From f933cb5d9439ac494ff4b75e5dbfba93f18a5133 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Mon, 29 Aug 2022 06:11:04 -0600 Subject: [PATCH 01/24] Initial commit --- .../resource-bar/assets/Blue laser (01).png | Bin 0 -> 744 bytes examples/resource-bar/assets/Fly_1.png | Bin 0 -> 4229 bytes examples/resource-bar/assets/Fly_10.png | Bin 0 -> 4349 bytes examples/resource-bar/assets/Fly_2.png | Bin 0 -> 4232 bytes examples/resource-bar/assets/Fly_3.png | Bin 0 -> 4450 bytes examples/resource-bar/assets/Fly_4.png | Bin 0 -> 4458 bytes examples/resource-bar/assets/Fly_5.png | Bin 0 -> 4387 bytes examples/resource-bar/assets/Fly_6.png | Bin 0 -> 4515 bytes examples/resource-bar/assets/Fly_7.png | Bin 0 -> 4558 bytes examples/resource-bar/assets/Fly_8.png | Bin 0 -> 4499 bytes examples/resource-bar/assets/Fly_9.png | Bin 0 -> 4445 bytes .../assets/Meteor Detailed_Large.png | Bin 0 -> 1147 bytes .../assets/Meteor Detailed_Small.png | Bin 0 -> 804 bytes examples/resource-bar/assets/Moon.png | Bin 0 -> 3328 bytes .../resource-bar/assets/Ranger_Carry_1.png | Bin 0 -> 325 bytes .../resource-bar/assets/Ranger_Carry_2.png | Bin 0 -> 295 bytes .../resource-bar/assets/Ranger_Carry_3.png | Bin 0 -> 312 bytes .../resource-bar/assets/Ranger_Carry_4.png | Bin 0 -> 295 bytes .../resource-bar/assets/Ranger_Climb_1.png | Bin 0 -> 288 bytes .../resource-bar/assets/Ranger_Climb_2.png | Bin 0 -> 305 bytes .../resource-bar/assets/Ranger_Climb_3.png | Bin 0 -> 288 bytes .../resource-bar/assets/Ranger_Climb_4.png | Bin 0 -> 299 bytes .../resource-bar/assets/Ranger_Daze_1.png | Bin 0 -> 295 bytes .../resource-bar/assets/Ranger_Daze_2.png | Bin 0 -> 303 bytes .../resource-bar/assets/Ranger_Daze_3.png | Bin 0 -> 295 bytes .../resource-bar/assets/Ranger_Daze_4.png | Bin 0 -> 303 bytes examples/resource-bar/assets/Ranger_Dead.png | Bin 0 -> 254 bytes .../resource-bar/assets/Ranger_Get Up.png | Bin 0 -> 289 bytes .../resource-bar/assets/Ranger_Headbutt_1.png | Bin 0 -> 335 bytes .../resource-bar/assets/Ranger_Headbutt_2.png | Bin 0 -> 333 bytes examples/resource-bar/assets/Ranger_Hurt.png | Bin 0 -> 339 bytes .../resource-bar/assets/Ranger_Idle 1_1.png | Bin 0 -> 321 bytes .../resource-bar/assets/Ranger_Idle 1_2.png | Bin 0 -> 320 bytes .../resource-bar/assets/Ranger_Idle 1_3.png | Bin 0 -> 316 bytes .../resource-bar/assets/Ranger_Idle 1_4.png | Bin 0 -> 322 bytes .../resource-bar/assets/Ranger_Idle 2_1.png | Bin 0 -> 291 bytes .../resource-bar/assets/Ranger_Idle 2_2.png | Bin 0 -> 292 bytes .../resource-bar/assets/Ranger_Idle 2_3.png | Bin 0 -> 285 bytes .../resource-bar/assets/Ranger_Idle 2_4.png | Bin 0 -> 291 bytes .../assets/Ranger_Jump Kick_1.png | Bin 0 -> 304 bytes .../assets/Ranger_Jump Kick_2.png | Bin 0 -> 330 bytes .../assets/Ranger_Jump Kick_3.png | Bin 0 -> 307 bytes .../assets/Ranger_Jump Kick_4.png | Bin 0 -> 304 bytes .../resource-bar/assets/Ranger_Kick 1.png | Bin 0 -> 357 bytes .../resource-bar/assets/Ranger_Kick 2.png | Bin 0 -> 354 bytes .../resource-bar/assets/Ranger_Knockdown.png | Bin 0 -> 333 bytes .../assets/Ranger_Over Throw_1.png | Bin 0 -> 297 bytes .../assets/Ranger_Over Throw_2.png | Bin 0 -> 310 bytes .../resource-bar/assets/Ranger_Pick Up 2.png | Bin 0 -> 321 bytes .../resource-bar/assets/Ranger_Pick Up.png | Bin 0 -> 320 bytes .../resource-bar/assets/Ranger_Punch 1.png | Bin 0 -> 336 bytes .../resource-bar/assets/Ranger_Punch 2.png | Bin 0 -> 363 bytes examples/resource-bar/assets/Ranger_Run_1.png | Bin 0 -> 299 bytes examples/resource-bar/assets/Ranger_Run_2.png | Bin 0 -> 315 bytes examples/resource-bar/assets/Ranger_Run_3.png | Bin 0 -> 302 bytes examples/resource-bar/assets/Ranger_Run_4.png | Bin 0 -> 309 bytes examples/resource-bar/assets/Ranger_Stab.png | Bin 0 -> 337 bytes .../resource-bar/assets/Ranger_Strafe 1_1.png | Bin 0 -> 324 bytes .../resource-bar/assets/Ranger_Strafe 1_2.png | Bin 0 -> 291 bytes .../resource-bar/assets/Ranger_Strafe 1_3.png | Bin 0 -> 324 bytes .../resource-bar/assets/Ranger_Strafe 1_4.png | Bin 0 -> 291 bytes .../resource-bar/assets/Ranger_Strafe 2_1.png | Bin 0 -> 320 bytes .../resource-bar/assets/Ranger_Strafe 2_2.png | Bin 0 -> 294 bytes .../resource-bar/assets/Ranger_Strafe 2_3.png | Bin 0 -> 320 bytes .../resource-bar/assets/Ranger_Strafe 2_4.png | Bin 0 -> 294 bytes .../resource-bar/assets/Ranger_Walk 1_1.png | Bin 0 -> 321 bytes .../resource-bar/assets/Ranger_Walk 1_2.png | Bin 0 -> 291 bytes .../resource-bar/assets/Ranger_Walk 1_3.png | Bin 0 -> 308 bytes .../resource-bar/assets/Ranger_Walk 1_4.png | Bin 0 -> 291 bytes .../resource-bar/assets/Ranger_Walk 2_1.png | Bin 0 -> 294 bytes .../resource-bar/assets/Ranger_Walk 2_2.png | Bin 0 -> 309 bytes .../resource-bar/assets/Ranger_Walk 2_3.png | Bin 0 -> 294 bytes .../resource-bar/assets/Ranger_Walk 2_4.png | Bin 0 -> 286 bytes .../resource-bar/assets/Ranger_Walk 3_1.png | Bin 0 -> 315 bytes .../resource-bar/assets/Ranger_Walk 3_2.png | Bin 0 -> 291 bytes .../resource-bar/assets/Ranger_Walk 3_3.png | Bin 0 -> 316 bytes .../resource-bar/assets/Ranger_Walk 3_4.png | Bin 0 -> 294 bytes .../resource-bar/assets/Silver shield.png | Bin 0 -> 781 bytes .../resource-bar/assets/Star_LargeNarrow.png | Bin 0 -> 707 bytes .../resource-bar/assets/Star_LargeWide.png | Bin 0 -> 641 bytes examples/resource-bar/assets/Star_Medium.png | Bin 0 -> 386 bytes examples/resource-bar/assets/Star_Small.png | Bin 0 -> 294 bytes .../assets/Upgraded Potion Blue_No Shadow.png | Bin 0 -> 3338 bytes .../assets/Upgraded Potion Blue_Shadow.png | Bin 0 -> 3447 bytes examples/resource-bar/game.json | 18824 ++++++++++++++++ 85 files changed, 18824 insertions(+) create mode 100644 examples/resource-bar/assets/Blue laser (01).png create mode 100644 examples/resource-bar/assets/Fly_1.png create mode 100644 examples/resource-bar/assets/Fly_10.png create mode 100644 examples/resource-bar/assets/Fly_2.png create mode 100644 examples/resource-bar/assets/Fly_3.png create mode 100644 examples/resource-bar/assets/Fly_4.png create mode 100644 examples/resource-bar/assets/Fly_5.png create mode 100644 examples/resource-bar/assets/Fly_6.png create mode 100644 examples/resource-bar/assets/Fly_7.png create mode 100644 examples/resource-bar/assets/Fly_8.png create mode 100644 examples/resource-bar/assets/Fly_9.png create mode 100644 examples/resource-bar/assets/Meteor Detailed_Large.png create mode 100644 examples/resource-bar/assets/Meteor Detailed_Small.png create mode 100644 examples/resource-bar/assets/Moon.png create mode 100644 examples/resource-bar/assets/Ranger_Carry_1.png create mode 100644 examples/resource-bar/assets/Ranger_Carry_2.png create mode 100644 examples/resource-bar/assets/Ranger_Carry_3.png create mode 100644 examples/resource-bar/assets/Ranger_Carry_4.png create mode 100644 examples/resource-bar/assets/Ranger_Climb_1.png create mode 100644 examples/resource-bar/assets/Ranger_Climb_2.png create mode 100644 examples/resource-bar/assets/Ranger_Climb_3.png create mode 100644 examples/resource-bar/assets/Ranger_Climb_4.png create mode 100644 examples/resource-bar/assets/Ranger_Daze_1.png create mode 100644 examples/resource-bar/assets/Ranger_Daze_2.png create mode 100644 examples/resource-bar/assets/Ranger_Daze_3.png create mode 100644 examples/resource-bar/assets/Ranger_Daze_4.png create mode 100644 examples/resource-bar/assets/Ranger_Dead.png create mode 100644 examples/resource-bar/assets/Ranger_Get Up.png create mode 100644 examples/resource-bar/assets/Ranger_Headbutt_1.png create mode 100644 examples/resource-bar/assets/Ranger_Headbutt_2.png create mode 100644 examples/resource-bar/assets/Ranger_Hurt.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 1_1.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 1_2.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 1_3.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 1_4.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 2_1.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 2_2.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 2_3.png create mode 100644 examples/resource-bar/assets/Ranger_Idle 2_4.png create mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_1.png create mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_2.png create mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_3.png create mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_4.png create mode 100644 examples/resource-bar/assets/Ranger_Kick 1.png create mode 100644 examples/resource-bar/assets/Ranger_Kick 2.png create mode 100644 examples/resource-bar/assets/Ranger_Knockdown.png create mode 100644 examples/resource-bar/assets/Ranger_Over Throw_1.png create mode 100644 examples/resource-bar/assets/Ranger_Over Throw_2.png create mode 100644 examples/resource-bar/assets/Ranger_Pick Up 2.png create mode 100644 examples/resource-bar/assets/Ranger_Pick Up.png create mode 100644 examples/resource-bar/assets/Ranger_Punch 1.png create mode 100644 examples/resource-bar/assets/Ranger_Punch 2.png create mode 100644 examples/resource-bar/assets/Ranger_Run_1.png create mode 100644 examples/resource-bar/assets/Ranger_Run_2.png create mode 100644 examples/resource-bar/assets/Ranger_Run_3.png create mode 100644 examples/resource-bar/assets/Ranger_Run_4.png create mode 100644 examples/resource-bar/assets/Ranger_Stab.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_1.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_2.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_3.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_4.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_1.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_2.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_3.png create mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_4.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 1_1.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 1_2.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 1_3.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 1_4.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 2_1.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 2_2.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 2_3.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 2_4.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 3_1.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 3_2.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 3_3.png create mode 100644 examples/resource-bar/assets/Ranger_Walk 3_4.png create mode 100644 examples/resource-bar/assets/Silver shield.png create mode 100644 examples/resource-bar/assets/Star_LargeNarrow.png create mode 100644 examples/resource-bar/assets/Star_LargeWide.png create mode 100644 examples/resource-bar/assets/Star_Medium.png create mode 100644 examples/resource-bar/assets/Star_Small.png create mode 100644 examples/resource-bar/assets/Upgraded Potion Blue_No Shadow.png create mode 100644 examples/resource-bar/assets/Upgraded Potion Blue_Shadow.png create mode 100644 examples/resource-bar/game.json diff --git a/examples/resource-bar/assets/Blue laser (01).png b/examples/resource-bar/assets/Blue laser (01).png new file mode 100644 index 0000000000000000000000000000000000000000..b76aaf7a042d56165a0d3cbadd2ce85216838081 GIT binary patch literal 744 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Fly_2.png b/examples/resource-bar/assets/Fly_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e37ddf9bf1830197f8a2776f0ffd3d8175ba0e1b GIT binary patch literal 4232 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Fly_5.png b/examples/resource-bar/assets/Fly_5.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2448c96f473aa54eb1662a940d52b0d8a53b9a GIT binary patch literal 4387 zcmV+;5!~*HP)bVG7wVRUbD000P?b4y-7D@iRhrAb6VRCt{2oq2ea)w#fb=X{erBxHslgdI1~QU{`v0IiP~9k4~M6{*q| zL~(-Ft7vUSAM3^5r(Pc0D_C0#LGhwiv~E!A!l-CzHDQSkiW>HW9SKQD!pvkQ^PT(0 z43cH`B?&sedCni?JLf&`_rBlR7a&E76e&`qNRc8%iWDhQq)3q>MT&q}*M25?T8D2U z@z^z{gk@{(LJ8gmT)+lkJ+QIdVs^)>$hQ@%&7KZi416CL4`d3()MZo5Dq2~FSQJo# zQNX$We_jAsfhMcXZUbHwP`S)v)?<)w%Y8E3dIY{rkK4k=6Tvtw$`pG z!S(oTV2UDXr1tGV)E%HQ+ZLfvUjmsim}sUn~?$mreQRb&|@~+NBcA1MULSVic2!Qn^5LG>K%i zxhO$Sv}rn#2K-tHR$6U#W1O;j6;_+ws01s4UlY3{f!OREwKD-NhBSfr9>PbHt7rnEo}CCm zU*K7*&3;J&Wp*2Wy`LqrAxESrzn!BZYG;;DF}DJZ(WVPSHn7}kvrkR1+@#{ycR4=& z6G@}r&QTFdn+dQd#&n@b2mWNW*{3BzHbzr%dLrfd_52e)y%SAL_Knq(Y~=d^CKXc1O7DN39HRMCRhZc zsko2PRD841R6NsYD*n37sy|lc0V;qQ`KB@X`KB=g6zUQk?^pSzG3oiHF#z`ht2)UO zMpJQ#(Nuhy(Nr98jOf?r3E~_>hC#8XcJ#*pv?{m;oum<1qS28&aTv={09}V=- zXe!o#YZU4powmRF^%(`61)LEeiNe=;6Tm<5RcBiSa+^fE8+Zj+Q-7>V`Q-y>^~b8b zR-3&LcpVs!$QKO2mZG$Vs~28+Y19d0Ue&hR>^A`q#+p6~Dum)^FU`EUAHMa!-8$a) zfXhM60Db`Uk3Snx2fPEk1-v2AN`MUDjq9F&%Buv=0j2Th6PDkWTg)qBNf>K23-B7g zod!uo>3XRGYyGjRBMSWmg?dmR4hqDZ0(qlA_7_Ov52Bwy+#nFo2*hE9TCDK>+C1(u zy2p_&e0GhAxc2c_ZT5$OneoU7hu7^E`###JRV`m>({=qSP@R^Ny1qh!Hz&FJf9E{? z;$O_I&+MC@?B%=X%Pr>nV@(`S$wVmrLSm=)y3lgusA0#O?-nXu%@GJwfD+Z^$Jaqd z6@rx7%%fYYv;Xz*;{J^_dz0Dmar^BVGjV^!R-665fI0EX3B-HqK-@+WiX}i@ymC5opt34!<73MUy)KVT zOq&>S+Zpudb-Cq+#moC2`Sgp-=0k@KN+oQHy3TLMxQN@C%chu*0}JDo)1Lb6yVE!S zWo4mi(?uxb`hMN%Xo=^9Q*Qd>ib9XWDV5iosOEX0-;QySkm^gK{{!DzUfg(`F1hLP zrwetrS47sCm0bpmmvc7!b^?YYt zqoJp&()RH}Il5-uM|sDpcf~Zf+m4+m9$0D_7pE8>3F}z+_s3d+n5qlCtxX)Ltjelg zSJ9^@tI_b)y1&P)!`A0k7qlL4mc-U}9tW(6+*h2?UShe$yc;M3qF;+M7*xZKeHnV2 zE@G=j5xe~Y&Xp1VLQXH(< zl9Tij6~hM*DtMY5@(lB6mzJIuY4L0W?)2L!p(JJeR&FuBjnAQ;NYga#IgsAk(46G9 zGTILyyo|c7yRzDxu1M|Z!RN@gW3g*Ek~SDGx0v6+SLHe)iQlkoPeyO6Mk6Wd%HtLF z)isgqHgEt|zg?0-QfF4mE#`H=4B$YxxGe{criC-CLDRyPm_$^a?L$F9ewa8KO?wZA zbLIhHM!CiOex$aGg``iDm0QePQA`7Dq2jq3PiTP*buy%-XR!LsN0~6mOrjkYD9?U{ zMi%|y4j%g5tsV5}8YJ!}M<_emP)sYgn72k~vY1J_GXct{m>Yzm4Br8oV}au6t!*NZ zp-zT0LmFepoy$wB7xD6%MOdbmVlbpdS#4@z!=OR^d0^p9e6;CFetzQ>0Ab}ST?OjN z9s}+cin8)4=7uDgwF}AI$I=1+N#IwlHv7B4JYY8Xw&3etuMnE1M2K%o=>lC>XqupO z;uuONj^Xg3W4ylRL)N~zfsZ$D!|jf)1AUS{eX_aqvTeK~MLQ|;lOHEi2^j^nH2XVtQ?bzCktIXS1!EDacF;+A<=am&1`XlZd`uiC*D`%V@=`Z$dZE;N~qCNmMj;FqQ2 z)m!oE4yI4Pn)AnuFI%2w~icc02TVAKz5;~yD$W>Hv~lP6DR-MV!_pXcZ2)7TiPVLppQkj)M_7bJ(z9A)oi} zANiJ{&p)drRP_(+X{tRk2VaxXqt5J>4p1Zr#D@ae8mjZM<>Sa^zs^28^ue-0g9b$; z=iq^3?5(MzbI-a{c=bU2%bo-EFDLrQM%45gXYQ~6TN7ySgc<^@e?PL`{dwn|7xMY= z;lm@6^PbI)QYRf5a44fd{$E7Gx`AHfOdoQ2s4?J{Pioj(`&C#e2(#MaH(#xDF{sHo{V5L(j$uld$PofMSJeUz9Mg)C+!3E*>ZhyRK z7gd|~1k|HlZSnB_`sc#R>MnYfGX;hV1=@yC1N7&f{(!@WLihZI5L|iXl>wjS=H@bK zQlM*$PN9@y(SN@ZZn9vvK$|$kcvG*jVXskSh;a_UmmqEdxhmMSp5sItzqxl+*!AF9 zvt|YS`|R1X>C>lAz-K2}^~}Gh{BS2BN@Xj^Y4|1whD7>~$)?B0nSmH$yrlpoHUVb_ zi*w(?A9L#+Q$ot=Jl@RD&!@V&ngIiX9~b#}({8T+(PCWAkgIq1?`v50KOr;k0eVfz zY|p;>|*v$p1|ew2F%mn zPQDA`k+@zkNhIp#kc9A_aSqpH6&GBQReaG{q0CuA7VJkmQ>XJr`FAtl|#{Bv7S+HP1zocROsi@x29JU9@&*@?`-caOjvf_#K+9xs*u-bv-ZFO!9P z+f3nF5z>)GV+7K<0O{C>a6cYS_hi#6oLRDeM?J!IJHk1$a_~7p2jNSNa}9;)uN9$> z8A}_N2{&g6?|Pt;K(~e|)ing?z+k+ar;1i42@fOiUf2))=_ieIgQt*g3&L?eqV=Yd z{o8x|9^GEyOaO%E6{PcJMCT(*>@%a$|pL@R}~t>}je=tzLQ4NF?}w6xtQ zRe-L8u76$4Dy4Guw6yhs90_ns{gbK?{g+1Jc_&9WG02v&2*(v&A_~{Vh}Jp1#gWj< zoC#1`+xR|sI$SqaIj|&M$>Vn^*#xqwR+El9r__hJT}7!0LMiR*&d;f;_I#8Id6&aUELIAhafw z*7U3KbuWiK1}Aj=#`bMxyPyeO|3$d;AO}GXk{l$tAo4)=L1|izlJY-;W+a@`kS%!#*NoEIx`@x1_B6d} zoEa$DI2r5R3^oo%pKM8X4!pBOHB1MW6 dDN>xy{6DPq^%yK6N=^U(002ovPDHLkV1mi7gvS5? literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Fly_6.png b/examples/resource-bar/assets/Fly_6.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc09c7e0c8f15563b9763c3affadbb1b5c6266a GIT binary patch literal 4515 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 Bw2c4& literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Fly_7.png b/examples/resource-bar/assets/Fly_7.png new file mode 100644 index 0000000000000000000000000000000000000000..6999696b33edbb9d601b3129d67b9889a8239e08 GIT binary patch literal 4558 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 sPx# literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Fly_8.png b/examples/resource-bar/assets/Fly_8.png new file mode 100644 index 0000000000000000000000000000000000000000..971127eb538214098e0d58f44022b4af16426994 GIT binary patch literal 4499 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Fly_9.png b/examples/resource-bar/assets/Fly_9.png new file mode 100644 index 0000000000000000000000000000000000000000..551ababd4e85aaceccaf0d932d0ab0eb0b4bfef9 GIT binary patch literal 4445 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Meteor Detailed_Large.png b/examples/resource-bar/assets/Meteor Detailed_Large.png new file mode 100644 index 0000000000000000000000000000000000000000..72c1816ed83c03c7d5d16b9ec4da3943870423a7 GIT binary patch literal 1147 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Carry_1.png b/examples/resource-bar/assets/Ranger_Carry_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b10bcecc3a8dd5dc9764cca1c0431f56160bdb90 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*3v{E{-7{-e)IW&sepe=6jO5y_I!Q8U1*?kA z$=IUy^rG(<-)Y1$3IUv#24yVGr4e0;y2bWGPf2Tsu1T-Q`BzR&+yAxGiJ)B zITs&?G-)r)uuHbIpW103QBb*O&WZVt=j6_G*(`bTrr5_bD_b_`l>4dfXxdw>rNHIB zPnpXNj2Cg$?r%7EIjBSa>}iLe)7LRsbcNn{1`ISV`@iy0XB4ude`@%$AjK*2qpE{-7{-cKjp4({$FMgH?7}o$f_fet*59nl7?P^@NG$6(+&y z1@3uYMIJJ}p55cbn=5HIf3`^33a$^n#|+zUN}t%Q>C*a>uRqOSQt=mdKI;Vst07rgrt^fc4 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Carry_3.png b/examples/resource-bar/assets/Ranger_Carry_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6f8463792e3d8d643e3fca23241aa059792b34 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6(~E{-7{-e)J@Ct4JpyOs92R``*T@c_~_W9yzn;_R+@&2pd^fXC1s-1qw<`Z+s zxM=qC3CtJyCEIuRr2eQmS9HWXyg}Yb^y#MWoNr9MA07I`)BkSP6oGo?H|eF3-5QV2 z+?(|(U}{9!|DLZmL(Tpr94OgwXO3BY*I#Chnvw@o1;c;*Y|zqJ-^r!D-c#Gcw&}FQ zEGdbNn{1`ISV`@iy0XB4ude`@%$AjK*2qpE{-7{-cKjp4({$FMgH?7}o$f_fet*59nl7?P^@NG$6(+&y z1@3uYMIJJ}p55cbn=5HIf3`^33a$^n#|+zUN}t%Q>C*a>uRqOSQt=mdKI;Vst07rgrt^fc4 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Climb_1.png b/examples/resource-bar/assets/Ranger_Climb_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc09013a3bc8eab636d10b11789780cffebea8 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6n^E{-7{-ft(J<~?K};BuF-+-gy4%*!sb zAPH5Ao@tS}b8fnd?L0WyZJW*fm`hy07HIw|y33uPR(p(lqmA(Nn{1`ISV`@iy0XB4ude`@%$AjK*3|4E{-7{-e)IX0q8mz-pV9EF0hJ1qtmFuzss_Z++B^saMT(6%HG#nrvy9a%1L^@1L(V z+5Bdj=gGXvfo)Cor33f56^;fx;GCy*w1_c4)nci|V)c_tB!9Yb8MkcbIv}uY8n?om z?z3vrYZOAh>wWxGk@|372vB*_)<8GODTnlS%T_%O2us(S7C7}vy7=aX&GW^-?9Z-e zeDde>N+zev51G1!MLyh?xSuY?#xFi+l7QXx`r7H8v*N{pK4S26^>bP0l+XkKty*=> literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Climb_3.png b/examples/resource-bar/assets/Ranger_Climb_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc09013a3bc8eab636d10b11789780cffebea8 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6n^E{-7{-ft(J<~?K};BuF-+-gy4%*!sb zAPH5Ao@tS}b8fnd?L0WyZJW*fm`hy07HIw|y33uPR(p(lqmA(Nn{1`ISV`@iy0XB4ude`@%$AjK*0l^E{-7{-d88yX@?qG4^}xE{C8k{Qor(!&?fbxAF3LI sr>{wvwVvyZt-HLIv$K5b|7k&Sy+>-N*YYWB1p0-+)78&qol`;+0FsGr+W-In literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Daze_1.png b/examples/resource-bar/assets/Ranger_Daze_1.png new file mode 100644 index 0000000000000000000000000000000000000000..40335b810debc83addf38258e05b37711b2117c9 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*2qpE{-7{-ghS*6g+Ie!E)8{-%AbMAG6n8 za^v#m+}6jzwt;2wjY<{kVrGv!k^Iy1H(U8`)C(?C< zzeHXYi2C&GB}2%IFAd8Sw=^*Dy=37L6lVW$Ca75aR~O&IRib-c=2;ni=F{Sl<8*j` zcE2D)%EO}icT3)HymNTZqb&^Y0%tq*>=d4mbf%s8OV2zrp?`)4G*i!`F!z})sPJaLMb+nA?pV$2Gh_si|yzokHbFnGH9xvXNn{1`ISV`@iy0XB4ude`@%$AjK*1xPE{-7{-bW{0S6?YD{v$0-d%q zrWANEe*4UIqoQ(8&kt+0GlI`pPjgiq&yi9(=I7YOGF{|_aaobdoah1#o-$TH&D|6J xafdJc(QtEhP>loE)xQ%o9+;+B6-)@SyC^+(M)vR5WNn{1`ISV`@iy0XB4ude`@%$AjK*2qpE{-7{-ghS*6g+Ie!E)8{-%AbMAG6n8 za^v#m+}6jzwt;2wjY<{kVrGv!k^Iy1H(U8`)C(?C< zzeHXYi2C&GB}2%IFAd8Sw=^*Dy=37L6lVW$Ca75aR~O&IRib-c=2;ni=F{Sl<8*j` zcE2D)%EO}icT3)HymNTZqb&^Y0%tq*>=d4mbf%s8OV2zrp?`)4G*i!`F!z})sPJaLMb+nA?pV$2Gh_si|yzokHbFnGH9xvXNn{1`ISV`@iy0XB4ude`@%$AjK*1xPE{-7{-d86b(gFPJOy}PH~UN=gR$8 zPNb_kznY}$&uuVqJ$F>w6;=+9M;vVhoh&8GJ9c~j71dm*DO}50|7wMg^$d-Oh=$F& z^3DuXo|IIVER^*Tv2o(ud;G|zcI^emY2F=L)=eUzabhQ|&y^}a{Li#O=Ov4pW~}GG vrQSg~j&p%TW9y^Jj_?hfGxc;f^9T5ZxPs{9%~4Ve?`L^}G+esB6iBg_1o;L32LguQ+xUWk0-OaNk;M!Q ze1}1p@p%4<6rf@&`JhRS3j3^P6 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Get Up.png b/examples/resource-bar/assets/Ranger_Get Up.png new file mode 100644 index 0000000000000000000000000000000000000000..57503f5e2abad9ada3d8b94c70cac86bab66f090 GIT binary patch literal 289 zcmV++0p9+JP)U`iy*0GJ^Z8Ni>s8P5JV z*O#CH;JgotHc&u;uwa@miXkMs0Go?IhC%^mI)KGJEb*Y*j^qu(Ng12d38qBki~_U` ny*$JjD=-7l%Q~zDC^i59R!&_)GIz&c00000NkvXXu0mjfIIwMo literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Headbutt_1.png b/examples/resource-bar/assets/Ranger_Headbutt_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e4b6b21deafdd65ae4d70f25e415d2e2a8006e GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^5anMpx_fv7sn6}@1s)=@*XzeaNX?q{_YCxFSpk2 za$|qZvCfW9>|nz6W0U585oJH2yz|Ko*PuwRs(YIy!tH|71*g^AZ1Vb3Yp;>6>oak4 zMB33wwcIZHES?pd$5&Zq2C*%jaK7W8*4)pP;@LkoF>HKx#aQoZbJRKRkOrIGB~Ll3 zOl(i?k2mlwX3R1XJu+o|48x_jUspC&-}0X--R@#r5FS&w0z3LY!*-gC|!Q zt+(q@|Mco`h0=OE7ynIpjOTWiG`^18@9i(}FZBz{CiDFa*Nta=V(OiqaY?wqH?3ns d0`u{Y%$J1@C9OIa@C@i*22WQ%mvv4FO#rmPgyR4J literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Headbutt_2.png b/examples/resource-bar/assets/Ranger_Headbutt_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1587e1d40e57c29b7a228c5e70ebaef5380d734e GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^5anMpx`4<7sn6}@3T`5@*Y;;aoz0r{_YCxFSpk2 za$|qZ5h8D3#OB<)a+Z3e;XpRo`h;OEybxk3+$}xU3Z>v{xP|$=?vrC?x{DF+0UkGE@wDXG;_wOz!^v1 zy0$64II7ET&(9G1^BjYKUVnJ-i{%^p*U7X-Mt!^}`nmW{(SlPiZSyQMT0Yt4=`K3C zWuK()lCNhol-A}asofNBD9#EEh@b60lk?90o|z5juQ7i(qpB%y@S{V~nDJ}H%mVIz c2MTK#-ncEXcqyLg4)iU9r>mdKI;Vst01MTDdH?_b literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Hurt.png b/examples/resource-bar/assets/Ranger_Hurt.png new file mode 100644 index 0000000000000000000000000000000000000000..b87e3f660eb04ce54df213f1da309e5dc002dbe6 GIT binary patch literal 339 zcmV-Z0j&OsP)Ljib$BxqlaZ=RQ^<6KH)7Y*J zZW)GqVTD9T;w+gH@Z{qm58mHx4*XXcvX4cP!jUCGha?n>WRK6S_t*XTwK~ciU~-aJ zII2yd00^N7y4WOukjPZPq=kYn1L(AB0^ zSwl4y5x|jI0qne1G&}gMz_Wjp!D*-p7}y|Evutt@`hVzlr{H3q!aa=TzW6UxYk=fd z2PW=wl_UwclsJc?8L*9UZW{m72dw@0m`y`9Nn{1`ISV`@iy0XB4ude`@%$AjK*4LCE{-7{-diVKu%rEgO+E?7_vU5^aN!PDE*$1;1&k6id+NpKAe1Ch7!uWOT6dYQYxsXqRKsMA7bd&XG{4rujQpMP>FmdiRMKQ62U53tHo}e$ISQKH!)NPb(s_hF0Emlwq~B;g_W1h Qfj(sLboFyt=akR{0DGx_fdBvi literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Idle 1_2.png b/examples/resource-bar/assets/Ranger_Idle 1_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4b41cc5c6da5ffaabbf41f7b6793bf00f7b364 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6h?E{-7{-diVK#AyN-v5;`>Iu4kK6>iA zTGy3o@^*U|M1TEmS~nppY5oOKqeCm=ZZ1l6IvTq~e22NwkA*u=2R%3JSty=X#i+%k zoe?2c(wecD|NWvEx%Hkewili;;z_)wV|aRjU3fSH@9Dj}n3gr{4;OEo8Cl;X3C8y) z%>1T*VCPnzOX;7lO!#+crsMe^Ojq>IS1?q2q)nJNP0@7Dk!`gMYYs1ByxOs~7U)3+ MPgg&ebxsLQ0LIdQwEzGB literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Idle 1_3.png b/examples/resource-bar/assets/Ranger_Idle 1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..60486c3e3d891da592df28e24868e72f8fbbfed7 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*5WiE{-7{-e)IWc;o$oRX|fkG>RmTDNskWbD%~2ezxKt-1eJ?ow~jzWL_U z=Dls&aI&3W{DSANO2=T1*k*ALX|zpgOrdg&PxpGC1-kN7nII=7BNVw(AGrnZLq&D;%VGVB_9z&P)O&ui9_ z^~%j>F4~zcsegH9LHUk`b87zo8Gd=BO_(`N(ezJe?r(Nn{1`ISV`@iy0XB4ude`@%$AjK*8&tE{-7{-e)IW>v|Z>y2hI|bbcZ;B^P#-k3MyyL-a93o!?0AcRaX3gO9HuOqeP>kz(oEk6xPfv0 z37_NK1^SEG=C7{J^7wygW@Gs-hUd#X{xNn{1`ISV`@iy0XB4ude`@%$AjK*1fJE{-7{-cKjpiFz8Z z7KztZaB*fP&U3J;%`-W|z9iu6 j?k!AlvD294g%0sGGPQhe>~8!E^aF#ZtDnm{r-UW|w3u&F literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Idle 2_2.png b/examples/resource-bar/assets/Ranger_Idle 2_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5a8b797dab762c64a7f7267a91ecaab8bd6efd GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*61!E{-7{-cKi8-h2H|6bTwV$KAI ktL2%J5qg)~_&F0Nn{1`ISV`@iy0XB4ude`@%$AjK*3F(E{-7{-cKi87`=wzbDX4)0bxw&woQ@|EpD^S^sf zo2UAAQvZ!TG7Vg^asf{!^{d%2W}RT)oBURd!YEvXx5QxAwSlr*<{an^LB{Ts5v5;-V literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Idle 2_4.png b/examples/resource-bar/assets/Ranger_Idle 2_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a962a3ed9081025f194a64f747bab326d3b9e8 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*1fJE{-7{-cKi8P_3r z&AT2bwevqzoN{Kfty^Ik^hzs)!=b|c!al>fusrnDdTxjmd$U3jzpOyi?@CN0cy m9G~^pGORvb^1#x literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Jump Kick_1.png b/examples/resource-bar/assets/Ranger_Jump Kick_1.png new file mode 100644 index 0000000000000000000000000000000000000000..76eba54a610ac349b489073edc434581a6ef0e06 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^5anMpx{wY7sn6}@3#}~@*Y;;X}P)J{oNJXPqs#v z_VQg5gTem@t@5HPj!Q1<(!EdBmPYDnB{e6-PVG#Eyn^6`?rQX+otzh@ruW_ z>yM|Uo}aYqq*{)hEra%#uMLY7H=UIBXW4m@P1pF%(sbs@F&_#-y%p{jEVIF(wbgdA)ymmg2c(MU=37rt6qPQT`()AAduJOi y6)!%vscWI3XlY=ribPu>sS-eLkym-elF{r5}E)Mns}N3 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Jump Kick_2.png b/examples/resource-bar/assets/Ranger_Jump Kick_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7de8dba740e31105228fc0bf6e58e5a62d5440 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^5anMpx}K^7sn6}@1s*r^Byt~aJkD^ZncPYU5Tr- zh#RL`a`obqw-i$CA9*f*u(eXyyW^Aps;>UuTSHQGZm095)t+WxdH;NEYVanMpx_Bl7sn6}@3#|A3m!7yakIgYci_WM1es#wANzoPN4i<@qWvP|-wp!eFd%NU7psH5PyT`jaMUI?*|J(7@ z=Brs6N7~Bu4+zJ_3FJ08an&ikXk#i$jQH#$wranMpx{wY7sn6}@3#}~@*Y;;X}P)J{oNJXPqs#v z_VQg5gTem@t@5HPj!Q1<(!EdBmPYDnB{e6-PVG#Eyn^6`?rQX+otzh@ruW_ z>yM|Uo}aYqq*{)hEra%#uMLY7H=UIBXW4m@P1pF%(sbs@F&_#-y%p{jEVIF(wbgdA)ymmg2c(MU=37rt6qPQT`()AAduJOi y6)!%vscWI3XlY=ribPu>sS-eLkym-elF{r5}E)Mns}N3 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Kick 1.png b/examples/resource-bar/assets/Ranger_Kick 1.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa08719c7acb2b6ff126b8a9980e58a713e67a9 GIT binary patch literal 357 zcmV-r0h<1aP)CGR`)zX}F@Piv(_9urE73x{B%%OG6z8B(i8et^05zf-fVZZP zlJZCZFHYUFOtQa=RR*Cw1@Zaa`*!r>{dH7ZRy+gR`*d#Top3*DrsDu~=3LDHnt>N5 zPh1BjC6WR&8OS(M+^zs_qXD6dFq26%gt(6HL1R(|2Jf5L0S9;8<+TQP9o3QR#7W#5@t2mQ{Ab5;l&1Qz zn#}yje%F?O@wi_O3@-;%K_q}PpA0Jsna5NRF#~E2?+DN;2Jq3N`TN?r_ucua&O*!p zA!xo<$tAK-ZktNrZAHcc$Fd+bC<1YSD{z15d_m!f#yHo{A5U}HVh0(30nLQ(Ab4sD zFV-MuGH0eUIQB|$Co|KMPOepeLeoI%v&aH4M%H^(^b){S{{?Jao-DvZ zQGn1$b^zgUvjgx8mn9&$E?NW3t}7B?)0T|s3si=2x1gKkz5oCK07*qoM6N<$f{?zL ArT_o{ literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Knockdown.png b/examples/resource-bar/assets/Ranger_Knockdown.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf1f73366ea2b536234af7e5684de8810b7fc23 GIT binary patch literal 333 zcmV-T0kZyyP)RH2<^;rjgjxYSUlcdDsA)_oDhsR%0K=&>k`{o2>5!_mz|@EUbiU-qu#b}^ zjcE3csDRQO#LQ={x%)Q?nAGrA3_A_G*po+}7q=ISy2cHFg6ICdgOVw+D znE@C>9B`Dy2)FoV0GWfN>H~1G*%|<2l1#a3&2D)D2Nh}%F5b7+9ylomNoBKp#anMpx{1F7sn6}@3#{!@*XnaaoNoHKj#S7pG~6K z1`^6k_Dc+X-+hsqfUSzvfdDZpxzS*o#&-Ai%S6IsGzAdi3rj$7k=o1D{S3j3^P6anMpx|jw7sn6}@3#{!@*XnaaoNoHKj(_*k5uhz zFA{n#oI1LV?>AGRll_EGOM)kN7mIK8QJZ{Hesg2nL4)gWe+gM;AJUHy;QDK^{CEEk zgW$I@HP)9+Q+MCFULvV#{LS=eap)rs^M|Ta&KUC7-c`TH@T|(vVM?0 z#@)oiW4>PcTh#Za`>bshjDhC%wYtplm0kxqr)*-rTpJP-yfb7w&|3_iu6{1-oD!M< DZliUV literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Pick Up 2.png b/examples/resource-bar/assets/Ranger_Pick Up 2.png new file mode 100644 index 0000000000000000000000000000000000000000..149abd6b18aa8d5aa205b212233b19753a1ea44b GIT binary patch literal 321 zcmV-H0lxl;P)VG>%JzfSnDM}tv|omPHOk3 z)hl2H6ae0=t0e$`+zmInR{)M63=o`q2d5!%Zv>$Vw6n|sU}ga+I-K9PeVA|0PpX0{ z00hoCn>@l?Ths>;Tu!3S12Nqn)uaM}Na8G1=cWJdEufMt>pp-JU>E^n3I-7TXe$yy z^a!bqWxO=Mh}VXfbXFBaNvHAwrLzInDW|}1PIvc+i%)w9qwK{sN|;83P TcoTnV00000NkvXXu0mjf&(C~i literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Pick Up.png b/examples/resource-bar/assets/Ranger_Pick Up.png new file mode 100644 index 0000000000000000000000000000000000000000..98c79b41a60e1009d4422d8196e326db39e4d77c GIT binary patch literal 320 zcmV-G0l)ryD zDi6Q`_%~oy{bCPbKA+-&`_lsxhz0OwX8;MIu>@kSK$@}5081JWW@q#3+W2=KO}J^wnWA+q}i;{rle6x zRSOL#A$hn3AQA;g%CrSwlCSsS_DO@UiylBrMS#!Vju~gO&;l$#_4WgeS?ux+9L_kN zg|tljb&;3-_q_>Y*D?zdU>g=xEx@6_>NrCavR(y<%}G&vg&4q{G}sDDrwhDRF5?P000057v8 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Punch 2.png b/examples/resource-bar/assets/Ranger_Punch 2.png new file mode 100644 index 0000000000000000000000000000000000000000..24ccad91ae7cee77a2df02a8e7a03e5341f58a00 GIT binary patch literal 363 zcmV-x0hIoUP)`-WS_V+P2wP zZDxK#*QzF9IvM|V*qd!0?exi^Uv*Q$NTHR&LWxt zK)_t8WQl4h2uPW`xphtUdk~q!`vXM47+@RRce?J~U<0PHU<`A8#9iM@nolyY=I-B^ z<0r_El_+^sq>Lalq-=?lNfR5x>XEs4A1GJLS!hRBIg3Qc0t@guK56iNssfmHmw>rY zxfhPrs8?>F=BLMXj%#c#RZ#|OM2-r7wd1d;%9I7-+%o+=gG~X!^0>=InWTW2IgZN# zIRpHa!3LBVaNpIWL^%U*5k-$G0i+BhUm6QQ#(@3divc2ooW29xgNZ9um*4;Z002ov JPDHLkV1j-@n&AKd literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Run_1.png b/examples/resource-bar/assets/Ranger_Run_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff1001ee89642b3a1c890393e16ea56312cef295 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*0l^E{-7{-diUf%Y?R$1DgbUc358ZiExy#u~a|s tf6?@$73XhhIX+>#8U5g;X5-|bu+H@n*Q4$V{sQ`i!PC{xWt~$(69596cX|K- literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Run_2.png b/examples/resource-bar/assets/Ranger_Run_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a93642fdaa142f241add59baa806324efe63db87 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*0;1E{-7{-diVKwyFdk%#?dHSVKCnVxo zoJ1gN&?5~MEeqd$d+mBN;^V#-a(jGP7m;*l!rYsZ3(g2_Ft%ov+C2BB=z=o>4zib8 z-0M!M#auJ(uol<1ITF;^65#Cf|2ZqqdGR%OnD*O+ZgB9j=d5fn?Vmg~6X-VvPgg&e IbxsLQ05$`66#xJL literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Run_3.png b/examples/resource-bar/assets/Ranger_Run_3.png new file mode 100644 index 0000000000000000000000000000000000000000..bee1f8da9b74987edff5ccf1e36f8285e3240664 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*7VFE{-7{-g_rq)Qpy;~aBuP3iO zw7GxQ6}5ahUW2qt=b0lEvyM$rSm2#|h<6U3;pIPOYxJZV(l{k5d3h&1%VD_4lfavJ zM!>)&ci)})ZZ-E@q(WXcB-{<@kb271wot%$W{aB0_3{Koldcu}wtk&>%tQ0iWZQVw wj?7a&KmIHA{@;>W(tK05;8)0j$SI%L{y6%*{?wYA0rU=or>mdKI;Vst0G0W8i2wiq literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Run_4.png b/examples/resource-bar/assets/Ranger_Run_4.png new file mode 100644 index 0000000000000000000000000000000000000000..08a20a67e2d7cdd5b9c2e1af47a076c540775c06 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*3XAyMi zr!!V8hgTIbOK^QmTqY1dZ`nPDwq*z6?5{Qv*} literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Stab.png b/examples/resource-bar/assets/Ranger_Stab.png new file mode 100644 index 0000000000000000000000000000000000000000..b9db5c0977a056bff9423488311a0239d28e5a61 GIT binary patch literal 337 zcmV-X0j~auP)Z2-k2y?|EB`J!?wGahzq&NpgDH4TD1lE$42&APsAf#ur zz(7u;-{K_eU@XrZIVn>PQ30@fKx;pp`#u|%{rq@GJu(x(kNu*FZ0klBH`)kv)cODf z$SLyC;{qwiSt1UsgN5d@>EyoYqVex_Rgo_WSb!Bc-Mb-TeC{G3h?-qECN2)y1D8fj zU1-yETooZ`-DA{iTx10Tu?bQEmmJeH!YV{Pjn@cJ@+`DJVC;=1k!bGbnLx?M8W*X+ jqGj!$g|-h=M>XOP{&Z~t`1|_W00000NkvXXu0mjfKHi75 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Strafe 1_1.png b/examples/resource-bar/assets/Ranger_Strafe 1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..db3154f65878219e7eeadefcec4d66762a875b1c GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*5`yE{-7{-diW#DT{SrJ-b>3=mY;w2$om#; z(_YeA^79MRoD28GCj>=hJQP-N=B`Mz*{m-9Zq|ioCC^*6j17HsD~cHXL~ITj=_@Qf zu|QAX&?{(0`R^H3)wymn%B_#3i0uA#s*B z&|sFoOzSoA2Rr+D-t3%tMdi}{s;Bd(@7vFyelmH_k?O!KA)Dz^OP;k(`NS$0F+c3L SjD#4_lMJ4&elF{r5}E*ZihjfZ literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Strafe 1_2.png b/examples/resource-bar/assets/Ranger_Strafe 1_2.png new file mode 100644 index 0000000000000000000000000000000000000000..10a48c75457d681298c896d3327159067364f61e GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*1fJE{-7{-cKjpiFz8Z z7KztZaB*fP&U3J;%`-W|z9iu6 j?k!AlvD294g%0sGGPQhe>~8!E^aF#ZtDnm{r-UW|w3u&F literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Strafe 1_3.png b/examples/resource-bar/assets/Ranger_Strafe 1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..db3154f65878219e7eeadefcec4d66762a875b1c GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*5`yE{-7{-diW#DT{SrJ-b>3=mY;w2$om#; z(_YeA^79MRoD28GCj>=hJQP-N=B`Mz*{m-9Zq|ioCC^*6j17HsD~cHXL~ITj=_@Qf zu|QAX&?{(0`R^H3)wymn%B_#3i0uA#s*B z&|sFoOzSoA2Rr+D-t3%tMdi}{s;Bd(@7vFyelmH_k?O!KA)Dz^OP;k(`NS$0F+c3L SjD#4_lMJ4&elF{r5}E*ZihjfZ literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Strafe 1_4.png b/examples/resource-bar/assets/Ranger_Strafe 1_4.png new file mode 100644 index 0000000000000000000000000000000000000000..10a48c75457d681298c896d3327159067364f61e GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*1fJE{-7{-cKjpiFz8Z z7KztZaB*fP&U3J;%`-W|z9iu6 j?k!AlvD294g%0sGGPQhe>~8!E^aF#ZtDnm{r-UW|w3u&F literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Strafe 2_1.png b/examples/resource-bar/assets/Ranger_Strafe 2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5770dae8c010f7fa9d062337b193fc3b188b5 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6h?E{-7{-diV~=4CSEaoNuNuEd2q=4F?e zMvoBF+3zeDbI-seBGzAtH9IQ5jW;+{VtjRy;B7~IcQZl01MlnC@7 NgQu&X%Q~loCIC-pcr*Y2 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Strafe 2_2.png b/examples/resource-bar/assets/Ranger_Strafe 2_2.png new file mode 100644 index 0000000000000000000000000000000000000000..83aa5d42f44c56b075406175a144312734dc70b7 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*8OfE{-7{-ft(L7CdCY<8qg=+-ec)x)N7u z5jW1Z-n~6`$2QFo~Qa`Dr<6@zy%&dA+ zi6=ZDXxjl#`_o2q5?9XOqkUzQ?t`Cu;W}ZP;)!AO zc5zBmRs32~&C?tiJ=1uK;F(*e<}B<ojN1KXHu! np-)kby}C8(ty-^dP7aFO?4Gn=wxXgO=nV!>S3j3^P6Nn{1`ISV`@iy0XB4ude`@%$AjK*6h?E{-7{-diV~=4CSEaoNuNuEd2q=4F?e zMvoBF+3zeDbI-seBGzAtH9IQ5jW;+{VtjRy;B7~IcQZl01MlnC@7 NgQu&X%Q~loCIC-pcr*Y2 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Strafe 2_4.png b/examples/resource-bar/assets/Ranger_Strafe 2_4.png new file mode 100644 index 0000000000000000000000000000000000000000..83aa5d42f44c56b075406175a144312734dc70b7 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*8OfE{-7{-ft(L7CdCY<8qg=+-ec)x)N7u z5jW1Z-n~6`$2QFo~Qa`Dr<6@zy%&dA+ zi6=ZDXxjl#`_o2q5?9XOqkUzQ?t`Cu;W}ZP;)!AO zc5zBmRs32~&C?tiJ=1uK;F(*e<}B<ojN1KXHu! np-)kby}C8(ty-^dP7aFO?4Gn=wxXgO=nV!>S3j3^P6Nn{1`ISV`@iy0XB4ude`@%$AjK*4LCE{-7{-diVKu%rEgO+E?7_vU65eN!PDE*$1;1&k6id+NpKAe1Ch7!uWOT6dYQYxsXqRKsMA7bd&XG{4rujQpMP>FmdiRMKQ6Y>2U53tHo}e$ISQKH!)NPb(s_hF0EnIc|XsvQR__t P(1#43u6{1-oD!MNn{1`ISV`@iy0XB4ude`@%$AjK*1fJE{-7{-cKi8_o!*{^^VgG= zPexu++>&zmG^@qJ%iLWt8JUlS7qCUW(0v?d8#!aihGkXPoi;B{xXd+A=Rl`J|KS2% zjiQO&W;U$tOAO9$^WSr4ey_p#Z!?OyUrDR)6#lbqf%L!cOp6tLGk%(zF_!vEB{9cn lJk#6TF!glN181ijjN+~>pS}OMF#`R-;OXk;vd$@?2>@Y6af1K= literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Walk 1_3.png b/examples/resource-bar/assets/Ranger_Walk 1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..663b38022e306f3feefa835d1c2425e2f5575d30 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*5uqE{-7{-g_rs=Tt+A`B^-Sbk|G} zv`q0*#$nAWkFIC8t9(r3Nn{1`ISV`@iy0XB4ude`@%$AjK*1fJE{-7{-cKi8_o!*{^^VgG= zPexu++>&zmG^@qJ%iLWt8JUlS7qCUW(0v?d8#!aihGkXPoi;B{xXd+A=Rl`J|KS2% zjiQO&W;U$tOAO9$^WSr4ey_p#Z!?OyUrDR)6#lbqf%L!cOp6tLGk%(zF_!vEB{9cn lJk#6TF!glN181ijjN+~>pS}OMF#`R-;OXk;vd$@?2>@Y6af1K= literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Walk 2_1.png b/examples/resource-bar/assets/Ranger_Walk 2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..83aa5d42f44c56b075406175a144312734dc70b7 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*8OfE{-7{-ft(L7CdCY<8qg=+-ec)x)N7u z5jW1Z-n~6`$2QFo~Qa`Dr<6@zy%&dA+ zi6=ZDXxjl#`_o2q5?9XOqkUzQ?t`Cu;W}ZP;)!AO zc5zBmRs32~&C?tiJ=1uK;F(*e<}B<ojN1KXHu! np-)kby}C8(ty-^dP7aFO?4Gn=wxXgO=nV!>S3j3^P6Nn{1`ISV`@iy0XB4ude`@%$AjK*3X`SA*6HTfk~b?Q!C$<2Qzy_@44$rjF6*2Ung9r# Bag_i7 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Walk 2_3.png b/examples/resource-bar/assets/Ranger_Walk 2_3.png new file mode 100644 index 0000000000000000000000000000000000000000..83aa5d42f44c56b075406175a144312734dc70b7 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*8OfE{-7{-ft(L7CdCY<8qg=+-ec)x)N7u z5jW1Z-n~6`$2QFo~Qa`Dr<6@zy%&dA+ zi6=ZDXxjl#`_o2q5?9XOqkUzQ?t`Cu;W}ZP;)!AO zc5zBmRs32~&C?tiJ=1uK;F(*e<}B<ojN1KXHu! np-)kby}C8(ty-^dP7aFO?4Gn=wxXgO=nV!>S3j3^P6Nn{1`ISV`@iy0XB4ude`@%$AjK*7zPE{-7{-ghUR=500*aJkD^Zso>*Y)dUMfnxDFP{bPM=Z` z@#s7?Veur9(kMB_iv9BaKWiCxs5IAW9oVPp`~F)t>zDa24*xkNn{1`ISV`@iy0XB4ude`@%$AjK*0;1E{-7{-diW#b1Bc1~VZ(($X#>)@KT&w38r6cT*){ofp;o|1q2^hM^s z<#L?NC$HBaTvF*6&NWNSjxoidIlV3Y*2hD!OnXJjwL;_$Mr0lA6F$rFYS|NJGd^g$j9UU#ijV0Y!PC{x JWt~$(69C{Md|m(m literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Walk 3_2.png b/examples/resource-bar/assets/Ranger_Walk 3_2.png new file mode 100644 index 0000000000000000000000000000000000000000..10a48c75457d681298c896d3327159067364f61e GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*1fJE{-7{-cKjpiFz8Z z7KztZaB*fP&U3J;%`-W|z9iu6 j?k!AlvD294g%0sGGPQhe>~8!E^aF#ZtDnm{r-UW|w3u&F literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Walk 3_3.png b/examples/resource-bar/assets/Ranger_Walk 3_3.png new file mode 100644 index 0000000000000000000000000000000000000000..913690aeee361b606a755bbb750af9710daa3e47 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*5WiE{-7{-e)Jh<~?M<)3TZI|IH53AE(3C z98BmDsLIQ^>G#-%VdeZ1ufIF8wM_p`eq-XgFMjQX+wQeTHb^C%*`;@0anp(Czblnr z-dm=&<;mI0j1~*$vx~G|xO70>L3B&OmY(!^FAw;#*_)WM?~-li*=qn)k!Z0f^I5|p zfxR!zI(K+-|E;~F9xu1v>&5%WcIuoDip>s4?Bhz9ygpNVfzgjy+nD}*3TZH$BE`cx z!#>ZFVY$%dSJF?|v^p}s^4eTU+7kJ_eWLW2yo*lzYc&-VmhvB&*BiToe;GT_a}1uY KelF{r5}E+lseYLN literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Ranger_Walk 3_4.png b/examples/resource-bar/assets/Ranger_Walk 3_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf94df74f59454d4dbef1e4e28ff32d6a4263ff GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*8OfE{-7{-cKhT6g*_W!*Z9g-pY&d=ZB@* zw-#)el2Ej1@kIS?qU;iKZ_f0Jc$PnQKV;syMDfwvD6Y+0J_R1WIpI*w{^I+t{M&cg zs7;)^HcQDpM~=^-)sNL-t$0dlps^Nvg=5wx#T6H9!s9~%tS8)KySUF`x(?ro+NsNK zwmsOuDcg1CjX+XD;=F5iAB*bWwNys^t}#pa?Kbr-W1Vz>>Hlhmld0)af2ZCI__8|Y m#)8JQdrQ+2N+r$qcyj2=HMaf!CG-L0R|Zd4KbLh*2~7Y2#d16V literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Silver shield.png b/examples/resource-bar/assets/Silver shield.png new file mode 100644 index 0000000000000000000000000000000000000000..9f691ed5b602056652f24989353b9befdfe7c5f4 GIT binary patch literal 781 zcmV+o1M>WdP)^@puT@paY1+qcF`$|JAaOd&|tqVp+G+TKpE}(NJOv&}ljW*z7 z`-0ZodY2i|%vDX5?UXrg?tLgw(D$DMZNQmwjn;heCOOe}0vubzO=N|jYX6&7ec>K` z*&%5=)NWoXX|7g?q zW#a9uzLL&yJVbT~uJym#!{JcbuYL_&eZl06zOK%u^#Bi%9qC-D+r3^-*-MQktpf(< z>dS`4jeuwIeR?5X`tnb}g=&M=u`*eIeOvn&q`Rh^6VbI)K1)R%4gV4$Ki zn34y7puW>O^T8nNG=Wa{A~a~Z*|Jlgy@Nkc-+B9)zZ#T7w;(_y$6F|{Kl>T7<86hC zK-lBi@etq&=AMi?38ibW=FWkCOg$FnQwlqh;qK%fU3D4yxJ*4a80hbzHq5s9 zTce^IACb85CSPggQ5Ry7hANeRdqQ<3U52ki#nL~JqTK=+Bl8V0W#zsA001p?MObuG zZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)Z)9b1s0M%T00000 LNkvXXu0mjfHZX6x literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Star_LargeNarrow.png b/examples/resource-bar/assets/Star_LargeNarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce8f2055e763e8782c9776314ff98b870bcd75d GIT binary patch literal 707 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDImUKs7M+SzC{oH>NS%G|m0G|-o z|2V+;^S92QzXO*9DnEbzHjsNePj>~7!&egI7tEh8A3y(n|NZ&#_VxQ28XW5!7#NsT zJY5_^GVZ;-aoU$DP^97E<%We!&a7=*J)#m?1|beB8X_1=7Vt_)8sFlFXq8~>%%7&7khF}ap3$TzM%X8OWSe3gi9q%m$wP8u(52M z9Ik%hR{_)W`F0DIS3O{ATXkG7VbQG;#^9^lxL2&O+u0y|HC+5c(BA^a=d0$+CCp`P zRhWVY&tPm(z=H!=&U{Uem1sQ8yI~9C=c{ZHu`?P@OGHF9{M2IO+NQuN?ZI%mAYpGK z%Y^-`nl~JTBG{Ptx9{5gZXI*OmkK+@-+j*oH~p_LQ&fB$+0xRxoRd@bzN$)1&Fmkn z>)tsxte@S}zrkLx|9ws8Z^4rvube+|E0O!Q>J-m9dw!E&K$5{I(O!P29w`e2YV*Ivj-HI`rg!ANX=km zC_Tf_pq0kpz-!Eq&?CuUaEOQDMKT)$j{$QPNS%G}T0G|-o z|NsA=KYs^I-U5N=&Q|1S7&mcJ&YShS3HPeB?RZZZ4g76CFlYXiJ4(o+97OY_5k_cg{G`M?L+JD<`cjbV- o-U9_$EKjyFN^fASXZyjn@>5?x(s3IlV6tHFboFyt=akR{09Q&2wg3PC literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Star_Medium.png b/examples/resource-bar/assets/Star_Medium.png new file mode 100644 index 0000000000000000000000000000000000000000..315be23ea1c59acf4c3690db38087e05a19a3a65 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDImUKs7M+SzC{oH>NS%G|&0G|-o z|9AmV6;NLF((NiBi@PMqFS!4HJb(TB^ZxVY84ezOa1JQ^$C4kD}p zQPJfGLPF*|Kx(?>KC4F9i}-IA|ZdsCB`sU<=n4 zp`HWpY?#jP)%|czyNPi}-KXXa8yWLHnNI(DKqp_Ij_IAujdk%&yEXE)F2+tWXZ)FX zYQD|xS_95ydn(nR9XI^{;mvs`Lnga|8K(p}CUUC^WG;}_6v|Xwa6#)rL(po6+K48$ snwg8lSh(a_PEClH0l5z5%!qT`3+ipmdKI;Vst0FYjy*#H0l literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Star_Small.png b/examples/resource-bar/assets/Star_Small.png new file mode 100644 index 0000000000000000000000000000000000000000..7eae179500e972fa3be1baf1ecc83781cd0c34db GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?K3?%mjbVdLvmUKs7M+SzC{oH>NS%G|>0G|-o z|6l;*0clo-ltVxkb4ie2@ceiNL#e6`Aa|Rmi(^Q{;kQ>d^0pfAxCWj-EOfJ7RYFlY zV2OeOm$CsHtLTXu&8zicIi0_D+8qrQiQbmb(f|Snno4;N6tN`iV=}O{iwJcW*ICuh zop$v!>*QCD8{?VWIMfna5+KwJmJWf*41!5Q3Qj&uE`J)Y9JtH6vvD)G7jw1v6}Gm2 z&Z?6c6lSw9993ahp~h(MbBKjSQdmI5$05M*ppM_J=Ch~L8BWPHSbg9T5&(i42L0E! W4wS!koL&g@0fVQjpUXO@geCwsb7Iv1 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Upgraded Potion Blue_No Shadow.png b/examples/resource-bar/assets/Upgraded Potion Blue_No Shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..ab09a747c91c34b594281cba0551cd6f03daa023 GIT binary patch literal 3338 zcmV+l4fXPgP)uJ@VVD_U zC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1Q zpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X z6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv1)yUy0P^?0*fb9UASvow z`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q{wNRKos+;6rV8ldy0Owz z(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E` zvOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G41dM~{UdP z6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4Es0sQWIt5*Tu0n&*J!lk~ zf_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+AA{TB3-ERLHar49hi4Ih z5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=natP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+e zdD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVb znL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0WMyP6Wy582WNT#4$d1qu znl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8dZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iutvy=3T65Yu+7a4Yv^%sX zb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i^lS773}6Fm1Fpe-gF!>I zp{*g$u-szvGhed; zvo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*ZvFf(^Xl-N7w{EeXveC4O zv)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChY zI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_WICNY@+|jrX%s^&6b2i>5 zeqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!ql}XcFH*PieWwLj2ZSq`7 zV9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I-?$tAVKYn8-l({mqQ$Q8{ zO!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;cwT88(J6|n-WB%w`m$h~4 zpmp)YIh_3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dlbFb#!9eY1iCsp6Bajj|H zr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syTu9enWavU5N9)I?I-1m1* z_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$mU2Q)a|9JSc+Uc4zvS-T9 z63!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;;JuhGEb?H5K#o@~7t9DmU zU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX=)z6+o0o6-+`4{y+3mqQ z%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@>;2q1Vm)$Z)P1z?N$8UY zW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHsy69KwU-!MxeeuI@&cF4| zM9z%A)VV8tGge1YH zcqtMBkq)^if*>pu1X%~`5Omm8y13ZI7P2l99b8xtBoAp2nIL)amMut7hiyRyHj7n? zq}%JDZ(AeGwU$`gjG~`BX7>95Q3lY%F;S@+EUv7P?CI7%WQIjoYl*F$b`mi- zKRKsm;(1a0vMI+ZK`7TirD|w;IA%TOM^8^1-fDA%wC=LQ(PZ?K@#J zv;XmwR00{vgLF_h}O#}X3%Y6aZLF^Xf!z2*EzqF=*8#W!_586nK UclPvvuJ@VVD_U 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 Z_6HWOik#HSo^JpE002ovPDHLkV1n)bn;-xH literal 0 HcmV?d00001 diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json new file mode 100644 index 000000000..41c09dddb --- /dev/null +++ b/examples/resource-bar/game.json @@ -0,0 +1,18824 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 99, + "major": 4, + "minor": 0, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.gamename", + "pixelsRounding": false, + "projectUuid": "dcdbdf13-00be-4e01-88bc-1cb673a81d14", + "scaleMode": "linear", + "sizeOnStartupMode": "", + "templateSlug": "", + "useExternalSourceFiles": false, + "version": "1.0.0", + "name": "Extension: Resource Bar", + "description": "", + "author": "", + "windowWidth": 800, + "windowHeight": 600, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "authorIds": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "alwaysLoaded": false, + "file": "assets/Ranger_Carry_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Carry_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Carry_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Carry_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Carry_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Carry_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Carry_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Carry_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Climb_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Climb_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Climb_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Climb_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Climb_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Climb_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Climb_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Climb_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Daze_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Daze_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Daze_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Daze_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Daze_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Daze_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Daze_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Daze_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Dead.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Dead.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Dead.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Get Up.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Get Up.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Get Up.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Headbutt_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Headbutt_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Headbutt_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Headbutt_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Headbutt_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Headbutt_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Hurt.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Hurt.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Hurt.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 1_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 1_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 1_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 1_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 1_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 1_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 1_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 1_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 2_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 2_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 2_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 2_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 2_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 2_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Idle 2_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Idle 2_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Jump Kick_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Jump Kick_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Jump Kick_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Jump Kick_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Jump Kick_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Jump Kick_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Jump Kick_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Jump Kick_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Kick 1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Kick 1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Kick 1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Kick 2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Kick 2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Kick 2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Knockdown.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Knockdown.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Knockdown.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Over Throw_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Over Throw_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Over Throw_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Over Throw_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Over Throw_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Over Throw_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Pick Up 2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Pick Up 2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Pick Up 2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Pick Up.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Pick Up.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Pick Up.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Punch 1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Punch 1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Punch 1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Punch 2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Punch 2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Punch 2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Run_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Run_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Run_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Run_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Run_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Run_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Run_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Run_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Stab.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Stab.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Stab.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 1_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 1_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 1_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 1_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 1_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 1_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 1_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 1_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 2_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 2_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 2_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 2_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 2_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 2_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Strafe 2_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Strafe 2_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 1_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 1_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 1_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 1_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 1_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 1_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 1_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 1_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 2_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 2_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 2_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 2_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 2_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 2_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 2_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 2_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 3_1.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 3_1.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 3_2.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 3_2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 3_3.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 3_3.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Ranger_Walk 3_4.png", + "kind": "image", + "metadata": "", + "name": "Ranger_Walk 3_4.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_1.png", + "kind": "image", + "metadata": "", + "name": "Fly_1.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_1.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_10.png", + "kind": "image", + "metadata": "", + "name": "Fly_10.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_10.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_2.png", + "kind": "image", + "metadata": "", + "name": "Fly_2.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_2.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_3.png", + "kind": "image", + "metadata": "", + "name": "Fly_3.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_3.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_4.png", + "kind": "image", + "metadata": "", + "name": "Fly_4.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_4.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_5.png", + "kind": "image", + "metadata": "", + "name": "Fly_5.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_5.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_6.png", + "kind": "image", + "metadata": "", + "name": "Fly_6.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_6.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_7.png", + "kind": "image", + "metadata": "", + "name": "Fly_7.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_7.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_8.png", + "kind": "image", + "metadata": "", + "name": "Fly_8.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_8.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Fly_9.png", + "kind": "image", + "metadata": "", + "name": "Fly_9.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_9.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Star_LargeNarrow.png", + "kind": "image", + "metadata": "", + "name": "Star_LargeNarrow.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_LargeNarrow.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Star_LargeWide.png", + "kind": "image", + "metadata": "", + "name": "Star_LargeWide.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_LargeWide.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Star_Medium.png", + "kind": "image", + "metadata": "", + "name": "Star_Medium.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_Medium.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Star_Small.png", + "kind": "image", + "metadata": "", + "name": "Star_Small.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_Small.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Blue laser (01).png", + "kind": "image", + "metadata": "", + "name": "Blue laser (01).png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter/PNG/Lasers/Blue laser (01).png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Silver shield.png", + "kind": "image", + "metadata": "", + "name": "Silver shield.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter/PNG/Power-ups/Silver shield.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Meteor Detailed_Large.png", + "kind": "image", + "metadata": "", + "name": "Meteor Detailed_Large.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/meteors/Meteor Detailed_Large.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Meteor Detailed_Small.png", + "kind": "image", + "metadata": "", + "name": "Meteor Detailed_Small.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/meteors/Meteor Detailed_Small.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Upgraded Potion Blue_No Shadow.png", + "kind": "image", + "metadata": "", + "name": "Upgraded Potion Blue_No Shadow.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/32x32 Fantasy Icons Pack v2/Icons/Healing Items/Upgraded Potion Blue_No Shadow.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Upgraded Potion Blue_Shadow.png", + "kind": "image", + "metadata": "", + "name": "Upgraded Potion Blue_Shadow.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/32x32 Fantasy Icons Pack v2/Icons/Healing Items/Upgraded Potion Blue_Shadow.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Moon.png", + "kind": "image", + "metadata": "", + "name": "Moon.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Background/Moon.png", + "name": "gdevelop-asset-store" + } + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 0, + "disableInputWhenNotFocused": true, + "mangledName": "Game", + "name": "Game", + "oglFOV": 90, + "oglZFar": 500, + "oglZNear": 1, + "r": 0, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 0, + "uiSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 16, + "gridHeight": 16, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.2, + "snap": true, + "zoomFactor": 0.8599999999999999, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Health_Bar", + "persistentUuid": "a703603b-6259-4e18-bfa0-7d8794e4f837", + "width": 0, + "x": 192, + "y": 112, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Shield_Bar", + "persistentUuid": "b581caf8-44ee-423e-b57e-cdd910fb7374", + "width": 0, + "x": 192, + "y": 224, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ResourceMouseX_Bar", + "persistentUuid": "17a23f4a-a442-4b52-8380-9f2b6a9c2494", + "width": 0, + "x": 192, + "y": 544, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 80, + "layer": "", + "name": "Fly", + "persistentUuid": "e0b70af7-7a81-41c3-88ac-88305df91ed2", + "width": 128, + "x": 481.13275146484375, + "y": 293, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "name": "Moon", + "persistentUuid": "8428ea9d-6d1e-41b0-9f54-1840f3378846", + "width": 129.1327362060547, + "x": 480, + "y": 272, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Health_Text", + "persistentUuid": "921b2f28-8bee-4ab2-a6cc-1ee823c5215e", + "width": 0, + "x": 48, + "y": 96, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Shield_Text", + "persistentUuid": "a231209b-a5d8-4280-868d-1e9beb31527b", + "width": 0, + "x": 48, + "y": 208, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ResourceMouseX_Text", + "persistentUuid": "07fda015-55f8-4959-80fc-f1ee3074d028", + "width": 0, + "x": 32, + "y": 512, + "zOrder": 11, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Title_Text", + "persistentUuid": "29ae792c-1331-430c-aadf-70fa8d9e36d6", + "width": 0, + "x": 208, + "y": 16, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "assetStoreId": "", + "name": "Health_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DraggableSliderControl", + "type": "DraggableSliderControl::DraggableSliderControl", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "rectangle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": "74;144;226", + "ThumbOpacity": 255, + "TrackLength": 200, + "TrackThickness": 16, + "InactiveTrackColor": "", + "InactiveTrackOpacity": 96, + "ActiveTrackColor": " ", + "ActiveTrackOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedTrack": false, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0 + }, + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", + "DraggableSliderBehavior": "DraggableSliderControl" + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "MiniHealth_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DraggableSliderControl", + "type": "DraggableSliderControl::DraggableSliderControl", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "rectangle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": "11;255;0", + "ThumbOpacity": 255, + "TrackLength": 50, + "TrackThickness": 4, + "InactiveTrackColor": "", + "InactiveTrackOpacity": 96, + "ActiveTrackColor": " ", + "ActiveTrackOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedTrack": false, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0 + }, + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", + "DraggableSliderBehavior": "DraggableSliderControl" + }, + { + "name": "Sticker", + "type": "Sticker::Sticker", + "OnlyFollowPosition": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "Shield_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DraggableSliderControl", + "type": "DraggableSliderControl::DraggableSliderControl", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "rectangle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": "144;19;254", + "ThumbOpacity": 255, + "TrackLength": 200, + "TrackThickness": 16, + "InactiveTrackColor": "", + "InactiveTrackOpacity": 96, + "ActiveTrackColor": " ", + "ActiveTrackOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedTrack": false, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0 + }, + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", + "DraggableSliderBehavior": "DraggableSliderControl" + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "ResourceMouseX_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DraggableSliderControl", + "type": "DraggableSliderControl::DraggableSliderControl", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "circle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": "248;231;28", + "ThumbOpacity": 255, + "TrackLength": 200, + "TrackThickness": 16, + "InactiveTrackColor": "", + "InactiveTrackOpacity": 96, + "ActiveTrackColor": " ", + "ActiveTrackOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedTrack": true, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0 + }, + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", + "DraggableSliderBehavior": "DraggableSliderControl" + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "48a2d179a1921276abe3f99ce3cf195fa7c310bc511fa215d9647c3fb9027921", + "name": "Fly", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Health", + "type": "Health::Health", + "Health": 100, + "DamageCooldown": 0, + "MaxHealth": 100, + "IsJustDamaged": false, + "HealthRegenRate": 0, + "HealthRegenDelay": 0, + "AllowOverHealing": false, + "HitAtLeastOnce": false + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield", + "RequireHealth": "Health", + "MaxShieldPoints": 30, + "ShieldDuration": 5, + "ShieldPoints": 0, + "ShieldRegenRate": 0, + "ShieldBlocksExcessDamage": false, + "ShieldRegenDelay": 0, + "RegenShieldWhenZeroPoints": false, + "IsShieldJustDamaged": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.05000000074505806, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Fly_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "574655a4565bd983af8f5dd98e0fd8cda3bd67cf929c00d3db317e898322e06b", + "name": "Star", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "LargeNarrow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_LargeNarrow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "LargeWide", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_LargeWide.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Medium", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_Medium.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Small", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_Small.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "8d92592738465177b86ec18299ef6e6394ae24eeb7a7d6dfdcbbdb55fab902aa", + "name": "BlueLaser01", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Blue laser (01).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "794ab341df538c9b3bdad418dfdcccc7be5d90f3d0b5929d6d528a542c6ed3ae", + "name": "SilverShield", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Silver shield.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 14.592423439025879, + "y": 15.103429794311523 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "d2bc2d266f5bb666ef68023abc14f51bc8fe8b5222af931efa378ac10c50f98a", + "name": "MeteorDetailed", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Large", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Meteor Detailed_Large.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 65.07723999023438, + "y": 63.82252502441406 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 20, + "y": 20 + }, + { + "x": 110, + "y": 20 + }, + { + "x": 110, + "y": 110 + }, + { + "x": 20, + "y": 110 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Small", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Meteor Detailed_Small.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 65.07723999023438, + "y": 63.82252502441406 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 20, + "y": 20 + }, + { + "x": 110, + "y": 20 + }, + { + "x": 110, + "y": 110 + }, + { + "x": 20, + "y": 110 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "a1e62f5a19d1fe476e2ad0b8977768d020cc1dc55423427f79a486664cebb631", + "name": "UpgradedPotionBlue", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "No Shadow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Upgraded Potion Blue_No Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.793042182922363, + "y": 15.89681625366211 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Shadow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Upgraded Potion Blue_Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.793042182922363, + "y": 15.89681625366211 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "c2ce913ddbcd055c4e49a1c01b63aff1a3d59e4e1c1845db4c38aedda3712d3a", + "name": "Moon", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Sticker", + "type": "Sticker::Sticker", + "OnlyFollowPosition": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Moon.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Health_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Health", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Shield_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Shield", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "ResourceMouseX_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Resource \n(Mouse X)", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Title_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Extension: Draw Resource Bar", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Initialize game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "Moon", + "=", + "128" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MaxResource", + "=", + "CameraBorderRight()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Moon", + "\"144;19;254\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Moon", + "=", + "Fly.CenterX()", + "=", + "Fly.CenterY()-10" + ] + }, + { + "type": { + "value": "Sticker::Sticker::Stick" + }, + "parameters": [ + "Moon", + "Sticker", + "Fly", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Moon" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MiniHealth_Bar", + "Fly.X()", + "Fly.Y()", + "\"\"" + ] + }, + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "MiniHealth_Bar", + "=", + "Fly.CenterX() - MiniHealth_Bar.DraggableSliderControl::TrackLength()/2", + "=", + "Fly.BoundingBoxTop()" + ] + }, + { + "type": { + "value": "Sticker::Sticker::Stick" + }, + "parameters": [ + "MiniHealth_Bar", + "Sticker", + "Fly", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Draw Resource bars", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::DrawHealthBar" + }, + "parameters": [ + "Health_Bar", + "DrawResourceBar", + "Fly", + "Health", + "" + ] + }, + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::DrawHealthBar" + }, + "parameters": [ + "MiniHealth_Bar", + "DrawResourceBar", + "Fly", + "Health", + "" + ] + }, + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::DrawShieldBar" + }, + "parameters": [ + "Shield_Bar", + "DrawResourceBar", + "Fly", + "Shield", + "" + ] + }, + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::DrawResourceBar" + }, + "parameters": [ + "ResourceMouseX_Bar", + "DrawResourceBar", + "Variable(MyResource)", + "Variable(MaxResource)", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This resource bar is used to show the horizontal mouse position in scene, but it can be used for anything!", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MyResource", + "=", + "MouseX()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Spawn items", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnShield\"", + "5", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "SilverShield", + "Fly.CenterX()", + "CameraBorderTop()", + "" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "SilverShield", + "90", + "75", + "1" + ] + }, + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "SilverShield", + "\"144;19;254\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnHealth\"", + "12", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UpgradedPotionBlue", + "Fly.CenterX()", + "CameraBorderBottom()", + "" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "UpgradedPotionBlue", + "270", + "75", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnRock\"", + "1", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MeteorDetailed", + "CameraBorderLeft()", + "Fly.CenterY()", + "" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "MeteorDetailed", + "0", + "300", + "1" + ] + }, + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "MeteorDetailed", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Rotate" + }, + "parameters": [ + "MeteorDetailed", + "30", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Collisions", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Moon", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Moon" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "SilverShield", + "Fly", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::ActivateShield" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "SilverShield", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "UpgradedPotionBlue", + "Fly", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::Heal" + }, + "parameters": [ + "Fly", + "Health", + "100", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "UpgradedPotionBlue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "MeteorDetailed", + "Fly", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::ShieldHit" + }, + "parameters": [ + "Fly", + "Shield", + "10", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "MeteorDetailed", + "" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Fly", + "ShakeObject_PositionAngleScale", + "", + "10", + "10", + "5", + "", + "", + "", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 32, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "DraggableSliderControl", + "type": "DraggableSliderControl::DraggableSliderControl" + }, + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield" + }, + { + "name": "Sticker", + "type": "Sticker::Sticker" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "@Bouh, D8H", + "category": "General", + "description": "This extension provides: \n- Conditions to check if a global/scene/object variable exists.\n- Actions to copy object variables, global and scene variables.\n- Actions to delete an existing global/scene variable from memory.\n- Actions to create a global/scene variable using a text expression, rather than a variable name input.\n- Expressions to get the value or text from a global/scene variable using a text expression, rather than a variable name.\n\nText expressions allows to enter the name of the variable with an expression like `\"MyVar\"+ ToString(Variable(Health))`", + "extensionNamespace": "", + "fullName": "Extended variables support", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXZhcmlhYmxlLWJveCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOSAzSDVDMy45IDMgMyAzLjkgMyA1VjE5QzMgMjAuMSAzLjkgMjEgNSAyMUgxOUMyMC4xIDIxIDIxIDIwLjEgMjEgMTlWNUMyMSAzLjkgMjAuMSAzIDE5IDNNNy40IDE4QzUuOSAxNi41IDUgMTQuMyA1IDEyUzUuOSA3LjUgNy40IDZMOSA2LjdDNy43IDcuOSA3IDkuOSA3IDEyUzcuNyAxNi4xIDkgMTcuM0w3LjQgMThNMTIuNyAxNUwxMS45IDEzTDEwLjUgMTVIOUwxMS4zIDExLjlMMTAgOUgxMS4zTDEyLjEgMTFMMTMuNSA5SDE1TDEyLjggMTJMMTQuMSAxNUgxMi43TTE2LjYgMThMMTUgMTcuM0MxNi4zIDE2IDE3IDE0LjEgMTcgMTJTMTYuMyA3LjkgMTUgNi43TDE2LjYgNkMxOC4xIDcuNSAxOSA5LjcgMTkgMTJTMTguMSAxNi41IDE2LjYgMThaIiAvPjwvc3ZnPg==", + "name": "ExtendedVariables", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/variable-box.svg", + "shortDescription": "Add conditions, actions and expressions to check for the existence of a variable, copy variables, delete existing ones from memory, and create dynamic variables.", + "version": "1.0.0", + "origin": { + "identifier": "ExtendedVariables", + "name": "gdevelop-extension-store" + }, + "tags": [ + "variable", + "scene", + "global", + "object", + "remove", + "expression", + "copy", + "structure", + "array", + "boolean", + "duplication" + ], + "authorIds": [ + "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "eventsFunctions": [ + { + "description": "Check if a global variable exists.", + "fullName": "Global variable exists", + "functionType": "Condition", + "group": "Deprecated", + "name": "C_global_variable_exist", + "private": true, + "sentence": "If the global variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ExtendedVariables::GlobalVariableExist" + }, + "parameters": [ + "", + "GetArgumentAsString(\"GlobalVariableName\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the global variable exists.", + "fullName": "Global variable exists", + "functionType": "Condition", + "group": "Global variables", + "name": "GlobalVariableExist", + "private": false, + "sentence": "If the global variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\neventsFunctionContext.returnValue = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a scene variable exists.", + "fullName": "Scene variable exists", + "functionType": "Condition", + "group": "Deprecated", + "name": "C_scene_variable_exist", + "private": true, + "sentence": "If the scene variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ExtendedVariables::SceneVariableExist" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the scene variable exists.", + "fullName": "Scene variable exists", + "functionType": "Condition", + "group": "Scene variables", + "name": "SceneVariableExist", + "private": false, + "sentence": "If the scene variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\neventsFunctionContext.returnValue = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object variable exists.", + "fullName": "Object variable exists", + "functionType": "Condition", + "group": "Deprecated", + "name": "C_object_variable_exist", + "private": true, + "sentence": "Object _PARAM1_ has object variable _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ExtendedVariables::ObjectVariableExist" + }, + "parameters": [ + "", + "ObjectToCheck", + "GetArgumentAsString(\"ObjectVariableName\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "ObjectToCheck", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of object variable", + "longDescription": "", + "name": "ObjectVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object variable exists.", + "fullName": "Object variable exists", + "functionType": "Condition", + "group": "Object variables", + "name": "ObjectVariableExist", + "private": false, + "sentence": "Object _PARAM1_ has object variable _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "let returnValue = true;\r\nif (!objects.length) {\r\n returnValue = false;\r\n} else {\r\n const objectVariableName = eventsFunctionContext.getArgument(\"ObjectVariableName\");\r\n for (let i = 0; i < objects.length; i++) {\r\n if (!objects[i].hasVariable(objectVariableName)) {\r\n // If any object does NOT have the variable, return false.\r\n returnValue = false;\r\n break;\r\n }\r\n }\r\n}\r\n\r\neventsFunctionContext.returnValue = returnValue;", + "parameterObjects": "ObjectToCheck", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "ObjectToCheck", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of object variable", + "longDescription": "", + "name": "ObjectVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete a global variable, removing it from memory.", + "fullName": "Delete global variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Delete_global_variable", + "private": true, + "sentence": "Delete global variable _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::DeleteGlobalVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"GlobalVariableName\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable to delete", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete the global variable, removing it from memory.", + "fullName": "Delete global variable", + "functionType": "Action", + "group": "Global variables", + "name": "DeleteGlobalVariable", + "private": false, + "sentence": "Delete the global variable _PARAM1_ from memory", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "runtimeScene.getGame().getVariables().remove(eventsFunctionContext.getArgument(\"GlobalVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable to delete", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a scene variable.", + "fullName": "String of a scene variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_scene_variable_string", + "private": true, + "sentence": "Change the text of scene variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::ModifySceneVariableString" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "SceneVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a scene variable.", + "fullName": "String of a scene variable", + "functionType": "Action", + "group": "Scene variables", + "name": "ModifySceneVariableString", + "private": false, + "sentence": "Change the text of scene variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\nvariable.setString(eventsFunctionContext.getArgument(\"SceneVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "SceneVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a global variable.", + "fullName": "String of a global variable", + "functionType": "Action", + "group": "Global variables", + "name": "ModifyGlobalVariableString", + "private": false, + "sentence": "Change the text of global variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\nvariable.setString(eventsFunctionContext.getArgument(\"GlobalVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "GlobalVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a global variable.", + "fullName": "Value of a global variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_global_variable", + "private": true, + "sentence": "Change the global variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::ModifyGlobalVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "SceneVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a global variable.", + "fullName": "String of a global variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_global_variable_string", + "private": true, + "sentence": "Change the text of global variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::ModifyGlobalVariableString" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "SceneVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a global variable.", + "fullName": "Value of a global variable", + "functionType": "Action", + "group": "Global variables", + "name": "ModifyGlobalVariable", + "private": false, + "sentence": "Change the global variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\nvariable.setNumber(eventsFunctionContext.getArgument(\"GlobalVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "GlobalVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a scene variable.", + "fullName": "Value of a scene variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_scene_variable", + "private": true, + "sentence": "Change the scene variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::ModifySceneVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "SceneVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a scene variable.", + "fullName": "Value of a scene variable", + "functionType": "Action", + "group": "Scene variables", + "name": "ModifySceneVariable", + "private": false, + "sentence": "Change the scene variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\nvariable.setNumber(eventsFunctionContext.getArgument(\"SceneVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "SceneVariableValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Delete scene variable, the variable will be deleted from the memory.", + "fullName": "Delete scene variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Delete_scene_variable", + "private": true, + "sentence": "Delete the scene variable _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::DeleteSceneVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable to delete", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete the scene variable, the variable will be deleted from the memory.", + "fullName": "Delete scene variable", + "functionType": "Action", + "group": "Scene variables", + "name": "DeleteSceneVariable", + "private": false, + "sentence": "Delete the scene variable _PARAM1_ from memory", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "runtimeScene.getVariables().remove(eventsFunctionContext.getArgument(\"SceneVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable to delete", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Copy an object variable from one object to another.", + "fullName": "Copy an object variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_CopyObjectVariable", + "private": true, + "sentence": "Copy the variable _PARAM1_ of _PARAM2_ to the variable _PARAM3_ of _PARAM4_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::CopyObjectVariable" + }, + "parameters": [ + "", + "SourceObject", + "GetArgumentAsString(\"SourceVariableName\")", + "TargetObject", + "GetArgumentAsString(\"TargetVariableName\")", + "no", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Source object", + "longDescription": "", + "name": "SourceObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Variable to copy", + "longDescription": "", + "name": "SourceVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Destination object", + "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", + "name": "TargetObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Destination variable", + "longDescription": "", + "name": "TargetVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Copy the object variable from one object to another.", + "fullName": "Copy an object variable", + "functionType": "Action", + "group": "Object variables", + "name": "CopyObjectVariable", + "private": false, + "sentence": "Copy the variable _PARAM2_ of _PARAM1_ to the variable _PARAM4_ of _PARAM3_ (clear destination first: _PARAM5_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sourceObject = eventsFunctionContext.getObjects(\"SourceObject\")[0];\nconst targetObject = eventsFunctionContext.getObjects(\"TargetObject\")[0];\nconst sourceVariableName = eventsFunctionContext.getArgument(\"SourceVariableName\");\nconst targetVariableName = eventsFunctionContext.getArgument(\"TargetVariableName\");\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\nconst sourceVariables = sourceObject.getVariables();\nconst targetVariables = targetObject.getVariables();\n\nif (sourceVariables.has(sourceVariableName))\n{\n gdjs.Variable.copy\n (\n sourceVariables.get(sourceVariableName),\n targetVariables.get(targetVariableName),\n isExactCopy\n );\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Source object", + "longDescription": "", + "name": "SourceObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Variable to copy", + "longDescription": "", + "name": "SourceVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Destination object", + "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", + "name": "TargetObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Destination variable", + "longDescription": "", + "name": "TargetVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "yes", + "description": "Clear destination first", + "longDescription": "", + "name": "isExactCopy", + "optional": true, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Copy all object variables from one object to another.", + "fullName": "Copy all object variables", + "functionType": "Action", + "group": "Deprecated", + "name": "A_CopyAllObjectVariables", + "private": true, + "sentence": "Copy all variables from _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::CopyAllObjectVariables" + }, + "parameters": [ + "", + "SourceObject", + "TargetObject", + "no", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Source object", + "longDescription": "", + "name": "SourceObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Destination object", + "longDescription": "", + "name": "TargetObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Copy all object variables from one object to another.", + "fullName": "Copy all object variables", + "functionType": "Action", + "group": "Object variables", + "name": "CopyAllObjectVariables", + "private": false, + "sentence": "Copy all variables from object _PARAM1_ to object _PARAM2_ (clear destination first: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "// This JS event use private scope from the API, this can be borken at anytime.\n\nconst sourceObject = eventsFunctionContext.getObjects(\"SourceObject\")[0];\nconst targetObject = eventsFunctionContext.getObjects(\"TargetObject\")[0];\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\nconst targetVariables = targetObject.getVariables();\nconst sourceVariables = sourceObject.getVariables()._variables.items;\nfor (const variableName in sourceVariables)\n{\n if (sourceVariables.hasOwnProperty(variableName))\n {\n gdjs.Variable.copy(sourceVariables[variableName], targetVariables.get(variableName), isExactCopy);\n }\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Source object", + "longDescription": "", + "name": "SourceObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Destination object", + "longDescription": "", + "name": "TargetObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "yes", + "description": "Clear destination first", + "longDescription": "", + "name": "isExactCopy", + "optional": true, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Delete an object variable, removing it from memory.", + "fullName": "Delete object variable", + "functionType": "Action", + "group": "Object variables", + "name": "DeleteObjectVariable", + "private": false, + "sentence": "Delete for the object _PARAM1_ the object variable _PARAM2_ from the memory", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const object = eventsFunctionContext.getObjects(\"Object\")[0];\r\nconst objectVariables = object.getVariables();\r\n\r\nobjectVariables.remove(eventsFunctionContext.getArgument(\"VariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of object variable", + "longDescription": "", + "name": "VariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the text of a global variable.", + "fullName": "Text of a global variable", + "functionType": "StringExpression", + "group": "Global variables", + "name": "GlobalVariableString", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\nconst variableExist = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = globalVariables.get(eventsFunctionContext.getArgument(\"GlobalVariableName\")).getAsString();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the text of a scene variable.", + "fullName": "Text of a scene variable", + "functionType": "StringExpression", + "group": "Scene variables", + "name": "VariableString", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\nconst variableExist = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = sceneVariables.get(eventsFunctionContext.getArgument(\"SceneVariableName\")).getAsString();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the value of a global variable.", + "fullName": "Value of a global variable", + "functionType": "Expression", + "group": "Global variables", + "name": "GlobalVariable", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\nconst variableExist = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = globalVariables.get(eventsFunctionContext.getArgument(\"GlobalVariableName\")).getAsNumber();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the global variable", + "longDescription": "", + "name": "GlobalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the value of a scene variable.", + "fullName": "Value of a scene variable", + "functionType": "Expression", + "group": "Scene variables", + "name": "Variable", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\nconst variableExist = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = sceneVariables.get(eventsFunctionContext.getArgument(\"SceneVariableName\")).getAsNumber();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Name of the scene variable", + "longDescription": "", + "name": "SceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Copy the global variable to scene. This copy everything from the types to the values.", + "fullName": "Copy a global variable to scene", + "functionType": "Action", + "group": "Convert", + "name": "CopyGlobalVariableToScene", + "private": false, + "sentence": "Copy the global variable:_PARAM1_ to a scene variable:_PARAM2_ (clear destination first: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"globalVariableName\"));\nconst sceneVariable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"sceneVariableName\"));\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\ngdjs.Variable.copy(globalVariable, sceneVariable, isExactCopy);\n", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Global variable to copy", + "longDescription": "", + "name": "globalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Scene variable destination", + "longDescription": "", + "name": "sceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "yes", + "description": "Clear destination first", + "longDescription": "", + "name": "isExactCopy", + "optional": true, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Copy the scene variable to global. This copy everything from the types to the values.", + "fullName": "Copy a scene variable to global ", + "functionType": "Action", + "group": "Copy variables", + "name": "CopySceneVariableToGlobal", + "private": false, + "sentence": "Copy the scene variable:_PARAM1_ to a global variable:_PARAM2_ (clear destination first: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"sceneVariableName\"));\nconst globalVariable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"globalVariableName\"));\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\ngdjs.Variable.copy(sceneVariable, globalVariable, isExactCopy);", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Scene variable to copy", + "longDescription": "", + "name": "sceneVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Global variable destination", + "longDescription": "", + "name": "globalVariableName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "yes", + "description": "Clear destination first", + "longDescription": "", + "name": "isExactCopy", + "optional": true, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [] + }, + { + "author": "D8H", + "category": "", + "description": "This extension can be useful for:\n* Stick an accessory to a moving object,\n* Animate a skeleton.", + "extensionNamespace": "", + "fullName": "Stick objects to others", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXN0aWNrZXItb3V0bGluZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik01LjUgMkMzLjYgMiAyIDMuNiAyIDUuNVYxOC41QzIgMjAuNCAzLjYgMjIgNS41IDIySDE2TDIyIDE2VjUuNUMyMiAzLjYgMjAuNCAyIDE4LjUgMkg1LjVNNS44IDRIMTguM0MxOS4zIDQgMjAuMSA0LjggMjAuMSA1LjhWMTVIMTguNkMxNi43IDE1IDE1LjEgMTYuNiAxNS4xIDE4LjVWMjBINS44QzQuOCAyMCA0IDE5LjIgNCAxOC4yVjUuOEM0IDQuOCA0LjggNCA1LjggNCIgLz48L3N2Zz4=", + "name": "Sticker", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/sticker-outline.svg", + "shortDescription": "Behavior to stick objects to other objects - so that they follow the position and rotation of the object they are stuck to.", + "version": "0.3.4", + "origin": { + "identifier": "Sticker", + "name": "gdevelop-extension-store" + }, + "tags": [ + "sticker", + "stick", + "follow", + "skeleton", + "joint" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "eventsFunctions": [ + { + "description": "Check if the object is stuck to another object.", + "fullName": "Is stuck to another object", + "functionType": "Condition", + "group": "", + "name": "IsStuck", + "private": false, + "sentence": "_PARAM1_ is stuck to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const stickerBehaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\n/** @type {Hashtable} */\nconst stickerObjectsLists = eventsFunctionContext.getObjectsLists(\"Object\");\n/** @type {Hashtable} */\nconst basisObjectsLists = eventsFunctionContext.getObjectsLists(\"BasisObject\");\n\neventsFunctionContext.returnValue = gdjs.evtTools.object.twoListsTest(\n (stickerObject, basisObject, stickerBehaviorName) => {\n const behavior = stickerObject.getBehavior(stickerBehaviorName);\n return behavior.basisObject === basisObject;\n },\n stickerObjectsLists,\n basisObjectsLists,\n false,\n stickerBehaviorName\n);", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Sticker", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Sticker behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Basis", + "longDescription": "", + "name": "BasisObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Stick the object to another. Use the action to stick the object, or unstick it later.", + "fullName": "Sticker", + "name": "Sticker", + "objectType": "", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\n// Set up the scene sticker objects list - if not done already.\nif (!runtimeScene.__allStickers)\n runtimeScene.__allStickers = new Set();\n\n// Set up the behavior extra methods - if not done already.\nconst prototype = Object.getPrototypeOf(behavior);\nif (!prototype.updateRelativeCoordinates) {\n // Unstick from deleted objects.\n gdjs.registerObjectDeletedFromSceneCallback(function (runtimeScene, deletedObject) {\n if (!runtimeScene.__allStickers) return;\n\n for (const sticker of runtimeScene.__allStickers) {\n if (sticker.basisObject === deletedObject) {\n sticker.basisObject = null;\n }\n }\n });\n\n /**\n * Update the coordinates in the basisObject basis.\n * \n * It uses the basisObject coordinates from the previous frame.\n * This way, the sticker can move relatively to it and still\n * follow basisObject.\n * \n * @param {gdjs.RuntimeObject} basisObject\n */\n prototype.updateRelativeCoordinates = function (basisObject) {\n const object = this.owner;\n\n // Update relative coordinates\n this.relativeX = object.getX() - this.basisOldX;\n this.relativeY = object.getY() - this.basisOldY;\n if (!this._getOnlyFollowPosition()) {\n this.relativeAngle = object.getAngle() - this.basisOldAngle;\n this.relativeWidth = object.getWidth() / this.basisOldWidth;\n this.relativeHeight = object.getHeight() / this.basisOldHeight;\n const deltaX = object.getCenterXInScene() - this.basisOldCenterXInScene;\n const deltaY = object.getCenterYInScene() - this.basisOldCenterYInScene;\n const angle = this.basisOldAngle * Math.PI / 180;\n this.relativeRotatedX = (deltaX * Math.cos(angle) + deltaY * Math.sin(angle)) / this.basisOldWidth;\n this.relativeRotatedY = (-deltaX * Math.sin(angle) + deltaY * Math.cos(angle)) / this.basisOldHeight;\n\n // Save initial values to avoid calculus and rounding errors\n this.basisOriginalWidth = basisObject.getWidth();\n this.basisOriginalHeight = basisObject.getHeight();\n this.basisOriginalAngle = basisObject.getAngle();\n }\n }\n\n /**\n * Copy the coordinates to use it the next frame.\n * @param basisObject {gdjs.RuntimeObject}\n */\n prototype.updateOldCoordinates = function (basisObject) {\n const object = this.owner;\n\n this.ownerOldX = object.getX();\n this.ownerOldY = object.getY();\n\n this.basisOldX = basisObject.getX();\n this.basisOldY = basisObject.getY();\n\n if (!this._getOnlyFollowPosition()) {\n this.ownerOldAngle = object.getAngle();\n this.ownerOldWidth = object.getWidth();\n this.ownerOldHeight = object.getHeight();\n\n this.basisOldAngle = basisObject.getAngle();\n this.basisOldWidth = basisObject.getWidth();\n this.basisOldHeight = basisObject.getHeight();\n this.basisOldCenterXInScene = basisObject.getCenterXInScene();\n this.basisOldCenterYInScene = basisObject.getCenterYInScene();\n }\n }\n /**\n * Follow the basisObject (called in doStepPostEvents).\n * \n * This method is also called by children to ensure\n * parents are updated first.\n */\n prototype.followBasisObject = function () {\n if (this.followingDoneThisFrame) {\n return;\n }\n this.followingDoneThisFrame = true;\n /** @type {gdjs.RuntimeObject} */\n const basisObject = this.basisObject;\n if (basisObject) {\n // If the behavior on the basis object has a different name,\n // the objects will still follow their basis objects\n // but frame delays could happen.\n if (basisObject.hasBehavior(behaviorName)) {\n const basisBehavior = basisObject.getBehavior(behaviorName);\n if (basisBehavior.type === this.type) {\n // Follow parents 1st to avoid frame delays\n basisBehavior.followBasisObject();\n }\n }\n\n const object = this.owner;\n\n if (this._getOnlyFollowPosition()) {\n if (object.getX() !== this.ownerOldX\n || object.getY() !== this.ownerOldY) {\n this.updateRelativeCoordinates(basisObject);\n }\n\n if (this.basisOldX !== basisObject.getX() ||\n this.basisOldY !== basisObject.getY()) {\n object.setPosition(\n basisObject.getX() + this.relativeX,\n basisObject.getY() + this.relativeY);\n }\n } else {\n if (object.getX() !== this.ownerOldX\n || object.getY() !== this.ownerOldY\n || object.getAngle() !== this.ownerOldAngle\n || object.getWidth() !== this.ownerOldWidth\n || object.getHeight() !== this.ownerOldHeight) {\n this.updateRelativeCoordinates(basisObject);\n }\n\n // Follow basisObject\n if (basisObject.getAngle() === this.basisOriginalAngle && this.basisOriginalAngle === 0) {\n if (basisObject.getWidth() === this.basisOriginalWidth ||\n basisObject.getHeight() === this.basisOriginalHeight) {\n if (this.basisOldX !== basisObject.getX() ||\n this.basisOldY !== basisObject.getY()) {\n object.setPosition(\n basisObject.getX() + this.relativeX,\n basisObject.getY() + this.relativeY);\n }\n } else {\n object.setPosition(\n basisObject.getX() + this.relativeRotatedX * basisObject.getWidth(),\n basisObject.getY() + this.relativeRotatedY * basisObject.getHeight());\n }\n } else {\n object.setAngle(basisObject.getAngle() + this.relativeAngle);\n\n const deltaX = this.relativeRotatedX * basisObject.getWidth();\n const deltaY = this.relativeRotatedY * basisObject.getHeight();\n const angle = -basisObject.getAngle() * Math.PI / 180;\n object.setX(basisObject.getCenterXInScene() + object.getX() - object.getCenterXInScene() + deltaX * Math.cos(angle) + deltaY * Math.sin(angle));\n object.setY(basisObject.getCenterYInScene() + object.getY() - object.getCenterYInScene() - deltaX * Math.sin(angle) + deltaY * Math.cos(angle));\n }\n // Unproportional dimensions changes won't work as expected\n // if the object angle is not null but nothing more can be done\n // because there is no full affine transformation on objects.\n if (basisObject.getWidth() !== this.basisOriginalWidth) {\n object.setWidth(this.relativeWidth * basisObject.getWidth());\n }\n if (basisObject.getHeight() !== this.basisOriginalHeight) {\n object.setHeight(this.relativeHeight * basisObject.getHeight());\n }\n }\n\n this.updateOldCoordinates(basisObject);\n }\n }\n}\n\n// Register this object as a sticker.\nruntimeScene.__allStickers.add(behavior);\n", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPreEvents", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.followingDoneThisFrame = false;", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPostEvents", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.followBasisObject();", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stick on another object.", + "fullName": "Stick", + "functionType": "Action", + "group": "", + "name": "Stick", + "private": false, + "sentence": "Stick _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const object = objects[0];\nconst behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst basisObjects = eventsFunctionContext.getObjects(\"BasisObject\");\n\nif (basisObjects.length === 0) return;\nconst basisObject = basisObjects[0];\n\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.basisObject = basisObject;\nbehavior.updateOldCoordinates(basisObject);\nbehavior.updateRelativeCoordinates(basisObject);\n", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object to stick to", + "longDescription": "", + "name": "BasisObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Unstick from the object it was stuck to.", + "fullName": "Unstick", + "functionType": "Action", + "group": "", + "name": "Unstick", + "private": false, + "sentence": "Unstick _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const object = objects[0];\nconst behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.basisObject = null;", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onDestroy", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nif (runtimeScene.__allStickers)\n runtimeScene.__allStickers.delete(behavior);\n", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Boolean", + "label": "Only follow the position", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "OnlyFollowPosition" + } + ] + } + ] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "", + "description": "Select one or more methods of shaking:\n- Position: Shake the X and/or Y position of the object \n- Angle: Shake the angle (rotation) of the object \n- Scale: Shake the scale of the object (must be a sprite)\n\nControl how the object shakes:\n- Amplitude: How far the object moves during each shake\n- Duration: Amount of time to shake the object\n- Time between shakes: Amount of time between each movement of the object\n- Keep shaking until stopped (boolean)\n\nTips:\n- For a single-shake effect, set the \"Time between shakes\" to be equal to \"Duration\" (great for a hit or impact)\n- To make the single-shake move in the opposite direction, use negative numbers \n- To repeat a single-shake effect in a loop, add a condition \"Object is not shaking\" \n- Use a long \"Time between shakes\" to simulate a slow moving object (like a ship rocking back and forth)\n- Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. \n- Use \"Shake until stopped\" to simulate engine vibration, earthquake, or pulsing", + "extensionNamespace": "", + "fullName": "Shake Object (position, angle, scale)", + "helpPath": "https://victrisgames.itch.io/gdevelop-camera-shake-example", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWFycm93LWFsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMywxMUgxOEwxNi41LDkuNUwxNy45Miw4LjA4TDIxLjg0LDEyTDE3LjkyLDE1LjkyTDE2LjUsMTQuNUwxOCwxM0gxM1YxOEwxNC41LDE2LjVMMTUuOTIsMTcuOTJMMTIsMjEuODRMOC4wOCwxNy45Mkw5LjUsMTYuNUwxMSwxOFYxM0g2TDcuNSwxNC41TDYuMDgsMTUuOTJMMi4xNiwxMkw2LjA4LDguMDhMNy41LDkuNUw2LDExSDExVjZMOS41LDcuNUw4LjA4LDYuMDhMMTIsMi4xNkwxNS45Miw2LjA4TDE0LjUsNy41TDEzLDZWMTFaIiAvPjwvc3ZnPg==", + "name": "ShakeObject", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/arrow-all.svg", + "shortDescription": "Shake an object, using one or more ways to shake (position, angle, scale).", + "version": "1.5.5", + "origin": { + "identifier": "ShakeObject", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shaking", + "object", + "effect", + "shake", + "scale", + "position", + "rotate", + "angle" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).\nThis behavior can be used on any type of object.", + "fullName": "Shake object (position, angle)", + "name": "ShakeObject_PositionAngle", + "objectType": "", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).", + "fullName": "Shake object (position, angle)", + "functionType": "Action", + "group": "", + "name": "ShakeObject_PositionAngle", + "private": false, + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_. Wait _PARAM6_ seconds between shakes. Keep shaking until stopped: _PARAM7_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Duration of shake (in seconds) (Default: 0.5) ", + "longDescription": "", + "name": "Duration", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "longDescription": "", + "name": "PowerX", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "longDescription": "", + "name": "PowerY", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "longDescription": "", + "name": "PowerAngle", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "longDescription": "", + "name": "TimeBetweenShakes", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPostEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 *(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop any shaking of object that was initiated by the Shake Object extension.", + "fullName": "Stop shaking the object", + "functionType": "Action", + "group": "", + "name": "StopShaking", + "private": false, + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "group": "", + "name": "IsShaking", + "private": false, + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [] + }, + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale)\nThis behavior can only be used on sprite objects.", + "fullName": "Shake object (position, angle, scale)", + "name": "ShakeObject_PositionAngleScale", + "objectType": "Sprite", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale).", + "fullName": "Shake object (position, angle, scale)", + "functionType": "Action", + "group": "", + "name": "ShakeObject_PositionAngleScale", + "private": false, + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_, and scale amplitude _PARAM6_. Wait _PARAM7_ seconds between shakes. Keep shaking until stopped: _PARAM8_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "=", + "GetArgumentAsNumber(\"PowerScale\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Duration of shake (in seconds) (Default: 0.5)", + "longDescription": "", + "name": "Duration", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "longDescription": "", + "name": "PowerX", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "longDescription": "", + "name": "PowerY", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "longDescription": "", + "name": "PowerAngle", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amplitude of scale shake (in percent change) (For example: 5)", + "longDescription": "", + "name": "PowerScale", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "longDescription": "", + "name": "TimeBetweenShakes", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPostEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Scale shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate object scale displacement, with linear decay over time", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every even shake, increase scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, decrease scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = -1 * (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop shaking an object.", + "fullName": "Stop shaking an object", + "functionType": "Action", + "group": "", + "name": "StopShaking", + "private": false, + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "group": "", + "name": "IsShaking", + "private": false, + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [] + } + ] + }, + { + "author": "VegeTato, arthuro555", + "category": "", + "description": "Convenience conditions, actions and behaviors for timers to trigger a condition every X seconds.", + "extensionNamespace": "", + "fullName": "Repeat every X seconds", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXJlcGVhdCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNywxN0g3VjE0TDMsMThMNywyMlYxOUgxOVYxM0gxN003LDdIMTdWMTBMMjEsNkwxNywyVjVINVYxMUg3VjdaIiAvPjwvc3ZnPg==", + "name": "RepeatEveryXSeconds", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/repeat.svg", + "shortDescription": "This allows to trigger an event every X seconds.", + "version": "0.1.0", + "origin": { + "identifier": "RepeatEveryXSeconds", + "name": "gdevelop-extension-store" + }, + "tags": [ + "repeat", + "timer", + "time", + "convenience" + ], + "authorIds": [ + "ZgrsWuRTAkXgeuPV9bo0zuEcA2w1", + "IRIhkkTTl2UHhfjrLTTH5GYwkYu1" + ], + "dependencies": [], + "eventsFunctions": [ + { + "description": "Triggers every X seconds.", + "fullName": "Repeat every X seconds", + "functionType": "Condition", + "group": "", + "name": "Repeat", + "private": false, + "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Timer" + }, + "parameters": [ + "player", + "GetArgumentAsNumber(\"time\")", + "GetArgumentAsString(\"timerName\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "The name of the timer to loop", + "longDescription": "", + "name": "timerName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "The time in seconds between each trigger", + "longDescription": "", + "name": "time", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Triggers every X seconds X amount of times.", + "fullName": "Repeat every X seconds in X number", + "functionType": "Condition", + "group": "", + "name": "RepeatXTimes", + "private": false, + "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds _PARAM3_ times", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Timer" + }, + "parameters": [ + "player", + "GetArgumentAsNumber(\"time\")", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"limit\")", + "=", + "-1" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", + "<", + "GetArgumentAsNumber(\"limit\")" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", + "+", + "1" + ] + }, + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "The name of the timer to loop", + "longDescription": "", + "name": "timerName", + "optional": false, + "supplementaryInformation": "", + "type": "string" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "The time in seconds between each trigger", + "longDescription": "", + "name": "time", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "The limit of loops", + "longDescription": "The condition will trigger at most this amount of times. Make it -1 for looping forever.", + "name": "limit", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Allows to repeat an object timer every X seconds.", + "fullName": "Repeat every X seconds", + "name": "RepeatTimer", + "objectType": "", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Triggers every X seconds, where X is defined in the behavior properties.", + "fullName": "Repeat every X seconds", + "functionType": "Condition", + "group": "", + "name": "Repeat", + "private": false, + "sentence": "Recurring timer _PARAM1_ of _PARAM0_ has triggered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()", + "Object.Behavior::PropertyTimerLength()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::PropertyLimit" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + }, + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::PropertyCounter" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyLimit()" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + }, + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::SetPropertyCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + }, + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Pauses a recurring timer.", + "fullName": "Pause a recurring timer", + "functionType": "Action", + "group": "", + "name": "Pause", + "private": false, + "sentence": "Pause recurring timer _PARAM1_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PauseObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Resumes a paused recurring timer.", + "fullName": "Resume a recurring timer", + "functionType": "Action", + "group": "", + "name": "Resume", + "private": false, + "sentence": "Resume recurring timer _PARAM1_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "UnPauseObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Allows to trigger the recurring timer X times again.", + "fullName": "Reset the limit", + "functionType": "Action", + "group": "", + "name": "ResetLimit", + "private": false, + "sentence": "Allow to trigger the recurring timer _PARAM1_ of _PARAM0_ X times again", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::SetPropertyCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "MyTimer", + "type": "String", + "label": "The name of the timer to repeat", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TimerName" + }, + { + "value": "1", + "type": "Number", + "label": "The time between each trigger (in seconds)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TimerLength" + }, + { + "value": "-1", + "type": "Number", + "label": "How many times should the timer trigger? -1 for forever.", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Limit" + }, + { + "value": "0", + "type": "Number", + "label": "An internal counter", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Counter" + } + ] + } + ] + }, + { + "author": "@4ian", + "category": "General", + "description": "Manage health (life) and shield points of an object. Health can be assigned to players, enemies, NPCs, or even inanimate objects such as breaking doors and mining rocks.\n\nHow to use:\n\n- Set desired values in \"Health\" and \"Shield\" behavior properties\n- To apply damage use “Damage an object” or “Damage an object protected by a shield”\n- To heal health, use “Heal object” action \n- To activate the shield, use “Activate Shield” action\n- Health and shield regeneration will happen automatically based on properties\n \nTips:\n\n- While damage cooldown is active, no damage will be applied to health or shield\n- Try using the “Blink” extension while damage cooldown is active\n- Use the “Is just damaged” condition to trigger audio and visual effects\n\nHealth properties:\n\n- Health (life points) Used for starting health\n- Maximum health (0 for no maximum)\n- Damage cooldown (seconds) Use \"0\" for no cooldown\n- Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled\n- Delay (seconds) before health regeneration starts after being hit\n- Allow heal to increase health above max health (will not exceed max health)\n\nShield properties:\n\n- Max shield points (Shield will start with this many points when activated)\n- Duration of shield (seconds) Use \"0\" to disable shield timer\n- Rate of shield regeneration (points per second)\n- Shield will block all excess damage when shield is destroyed\n- Delay (seconds) before shield regeneration starts after being hit\n- Regenerate shield when it has zero points\n", + "extensionNamespace": "", + "fullName": "Health (life) points and shield", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWhlYXJ0LWhhbGYtZnVsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41LDVDMTUsNSAxMy41OCw1LjkxIDEzLDcuMlYxNy43NEMxNy4yNSwxMy44NyAyMCwxMS4yIDIwLDguNUMyMCw2LjUgMTguNSw1IDE2LjUsNU0xNi41LDNDMTkuNTgsMyAyMiw1LjQxIDIyLDguNUMyMiwxMi4yNyAxOC42LDE1LjM2IDEzLjQ1LDIwLjAzTDEyLDIxLjM1TDEwLjU1LDIwLjAzQzUuNCwxNS4zNiAyLDEyLjI3IDIsOC41QzIsNS40MSA0LjQyLDMgNy41LDNDOS4yNCwzIDEwLjkxLDMuODEgMTIsNS4wOEMxMy4wOSwzLjgxIDE0Ljc2LDMgMTYuNSwzWiIgLz48L3N2Zz4=", + "name": "Health", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/heart-half-full.svg", + "shortDescription": "Manage life points and a protective shield.", + "version": "0.1.0", + "origin": { + "identifier": "Health", + "name": "gdevelop-extension-store" + }, + "tags": [ + "health", + "life", + "damage", + "hit", + "heal", + "shield", + "regeneration" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Manage life points by damaging and healing the object.", + "fullName": "Health", + "name": "Health", + "objectType": "", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPreEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Health", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHealthRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "Health::Health::PropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::MaxHealth()" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "Object.Behavior::PropertyHealthRegenDelay()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyHealthRegenRate() * TimeDelta()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMaxHealth()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset damage trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply damage directly to the object. Damage will not be affected by shield. Triggers damage cooldown.", + "fullName": "Damage an object", + "functionType": "Action", + "group": "Health", + "name": "Hit", + "private": false, + "sentence": "Damage _PARAM0_, removing _PARAM2_ points from its health", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only consider damage if damage cooldown is NOT active", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Mark object was hit at least once (used for initial state of damage cooldown)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Restart time since last hit timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Apply damage", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "GetArgumentAsNumber(\"DamageValue\")" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value of the damage to do (will be removed from object health)", + "longDescription": "", + "name": "DamageValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change health points. This is not considered damage.", + "fullName": "Change health points", + "functionType": "Action", + "group": "Health", + "name": "SetHealth", + "private": false, + "sentence": "Set health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyHealth(), Object.Behavior::PropertyMaxHealth())" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "New health value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Heal the object by increasing its life points.", + "fullName": "Heal object", + "functionType": "Action", + "group": "Health", + "name": "Heal", + "private": false, + "sentence": "Heal _PARAM0_ with _PARAM2_ health points", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change health points", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "GetArgumentAsNumber(\"HealValue\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prevent exceeding max health (unless overhealing is enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "inverted": true, + "value": "Health::Health::PropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyHealth(), Object.Behavior::PropertyMaxHealth())" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Points to heal (will be added to object health)", + "longDescription": "", + "name": "HealValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the object maximum health points.", + "fullName": "Change maximum health points", + "functionType": "Action", + "group": "Health", + "name": "SetMaxHealth", + "private": false, + "sentence": "Set maximum health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum health", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change rate of health regeneration.", + "fullName": "Change rate of health regeneration", + "functionType": "Action", + "group": "Shield", + "name": "SetHealthRegenRate", + "private": false, + "sentence": "Set rate of health regen of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealthRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rate of regen", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change duration of damage cooldown.", + "fullName": "Change duration of damage cooldown", + "functionType": "Action", + "group": "Health", + "name": "SetCooldownDuration", + "private": false, + "sentence": "Set duration of damage cooldown on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Duration of damage cooldown (seconds)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change delay before health regeneration starts after being hit.", + "fullName": "Change delay before health regeneration starts", + "functionType": "Action", + "group": "Health", + "name": "SetHealthRegenDelay", + "private": false, + "sentence": "Set delay before health regeneration starts on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealthRegenDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Delay (seconds)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Allow over-healing.", + "fullName": "Allow over-healing", + "functionType": "Action", + "group": "Health", + "name": "AllowOverHealing", + "private": false, + "sentence": "Allow over-healing on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Allow over-healing", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as hit at least once.", + "fullName": "Mark object as hit at least once", + "functionType": "Action", + "group": "Health", + "name": "SetHitAtLeastOnce", + "private": false, + "sentence": "Mark _PARAM0_ as hit at least once: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Hit at least once", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as just damaged.", + "fullName": "Mark object as just damaged", + "functionType": "Action", + "group": "Health", + "name": "SetJustDamaged", + "private": false, + "sentence": "Mark _PARAM0_ as just damaged: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Just damaged", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object has been hit at least once.", + "fullName": "Object hit at least once", + "functionType": "Condition", + "group": "Health", + "name": "HitAtLeastOnce", + "private": false, + "sentence": "_PARAM0_ has just been hit at least once", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object was just damaged previously in the events.", + "fullName": "Is just damaged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDamaged", + "private": false, + "sentence": "_PARAM0_ has just been damaged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if damage cooldown is active. Object (and shield) cannot be damaged while this is active.", + "fullName": "Is damage cooldown active", + "functionType": "Condition", + "group": "Health", + "name": "IsDamageCooldownActive", + "private": false, + "sentence": "Damage cooldown on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Health::Health::PropertyDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"", + "<", + "Object.Behavior::PropertyDamageCooldown()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is considered dead (no health points).", + "fullName": "Is dead", + "functionType": "Condition", + "group": "Health", + "name": "IsDead", + "private": false, + "sentence": "_PARAM0_ is dead", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Maximum health points of the object.", + "fullName": "Maximum health points", + "functionType": "Expression", + "group": "Health", + "name": "MaxHealth", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxHealth()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Duration of damage cooldown (seconds).", + "fullName": "Duration of damage cooldown", + "functionType": "Expression", + "group": "Health", + "name": "DamageCooldownDuration", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyDamageCooldown()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Health points of the object.", + "fullName": "Health points", + "functionType": "Expression", + "group": "Health", + "name": "Health", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealth()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay before health regeneration starts after last hit (seconds).", + "fullName": "Delay before health regeneration starts", + "functionType": "Expression", + "group": "Health", + "name": "HealthRegenDelay", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealthRegenDelay()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Rate of health regeneration (points per second).", + "fullName": "Rate of health regeneration", + "functionType": "Expression", + "group": "Health", + "name": "HealthRegenRate", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealthRegenRate()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time before damage cooldown ends (seconds).", + "fullName": "Time before damage cooldown ends", + "functionType": "Expression", + "group": "Health", + "name": "DamageCooldownRemaining", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,Object.Behavior::PropertyDamageCooldown() - Object.ObjectTimerElapsedTime(\"__Health.DamageCooldown\"))" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time since last hit (seconds).", + "fullName": "Time since last hit", + "functionType": "Expression", + "group": "Health", + "name": "TimeSinceLastHit", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "100", + "type": "Number", + "label": "Health (life points) Used for starting health", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "Health" + }, + { + "value": "0", + "type": "Number", + "label": "Damage cooldown (seconds) Use \"0\" for no cooldown", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "DamageCooldown" + }, + { + "value": "100", + "type": "Number", + "label": "Maximum health (0 for no maximum)", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "MaxHealth" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "IsJustDamaged" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "HealthRegenRate" + }, + { + "value": "0", + "type": "Number", + "label": "Delay (seconds) before health regen starts after being hit", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "HealthRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "Allow heal to increase health above max health (regen will never exceed max health)", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "AllowOverHealing" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "HitAtLeastOnce" + } + ] + }, + { + "description": "Protective shield that prevents damage to health points.", + "fullName": "Shield", + "name": "Shield", + "objectType": "", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPreEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shield", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "Health::Shield::PropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "Object.Behavior::PropertyShieldRegenDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only regen when shield is active or when \"RegenShieldWhenZeroPoints\" is enabled", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "Health::Shield::PropertyRegenShieldWhenZeroPoints" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyShieldRegenRate() * TimeDelta()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove shield points if shield expired", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset damage trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply damage to the shield and object. If the shield is active, it will be damaged first and any excess damage will reduce health and trigger damage cooldown.", + "fullName": "Damage an object protected by a shield", + "functionType": "Action", + "group": "Health", + "name": "ShieldHit", + "private": false, + "sentence": "Damage shield and health of _PARAM0_ for _PARAM2_ points of damage", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only consider damage if damage cooldown is NOT active", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "RequireHealth", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Mark object was hit at least once (used for initial state of damage cooldown)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::HitAtLeastOnce" + }, + "parameters": [ + "Object", + "RequireHealth", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHitAtLeastOnce" + }, + "parameters": [ + "Object", + "RequireHealth", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Restart time since last hit timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If shield is NOT active, perform normal damage", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealth" + }, + "parameters": [ + "Object", + "RequireHealth", + "Object.RequireHealth::Health() - GetArgumentAsNumber(\"DamageValue\")", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"" + ] + }, + { + "type": { + "value": "Health::Health::SetJustDamaged" + }, + "parameters": [ + "Object", + "RequireHealth", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If shield is active, damage shield first", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "GetArgumentAsNumber(\"DamageValue\")" + ] + }, + { + "type": { + "value": "Health::Shield::SetPropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Excess damage is based on negative shield points", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Apply excess damage only if shield does NOT block excess damage", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Shield::PropertyShieldBlocksExcessDamage" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealth" + }, + "parameters": [ + "Object", + "RequireHealth", + "Object.RequireHealth::Health() + Object.Behavior::PropertyShieldPoints()", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"" + ] + }, + { + "type": { + "value": "Health::Health::SetJustDamaged" + }, + "parameters": [ + "Object", + "RequireHealth", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value of the damage to do (will be removed from object health)", + "longDescription": "", + "name": "DamageValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the object maximum shield points.", + "fullName": "Change maximum shield points", + "functionType": "Action", + "group": "Shield", + "name": "SetMaxShield", + "private": false, + "sentence": "Set maximum shield of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyMaxShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum shield", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change shield points. This is not considered damage.", + "fullName": "Change shield points", + "functionType": "Action", + "group": "Shield", + "name": "SeShieldPoints", + "private": false, + "sentence": "Set shield on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield points", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change rate of shield regeneration.", + "fullName": "Change rate of shield regeneration", + "functionType": "Action", + "group": "Shield", + "name": "SetShieldRegenRate", + "private": false, + "sentence": "Set rate of shield regeneration of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rate of regen", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change delay before shield regeneration starts after being hit.", + "fullName": "Change delay before shield regeneration starts", + "functionType": "Action", + "group": "Shield", + "name": "SetShieldRegenDelay", + "private": false, + "sentence": "Set delay before shield regeneration starts on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldRegenDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Delay (seconds)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change duration of shield.", + "fullName": "Change duration of shield", + "functionType": "Action", + "group": "Shield", + "name": "SetShieldDuration", + "private": false, + "sentence": "Set duration of shield on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Duration of shield (seconds)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Activate shield. If the shield was already active, this will reset it's points and timer.", + "fullName": "Activate shield", + "functionType": "Action", + "group": "Shield", + "name": "ActivateShield", + "private": false, + "sentence": "Activate (or renew) shield on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"" + ] + }, + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change max shield points. This value is used when the shield is activated or renewed.", + "fullName": "Change max shield points ", + "functionType": "Action", + "group": "Shield", + "name": "SetMaxShieldPoints", + "private": false, + "sentence": "Set max shield of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyMaxShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield points", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Shield blocks excess damage when it breaks.", + "fullName": "Shield blocks excess damage when it breaks", + "functionType": "Action", + "group": "Shield", + "name": "ShieldBlockExcessDamage", + "private": false, + "sentence": "Shield on _PARAM0_ blocks excess damage when it breaks: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldBlocksExcessDamage" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldBlocksExcessDamage" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield blocks excess damage", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Regenerate shield when it has zero points.", + "fullName": "Regenerate shield when it has zero points", + "functionType": "Action", + "group": "Shield", + "name": "RegenShieldWhenZero", + "private": false, + "sentence": "Regenerate shield on _PARAM0_ when it has zero points: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyRegenShieldWhenZeroPoints" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyRegenShieldWhenZeroPoints" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Regen shield when it has zero points", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield was just damaged previously in the events.", + "fullName": "Is shield just damaged", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldJustDamaged", + "private": false, + "sentence": "Shield on _PARAM0_ has just been damaged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield is active (based on shield points and duration).", + "fullName": "Is shield active", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldActive", + "private": false, + "sentence": "Shield on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "To be considered \"active\", a shield must have positive points AND not exceed duration", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't check the timer when duration is zero (or negative)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"", + "<", + "Object.Behavior::PropertyShieldDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Maximum shield points of the object.", + "fullName": "Maximum shield points", + "functionType": "Expression", + "group": "Shield", + "name": "MaxShield", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Duration of shield (seconds).", + "fullName": "Duration of shield", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldDuration", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldDuration()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay before shield regeneration starts after last hit (seconds).", + "fullName": "Delay before shield regeneration starts", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldRegenDelay", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldRegenDelay()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Rate of shield regeneration (points per second).", + "fullName": "Rate of shield regeneration", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldRegenRate", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldRegenRate()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time before shield ends (seconds).", + "fullName": "Time before shield ends", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldTimeRemaining", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,Object.Behavior::PropertyShieldDuration() - Object.ObjectTimerElapsedTime(\"__Health.ShieldDuration\"))" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Shield points of the object.", + "fullName": "Shield points", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldPoints", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldPoints()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Health::Health" + ], + "hidden": false, + "name": "RequireHealth" + }, + { + "value": "100", + "type": "Number", + "label": "Max shield points (Shield will start with this many points when activated)", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "MaxShieldPoints" + }, + { + "value": "5", + "type": "Number", + "label": "Duration of shield (seconds) Use \"0\" to disable shield timer", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": true, + "name": "ShieldPoints" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of shield regeneration (points per second)", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldRegenRate" + }, + { + "value": "", + "type": "Boolean", + "label": "Shield will block all excess damage when shield is destroyed", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldBlocksExcessDamage" + }, + { + "value": "", + "type": "Number", + "label": "Delay (seconds) before shield regeneration starts after being hit", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "Regenerate shield when it has zero points", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "RegenShieldWhenZeroPoints" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": true, + "name": "IsShieldJustDamaged" + } + ] + } + ] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", + "category": "Input", + "description": "Draws a draggable slider that users can move to select a numerical value.\nThe value range, tick spacing, and the appearance of the slider can be defined with properties.\n\nHow to use:\n- Add this behavior a **Shape Painter** object\n- Place an instance of that shape painter on the screen where you want the slider to appear\n- Use the \"Value\" expression to find the Value based on the position of the slider\n\nTips:\n- You can disable the slider to prevent a user from interacting with it\n- You can set the Value of the slider and the slider will move to the correct position\n\nFurther details can be found in [this tutorial video](https://youtu.be/iiTUwdAT_hs).\n\nBreaking changes (1.0.0)\n- Track thickness and length properties replaced track width and height. These 2 properties must be set again if they were different from the default size.\n- Hidden sliders can be dragged. The \"enable\" action must be used to disable them.\n", + "extensionNamespace": "", + "fullName": "Draggable slider", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", + "name": "DraggableSliderControl", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", + "shortDescription": "A draggable slider that users can move to select a numerical value.", + "version": "1.0.5", + "origin": { + "identifier": "DraggableSliderControl", + "name": "gdevelop-extension-store" + }, + "tags": [ + "draggable", + "slider", + "shape painter", + "ui", + "widget" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Let users select a numerical value by dragging a slider.", + "fullName": "Draggable slider", + "name": "DraggableSliderControl", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get re-drawn every frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use correct min value (instead of always starting at 0)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set track height function (which enforces valid thumb sizes)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTrackThickness()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start halo at same size as thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPreEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider logic", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::IsEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Track where the mouse is (in relation to object)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move slider when being dragged", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMouseX()" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "End sliding and update variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update \"Value\" based on the location of the thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValueMin() + (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin()) * Object.Behavior::PropertyThumbOffset() / Object.Behavior::PropertyTrackLength()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo even more when pressed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1.25 * Object.Behavior::PropertyHaloRadius()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect hover/touch/click (but only if the layer and object is visible, and the object is not already being dragged)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect mouse clicks near track, start dragging", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset hover detection ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo when hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "Object.Behavior::PropertyThumbOffset() - Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyThumbOffset() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "- Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shrink halo to zero when not hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Redraw slider only when halo is not at final size", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyCurrentHaloRadius() - Object.Behavior::PropertyTargetHaloRadius())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Behavior::PropertyCurrentHaloRadius(), Object.Behavior::PropertyTargetHaloRadius(), Object.Behavior::PropertyHaloGrowSpeed())" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPostEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider drawing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive track", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set inactive track parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveTrackColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveTrackOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive track", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyTrackThickness() / 2", + "Object.Behavior::PropertyTrackLength()", + "Object.Behavior::PropertyTrackThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of track (inactive side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTrackLength()", + "0", + "Object.Behavior::PropertyTrackThickness() / 2", + "270", + "90", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active track", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active track parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveTrackColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveTrackOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active track (2 pixels bigger than property) ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "-(Object.Behavior::PropertyTrackThickness() / 2 + 1)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyTrackThickness() / 2 + 1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of track (active side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "0", + "0", + "1 + Object.Behavior::PropertyTrackThickness() / 2", + "90", + "270", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Halo", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare halo", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw halo (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityHover()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use a more opaque halo while being dragged (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityClick()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Thumb", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare thumb settings", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyThumbOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Circle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"circle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "ceil(max(Object.Behavior::PropertyThumbWidth(),Object.Behavior::PropertyThumbHeight())/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Rectangle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset() - (Object.Behavior::PropertyThumbWidth() / 2)", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyThumbOffset() + (Object.Behavior::PropertyThumbWidth() / 2)", + "Object.Behavior::PropertyThumbHeight() / 2" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the slider is being dragged.", + "fullName": "Being dragged", + "functionType": "Condition", + "group": "Slider", + "name": "IsBeingDragged", + "private": false, + "sentence": "_PARAM0_ is being dragged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the slider interations are enabled.", + "fullName": "Interactions enabled", + "functionType": "Condition", + "group": "Slider", + "name": "IsEnabled", + "private": false, + "sentence": "Interactions of _PARAM0_ are enabled", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the slider. Users cannot interact while it is disabled.", + "fullName": "Enable interactions", + "functionType": "Action", + "group": "Slider", + "name": "SetEnabled", + "private": false, + "sentence": "Enable interactions of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop dragging (so the slider won't be dragging when it gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset halo size (so halo won't appear when slider gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Enable", + "longDescription": "", + "name": "Enable", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "The value of the slider (based on position of the thumb).", + "fullName": "Slider value", + "functionType": "Expression", + "group": "Slider", + "name": "Value", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValue()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the value of a slider (this will move the thumb to the correct position).", + "fullName": "Slider value", + "functionType": "Action", + "group": "Slider", + "name": "SetValue", + "private": false, + "sentence": "Change the value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyValueMin()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the proper offset (it moves the slider)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTrackLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Slider value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMin", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMin()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMin", + "private": false, + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMin" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMin\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Minimum value", + "longDescription": "", + "name": "ValueMin", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of track.", + "fullName": "Slider track thickness", + "functionType": "Expression", + "group": "Slider track configuration", + "name": "TrackThickness", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTrackThickness()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Length of track.", + "fullName": "Slider track length", + "functionType": "Expression", + "group": "Slider track configuration", + "name": "TrackLength", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTrackLength()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Height of thumb.", + "fullName": "Slider thumb height", + "functionType": "Expression", + "group": "Slider thumb configuration", + "name": "ThumbHeight", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyThumbHeight()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMax\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum value", + "longDescription": "", + "name": "ValueMax", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "TickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTickSpacing()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetTickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"TickSpacing\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change length of track.", + "fullName": "Track length", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetTrackLength", + "private": false, + "sentence": "Change track length of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackLength" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new track size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Track width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change thickness of track.", + "fullName": "Track thickness", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetTrackThickness", + "private": false, + "sentence": "Change track thickness of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than track height + 2 pixels (to prevent track ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness() + 2", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness() + 2", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Track thickness", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change width of thumb.", + "fullName": "Thumb width", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbWidth", + "private": false, + "sentence": "Change thumb width of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change height of thumb.", + "fullName": "Thumb height", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbHeight", + "private": false, + "sentence": "Change thumb height of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb height", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change radius of the halo around the thumb. This size is also used to detect interaction with the slider.", + "fullName": "Halo radius", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloRadius", + "private": false, + "sentence": "Change halo radius of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo radius", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of halo when hovered.", + "fullName": "Halo opacity (hover)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityHover", + "private": false, + "sentence": "Change halo opacity when hovered of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloOpacityHover" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo opacity (hover)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of halo when pressed.", + "fullName": "Halo opacity (pressed)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityPressed", + "private": false, + "sentence": "Change halo opacity when pressed of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloOpacityClick" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo opacity (pressed)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change shape of thumb (circle or rectangle).", + "fullName": "Thumb shape", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbShape", + "private": false, + "sentence": "Change shape of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Shape\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than track height (to prevent track ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "New thumb shape", + "longDescription": "", + "name": "Shape", + "optional": false, + "supplementaryInformation": "[\"circle\",\"rectangle\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Make track use rounded ends.", + "fullName": "Rounded track ends", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetRoundedTrack", + "private": false, + "sentence": "Draw _PARAM0_ with a rounded track: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rounded track", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of thumb.", + "fullName": "Thumb opacity", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbOpacity", + "private": false, + "sentence": "Change thumb opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of inactive track.", + "fullName": "Inactive track opacity", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetInactiveTrackOpacity", + "private": false, + "sentence": "Change inactive track opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive track opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of active track.", + "fullName": "Active track opacity", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetActiveTrackOpacity", + "private": false, + "sentence": "Change active track opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active track opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the track that is LEFT of the thumb.", + "fullName": "Active track color ", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetActiveTrackColor", + "private": false, + "sentence": "Change active track color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active track color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the track that is RIGHT of the thumb.", + "fullName": "Inactive track color", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetInactiveTrackColor", + "private": false, + "sentence": "Change inactive track color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive track color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the thumb color to a specific value.", + "fullName": "Thumb color", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbColor", + "private": false, + "sentence": "Change thumb color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbColor" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::SetRotationCenter" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTrackLength() / 2", + "Object.Behavior::PropertyTrackThickness() / 2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::SetRectangularCollisionMask" + }, + "parameters": [ + "Object", + "-Object.Behavior::PropertyThumbWidth() / 2", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyThumbWidth() / 2", + "Object.Behavior::PropertyThumbHeight() / 2" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "circle", + "type": "Choice", + "label": "Thumb shape", + "description": "", + "group": "Thumb", + "extraInformation": [ + "circle", + "rectangle" + ], + "hidden": false, + "name": "ThumbShape" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb width", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbWidth" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb height", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbHeight" + }, + { + "value": " 24;119;211", + "type": "Color", + "label": "Thumb Color", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbColor" + }, + { + "value": "255", + "type": "Number", + "label": "Thumb opacity", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbOpacity" + }, + { + "value": "200", + "type": "Number", + "label": "Track length", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "TrackLength" + }, + { + "value": "4", + "type": "Number", + "label": "Track thickness", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "TrackThickness" + }, + { + "value": "", + "type": "String", + "label": "Inactive track color (thumb color by default)", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "InactiveTrackColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive track opacity", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "InactiveTrackOpacity" + }, + { + "value": " ", + "type": "String", + "label": "Active track color (thumb color by default)", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "ActiveTrackColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active track opacity", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "ActiveTrackOpacity" + }, + { + "value": "24", + "type": "Number", + "label": "Halo size (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloRadius" + }, + { + "value": "32", + "type": "Number", + "label": "Halo opacity (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityHover" + }, + { + "value": "64", + "type": "Number", + "label": "Halo opacity (pressed)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityClick" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rounded track ends", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "RoundedTrack" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable interactions", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Enabled" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsBeingDragged" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Value" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsHovered" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentHaloRadius" + }, + { + "value": "0.2", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HaloGrowSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetHaloRadius" + } + ] + } + ] + }, + { + "author": "", + "category": "General", + "description": "\nTo adjust the appearance of the resource bar, edit the Draggable Slider properties. The shape painter appearance settings will be overwritten by the Draggable Slider.", + "extensionNamespace": "", + "fullName": "Draw resource bar (health, shield, etc)", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBkPSJNMjgsMTJIMTRINGMtMi4yLDAtNCwxLjgtNCw0czEuOCw0LDQsNGgxMGgxNGMyLjIsMCw0LTEuOCw0LTRTMzAuMiwxMiwyOCwxMnogTTQsMThjLTEuMSwwLTItMC45LTItMnMwLjktMiwyLTJoMTANCgljMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJINHoiLz4NCjwvc3ZnPg0K", + "name": "DrawResourceBar", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_loading_progress_bar.svg", + "shortDescription": "Draw a bar that displays a resource like health, shield, or any variable.", + "version": "0.0.1", + "tags": [], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "", + "fullName": "", + "name": "DrawResourceBar", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "description": "Draw health bar.", + "fullName": "Draw health bar", + "functionType": "Action", + "group": "", + "name": "DrawHealthBar", + "private": false, + "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.DraggableSliderBehavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithHealth.HealthBehavior::MaxHealth()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with health", + "longDescription": "", + "name": "ObjectWithHealth", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Health behavior", + "longDescription": "", + "name": "HealthBehavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw shield bar.", + "fullName": "Draw shield bar", + "functionType": "Action", + "group": "", + "name": "DrawShieldBar", + "private": false, + "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.DraggableSliderBehavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithShield.ShieldBehavior::MaxShield()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with shield", + "longDescription": "", + "name": "ObjectWithShield", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield behavior", + "longDescription": "", + "name": "ShieldBehavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw resource bar.", + "fullName": "Draw resource bar", + "functionType": "Action", + "group": "", + "name": "DrawResourceBar", + "private": false, + "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.DraggableSliderBehavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "GetArgumentAsNumber(\"MaxValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Current value", + "longDescription": "", + "name": "CurrentValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Max value", + "longDescription": "", + "name": "MaxValue", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set slider properties", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetEnabled" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "no", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValueMin" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "0", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetHaloOpacityHover" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "0", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbOpacity" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "0", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetRoundedTrack" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "no", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "DraggableSliderControl::DraggableSliderControl" + ], + "hidden": false, + "name": "DraggableSliderBehavior" + }, + { + "value": "0", + "type": "Number", + "label": "Time to complete moving the bar when the value is changed (seconds)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ChangeDuration" + } + ] + } + ] + } + ], + "externalLayouts": [], + "externalSourceFiles": [] +} \ No newline at end of file From 5b4e83d6555e20fdcf223868fb8d39e6c73a4928 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 12:15:02 +0000 Subject: [PATCH 02/24] Optimised images with calibre/image-actions --- .../resource-bar/assets/Blue laser (01).png | Bin 744 -> 708 bytes examples/resource-bar/assets/Fly_1.png | Bin 4229 -> 3375 bytes examples/resource-bar/assets/Fly_10.png | Bin 4349 -> 3384 bytes examples/resource-bar/assets/Fly_2.png | Bin 4232 -> 3322 bytes examples/resource-bar/assets/Fly_3.png | Bin 4450 -> 3396 bytes examples/resource-bar/assets/Fly_4.png | Bin 4458 -> 3412 bytes examples/resource-bar/assets/Fly_5.png | Bin 4387 -> 3417 bytes examples/resource-bar/assets/Fly_6.png | Bin 4515 -> 3444 bytes examples/resource-bar/assets/Fly_7.png | Bin 4558 -> 3444 bytes examples/resource-bar/assets/Fly_8.png | Bin 4499 -> 3396 bytes examples/resource-bar/assets/Fly_9.png | Bin 4445 -> 3364 bytes examples/resource-bar/assets/Moon.png | Bin 3328 -> 2048 bytes .../resource-bar/assets/Ranger_Carry_1.png | Bin 325 -> 242 bytes .../resource-bar/assets/Ranger_Carry_2.png | Bin 295 -> 224 bytes .../resource-bar/assets/Ranger_Carry_3.png | Bin 312 -> 243 bytes .../resource-bar/assets/Ranger_Carry_4.png | Bin 295 -> 224 bytes .../resource-bar/assets/Ranger_Climb_1.png | Bin 288 -> 213 bytes .../resource-bar/assets/Ranger_Climb_2.png | Bin 305 -> 230 bytes .../resource-bar/assets/Ranger_Climb_3.png | Bin 288 -> 213 bytes .../resource-bar/assets/Ranger_Climb_4.png | Bin 299 -> 232 bytes .../resource-bar/assets/Ranger_Daze_1.png | Bin 295 -> 238 bytes .../resource-bar/assets/Ranger_Daze_2.png | Bin 303 -> 244 bytes .../resource-bar/assets/Ranger_Daze_3.png | Bin 295 -> 238 bytes .../resource-bar/assets/Ranger_Daze_4.png | Bin 303 -> 238 bytes examples/resource-bar/assets/Ranger_Dead.png | Bin 254 -> 220 bytes .../resource-bar/assets/Ranger_Get Up.png | Bin 289 -> 217 bytes .../resource-bar/assets/Ranger_Headbutt_1.png | Bin 335 -> 262 bytes .../resource-bar/assets/Ranger_Headbutt_2.png | Bin 333 -> 259 bytes examples/resource-bar/assets/Ranger_Hurt.png | Bin 339 -> 240 bytes .../resource-bar/assets/Ranger_Idle 1_1.png | Bin 321 -> 247 bytes .../resource-bar/assets/Ranger_Idle 1_2.png | Bin 320 -> 248 bytes .../resource-bar/assets/Ranger_Idle 1_3.png | Bin 316 -> 245 bytes .../resource-bar/assets/Ranger_Idle 1_4.png | Bin 322 -> 247 bytes .../resource-bar/assets/Ranger_Idle 2_1.png | Bin 291 -> 230 bytes .../resource-bar/assets/Ranger_Idle 2_2.png | Bin 292 -> 232 bytes .../resource-bar/assets/Ranger_Idle 2_3.png | Bin 285 -> 227 bytes .../resource-bar/assets/Ranger_Idle 2_4.png | Bin 291 -> 231 bytes .../assets/Ranger_Jump Kick_1.png | Bin 304 -> 243 bytes .../assets/Ranger_Jump Kick_2.png | Bin 330 -> 257 bytes .../assets/Ranger_Jump Kick_3.png | Bin 307 -> 259 bytes .../assets/Ranger_Jump Kick_4.png | Bin 304 -> 243 bytes .../resource-bar/assets/Ranger_Kick 1.png | Bin 357 -> 261 bytes .../resource-bar/assets/Ranger_Kick 2.png | Bin 354 -> 265 bytes .../resource-bar/assets/Ranger_Knockdown.png | Bin 333 -> 250 bytes .../assets/Ranger_Over Throw_1.png | Bin 297 -> 244 bytes .../assets/Ranger_Over Throw_2.png | Bin 310 -> 253 bytes .../resource-bar/assets/Ranger_Pick Up 2.png | Bin 321 -> 228 bytes .../resource-bar/assets/Ranger_Pick Up.png | Bin 320 -> 238 bytes .../resource-bar/assets/Ranger_Punch 1.png | Bin 336 -> 240 bytes .../resource-bar/assets/Ranger_Punch 2.png | Bin 363 -> 258 bytes examples/resource-bar/assets/Ranger_Run_1.png | Bin 299 -> 239 bytes examples/resource-bar/assets/Ranger_Run_2.png | Bin 315 -> 244 bytes examples/resource-bar/assets/Ranger_Run_3.png | Bin 302 -> 243 bytes examples/resource-bar/assets/Ranger_Run_4.png | Bin 309 -> 246 bytes examples/resource-bar/assets/Ranger_Stab.png | Bin 337 -> 245 bytes .../resource-bar/assets/Ranger_Strafe 1_1.png | Bin 324 -> 247 bytes .../resource-bar/assets/Ranger_Strafe 1_2.png | Bin 291 -> 230 bytes .../resource-bar/assets/Ranger_Strafe 1_3.png | Bin 324 -> 247 bytes .../resource-bar/assets/Ranger_Strafe 1_4.png | Bin 291 -> 230 bytes .../resource-bar/assets/Ranger_Strafe 2_1.png | Bin 320 -> 253 bytes .../resource-bar/assets/Ranger_Strafe 2_2.png | Bin 294 -> 229 bytes .../resource-bar/assets/Ranger_Strafe 2_3.png | Bin 320 -> 253 bytes .../resource-bar/assets/Ranger_Strafe 2_4.png | Bin 294 -> 229 bytes .../resource-bar/assets/Ranger_Walk 1_1.png | Bin 321 -> 245 bytes .../resource-bar/assets/Ranger_Walk 1_2.png | Bin 291 -> 232 bytes .../resource-bar/assets/Ranger_Walk 1_3.png | Bin 308 -> 246 bytes .../resource-bar/assets/Ranger_Walk 1_4.png | Bin 291 -> 232 bytes .../resource-bar/assets/Ranger_Walk 2_1.png | Bin 294 -> 229 bytes .../resource-bar/assets/Ranger_Walk 2_2.png | Bin 309 -> 243 bytes .../resource-bar/assets/Ranger_Walk 2_3.png | Bin 294 -> 229 bytes .../resource-bar/assets/Ranger_Walk 2_4.png | Bin 286 -> 233 bytes .../resource-bar/assets/Ranger_Walk 3_1.png | Bin 315 -> 244 bytes .../resource-bar/assets/Ranger_Walk 3_2.png | Bin 291 -> 230 bytes .../resource-bar/assets/Ranger_Walk 3_3.png | Bin 316 -> 248 bytes .../resource-bar/assets/Ranger_Walk 3_4.png | Bin 294 -> 242 bytes .../resource-bar/assets/Silver shield.png | Bin 781 -> 745 bytes .../resource-bar/assets/Star_LargeNarrow.png | Bin 707 -> 630 bytes .../resource-bar/assets/Star_LargeWide.png | Bin 641 -> 587 bytes examples/resource-bar/assets/Star_Medium.png | Bin 386 -> 354 bytes examples/resource-bar/assets/Star_Small.png | Bin 294 -> 270 bytes .../assets/Upgraded Potion Blue_No Shadow.png | Bin 3338 -> 438 bytes .../assets/Upgraded Potion Blue_Shadow.png | Bin 3447 -> 503 bytes 82 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/resource-bar/assets/Blue laser (01).png b/examples/resource-bar/assets/Blue laser (01).png index b76aaf7a042d56165a0d3cbadd2ce85216838081..937b258d35d221760c85a377537a7b6d751b29cf 100644 GIT binary patch delta 57 zcmaFCdW3a?vMd8X#WBR<^hWIxCV}3FH4Y3w;OXk; Jvd$@?2>{5w5IO(= delta 93 zcmX@Y`hsh($ diff --git a/examples/resource-bar/assets/Fly_1.png b/examples/resource-bar/assets/Fly_1.png index d171e6a5af8ead63a087c14a7a82cf56b37b018f..85870bc9dbb5a5372d6c50128620e4f4a1d5954a 100644 GIT binary patch delta 3365 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 literal 4229 zcma)ghcg@w(Dpg)kjO=X=mduoHApzUb9(RPr$!CY>z(L==)Je-A)FQ*g6O@IBhgQd z9_{sg??3SF%$C`ioq2X==h>N!(oj=)OiWD-0015#pRmg%)Q;;3@LTO1)5wSp9sIPDQKwbFaB( zi2LoI$Z!1e@vn1Ja-_V)s(NTWPOG-|@?qkU{E?%>BJ?KmbS$#T$4H`=WKY4}Fc#7M z(IO>pwv|A~`)%1o56ppR>$Cax&TJ9kK-ZPp4r5GpMQulge;4}yD697*dd5;l=~f2L z_;X>fyI>;WY2qKq$|_Wdu^(;LBbEJ|3Cm>~hXSR+g~HB zk=aG#6^L5I3E4?CHF86eYxSMiUateE0bm*LJMQ;GkGX`|VT0(Je5ikG$0ws=D zmHA8YFO66Isf`|YMc+gC=%IMOd5^*+KLL+j)%p)!*CjKkbNgEvIpde3O;+JyM#QfO zoj&T^&?7GyR@pVyJoa2@i`}ooe7}%K#@XZ70MAg8r;~h93$HUV3314yMW;De_qSfX z%3i}nEm#}!Yd#Y53bJ*eFxtmL;4^74kciGOP?B>Tlufvcv;vaGHwv`sa~bejY&fA@ zAqYR}W;=9u>x8S-J?W2j(tb6Jq_TNqAj~d+ii5bOz@N?zTxA7UnDq+rT$Y^^(W5=) zgkxL7rdkK~z4UET1Y?jklH5{uMG}`tW;FMz%yZZve6Ko?oPSaXrrQMxp|{ofEnya5 z+C7Ah?{wFx>@YD!HA2X{Of1Bu`k`re7oTuKJipg`pT9HO>dNhgkY!su!F$bH!n}ga zudb@!w91!8!yIGwN9}>~i_x#p^2lh5pG-6dX(2+(4xBzuecmjaG$#2&9jl<1yxe%3 z;5NpvsQes=m)QJNx`LICfj$`$9}UEhPtl#-1Kd4w;^INI^_Vh()d3{eu3vpjcAAJ)v4VqIcN@gr=9fx;O=x_<` z|47NBLj8#p7wFozpD@?IDJTvyZM{mmN@3w+GEK74_xHc+gi(eSs0zDV@~R~4#UsKX zJRN)K>Q3xP&TD5Bc1ltlUyDFDCYWqRtGF}QccT$lS6EdKF@NSDrZM3r@zLhz3Ela> zOc%A$1B`@v7u|&#u!B#LSn8{=30J5=;Z3q2y@;FXy7InJ3+}xYK*{LUhej{V6M;Ml zwuRIhrK$XI4-Ay2&KoP&bGGFQY zxE(h0_tuWuPwJsWhGdVM1H*%ob#aV9I^O{sZ0}h}O%v1eEXD@&ILeM$A?;#fxT4~^ zckNB$oRFB>S~k^>QTqa$1t%)eo1dmmm}61QzfqM!F##OcYm1SnO4uG5#R{8)bCl`B ziim=oY@L@8ZL(%hM$&^djL8v1=FqcV9{H`~gB(=8VZR)mX z^YBv<;+vqbu`M;B(by#9uM7FCOgf%}D}Wu)g)L>kSbHPA8}z2~ip8HML(T2W1c1+!q2=W)V4 zeX)N_Y~xM^>4bB9>IyXHI8PfnjWSn0(FztWxyAGjFJHY*hXoS=f`Sp<3m@j&nkc@h zNDZ5Qi`+kd)uSCCdJf@yfth>r7_3E_f8r|9(H>oWbM?==Ikg=a&RTW6IVxt5}RCw zvY!g!xyai~smjjIj@;^xqg&z>-ro;8KNO>qr<|G_5D^}NSt8p7`2r0@jkZJ{YR%YZ z8Q9t;9eMV`CPi(CBWKVKAu&aKtX%$|cm`4r;@52sszjza4U^au%o0Zi2X|AlSK3IY z7I#UChDuU1gzb#-D1Z4&0SufUYI%}3&lX#Dr*5`eCPfjR4+Kbv#DJG~!8CZ*6spc* z=V_+Qr}Z~yD?CS6K!aBa{tY`*WeTDU)f-;*SF!4mr{9gWk{X76wR>s?ND(LKzYi=C z*I_nad!^}H7Z?Gm$?crU!=C-*&e%z`jhUp$qt2m6>Fz~A*?4&3*VnCAPNqs#r^M!z zuyQo2UJfyT;bF>9`Kt%uy2c0P(+>UV4H9 z0eqE<3tQt@dfaFeQGJn|2f)|Tn#5HWh)OO>2Q`-1j1;UIZ7%irhmi9Czw9?=_be4v ztnk!OvE018vFUQ{o?Ps@$HyeQIUVpo%!pY!CSbE@QD^Kb6&d>|y zL`2yC5CChS8v8<5Ar>4O)8(>V4l<77|Mac!NR(_ z>yC|Bnm6_K6E9b=HywZ`9wV6BIo5$tEE>*WlfC>`?q^$SjtPu4Nus@lc1iJ8@sCx! zSl?g@XXl-%iHVAw9KLj@J}Y?K!0n#XDL_|(#aWrRvRlDbEGg9)JM_yCpB9J$xPH2G z8jMo77c760b`jTnsBhA!?AE${;s%OFWZ+?vvO%9f+8y%mwa@s-$4Q-xQB0V_s_THj^LJ019M?{Z~WTLY{zm(ezp4#3=dn+)tFk_+J=u{9gdH9Bm%>#vtXDT5@SJV zo6qjQ@}bSrr_0~7rM5Ln5Vos$?*W&OJ&gsS_ltT#fKyJ zB)YWaN#`PWym@mek?_}KVLDeH^XVk)@vOby*KL}_{F8+F7WEwTDy(Glq!R| zmsOON$%Vgp{Czz(AiL^v=VBdFXqf&b=WC7Y$*@Ii9>3REoB~BlG9wjOdJR7_S?l0$ z*wx35+tqp>H~X#au>3^Zd{)d{DH)|8vw{%QJNfa*bzGZGFyv)(4rqk6d1f zn(rKr-S$T_y|F!;H(dC#UN)}fLIE`_WL?vbYUZ8zluxAetnljDE7d&c&la&u&>bgQ!K|t*GJD-$4us3aj#hh@P5-v;CXlW z?Z1-@DT{4m2;#_D>QX2lC?V|=O!W4&{?5Rs!B#ebghQRFTpJ=PGFGesZ6M!Ofiu3a zqE<(kJVi&R!hjpTEFp_C8B=9U%W!Z<1Tpr>lX50Y#M68OO#^e1!dslswx>I>%^(+< zwtHwp$sZz%{xNU4>#g!HO9*`;m+IzFEs!cUwHpi&r#SjXHgP^1Frh|@(^t4+A#;5Z z84W*FF5bcobydxCd8=kZvEsxwW0-NGQ7Z8z6hY_I6jQ*dN^R64l6f zcc(wv$c?D_M3}gW^=3T5B_iro9&{m1I=#*+!E_Q{hFGxJ!rr55+#Xj}U!+ft&z2UZ zvKA@gT<|tHy1Li6f+jqry}0dRV5DJ~XPJ6$fylpM8ygiw#oh#`=A@yH_xZx-53{hK zjh@p;N+iv(B}u(?`AP3rb0F25O(`W_z{Kllor(7c63SY8Y$Pr3JuW)pKn0#dlT5$J1+s3Wk4BaPD3wV$)WySXyBH#E^|vK}6UIYTvBj}^|EIr7OWy7*~q79vuecto2_ zy@L{LOkMP(Y4IRC)>ojC%{=!z`OaZJ429xF83>~i8ft|UDLR>s|sVV978mt(pwTA;H&R$wry(l^bIzw?i5t^Ku^ z_cMtakQMOxEW;gmjYF>0NpVbj=2;(hQ&+2IycnIg-Jdoe%`@@rChy^JoEL>kDwV_V zD@Lj9_Up9!ui_ODB%bk&~xrooe!=w6v>(UtcW z$YuF_ke_&jpPFkTTtb+9#7R0s#n`i!GWR;!Lsh5y+t;r(YtdKBi{uXrQJ6H!rFfy9 zP#v#l>P*zR&Hm7WTkS$w&g-k^X=LdEziB5=Nmy;ZB;o6rI;+W>-Pjdxr4}Z|9$)@b zUT%I#o1d$*0YaGLF2%%^d!PP|rMvh_^%HXG$;a?s4;?o3xN|nPL4PAM4-hNYKaH)M zS(Hqxpk=Cb|B*u%9-E?~nZkSru>}%laMon)7jLIeg8Hni7TQ3JyCfn6|10`J_ax$# XnV&xh{yKknApn%*)MRUPbXFRCwC$oC#P|F9l=NoEe1~P2 zO%T+y2R9TW^{R*~nvy9h;sV3w#*%3+S$Q?(dULzgKo@z0dP|W}G>5zW4k8&$pf<4u1|jc<|uCg9i^DJb3Wn z!Gi}69z1yP;K73j4<0;t@ZiCN2M-=Rc<|uCg9i^DJa|0D5t~~O1h#-21DPNLtN?F- z7!U%qaXAH!4@=%m2$1`{;lrx6q@SdtLC+Y2zAFrRXIAh)@*}7=W{w0WE#xpr1A5Rr zKKHQW12nT8aDT1x*gD$)4plxJr%nYwXf#sY4AAsQ4oWgomHti{( z2Qk2<%6Frf&>^OY;I9I{3ZcV0u0q>3c<%}%v)=}dtAG5)2?T=>(7d@m30wnY zIql@Q3V%KYaX@A0nukc;c8zpHy~^r$x1P4p&%ZV^tj74^&o)X(>TXs7ZwpLp0Lof3 zTA(}lN+Gnr2FQjKqnw{W1bEWYnXptJL%mMeNVlIQUutY-^p5{X$?dXHQsw*rrp4tJ zG%{hP^W8BpAYCB@Tn8k<>_-X61xncqANfo5Fn`p?mU``ye5vhPGu6h)m9qzQF_wcM zbZX0lj^6>QIh|^RV45R>5ZKX(MqLc~+e4?+x@;T_uv3!dUGJROoC4?jMh1p~n}F;` zXH(pC6FT?0J4-EaF3Z<;U8*rc>#{TPBu;R|j>(=h>~eUy3C|7(cK|&+1W8=+()Ab| zwtp-mOP_V{lpS?BBKc9*ZM`LSHuL1*Md^j^LeQUpO!M3WL8S{R2~XR8E++esJ#|@P zjXm1-_B3+b$NNs}{6g=z3tg!0bTx}dE$KM)$47=>i_!ci%O54rJh1}dN}D(i549q zZbhu$dDg~br=)v;^)^C@Btw_l`U(shHRoDY!7QhzS(G*)@WmO|!`{j`ADy}1R)#K> z^tbl?O#vLVm60*ohfg;39bBvwg30>yvKei9PAIbB1up3=*y@ILZ(DV@!{6QdUw?0-)d-%r^fxQ(@s6ak zy`EW-wzAe)vjXk=q})^q14s^UuYc$1yKjD?$PurR+D-nr+7nudj%~)$=8T>6(TBUM zeOHw(qvv0>q897oDr{-m%g`rK@G5InqHXuYB9$(aKFAAxo zq;eT+R%aUd&5%m;h+TTc3P#SA^n9R?2~N)XQJNHu07q+6iBW5Joa;9|?bnw6`rG#f z3af_J?FG7Vqlo0<)~(xg;D76*v}RQ%`FVFI*0>Y7H|b7FS4@}`pCy`X)80Su;6$#11rXYx$8;IUNA}MtM6Z|gNc%EBP1Okrsr&*2HCZ(R1f{qD{3~B zOmY0jb7V<`goH?|Y*}1gUCGjj8M_E&zi5)Kk&CWIXCA1{rh%l_(|-@^!@SbOD5W-c z+y^h%bV1FAktwpbe{GQg(b3T+&1})4g~etDwVOm5He8nGEo1M*1ow8BV~ zEl<~ow`w~1k#zBWq<{WTgo>JRj>8?@x;Mq4dY!u1SzvnEAOxU`0t4TAXqM|H1 z&)U_wC^teLVKj|Q`}~}RyE&2$fs!tdY(#B2Dw*0E%mW1`yW07iFKF0kl0z#*($B|# zF>AuvvuDZC(NWgS)YMdq%na@I8p@3{!k9AJcAI5xU$($d?|;^k4*yqyF`@w~)(y-y zJRVYM1}u#|t=gvC(y*~4$7?e_Fl&Oe9`*C{lQlCZC&%nL#C^w5-Z)vbVCdqlzZjXB zZZXuan^a$i$0bl%X`R{>JSRP@)PLIg#r~aV?AEgJrGSjlTpdSePycGxjFglVqei;8 zxX|yv|8DZPC4VKQG^F2~C@)GDom=z|od>0UtvvMcOi7`bH^6*2ho$2 zFWhFc{t){uT_SDJ+hB6%$Ekg4oE_bm9CpS%X%rSV2xsPBe4o zOxa^@-+wNq<^Ra0X6}hN=OkI$puAbg3AtTe&-90o>&CCxxC!~f2(QQ9L{SycSX4f@ zRP^Y56^0T-p}m-~W?_Qy0mjU?VQ4aor z(al?wu|cFBo#x#;mmJTayqPdk%1O#?J95Ouhku+$Qoj3;+o;2bqOwb%=+*IYHM4y^ zQPp8D3?;sNrwQL!dpnDLA@5!{5f0c zlT8QcK>i7=OE1#7Gr!T9Q~+xIiD{)~SA`y{KwiEP8d$5U&nv3=*F0_=Iz1KBacN& zOQxySb7eqS3mS0eWj9CBE8rVkP=p-Ta(_3hvUKt3AZmQBi<;(punaK!7rrnaw$!oYVn8z7z%gzX ztbYSg<{d0MJ_ilC6IPq;Dnmt`S21RgX8#bNmL;zPXn|8m?H&iBfu1yO38ZC7WrpJW zd8U_2Dko8^*^e>{feUxQ>XRdvSM!>>p3d`b;%sKTEL16{lBYHWB!7b>^3+Hqk`ib< z%Er!*OwX*@Sd?`M_;BTIVWy9By*!@=+wp4hFFRuS(Hv{aZ>8J?Om`$ zIfi3oZ(HRxtM7<14uM`=bz2(R%uxWVfyv`ksu@p!@hbJqcR@PdzXwvm7#RJOnKHV8 zsa$RQ7}^PV*zo)VfF~nY+J1&QJ&Nb%!Gi}69*=DN51?mzlg+yaC29y;MEyZM@t(Kp;ql zr{1u>jtN3fQ2UV);+d}QGhrwZNI8IL{A~bTKL|txXsan3`(^KD2YTH%$?O4I%BTHR zw4}i#;IFFG36oS}A4XX@w8GpBDXT|ps3k|wU)oq`qS4-HLzu;rq1DAH;1@)}2li^- z@QFZXw3ZhiI8GA6xE!wp7GtAH@+#r*K8xRjtF%=J##6ZKUwiC5F*sY^5Ap6UzcV`( zM6~~}B;VdfYtgCOj|Z(9a&mbM5la%B_Gqs%0tm+$uoA4ajM(pUQI8?@^N;F|u|n1;YWt$RuF_E) zxdC2^;Lx=Qou0hefcL`RCs7vOCM7>9?vQrRY|jdYtpRVWx~+V!%k)6n{%3e3BQXph z`lXw$F^SL^;+B~}PfC2YTv{x`lTh8HWL`Hg%s3`kW#ht+LOE`FDI3Qxl61fuwy`VY z1`S9|Gm%u_xYp`hGYb=UD`?YsvOtlsCV})j1Y56ct*lyOOipjd5-V94N&$owDQ;^m z9c^WXN~PX^J{7>(Kyc>^T9pdZ1^R*ZKjqALFmIEPEctDTgyR>x$%s@2!Spw)&UCpSDJfN?@Fx2=DhlFUKDG7&QO5%vTb%{_W zNNf9DHkGOKlj22rE33OMI6D8!e%$kzrWHDyb4{N>t_N9VAunnk%K{=fR+lGlm+*q{ ztb@wsFJ-OUmCA_rh%NC(Fmtdhd1B6L*~sg$!RPtVQ7|sPr!NQXLd=a(pGaRhE5N6c z%TIe8;f5N?p2(|fvTOc^aLkf-_?U7M2&E(wB)K2_7aXD6xQbS+5)3A%nG&XU!}S-B--j+JPwt*b(eM-8 zR2B8OzpTk0%b_Jczbi<5Ou+?mz&;cciWHlyhyz9Q^lbD5;!}&#kT9e^X$Tz*#Shqf z{w<$G+s8e>5DK&J!(#}pCop--f)o=oC?^*=s1Id8k+K4N2y*9ttbzzZ1e%P9f`C&> zf)0=T{C@g=dBs!e>fUv6#{#keh%dn$;~x)E&J;nji4h8Oro(Dd?{fhSohBQ?y;OtO z##`Cc)kvib(0Z;iR+x$a+^a}NSFEcZE`n0Z;4_fI?54qjnnUjB&qSkx4E#{Vh1Z3$ z(~90x0lo*CrA5brZ|-6Qb(GHFro$I@(?;>?Ughbhv363D+GQ zs&i7k2Y>RdghF40b6Bpfw%X^jCtGuQYuHTJEk>Pk{(A>DF+aM;IJ@%K zkfL%$Qi;C~a>7G1OJUeVomn3T2}IUepJnY3`Tt>gROg$Kh!3^xHF}1d!z=OGjoU8- zoXQ}J%4wwoLOE#i+U(T^o6*Uu5W@ysMN#3V`HPF?U}j4RKtQXv`WEK+PT`f~)D`k& zbr#J__WJk2kymQNl~9wOHg+Fxh|I{52(aWIB)%KVDj<=Z! zLWI{#(bYdNlSMajhUl2tx0{9fredC^!YX}V5p09s85L4Y0RQyCTVpR%i|wu|^0ChU z9HdExf2`wcrdj>+)%~!p5@iNx(bERS%?iS+@bb5f9(|H|pvOG6sKgv=Q1IdbZ%hm++tSFr{3lvNdj7&a|J#ZM-jdV< zC3obv+n$Ty_?Fk1z6AOQp07XKWPZ#=d75y<`R2ZDypnT5i+EX8ME+dT(a~AgA9QX; zVxM#;$Zj*NpI)5%Tq^qjGH1sp(-UhKb%Z9*ROk*N)C@^XoO%8vL-bn{-S1-_#BZ%* zNn7DZzbS~ECx-WTl*`+;6Xa&*l7qM?57aso{dY;{vsVbjI=^gK8EOXc40SnxHkX{sng?L;JDJ$1&tAQfiePl5nci(*dJw6ul7Oczv1L=AvPh^;7hw zS&-SdqPQa7Wws|N318Ej;WDClo__BRHYH#|l?5yr!DY4*9aCW`*MadYNsr&o@Go7Q zoOpc;*u{pZ`F83tzd6=V_nmbb+ut9FTO%|j87A+v*ZQq)t0F2Y07X=CrXxD)1cP^J zHT`E~DrQJ6vjG!gvSDUv*KF78Xlfp^;U}iYJcDolOvcnlS;}>(LzH1gVN>3oJP2=X zq^-Iy0a~l?&30H4{vaN;HJ2#ExfR)8=2tWu#lb(|Ez7n_I7eCXI7O!)yh|6Al|rf> zQYo&gI&5xS#^N>EG*Yd9gm`=X(*^N`grEqt1Dii$}%u;kM&kYCxjmmS9&C1{Fz20iVi zv=2dr0@EVwJM0M=d-5+{Fi45%==iyuYUKD`P%Mc_h>J7I`UqW~?NgfXBh)75t11`1 z|8voV1VoQRtg+eH$OekQPZ~)apf8%OsdKto_Uw z9P!nc@7(XRPxR8&YCL+?FCOWL@wQhynN+O=Ue*;%A0i2ejm*t;Jv==6x-uWMZekou zG0Zn_Kvbv&X`$P&>12k9Af39`A>fas!-qL?5C5fjz8(E%huOo|0Fe&BDt>Dt~uY9;|%^=?_ zH2RMI?;v1&P^D#OCKij0wgqrF_B|lSEcWLvj}g&()ItK}Y~H_XkAZ`srNj!Gk*eyd zr>vX4k^EsEt&y>%!t^S>mR)I0)k#?-EIk+q1aatv_qkv}p)yA1x}+)gg8bcUx?a}6Z0W6x@%s76wjE6$1R?!KJIwyql8&F^W` zQ~x7g)hLQxFYMC#=CyCj;d-t#0&z>()<&V^QFxGq)L>?QpHNgl{qVK2`(+W_GU~?> zYk~K>yGyo{b2Hvumb(6d%qEv{wMdmO-!a5gS=UG}%rx{wxp zOn3)|&8GYQ4(WKS7+!Pimpm{Nz+yB!TCucTI`89wdGC33(BePkW1Pu_)@Y#az7M>-ed8v-%rR03*1aZ||5VMyO~;vVS3y zu6giGZM%g&lO9XpY{l)_g9`e?JQZ+a_VqhIJ{jMEtSshH;!|fPF&|0PC9~R&y#FAD zM)#7fUbpCj(7vYeVx{u-tPX!%mt|F58 zdNje(U+}0hfw}y~Z^XvbuqYA2@fEAvZD5#F^jfYFWdjc%IksBZ)8S=BZ3{!?Cbnj0 zWCHDJ0<^kcO8hKkO#MVSI;?24V$)saG4zbSu@9XY%d&zRVd_&QkET0@ReT#^%4k+2 z8~|6&jX}h|s1~PKm0Io_ia^k;#HH~8vN{7yxe#AT-idt(-$-W*N`U5pXI@%z685D9G5BW_^An7uZQgX9CA4GA44RZb=(3 z`w$Jfir*BfZ%2o?jdpCTpq1RM;(quMHQ6i!pQtwqgvoiPKgBW_EzkUe(|pECi@OZ3 z!aZuUvm-HnTsqSwkO{ZI&G0u`-O>+~EXVTQiq^Z>ivKgZf7SutEvAasHYkQr8JI&# z?Do4-0H9;zTBM1YTjnB(F?sQe5jD3bIbu0 z!!1n{Q_C*{WsOWqh$;n^c}Z`=d9O$a4hBnBb!*pkli>7pW#zP9_K*p=GD&;wwJzxX z@3Xdcqw5H(STQ`R9DDw;6>hBONv5`XE1k_EpO#9ZHvemyd&7`Kd~U+B(!k;ZEJqp8 z&lscR6hKwHxqlR&tuS->kcQ=AsnAnfQeXfgdq9TJzv&&4eagfX-%sGn+2>_VWpoir z+ap{Q)bj7rk(6pi`}%QLOV#tZ2@sWpCWPaqNFhBJFwwhGH6h lLYsV_>YwS|Nl4ulhfR3T?>eM)(cNzYq^EYQe0A*Gc(LE z3%jBcDlV9c5MIRhVs z+xr1mqxQnUBG3o8Icpw5+=TcU;+SHH>smvc-!jB~r@@DOgD<0OF|!zaYa?gDHjo8E z(+{6^bAWlxgi~aVV3HgpdPqB7hcRD+DnO?2FiD4Uz<+~67IXO}Y_=C6;#{dgR=Lu~ijVrHQoIy7bQmowE#W-+R(+ zr8J5hOK-dKT*gXgtxlcbhdpk(JAAN-dw=)~Dn)d)Qu-%yG+s8-N0h*4#@uz1nWG;4 zzT)9iu7sPIyl$FX9FBYhqeink+NLm^M8R4 zh)iC2!$ENo;vHxIFHsMEA{aW;QD%1No&EE#0UGoW{_3Grd9RWV?*A7>KR4CnHuhmK zwe}f7%NM^vWo6~`_O1{0@0p`#!jduv#bu@tcL#kde%b{cS_`s{5|&38OlsuMSujvr8JSdu{|9|#3@|1HP!+$|%!U~;k zuWM+^fs^OE44hZ4<`A4(46DVpt7T+KHFP)<$VeW-bp*3`0TFnKf!p%zWr z($kFt=;@|fD%E{KKi#@*vAwx7Hlpw0W*PkQ)+=_rMhbCtY2a+3(-?bYxqWjs{7=o{ zlxc=jC;v;CZRm3vS`AwW5>*znVp?&m6;3X zZb84#i{h(Js!Dq2_=S4R^&3N+l)vc*s23bLBA6Nk)`PEYndI2bM=omR6RI`bI1;1y z&?zgDpmK6|cNaBt!+(Yi7TdUeyMjUjC!^2tqJ)oKV{3i+wIMD+LY$toC*ysyY6aRAu z)J#udBH>_x;c0o3r{SS1_gv~fW6L#v?W8I#mqcP5+%cUS_sV3>vW;$K^@upcrZr;2}En2jA$jq%Crs;* zbLY$^JlPpwmb^$uDy0o4QFdtGy*tNQ_|b zT-sD{gepwjw-xl&S6|VPAw#INv{cl{qes4^-rbgMrJUW# zC6^bYG$}!ysgsSum}80e>`S~d{0Gb>^p9<(Dpba+I{(NkdlIkcQ-R=o1Vfj6%uO7O zqhI?bm+ZEIOVw|Sz;*_oT4@4lDna10xf4@|Z$i z(SI9b?@qj`Qz@_N*pRJGb?`7=)q!}guCpy|i@-Jtki77szZGVvyk?V9JHHkh*>sEh z`G5dP_71$3TXAM7;8pD_FozI!!4v|b2?VWo@aktS@#>If=C(yr=qz|x4$H9yPb+4&v#Y|GE=F~zs^_np9GcYHK z%Pg9MHie{X75YHd`nvgpuvG!C_0wVO?DYCjaJ*Fmd9C&Wuk~(Z>ht|51$J=B_kRkJ z=@uZXe1%Kf3{x8!oq|2UFt8dNfteM;sn!^n`7=H{2?{|52&}m#VkNq);Zj#_MEhHj zeC_6vD-Uyt&zL^=ycN7wa|L5=#hepSiI04BiML{i$PuhNJX|xregJ_n~ck zTaLq6nPCQ%b5aYOol74;~}muGibG?L44(@Lj(0Z4>@TI^F1iLxW?UDUyZ zEc$@fytB8AUf19QOa`*_bnMypSRW{CH}#i5^a z5XK_zNHhJK0QXfTevP+?mL1HFf6w8wWq(^Js;@RnH>J#KgqJ#Ps{t{{bHMcWZ@7F_-`V002ovPDHLkV1i+DUpfE) literal 4232 zcma(#g;x`f^V=9ON;)UqLrN3`1qV1{)KqfPf+CFW9?~GCpfmylhSDOVyHz?xT2e}o z9P#7x{R@8g-o?9j@7~?Li}x-XrK?Uu$w3JK0BAHd9zD6{?$?NdkX=)lKQic=QMhQB z{HFx|5A_5)C$0qnKYe2lRX1BJ4`(+30Fvge-KU2%aM2di6o2BPqot)IAxZ{N_9Gjx z_haq?0O%++A1UkmWNv5rd+3ih^*r<+{EgrekO4CA@D{=#AQELw0CTtyk4wXtpa0{! zi5?yNSi{hhfRwopN1Kke)1F^bjbp|6(2~}kuLP|-me7p2-aUPDm3Dr(h6>lazQ%#( zU~RlWn)_Q`8Qy={dJ~uYFLw`STAEtE9G`9n9#NBY1FizRj|3aaccD8AuJ-L2=|ynFufj(%6xsAxFfyDwUpRW{w-tr>>EIUF=A` zK+i(1m}ATe5b;r-8j(I63-QESX-{>0D$3}aO;gtdbF1j*9_8}n8k z&-^?e{Uci#8{K*takjmq@ipHje>4xwh=pQ{IXwl!U#(i21&8Aw)Q|1y0*2J{Aza-aqA;jQ9uZSIRkI+`h7x?M^evb})oH24GWqR)pd z;AmmG%(*p?D$&l(+a&k7@?@-GR{LRK3H9q6^HjfLt9L{tyqkrXc0aJl*DDsiS&z~^ zz|K;pP=9BPVrZ(IP`6Px^QA1nIyfFRdSlU+Pp@5fySz!kcyx=lffk6ZU+MqJ;FSEV zxneE5=rFyK$(FvZbqC(9e{93!-J9wvbAuYby~w$Jb4(~?y+efhSpe|YSdv$$UG;SN z%owVrvC@)aa@lium=pPiG)7Kgl>VI2MQ-sSc?a)*5h>)aL%>k<>xJwk zw>5jF0$W7P zLO3PfnP2p-jwG1Jo*U3j>{?j&*@*m&6er0FfOANF{;^QrKJ~crv;4(i8Q1m1hd(Y> zz8r+~V0ka}eM3>Eto8*TXGpqM2G%IlEH3(TLRO$GO8TIZsLbgos%>_YMDHHYtAH!B z)_)q%-H^lUdU1#M4`sXn&gEZqWttO?TZKWs1$n_eXgd$ZD2FnoI^}~?2irFWhehgO zPm1WrsK25~3HCI@=RuWghu-dRG?+m`nIY@#rNy7V`qa=}N90aIP#yO9f5r&O=fw06 z26K5`YaIvp{L_o2R_^|HdOG3xcs7}uL7XHS7{q5msj|Q11 z=T#*`f5XiShwsFqN}jffI2w1(ZoaNYkJp9vEFs2@FZtzsiL>US1^OLAagGV8j{|k7 zx)kz35sF6W-!3F#{F`rYG}n0fdhITrtm_r9-rrO$TF%*tTJ_skG4xu`)f()87ZXCV z35sVL7jvqv{pHbfUe*>PT>*f9Z$H;46&~7TEmE@rYdqI2H4?1fGwY0CSFmCX<{QHv zzaL?a;}f<-VsshqaN*-uwVYTh8db?v{SL7(F^`+TY;Yb+1R?8HHAmbH(Nb;kR64%F z5kZ6#lI!-^!2GQ2Q{k%&g&AGBM-Dcyg}(U9-6V5$DBs5mps{DA`C%C0tJx-%4X>26cc7=cPhqjqX2_y+2(w-8a!6cvHy()Y9Tz zWK?2E^}IWNsXL8PwB8f;?x0L9YT&ip7$I-hr~+eZkHjUUHVP*D2yY?VqRC|gp(n+uR#kWe0o8_ye2OV}SX+?K0$FIm-=lWusM z$~K74q|Urg*nHpD+iTf>_}p)0Cgeg`DqR}amDeclv>`ufAFZXc8H<-#_iL4GE z^=NnEV_4}zj&o{;O}H);M=a0WoOQ}EE32ym|XSLiNuOxQSy)hzH8hNovekvod^jXf`KXEPh=_Rv%#z=SgFC?@;%?x6O3re?7wjQeuP!{2 z&PKPX+jh*AIcJM+D0bn+xzBQFxMJL|gMgE{H8%0!5{kb+qo8Gue^M$3?7+lVhS&EZ zMT1i_Zv6~jGURISqrIE};SxRvK)&@ob{8T*VhuJt=celoVM^1sb|kHfE_AF#Euu1B zTT@()wX^0ESIsaS_u6Q0+VZnfips?R7ZNbhc4sfOn>&SBK{wphIpI;j+LDEHGrQ%( z3S8|k`Iv>p!kP81%9zeKcY?b;jR@n0oMSX$NQ?8RX~d1Dt&drqj|z1%)DQ?n?|Jdl zqNCrG4i+=t>mp=5CYzrmdVUL=;G!WdCXod=e52$XZ)z0AoUPaf^>uR^3O-Vj%2<$& zb*8sA#Jh9Fc~5>drfobmNgrGp&br$l)DR|r5XU(*RT!;D|m zJMNe1X?Gn-*EkNjBTWcz9Fi(oJiE^Oeo$=mnZ4wpxu?Cy_FX7f-{94-Kuc~1{leSK z?;_LdH%q|zAvbwK7mi`p6lGt2dR=6Q0K;^ zm>5bNwc>iplkNj;@Ap+EB@Gnji81av^jU!wx6 zyM;MyC~K#hS#>JDI(F$|dil#cZftX4rS!!v(x^=N20!nSfr|2%6x53l6-1Qi*QaIm5|hnEf-w# zC15P;)uP@C(Z^j!&;oP+XMVzSh}2UbO+-?R8Z3tCj&<0Y7VeJ`vieHsO8c~{M4rD} zko6199mxf=y8H9vUzM)V_gIUr;n(5rko3fCwazqgSdB03#AgT@G6FZvz^*9!t^@;> z_2+Z_D{TivXvJnc70$S~H!k`qArmp`_w_?*6-7Wb+{b!k==LZ|zSu5W6P!3g(jLd) zl(>U_L~K0&*|N3nUSujTtkf_f!-tBqgMv7aq>Z4jH^?pY&+|rj1jYz2|A)RmYpRB;F%=U>v$~(ZkUXIGOUw5v16Li7Jvt z)np`lF!TOm*BGQ2`lq@OwD2}T8~cfV*-71GGT%Ci>q=>S57W}TKf3mG zd3m@b>tVSe0m?2lm&$-;o;zxLo8Ha3NgX(tSw*?n#7&?2HrRT1hs!huHmtBi$JKst zW8^}1q^a7z)2Cz7@|cp4D%>dJ%w*my2@n83}ITl54zNBM~Ab&3Akvn0QdK#wS2@%+9bbT((ie} zN|;ne6$;8moyh&M!p`(_o-*Md#3&M@-+zcdqEhWa5T9!h7#A-FD>!Znl6Btk&;GQv zNXWY-8CrY$$~cbTa7kW6?5U@_KSO6I2V%9>VO(mvvJ*K3*%XQE2%g+0m%(a=OijH) z_Ui)Q{Ugrc=C7D5pm>lhFw&mGVqqR5$Va+eCoq=4h@yTC=S$DWTX_;*S{WD~Ney}N zS8tr&6{c0oz2E)<9!-Igx9>$J|9XOQKbv*(twA`SRNTVQQl6?Yx(y#ggE;p~yP~YV zkq!ZHUVUc^of}u_hppdDG_%$!S$?1it?DX8m0&S!sLf zs8=;I&BBS>9S!EQ3LZ{n)z!b)h0Um0vYS*vlaGe*m$h~F(#^s@0U`I@yxP0r0wMoOkNqoTjZF(w|E#N<0$3VA|pcPDqLgXxXZHxp(c0Tsu%ToAq7sX$T$k!&m1bGuQvkpKaZ7MH|!|& zpEt#v5e1^$(*dC2AR?TVL4r~GAc0%p>LmBDx27Sn^eNrWirPv_*M6-K=_MO?^F7w) zT9$xH@ss7B5MvS%Ueptb(S{b7KNxZhvx!xyf4Rc_u=?SCY0QHU;i+qVmS;k8A`yfD*k$S3PBA=c-E4IlU)Lt?~tpV$mwtxoE%O6nsXN;v(5w zF7Imsp&+qxmNm5@!iLGD>u(OHxaieSFv6E`cF)C$71@3na29VXf zBw?g#HXKx+a%5D5xg)G?%cS1eOOEWE_y78~FB9bZG)-)YAG3Romy`YF9F%>hNb6^H$ zVR20qL~;R_L?LrS(QsE}M+NrpqpuwaZMzcz>mFe`6yZYqiWK+9-)~&YEX? zPJzk>hBXCAl5rvIy=J1nGf=Co4491PxpX120ZQswMq#}g~fbO%$w zGR(A4uonCX$c9`4@2SL26VT6M(76U$`AOrkr(UgUyZ3yQ!S=yxdS4^%QHJ|yLT*3LSesDJf-9*u0WbCTuk1}$X_jRKbe*^kaj z>;vtq(Wa%8wWN~v42Vb7)2-IHJqT{Wi&%a(+-_I{(_dX{GnXtO zW`F1g2PSUDFEs8mH!+xOOGvG8ck5o(bxhjNgPz;?L;QzF&O1nt4a^5yZGL+?(#XEk zU%KKhb|=Tu!)iSBeM`r_k@KAcHR)-)6T>;joE=bhn;E@6`=WlBSd`0R{A2WS#v^Ye_8_nIrXOnW7r zkp21jK2uj-(TKgteuUZ-uNDz^!)LE59RBk5@9i{8Gnwx8yoB?Gy$tO%VEPS>*oQpo zl)g10bkd5e@w<HRp*sMeEj&CT!08*2a3wa^yWL^`wifHXA@_@{3os zVn1>WPui40&uqGELoHrm`a1R&h}?n((uG%>45Dk~!vAW;{v?OaZ2ftB)QSU14qt5~6%`fJ`n9{L zQ~U9FZ;;(Es3Ryfc_m#qe~JG7?!Ib1Gx$DwjC<~98)&eK=~>se39==3L2Zkoj=iTB z=^%_wjHs4YhA1j4Dzdw1$ba@|(OWp-ZrMP>y6tn6gb?^%z z*M{EoNaJ?Yyh$Jl4|f4wL1${_>Q9fjwx*r$9-uR)zoXL9QpGl(S+D{950~L7GZE=q zet5v!QCt7o@6Kjd-e=bIw!-kKYp#@wb3ak{IC1=IvL*%(9?UK=$bX_%tI66J`_xkO zJwg_}+eqp&Y1P$<+Yed0Jz=`cWIFw3?%I~_AIh@U%&3eHzSjvONr@eA@3+c;)YMc( zGyVPjt!jtOTK`rFq!&iX(!TTbV)GbstQu!lt?uKg<5|i~4F+2*6-bGDj-K=NioL5B zMw1-#XRWu&gp7;~MSn8~4jgDzJ6{%jjef@{5}vyDiWLP88-Fm<<2N5MdEb=Zy|xq_ zl^b~Q@E5M@g|T!$A)*38wbS6gi3 zPRU*B(qRVrjFu&M*z)TYW?z9co;lJibaDElMRM*jXB=+?Y36qK(IxKI3lm9>*s-rz zHLHSygJsP$nM@YHzismYG6*r1h^@%ou*vI&nDa*dY#dHJehG-f2m^BrLflP2)!`+^ zQ~tqI7R^|>a(`vDM*8^pU<-3s@w?Zr7g5&^bI@PB65EkaCJ?xL)tf0jPnZTsj$WM? z()FK<6b-p_=@K<+)ToM?nVFdue+V-tZ$v+dN}K~tVWcx?#@$miHqqIjO4?yiC6gTE zqcZ4r@f}4|Qc_axGcq6`fJ#bA6u*=C@?Nw*Nr_VQAAiPOs)?bhNlgr@$tFN@j2ZSS z{dDz)tTBa!g{0ML%|^Pqx>7+wf#RNW#nSi5OEm>;E3%loV@2%4GW)&|=k}J65S}3< zPM;?vZwpkVK;Tqaf;&7-dv_lvlG(8wIdX)8f`TYJJ6qPsGpD|%Q4z0JYI|xGdZ|)M z(}m;@Gk=A|6`O_l=nsXscArXz1|Cuv)%_cq+#@HN#IXnW3o)fIl-|U#5r)#!LNawT zi#tt`L48)z);II%O5qKws@)Q7Jr3l3MJaJvV8eRk)B(^oy)Ptc;5S0-DE?R4X!EH9_-RF=Vj|K@ZVW!n4f+8@5_03|t z5bu;D#5OoA#Q2-U(FrE^h&POyu!}~I?qt*koib`Wx$@bmYo7#D3BT-#mOcw%o3~WW z*x+r28CvZE@-Y1AKA5rA80n*$@hKkLT7O4P|DbfCklZv?m~0v=Orc;LD}59U(Rrkir+(3Wu$ii4Vj$WaA*9d@VbZZ@gyct* ze}w)5OuUBNGr5Zug)w-yFzQ=ehcF|QKKHVa_%@DTvEMXE&6sGKf32ERTRe#LX z%rnoJsUk45OfoMIJP-N; z^Mzu}MCX@;q-AT-Hmjy_j4aC*;(tP_|M7XbBG>;Q=Wg7&Y9im;%{kxOeS5x_Cb06~ zOl~8c4hzu-_F+4)7uDnrA^z13LW1ncZ5YY;k?$v4stcItv{Q(C>0=?*y!9}O z{PtMaY%@9VS8Sf$hID3CiQ@hRr72Xo$uYe9(T;5p{|W8Rg6y9$L+#4fK2NC zw;-^^TQ5+x#1+^Z9RVc64u9)TXmneT{Ui2}{#T5;b`NnUY_fG}16nP@BSF+nMtxgL zd(nR8lLPmVs@DI%SBlsE7W!;x)IIto`n>@{xeGSky692u>Xx8_EJGzZSaD{Gv-YzY zs8gqsR+C7c95!!>>=xYpD-JXW}Hg1sb+vp=a%I+_89%+rS zr_A)!Exc3lgaKYN%JBCrY*8A>_t9`Gc$%y22t!*qtH55Mcn6$Tx6ljbMS>VG4zI&t zswYrt+Z${I{01!t8Z+7k^tMC05ug!Q*ztxou|u0KTv;AGc<|uC$SU%@H5eu?z-CAx?+Mv z0M!7ZDaQbYVE}-7~o>rw9MEZ3pJ-)o}=j-3=+k14_Yedbbg#^DSR*$9q|AoSb1K=k26-qAT z?2ngMaiq>wdNpyUJY0XfL=+!L+5*H*M87H~(zuAP40zqAx@v0K zu5Uokumrbi!WJe)?(OH$<`L%MClE=7N?A69@e)qX3_s7Wvz z8e75tGAwF(^5>UrJS7&kZ!`VZoYqjMUnASj8fA#3#t&aQ^rmE7p@N z0ppt{eFf>*Mq@8A;8apeN+jQfgezZss5E-7s2#$(OH*Sj7vO)EPQuC2(b6z<$3(Bk z#I)oX@an^GPCAJhl@9O?Om18|y%vSXTzrfuTTLEY*w#%eA7!j{T0Y<-J(E^_WJiEpoC+pd8& z0Odz)n|1o6B4+lB)L-!#fr4B=zOlIqPqia{zP5QFF^zY}?voxgK&fDy=eA5IQZ$_N zkO0m105aOn7+jr4Mow9x=-sDGux=ju6>kBDwG0_EHn!#IpzU?6M6fL%+0Y#yN1mV9S&pHKoV{3m~a_PR1D6?dIGIP(KUK zQ8M0wI@IJ5fzhnnxvox(WMa`Fi{P$7${jWDuGxDEYc|c zEyMT>(yv~#AQ;l6*6+zlIWWJ~H9gGPW?K8|kl4`d_WgD$?wEJ?m}fL(YN#?f=_MBN zdWo@jmJuuf1>wkXR_{Y;VJBg#dcYyMh~<&(fgQ+h)ggkJGqQ^KkRqO@Xl<}QoU4B! zyVRust=PatP81mjIE>fT5~7Qd=Rsx6hI6I_xAfjzHI;u9gMqh(#$vJ@0nO0snj-f{mt|K~%eBGd}P zN^-Byb5uzlVD_Q~SKbLCIAPbyg%hF^MxSMjcM!#8pKI^JY16W*$@m3V$KGVqb6b2q zZF_QwRH)s!6Szlwp_-w9GQ_Ha{N-wQisuEsYxHF(%1i)O_86{} z-zd*C+6U*69I)*H*Vxv3{4dj0IW<|8=HIdf8dj%RaX^%3VJ}!6*HfGhIwu6etOeJW z>s{P5brPy-AJN|XRo5(F?(lcBb1z5AEnT}jVG1T}PSu`9Nv~b_32uFi6xeH!FKf@& z73)9pr#6Jwx}Mx7AwYP*1Biuh$=!9-m9O(e9WVz~YLmb?CHJB)?XZB*_mlE}gP2rd zZUx@&zJDub=yo1=*k1mnWnF*R?GfzfepMallJzFLE#Qz*@kbbK9D~*aJS>a3apg+z z(EZNFCLXJO8iq%gYzev?X|v1Cztg(~=!FB)8Z}yt3@qnDhgF{Goe~#gBIax!h10W| zlt^|Z$WlV1si8e+w4Ye_-=80LSd$;?SXD*QT6&n?`sA|9My|tiHNb}erF{pMigj1_ zXCdfITx;*{AFiWLF?B4NcL;(BH z2BQ9N+L)rqy1;-Zk=)5q%W#)N;N+l zHc5wvH*0i~3y5oZZZw=UY0vSNOlk2voY3-e;ybVVJTHUtkZ~PGbr9PBk=f1hrIl?+ zs@{73r{>#E6a>!z{wngDu}JCDw;6-;&_(*)(;JAN-hCn*%njjgfN ze#}|yT0N>I(VxQEvJaO7vrg!y$f1UIcI8%ZM@L66f6<g|Zgvj0-bR*^DdB^g#>A~s z0=D42YWxel&Ax3&V{K(0<5CF8Hv#Jct!4boRzk*1xFC{NkR*!Vwm?ENJ{~c%=Q+JA zggvX)3X99m%lo=9mM$nPOvbG2?|E$7C-0Ww*A0$0$Lb#uY%dD8}HA1+Pmf!PycB*9nQFQp^|J$Z+rkT!K>JDVa~bo!pSNo zrUziY29Bn|HA@_h!RyzlDJgwhleyWCB#y^E*X=2sqge}X3tRg$6O!5MOj@Njh zo=Bv``nL!Bn;ZVJ!osek1G6Pf*sbK6xs&Se{IDJ;YDXt-$D=1xO6TeaX+d0eD3kw{S)!x zQF{^wssIIc+j3wcl%VyCA@RUTY@CZyh>TFyWDY-Oc&R9Xt?>DXCK=;|iuE7s8Sf`* z2(r;?M~vNX4~w1Qx{*WO33fR4bk>4^sBYj+SFecTvU?{i z+#O>Vw{XHlBJ1!sii#7)R%Gx=B?VzlCif~b`f)Me$sSkH8hGDm>eGX%;*PLS`ln~8KkNQGG7H4Zj(-% z;w+E4$)B`SJheE_+03jz^z^WKQYm5DY_${ei*5+4SgZbH6sx zaNQ$K(amp9w25a?K%Cl|RsIu}0G?7VEQD-NzN*il$W55tJ$lu|Zi9$Vp=dYThok(o zs`lO&?cteMnClCvfu+a5dxTTUfvFT^88w$+69HsRZ-tl85q9(S!o|F>IQKvK{{qUi zTTD)D8Q9!re33)e1o}9hUq{t3v1A5D=Ov zzBnH>oOiu^TTps-Rg^xk<~dE;9;{t{>u%DxHq_mrW1p zDK3R~OxznQk51K{I2Cewll&!IJtnAiiacXhBo(il(k%Nje|HvNO!T&&hIERM2*?f` zec?!jDBGej?D}Mv%000B%0kwNlYXATZ21!IgRCwC$oe5YKEkT+(8jIp+Xp zL&;1f+|30|K?yPyQFF&+5e|V8rkD$5ar5SqEncr_Sz2bATet#UO|#^nsd)8XO*7Ln zchkIHhf&~i}ELgB$ z!GZ+~7A#n>V8Ma~3l=O`+?$b*Ti_0ii8%#zlXCVjK~xMuUqNRz%BIne*+9JK_*{4-8GnDez|Y$j}oy+4L&b z?U01F^VKkOvwuW~r8x=~g6@gA`(2rBrDx!NS3wuMK1XHhxmgV}_sZtCb z(A(I1*jseDht|aRRI3(#kcN&ek>pYI5M)CeVl4*aY)czt!iyS z4J05?0D|l$HV`hU!uPm*1_CQ)Vi6!^Xd}jHFvT0Q75zU{a#yP|eeB3lJ`=jjOn=Syg(exyM*nh4rT7HejRH{RTtGGXSEt zuN1tpoC}{ie_svezFW{+?S*klO(oQQ%#4c~ZAS?CXf^0iZ8RldERRo~cfN-5PjOK@ z>`xr1e$VKZ{OTnQ-;r(~ogAX`=~@($I)Ce8pI4WhiQBmQgo-tTyGu<3I*L`($R}T3 zbWW=YCN1Cjjzn(`yA{2B+Yc&g5L=TU?FgI6o76}o`s2@k5X92*f|+vZA`6{@v-bd4&eE4p+neMU(Xg=^p)N3owj9jr@sY`DBZG0$czwkNdT%`GI%(8&1V-sCF?lSJ3lzKcpl)Cb+8FGjsEv6DD)-TY^AUr$>zw*g5_; z1y1Buf{u5}BNCoqV|5Z5@aF2%et&#VQkO8r(QCu$>6KretVZsFZk{f8QrMpZU0>Ct zLQ`J9u&7$$UK8j(~^rgX3Q)x@??mzlkxqOSnd-~ew zGGe-1GX*`O1%3Xi&yGqKMt|`ezdkW^QSPZ0T~dE55vQ2QG6d)c(#@NNR62y8w{6`^ zlP0`P!R;+DqhE#hIm4ulqKJ@j^!lvjbo|&)R6gE)dp(ZpCrOCqtxGZsoxk=o!wJQY z<|lvyj*=Yl;paa_&0c*buzm7%10O|V7&ZOr%9U#*6=zOgq}=RX^nY;UF67Z5khllh zlg6V9={!S7=M_p?k8Z@fcOvfxTG5=DD=264F1m33vSgc?FDxMg*I$y}(>^*UVd4Q> z{&&-#XdoFLNlgX^9agiJxt9#w0FvVHe@~K}2oDb@bSVnQaU?fJ4Sf}T4-|)giXIy^ z=W@(iYx(8LL0i7a`+x3zY(K}gCXFfo9B$O?HD?UmQ&g5gWmva%rz`^!6B8xPY~H-N ztagO^X4^nqzPZ7oG!1&@M)B=pPst9@23vkPci7rdRa3JIgnOzPj1ac6;@0op?(a9E z(8vuTF!5W>{F5taiRVati$pl_Yq`tpC`zG=E3f@o10q&Gp9|P=JZ6Ek+~NAjF#dO z#^DPi>jOXLo}{s(>zce1b^;P3J@vysw%o*G@ZiB^jDIwlOmy|?Rmu0PTeF+|c?jSy|-a;X(7~&lf%B z^3T^OeShpS^5;^}ra0};-&8Jf)mz-?jHO(B|Mgs~{})^gGp=;x>mu&Y*F;&Y{P6s3 zTujlYC^{D7-uMRYPw8AD1=++LD@r5Hvy>9Qgz|TOOScMdRWPft(DCg3;lxFHZTco^ z5ikkuq)O7-dkke@EHILAve7z>aXYHoe12F#zJIn~vQ-y;|2=P{)vx^^t8ce+R$T<; zYoi2lXa_{v2(dmw)i{qEUHAf*c&VND*z;!ZXUQ3DAI_kpn8h^rwOsmitUFD zjPiCIrQA&iXvw=fXzKV?6w!4SHRRJsPMeQ-r+)V$mw0GCH~PZITwKv+jO{Bdlk)kY z7=Lp=f{|qPee5i93A?w=)VB(>`nA1o_3Z*t!hX)zMs9$iQ($NW&VK);TwEQ@1{a9x z3dVt7G1SVl@Ow9{W6J;gYzdf__{wwXogK#0@d{Jx_kdDP=Hf$4kDa z3EF%Dg-|k=v}X#J=plU)2GzruPh#wAkpnaG4`EFH9jwL&Z$OxiV#h4v;%m+35`S`D zMj--IDHZhRlCxpLB5HH%u;rh?#|8YdDvZorX41vC=DCf>3~cf2iyP3kh@Dx}DEWij{FcaNoaDNGNP;}Az=wmsG9V|aW9iMz=S8xbp?$4Za5PAOE zI(cT@jy$uEro!@tA5t3?C&Ca$jJ@UAbU*>C`syJ4&PZx}JA#+X2(1u=(^BQ{gu3)CN&(M5Le}60ohEN_K zy?P55Bl&k3M%@GrC<0WDBS3Nt+qoDwta-QOYX%iBmvm2dt$5;jMS}*+F{g$$s9&yP ztcA7cUMvG3Y_ALXnkb#KHc+(=6fUU_D8la=JKf08Mm~tO?{8M0P^=-lW>p;H{dJgA zRa&|{(y4gq@+gE2PIbOfpMU0p^<}PYjp-O!|0Ijmx6@3kUpvCmHh;x3Q>12w#fKiv%WmjD0&07*qoM6N<$f|Ev@Z~y=R delta 4456 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 delta 4385 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 boX-3|to8L6EFnrx00000NkvXXu0mjft09q! diff --git a/examples/resource-bar/assets/Fly_6.png b/examples/resource-bar/assets/Fly_6.png index 8cc09c7e0c8f15563b9763c3affadbb1b5c6266a..4ca72e5bc3b0ca9771a3c0a8c93c57922e3caec6 100644 GIT binary patch delta 3434 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 M07*qoM6N<$g6osAsQ>@~ delta 4514 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 A>;M1& diff --git a/examples/resource-bar/assets/Fly_7.png b/examples/resource-bar/assets/Fly_7.png index 6999696b33edbb9d601b3129d67b9889a8239e08..76d5a4ac35fbdf740b4b3c99729ac447b6671b6b 100644 GIT binary patch delta 3434 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 diff --git a/examples/resource-bar/assets/Fly_9.png b/examples/resource-bar/assets/Fly_9.png index 551ababd4e85aaceccaf0d932d0ab0eb0b4bfef9..366b4ad0b4f63847edaf9c5be361f83e3b27fc6d 100644 GIT binary patch delta 3354 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 delta 4443 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 z aBAG)s(|BeE*;8dk*7u`dv(J0qp8N*0H=5l5 diff --git a/examples/resource-bar/assets/Ranger_Carry_1.png b/examples/resource-bar/assets/Ranger_Carry_1.png index b10bcecc3a8dd5dc9764cca1c0431f56160bdb90..d8e479c0929c7f95a3700a1df76551c6172aa931 100644 GIT binary patch delta 196 zcmV;#06YK10`dWnB#}WCf22u7K~zY`&6V8^fG`MzyMga+zexAp3AQ&D;f$IoB91I`b<4OYDYx3qT@2 yz!2bT9SGn`BZ0nP!UFhVApxN_>B`UamU93)H96n8m7twTH!8tkzhAY;13CKp zd1KL83cDqe8B(YPBrM5Ya)+nbF0j7IDAdrF#mDoI!VXnIe3NmkVfF>|9NMD7coz?5 zAuEKx0Qy5IT$Hk$(c@Hbf-9kDK4UpQm5D!CaCy9($e-h!ZJ9)~8Ohle@yw}&uq<~@ zCAfmUb1EPTN4_HpM!q8oM!up7eZPRt(^7~Z&C5Xfm#zXhix<%IkY&9fdPx-!52Yvr bC(+smKf|*oiH!oQ00000NkvXXu0mjfzpQw= diff --git a/examples/resource-bar/assets/Ranger_Carry_2.png b/examples/resource-bar/assets/Ranger_Carry_2.png index 7a8efd97c7c223c305a34e1724d274a026552bdd..6dcee5873cd9ee5aa4aae0b7052c8051ed6f93c3 100644 GIT binary patch delta 178 zcmV;j08Rg=0^k9VB#}WCf09W=K~zY`V_={m_>YE()&OQlNugpwhW&p(%M*-YnsFHd zQ-jw4WX;HYk_|u?M^i)C3otQ~4S-=%3}8U^A3hi0i&6|%kZJ%{S0EckOoBp*J{*aO zI0LX@qLVZwng@vi{K=a!@W2@W;}0DJuxcLZ29R4f;3}ONNGcDoC=@Kj8Gy|NWECjb gyhL&sFwhzR04f=o=;h?T@&Et;07*qoM6N<$fY0q<w2Izp^c;bJG-C7z@cyi3(OJn+rQBmKp@KSJ2{|cfFR=lW@8xA zy1qjIuWj8&#$F<50Qcwd0u=Q#7yy23nMRBYnkA$v$ZC6h00000NkvXXu0mjfX=PWL delta 264 zcmV+j0r&p%0k{H?BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=%}GQ-R7gwB zlidx%Fc5>g0q<}PdZizwsF-kR!TP?cDA|BUt7RW|-$z;w9WoHl=o{R1d`bl{Z{SNQpWDk!gs z3M;QkD>yxZ%NUv(82xPF%d){`6&n68N}v&9Uk?Z|qc<4B!*2};mgNDOC8R3veMh|j O0000 diff --git a/examples/resource-bar/assets/Ranger_Carry_4.png b/examples/resource-bar/assets/Ranger_Carry_4.png index 7a8efd97c7c223c305a34e1724d274a026552bdd..6dcee5873cd9ee5aa4aae0b7052c8051ed6f93c3 100644 GIT binary patch delta 178 zcmV;j08Rg=0^k9VB#}WCf09W=K~zY`V_={m_>YE()&OQlNugpwhW&p(%M*-YnsFHd zQ-jw4WX;HYk_|u?M^i)C3otQ~4S-=%3}8U^A3hi0i&6|%kZJ%{S0EckOoBp*J{*aO zI0LX@qLVZwng@vi{K=a!@W2@W;}0DJuxcLZ29R4f;3}ONNGcDoC=@Kj8Gy|NWECjb gyhL&sFwhzR04f=o=;h?T@&Et;07*qoM6N<$fY0q<w2Izp^c;bJG-C7z@cyi3(OJn+rQB+-G@gLo0d~9s4`Tu^FC(#DL)Y8@fT$r{7ARB_75|K6IHGohw;xYhd0wO0t5z}C(9e+w|s!@Ok001O- VjKG60=-2=N002ovPDHLkV1fY0M*IK( delta 240 zcmV1Hc}WRIEd z8vwF6ia8WAWD$aAks4V`hTvJGMwTIX7Rl+C`&tSai)v&k3K@%P#-M9@AdZN)6ctu) qDOvDW2CBcV@*Embr1JiJM{64-c#Oc&1Lf}k00007vcYahP^&!Y1hMZfQWCxpJMALguUeRu)iy04 z!!so`w1AY@nZ)<=)`C3y0-i|&sz3&;d(yz)3n0Z%;0c~8#c}~qB{-!xqbJFv8Tm#E zGlaJaz!0XE3n1)^%_bXMtRPhPF7fhsW#PV5;0c~$wNXYHl)^5%9eU$XR%b4jQI*tZ z7qft~pBMDMYkvXc{PU>-Let>_ixU*^+Zf+x8U_y+oRSbemw$biiJD&*00000NkvXX Hu0mjf=M8S< diff --git a/examples/resource-bar/assets/Ranger_Climb_3.png b/examples/resource-bar/assets/Ranger_Climb_3.png index 0afc09013a3bc8eab636d10b11789780cffebea8..19dca09587a7a09e89db8d1ee4b5a9e819c3c839 100644 GIT binary patch delta 167 zcmV;Y09gN^0@VSKB#}WCe}_p#K~zY`V_?7y{-a@%!2c*IR7{E?a1F?sNipO<9vA#4 z*>+-G@gLo0d~9s4`Tu^FC(#DL)Y8@fT$r{7ARB_75|K6IHGohw;xYhd0wO0t5z}C(9e+w|s!@Ok001O- VjKG60=-2=N002ovPDHLkV1fY0M*IK( delta 240 zcmV1Hc}WRIEd z8vwF6ia8WAWD$aAks4V`hTvJGMwTIX7Rl+C`&tSai)v&k3K@%P#-M9@AdZN)6ctu) qDOvDW2CBcV@*Embr1JiJM{64-c#Oc&1Lf}k0000fu4Z#(SIMV>k0DR6TIS-JN z9|##ho-07&{K=can2;fGg}5-@fW)VXWCM`X0m;rs3o!EhKe!A)FwfG&h5^=shAab! oPKCt!l_my|T@z8IE*!!D0FA_bmo)}fLjV8(07*qoM6N<$g36Cg5&!@I delta 251 zcmVkl$ezH=zlsX2O7l!FoY3|3Crc zf2rIOvM0sxdVy1ytYDh23hX^cA1XsbABF#xQeKV3eV2U>Ah7@d002ovPDHLkV1n*v BXXyX{ diff --git a/examples/resource-bar/assets/Ranger_Daze_1.png b/examples/resource-bar/assets/Ranger_Daze_1.png index 40335b810debc83addf38258e05b37711b2117c9..2b39c4cc5e52ddac59e397fd313ea884120f5bce 100644 GIT binary patch delta 192 zcmV;x06+hy0`38jB#}WCf1pW3K~zY`V_={$_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGyc`U_e&DpS&3Z6Kw!4L&!D&#wNC4!LS|80K#PfHm8$q0J>L3HmU)n)(se%NG{Ux u6zBg*s#MTjKvKPctw|m@y{~e_ z@M(xK>$&wIvdH!IxRLZ()eu_p=IH=b==6Z5A+&%14(S985fcaS%u;g~`ic(WsujIN zo;ot~4k`>D2|(}7zYzdZWZ`mu?xgRr+{3)$v;gi=n?j7a6OdxehXeGCo;DKxF~BKh xXVSlNRf;#5zAD8VBv74)^bB4h(}n|-vH@yQp87`q{-po_002ovPDHLkV1h5DZVdnc diff --git a/examples/resource-bar/assets/Ranger_Daze_2.png b/examples/resource-bar/assets/Ranger_Daze_2.png index 6e9d1697d46991fa47cd0c6d1302e4526beb0947..b8f3fb6e63f7f0eb9fbcfd758a42250e98e3696a 100644 GIT binary patch delta 198 zcmV;%06G7!0`vipB#}WCf2K)9K~zY`V_={I_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwG0}##JnoXgZvgdeC$&z% z&_r@kj;9#^Pf}%q?gEnP18hYZ$;p`9%9LaP0MQ$rm_qod%m4rY07*qoM6N<$f(Nct ATmS$7 delta 255 zcmVB&@`9!=WIzFz1O;6r#07k2sdEVZiZ0=)HF}9W zwHIa&CITK)5Q#mQlyFE|0rv9>*m!xojQBey%n{}V%L;hMY#JiQPC<$UmlWtTc5)<~ zTW}~0b_Gr;yO911SEcxX*{f1~Knm6UkSO3aWIAw=Qa;feotSI;>ox!Y002ovPDHLk FV1mpZZ7To( diff --git a/examples/resource-bar/assets/Ranger_Daze_3.png b/examples/resource-bar/assets/Ranger_Daze_3.png index 40335b810debc83addf38258e05b37711b2117c9..2b39c4cc5e52ddac59e397fd313ea884120f5bce 100644 GIT binary patch delta 192 zcmV;x06+hy0`38jB#}WCf1pW3K~zY`V_={$_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGyc`U_e&DpS&3Z6Kw!4L&!D&#wNC4!LS|80K#PfHm8$q0J>L3HmU)n)(se%NG{Ux u6zBg*s#MTjKvKPctw|m@y{~e_ z@M(xK>$&wIvdH!IxRLZ()eu_p=IH=b==6Z5A+&%14(S985fcaS%u;g~`ic(WsujIN zo;ot~4k`>D2|(}7zYzdZWZ`mu?xgRr+{3)$v;gi=n?j7a6OdxehXeGCo;DKxF~BKh xXVSlNRf;#5zAD8VBv74)^bB4h(}n|-vH@yQp87`q{-po_002ovPDHLkV1h5DZVdnc diff --git a/examples/resource-bar/assets/Ranger_Daze_4.png b/examples/resource-bar/assets/Ranger_Daze_4.png index 99f630c04cfcfba9465bfda6e08c02c52e96f202..6db8160092943fe95de7dbdc5236b7a23d5c7d1c 100644 GIT binary patch delta 192 zcmV;x06+h)0`38jB#}WCf1pW3K~zY`V_={W_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGyc`z%YbAc{2v4*buS}fU$`!Trg}$Gk|b;fX(S-8-VVWp#SzT}l3>OHyn>ol8<|fra9Eh*z))nJz4_Z7-Ooq00s}D82vy002ovPDHLk FV1f;OYHa`j diff --git a/examples/resource-bar/assets/Ranger_Dead.png b/examples/resource-bar/assets/Ranger_Dead.png index 3fe61659c802fde7a273e520be27ecea61aaae9e..6d33f273dee34e2fdee83cb338b66cf22c115fa9 100644 GIT binary patch delta 203 zcmV;+05t#p0o(zQ8Gi-<004s=hKT?G010qNS#tmY4#NNd4#NS*Z>VGd0053jL_t(I z%e|A)4S*mJLvI8B-N+UEbt~6!Fh@9}iBie|cZo{UKuGAL4T!um6!eRM4$Jl^3ce1^ zW0J!l14h9NQb%IFp}6)!GvK~Xg{+HM=^|-eP^`Vth#Op(c|@ROY}Sl>^hgt|mZFsm zFJ^#hJ|b+)>t6i~<)j#jD>rLI;5pYGnFT~>?;GmZIsmq+PgLL8gS`L%002ovPDHLk FV1l2xRE_`u delta 216 zcmcb^_>XadWFRvG1H+a>WxIhCV{wqX6T`Z5GB1G~mUKs7M+SzC{oH>NS%G~10G|+7 z5S_d^N{ZqAEKiVzOZS%oDb|u8zu^Bs!0>w;U+_dliJEjz7sn8d;M~4$p#}v3ri*|6 z=jT1#v|8=h$Aes}zD~UoSEirbQ#k*INAbB_3A1ZW6Zc-alwe|NvnIxK!(o1}`mHAG z-1EC)@A??5xE!gxPBPNskJjsT9HrBy?3YTiILze~8`=Ng%Zl;ZWG46AU`K19BN#kg L{an^LB{Ts55-U?# diff --git a/examples/resource-bar/assets/Ranger_Get Up.png b/examples/resource-bar/assets/Ranger_Get Up.png index 57503f5e2abad9ada3d8b94c70cac86bab66f090..f2f274bb69d147166b5f00a69601f6fbd0ed7ea9 100644 GIT binary patch delta 189 zcmV;u07Czv0@(qOB!3BTNLh0L01FZT01FZU(%pXi0001sNklt>Q{4cf!vL2TNHPG~ zC0JsGxEMfB2ZRg(I~89dLh}xG17L*V5H-JBRGd3I(V*pk~R5bwEAc9F4 rmludiMCh7f1`td{XcGSkVCn$?2}(uVvc0ca00000NkvXXu0mjff=5AM delta 261 zcmV+g0s8*g0ignrB!B2hL_t(|oMU025U`9IFlqp;4fv17XC%dd|4~w?0?VF(4a6`6 zn*m_WKn)DYhCszI48iIGWX&Kp%m8cv-2k}lFwO60d4k!3Y1^^70;>yPhQKuA130}v zEFdWzKn*4wh{)kUwhKUpfC3Jg4|N63Ktzdu^mKscI=CSyE`FHW01Wkp?N~J<$I3D! zmtlATW(cu>U`iy*0GJ^Z8Ni>s8P5JV*O#CH;JgotHc&u;uwa@miXkMs0Go?IhC%^m zI)KGJEb*Y*j^qu(Ng12d38qBki~_U`y*$JjD=-7l%Q~zDC^i59R!&_)GIz&c00000 LNkvXXu0mjfjSy=w diff --git a/examples/resource-bar/assets/Ranger_Headbutt_1.png b/examples/resource-bar/assets/Ranger_Headbutt_1.png index f2e4b6b21deafdd65ae4d70f25e415d2e2a8006e..143243f8c5cb55e484719c56cd9f60846321a8cc 100644 GIT binary patch delta 216 zcmV;}04M*?0)_&RB#}WCf4E6RK~zY`)t1o>fFKM7*}#7{as_|g$~7F!5iqDErBaLO zYltL`h~^H8HiXcrMHX22JYL{*&3*Xn89YK~Pr>^-opF!h(v!h75R!fZ@(jBN(wGo! z-#!KAeu`S!_$prom6r=aEq(Oi0}-MRuF0jgxUPR+iM49oTi*a~WJ zR{LnZi0000)H5#C zgIdlDRDe9Ybma(oG(E|Bzh5v-a{+2J6~vUUTmaJT^{Ik-ZpSd?2zq%WhAEb3nhM~` z`JSc%R6>1EQt4T0PZ0iP^aQduzW~=Wn(_jT lmuS)xa7|{2uwVnn@dMKm!eXkrqqdX}u9^wvfrGEJ43tEJ!UUBH?)|whEf4~6@&_IjRDN_Cxiz;E>ULlR#dqY(eQY7b$3xOKCeqz%tO_sRH^8 z(&!%i7lIxPCi%C(g5U%lK={gH0m7dQ3&4M+KEX%^-YhIY`0AK?_e@(C>_((G8feZ_ P00000NkvXXu0mjfecE2H delta 285 zcmV+&0pk9H0?h)DBpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=;z>k7R7gwB zl)(+dAPhybLGRtDEA-l}x<&`<2vi?1G6qA9shTHQA+~uxryOS_Pnikazl@oH&(;I*%q1xwF!+ce jGXeE@nQ#mKz;S#4>_((G=@)5700000NkvXXu0mjfdv1Gj diff --git a/examples/resource-bar/assets/Ranger_Hurt.png b/examples/resource-bar/assets/Ranger_Hurt.png index b87e3f660eb04ce54df213f1da309e5dc002dbe6..a43ac903ccbe9bad922313e9379b4c5235e88584 100644 GIT binary patch delta 213 zcmV;`04o2}0`LKlBYyx1a7bBm000XT000XT0n*)m`~Uy|qDe$SR7l6wmB9&sFbqYr zfp<4@1+Q-98V=?N5d@`;B>$%s#6ZBq>+`p^R)i~+B&eoSrSn)fD^YK7A%U_AHVJfJ zr?WlD4VPe-z)G40Yyv64avdCLoWK)=gQJFm3y37)+>rooAWr+)el8f6?a|DMd`Dm< z_Bkc6X{Z$5+o=Q&OiR8MAcz+@0Q@T>0B&gn*t;POz=MSVMbp&Y3$?ipKg+`+XeyjM P00000NkvXXu0mjfJz-Uk delta 313 zcmV-90mlCD0n-AIBYy!JNklLjib$BxqlaZ=RQ^<6KH)7Y*JZW)GqVTD9T;w+gH@Z{qm58mHx4*XXcvX4cP z!jUCGha?n>WRK6S_t*XTwK~ciU~-aJII2yd00^N7y4WOukblTjz@&wOF9YbbY67li zl?WHBu&zB^FJoT3S|L{l*D+WGG6#r9cUeO<6%oLZSpn?4Rx~^Kt-!N?l)-7J3K-ZR zQnPGw5c+@UcBkNCp29th<-YhYRBM3bRtF~TbCo0sxRf}Dq8YG_ac&y_(+8~m_?S&Y zbwJ28E(=Hr2r}GY^oL`$gcRI6t0f37*mHqR(8R5l5TPEfVuFS*c+t?U#)hX&mB!ZoAwyF*kx3r)k+P0J&9maLvJ`I>6-00000NkvXXu0mjf D5QAM& delta 273 zcmV+s0q*|y0l@;0BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=)=5M`R7gv; zlF<#qFbqVq0sm~o3jDGaYjiM12t6l`Y$vu`M4xm@a=vqgM7fe`bc*`CYr$)yoKg67 zi7Lx?zlV$3wo@Y^`2-d@`z_-!1sEJK*JNX)V*@01E~%lxKPz*Mkr zN;!C8&!6yuoOc^XLn(pf;x`~^6>EaL;-N3sBWQi?Qi5v60{8)tB#}WCf2v7DK~zY`#g*L+fFKNn*}!)!m{t_H-k9|ur(P^!NQ zV12?62$V#589A(wkp$>;OBYB1bZEfcU6^K77T<+U%``0ACFn*fK$*J$`8%q9%lrwz z64Q`>0Z7CH3;~=GNC1CnB!JC?1aQD0fk$Qf-eKCj4y?nX0sjGCTmS$707*qoM6N<$ Eg3~Hh`v3p{ delta 272 zcmV+r0q_3!0l)%~BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=)k#D_R7gv; zlF<#qFbqVy0sm~o3jDGaYcLoi1TKjq+sWB2qE9+GvG3eg>UJi@=@8|9wL-6raz^0S zB_^!z{TwokQs2*8mF|5-sU{yjyZ{yY`+}~JYGR+z6*9u8UfH5yLd9LA7q~Yv_@TMW zQs*&@p%-R)0V)D3Xjm3&bcJZ65AUK}9stTG=Up4h^`Qg=R7gwB zlF<#qFbqVy0sm~o3jDGaYcLoigxZNC+sWA}0;x|rC9&_WLSj2L#pw{`ezl@mUFGz^ zw;ljT0qDLZ0R7ft z&SDCwpx)d7XvPYY%NHxs0owjGvkK|egsTU_r99LN^L{pA?t`9rKL|kInLeOqeg&Y3 z&5&;aNMr{n0(=$#0W4`GfZd1$u(6N;o{4GnE)0(wXU&hsi{`SA00000NkvXXu0mjf DM+8^) delta 274 zcmV+t0qy?x0m1^1BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=*GWV{R7gwB zlF<#qFc3q#0sm~o3jDGaYjiM1DD|ZmIhQ)uRzl)QR+2m06%x~5vjm-DdEQ%LR#rJR zaJ8ff^Lx7wsYX9P?}v$Jt0ZQM;Zp^yO9f==3W7Q;3^SKNUJ%b!4YqK3nVY?oX9zKM z8HF7e;6z{#84f>d2peN<_z*S3!n~|=mfLIYgn3zy*$qS370a02Am7b3K!*Kot^r*j zzRe|2W;O3nMm6tHMm2B9OvejwFQW#Zt9@!n|I(R(ce()QrbzvO`bcK*8LJ^R{D^7# Y0%y&S#)*#u!vFvP07*qoM6N<$f`Wi_3;+NC diff --git a/examples/resource-bar/assets/Ranger_Idle 2_1.png b/examples/resource-bar/assets/Ranger_Idle 2_1.png index 10a48c75457d681298c896d3327159067364f61e..e45760c05aaca90c77b7e929db4427fb69b01732 100644 GIT binary patch delta 184 zcmV;p07w6$0_FjbB#}WCf0#)`K~zY`V_={m_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGPO8-KO`_8h@piSsEL&qF z@NS6->vy?#kwrdVkBy{fNr%vq4=)$sgibFg>OxBsp8!?RLTed!_H<#A!JFpIg>J_n zrWZV2fD?fhhhZ)#>Y^7;eRv89XC~nW6mw$H%@XV_-#Qm{O<)$L#oi~ tuj~Wno;1VYE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGb@05UX(WmVr%S^xk507*qoM6N<$f<~oF*8l(j delta 244 zcmVHg!o$Y@QB4g-#F1a!E_QPsnl+GipniWmTjFJdGB`+;}4c z56!)V(vCrfEX;HODhw@8y5sG|m4WKpIk+ uW`AWinDeF~Y>+_JcWD_|F4Kk&31I~?G>2t0um!;Y0000>kKDkjAcxCU|!LD7uNC&mC2 z+d=gES)O1_tRW~i!!(m@0Lp}>2#eUlc;00000NkvXXu0mjfQVvXq delta 237 zcmV0i6PnBpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=vPnciR7gwZ zlF<#qFbqVq0sm~o3jDGaYcLoigj^a&_9b-^s00#EI@z&(Csk_rX(DNfcs*NTwynlg z!@D8Itly<~sfSXZ_e++ZCGC=r*t{Ho3LPF$^T n!iE~C<}N)0%VpW{AtAf~p}>2#)b6W=00000NkvXXu0mjfT7qV= diff --git a/examples/resource-bar/assets/Ranger_Idle 2_4.png b/examples/resource-bar/assets/Ranger_Idle 2_4.png index d0a962a3ed9081025f194a64f747bab326d3b9e8..7dca05bbc42a6530d65db49033688e8571a74846 100644 GIT binary patch delta 185 zcmV;q07n0#0_OpcB#}WCf0;={K~zY`V_+D};6EBBO>>kKDkjAcxCU|!LD7uNC&mC2 z+d=gES)O1_tRW~i!!(m*05T@a0Azoo8$c*p!J0vekqv zaQPpXW}Jp#OA{pJ0kV@aMR|cgc{2tcI0In(p<@76%_H3aQj7NgFO=p5e5LV!lIjF> n7m!q}W6A&Il?CL~i6jF6QX_VV?eM}|00000NkvXXu0mjf9|}x& delta 243 zcmVdiL#oj1 tugrnso-~95UI_CptpKabbl^=wSOHQac8H-!+`<3=002ovPDHLkV1gXKZvX%Q diff --git a/examples/resource-bar/assets/Ranger_Jump Kick_1.png b/examples/resource-bar/assets/Ranger_Jump Kick_1.png index 76eba54a610ac349b489073edc434581a6ef0e06..1995ed79c17694fe682a200ad050668a53d2145d 100644 GIT binary patch delta 197 zcmV;$06PD$0`mcoB#}WCf2B!8K~zY`V_+BsqhJ&aDEN9GJB!5>RW8)G084md zwSb~rj7(#T3yRV|S~|zDfYQ{2uJJzsJa_;A>LpF~xE2cT00000NkvXXu0mjfeH>He delta 256 zcmV+b0ssE<0k8s)BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=#Ysd#R7gwh zklhW#APj`rpzqzNE9A9Xb&U?z5eP@HWllt@f&M)3NhdJIcL`y!Sp1eqno8WRwQzQ{ z#!ZmmSxY9y2&PNK0N>{^!0$EA+pIEPXxKi1}!t}rDp?^T<~yJ zOCa5Gp~EcnYyega^l)lhE&)YDSR*!{f|^?4{AiC6FZZVkwLOzMshcXm8grd*JCGq2 z8*-iGqV?X*fYNiL#at#M_1dJw48Yr09 zS0rf+9R8!Fd`aoYk&Ez+bx!#X5tq4I&o1$EU!D+g6jB1TxSr#H`)g%}l}OfbfCL86 z5MBEcfOS#};09S)=tDO$`gYlR_rL|PL@j{VI=TSDmwMuii$((;NyxMvRiIf|019G? zl8~{0A-gC4&6POWs;yFB8HDuvSOEIaYWYvt?nyg-b~xBw;QjqF$}jeGzA N002ovPDHLkV1fWJUtjMwNzv*+h-1D zeaip@@8_*$Tkb+GkQvUO24Cg^L`icB@Z`CFjzc!4CW07wa*BGLsTHux6b3gkI* zp4BZR`~p;T4iSr-*D`Z;6>LmW4)#5AVJSzjH{#-#JcRTDP%n?y6wLd!pJf4py?(^b zQmWVOq>+P6gnHdh8kuBz-A)-f$VkX>G07u;s*}8rcQMaQtmL8O7pR1i_MaoLJg*@0 g7X0=p1xb|h0VU>*>{44D7ytkO07*qoM6N<$f(p@j%>V!Z diff --git a/examples/resource-bar/assets/Ranger_Jump Kick_3.png b/examples/resource-bar/assets/Ranger_Jump Kick_3.png index 0fc749d1727f97d2cad1429744cfebbf3829f61d..4bd2a279bb6dbb1a753f18e8b4463d665e2dcc9a 100644 GIT binary patch delta 213 zcmV;`04o2p0)qmOB#}WCf3-baW43$APM+0Bl-7@rV!vE!|_2(*#GwW6_`H$XUHF?MBn-nBT}M(w1) zQ6(x|?&G?N6vWT(`$5XH)oLijhIcQ(6JA~rZGu7yej@0G0&-zk^Gp`5y0Dkko(s)q zT%^lZ%wz$cxZouPuvMr~8Gd_xlsG#u%U=k4HnT5-upGMq?B1M% ziwm$8O6*MO`Uco<$1aWwGIpov&uW2!M-`;EA6AfYGMQ8p!Vfv3Xl{U!FSP&w002ov JPDHLkV1mHWYtjG! diff --git a/examples/resource-bar/assets/Ranger_Jump Kick_4.png b/examples/resource-bar/assets/Ranger_Jump Kick_4.png index 76eba54a610ac349b489073edc434581a6ef0e06..1995ed79c17694fe682a200ad050668a53d2145d 100644 GIT binary patch delta 197 zcmV;$06PD$0`mcoB#}WCf2B!8K~zY`V_+BsqhJ&aDEN9GJB!5>RW8)G084md zwSb~rj7(#T3yRV|S~|zDfYQ{2uJJzsJa_;A>LpF~xE2cT00000NkvXXu0mjfeH>He delta 256 zcmV+b0ssE<0k8s)BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=#Ysd#R7gwh zklhW#APj`rpzqzNE9A9Xb&U?z5eP@HWllt@f&M)3NhdJIcL`y!Sp1eqno8WRwQzQ{ z#!ZmmSxY9y2&PNK0N>{^!0$EA+pIEPXxKi1}!t}rDp?^T<~yJ zOCa5Gp~EcnYyega^l)lhE&)YDSR*!{f|^?4{AiC6FZZVkwLOzMshcXm8grd*JCGq2 z8*-iGqV?X*fYNiL#IQV9}QF2 z@F*#W!5|vOrm5l7v;@OYYWsqwu1B$erg1PNg9pWMWQ-+G{HG}Opj(72_kNZq7?WcO zPFI8YAVXm^Sr))FVGAOdp_I5Drv=EtLW1Eq)e#fP3^*eFKVy0xA}TJhS;C*Z83SW0 zV(@wqn<4lxjzmJa1q6bNfuJSWETdLMgwK`KDfFCGR`)zX}F@Piv(_9ur zE73x{B%%OG6z8B(i8et^05zf-fVZZPlJZCZFHYUFOtQa=ReuJdJq7Xk-TQX*x@d_!go|`rmYEq1kQL}W1a+?gjN9n5Kmnc&6@`rh zPs$)bxPg?t$wVb0kY?BQ;*d+kH9(X24?t;oRDjSqZ2{7?-4swOo&>1*SEmAM-D`lN duE_y3i7$K-ZmNAvB&h%Z002ovPDHLkV1oa8lcE3s diff --git a/examples/resource-bar/assets/Ranger_Kick 2.png b/examples/resource-bar/assets/Ranger_Kick 2.png index 12844569c68fdc3f77b5ed27f632351029eec5dd..3ba72e43ed43e2bbbd9caeedf4803a52406f3e96 100644 GIT binary patch delta 238 zcmV5ru?gnf!D%YG9BYoVOp?jWI7DE5tRQ$5>2=H`Ibe=HZL88c=IUV52(j7qQ0jfX9z}}7?nYq4zjM@OQ94LAUKxawt6Y%fo`vNq~`v5c_ oTLug_oeZ=9YEQ-7^7!^S0AzTXohDo1R{#J207*qoM6N<$f)y%b!~g&Q delta 328 zcmV-O0k{5%0^$OYBYy!YNklTQP9o3QR#7W#5@t2mQ{Ab5;l&1Qzn#}yje%F?O@wi_O3@-;%K_q}PpA0Jsna5NR zF#~E2?+DN;2Jq3N`TN?r_ucua&O*!pA!xo<$tAK-ZktNrZGT0^0>`o-H7EjcfGco+ z>3l)qiN-kB&mT{7*a)lKFhNGvdsXxjz*PSQY+ar#z(P@g&`5Rw;c&A9@C%nEAh<4C1I(@~5@6Go ajOhzhhHn% diff --git a/examples/resource-bar/assets/Ranger_Knockdown.png b/examples/resource-bar/assets/Ranger_Knockdown.png index 8cf1f73366ea2b536234af7e5684de8810b7fc23..60db51b337d68faf634806971c554520a47ced72 100644 GIT binary patch delta 223 zcmV<503iR(0{Q`vBYyx1a7bBm000XT000XT0n*)m`~Uy|tVu*cR7l6|l+g)*FbqVq zf&Xsg3jVs4YdDxAL=-C5kk-`3AIZUiRk+tAtwfMyAEOi~<9gJ^$X#eM()002ovPDHLkV1gzRV!r?Y delta 307 zcmV-30nGmT0nGxCBYy!DNklRH2<^;rjgnwEAJYN(yx2S1MDJl!B z3IM~YGm;j7gXxf}wZPPf0Cc|O#;}i*C5>qIj;Mgr9K_6LQy1Trq$L2xq|CkF93Qy& z-1akL4WNq5xuk+>00*B1eiKzFnM>7cfSCapLmY6F#R#|fW&oLkr0N53vDq2`W0Fj{ zYRztW0tXdp5G*dT(J%V+=q002ovPDHLk FV1mrKhid=; diff --git a/examples/resource-bar/assets/Ranger_Over Throw_1.png b/examples/resource-bar/assets/Ranger_Over Throw_1.png index ab53981d145ac1485ae7951360d5cc0449016afb..58576e01fe331bf2783c014776748cccef61aeef 100644 GIT binary patch delta 198 zcmV;%06G7u0`vipB#}WCf2K)9K~zY`?Um69fG`Y1yMh01{w{QTqW^#fKoWqv7Bv84F1>2r0{G2`JSCozueNI%KpO+F z>u})%P(cyE)&Kg6YT+7mb~IRkx0~#XsiA+w4o9|LhgiCcQ~&?~07*qoM6N<$g4E_% Ay#N3J delta 249 zcmV>51B*caSuhOny%`hS5R!dalLp zb<{_G-Y=VYX5h$@ssNhMV+!m(Qqm0KZg>G5Spaq=wxHO}w*}M>u7F|cI%MX#Ds&@3 z`dROW6|}^8B%CzEAmv%)fJEU*!DGe;}m=N48#ve02kE00000NkvXXu0mjfl9O;W diff --git a/examples/resource-bar/assets/Ranger_Over Throw_2.png b/examples/resource-bar/assets/Ranger_Over Throw_2.png index 4635dfea5c2dc2b7a7e79d8b21e09e93b3611304..18edfc06219d7a224ee9d46feae3096b44d588e3 100644 GIT binary patch delta 207 zcmV;=05Jcy0{sDyB#}WCf3HbIK~zY`?Ulg|fFKM-yMcE%as{t$N2bVJ?(k@vw?=eFxTz+ z5;<$aFIW%?{Wz!lkN7ZC?Oc32(=}zg+}Cs&B{TLl#dB5S2shy+l*};?ecdPC3Pj>z zPzZ3L59f(g5KEqq<&f=RO*kWK31iT3EU|(p2(E?;G#vM}5-s>j3Pex$MZ%)QZ=tDR z1Qup%^tz!1@EgVpf&>gVuN(GS_k!OAhIj!{H$QzX17CSc!3mVI1Jiv}TvNGJw*UYD M07*qoM6N<$g2`5I+5i9m diff --git a/examples/resource-bar/assets/Ranger_Pick Up 2.png b/examples/resource-bar/assets/Ranger_Pick Up 2.png index 149abd6b18aa8d5aa205b212233b19753a1ea44b..b8267558f80aa64bdc33cb095a0d98df58dbdc62 100644 GIT binary patch delta 201 zcmV;)05<=@0^|XZBYyx1a7bBm000XT000XT0n*)m`~Uy|mPtfGR7l5TU>F6XfX3iI z8YWG1loTo^#Spj#at%SzjLav-02JFn^!r(!U`(tbC^o}1lWYLY*;F@x=rF+L1!B?$ zwrIl|s7Qtq7Zd2V<1>H(myN{Ojx`yBFhvFs8-TVG>%JzfSnDM}tv|omPHOk3)hl2H6ae0=t0e$`+zmInR{)M63=o`q2d5!% zZv>$Vw6n|sU}ga+I-K9PeVA|0PpX0{00hoCn>@l?Ths>;Tz^iY&I2*sAJwD+fk@&k zROhAt?k%8_EbBgi6JQttVhRQj{Aeo@LG%czjb*$vzlhg{mvmMYL`kRe0j0A6)+wjJ zZ%%jjh>K5q2&3%9HA77T!`FMWZTeF5wKbz^uFe`x>!002ovPDHLkV1j+?dRqVh diff --git a/examples/resource-bar/assets/Ranger_Pick Up.png b/examples/resource-bar/assets/Ranger_Pick Up.png index 98c79b41a60e1009d4422d8196e326db39e4d77c..65ab13820f132b5c84885a8d985aaa7a0db60848 100644 GIT binary patch delta 211 zcmV;^04)E&0`38jBYyx1a7bBm000XT000XT0n*)m`~Uy|ph-kQR7l5TU>F6XV6cP# zXqYt3QBtUw6hq(|$Tb8-GcunT15j)S(eGz@f-$j%px6x4OtJwmXH(q(qQig)FJKyk zE$WaH5{Qq*MfhU?TROmN07wFtW@H0!g$3MnY?|@0onfU0l)%~BYy!0NklyDDi6Q`_%~oy{bCPbKA+-&`_lsxhz0OwX8;MI zu>@kSK$@}5081JWW@q#3+W2m`B_(Lc7PASE<>)a|eiu-WW`y^x z_3i31Lgk*+&!0pV8i9-+^6du*1N`1{%J{3hHW=2l`$nQN(h_*@`S9r3IS<$pqP28! sKiDD44~0UCv>)_^GC<#T<^^i$1L6E{Qv!3=+yDRo07*qoM6N<$f-&fe0{{R3 diff --git a/examples/resource-bar/assets/Ranger_Punch 1.png b/examples/resource-bar/assets/Ranger_Punch 1.png index af68f8ec46743344fdaab45d020a78396db114d6..2361f68bc2d46d8e83b7ae1bbfff8cb4e39c38c9 100644 GIT binary patch delta 213 zcmV;`04o2`0`LKlBYyx1a7bBm000XT000XT0n*)m`~Uy|qDe$SR7l5TU>IQV9}QF2 z@F*#W!5|vOrm5l7v;@OYYWsqwu1B$erg1P3!9xg>W;im2iNBxai4zlJ35siJW&v85 z|HmgzPEN-fL}&(6Ck5fKfML*Ez<@6$Q8g#?CvQfEKuAKBUCI?TrLqR+$gRW2-Q+FD_x0o0Q~^~Z1H=%6WV3b P00000NkvXXu0mjffQC_- delta 310 zcmV-60m=UG0nh@FBYy!GNkl zxi7g;5;F4whYQNGxCrXv0%#AEH;7;UlMG0(-WOEvN%ch1JYdk9Jxm}i59`P4-iUCv z{`-WS_V+P2wPZDxK#*QzF9IvM|V*qd!0?exi^Uv*Q$NTHR&LWxtK)_t8WQl4h2uPW`xqo#{_InVS!}|k7z!+c~ z+;_U}-CzTzv0w~yeZ*bgOPWtIu;%XHnBynNkCiBSRHTd`Go);Zlt~jC!|IW_cpoTN z%UNhgS2>GB#{vuRIzDOeeyRePc9(#;P`MY5)u>l)pysE?b&hLnE>%$mYebF;f3@SU zsmhcE;@mR*JxYU30m1UP%SD-_fS5Us%Ka11Kfj&D^-`^00000NkvXXu0mjf1@4*D diff --git a/examples/resource-bar/assets/Ranger_Run_1.png b/examples/resource-bar/assets/Ranger_Run_1.png index ff1001ee89642b3a1c890393e16ea56312cef295..9eac15a12984cc610a678d6b13c707b633f64a32 100644 GIT binary patch delta 193 zcmV;y06zb#0`CEkB#}WCf1yc4K~zY`y_MY!fFKNn*}!)%tt9F`1b9cLE+VwGYB0*P}2H#84eNI#(Z=?kCDs7{J}TNk`2Zmvc)chQd7#z~iLY4Kqi~H500000NkvXXu0mjfthi1O delta 251 zcmVp!aUn6>{xXU893_1X2UGzMYWTPWq%Th`|q{r2La=5~4159jf)E-$+AN zqMGq}%ny-`Jbqq}7OZ_UrERj!UV&<+TrL>dMVe8vBbXvhJn|fcBU3hwSPR{RgRgLj zfY$rAV?;o66Bp_hAahezZ_l?1)%uc;lz=z2*k+Fe-!(6wk%9uRnkcNoBvJs59 zIn_*9K^QzaC&2%rmtv^T+A2Zh2H9KS=_!GeQdWttSl3$J5&8fC002ovPDHLkV1j4# BaE|~0 diff --git a/examples/resource-bar/assets/Ranger_Run_2.png b/examples/resource-bar/assets/Ranger_Run_2.png index a93642fdaa142f241add59baa806324efe63db87..ef62fc54e092e8277acd3743428f8ea656957a6f 100644 GIT binary patch delta 198 zcmV;%06G7=0`vipB#}WCf2K)9K~zY`V_={$_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwMjofZ=Sa8$gt1d|n_a@UXcEErB64qd5`7HOQ{O<|2%M!loG= zW4HpF?Jzze&BWvZqB9mnnFwqEfAVGwOj1t7W&p8if!hj+G010`3H5BTnf&c&j07*qoM6N<$f()He A1poj5 delta 267 zcmV+m0rdX#0lNZ_BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=&`Cr=R7gv; zlF<#qFbqVq0sm~o3jDGaYcLoigxaa2vtu_+LZ5VM?A~1?LAsi3G(>*hwP;sf^{Ii` z5*5aIKOa(!^8CIZEZl7hVUrD?El^?7-wSrR)G(Gf1tB#gPdVefiNG^suULa3yoGlo zwT!}6>K2@+lN?+*Eg&BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=!%0LzR7gv` zlF<#qFbqVq0sm~&75HT<)?hG3C^)sPv+JaBfIjKeHujxewdJ3zPAS&g)r!ux(lKh7 z4KZeX=KC(%DA(6xslv05n$#w59t|*N($51}A!^2uAfQWa!VR1bG1L4utS%aWW(gR1 z4GoayYyi;=U=3l+5HLhpZNA)}Mtt5x8dT|kVBJ)R8s!Rxp%62fgeDZ%cVHnjim1M| z^^wL%DbkZYUj>M1%1rqGB8~sFX>^0xEpYl&z*&^?2K+%z>+*$dXaE2J07*qoM6N<$ Eg6@KGr~m)} diff --git a/examples/resource-bar/assets/Ranger_Run_4.png b/examples/resource-bar/assets/Ranger_Run_4.png index 08a20a67e2d7cdd5b9c2e1af47a076c540775c06..842983980a6d7200bda178fe752e669f7e9f651d 100644 GIT binary patch delta 200 zcmV;(05|`&0`>urB#}WCf2c`BK~zY`#g*F)fG`L}yMh011kJLPnTM&g1aeYSsB>MT>*Xc48LLwJ23Seo!4lu=1@dSYW z?n*Sx`T(g1tZYm%0x%(nxC=ms$`WIPG%Oo4c!-K~6hfRM5Xl(^J}^gb2Bx?>NP=Uo zi|Q&~~w{_9MgB}00000 LNkvXXu0mjf`cHB# diff --git a/examples/resource-bar/assets/Ranger_Stab.png b/examples/resource-bar/assets/Ranger_Stab.png index b9db5c0977a056bff9423488311a0239d28e5a61..fac7d083761a1e7ce829e73e9d079c24a12ac5f4 100644 GIT binary patch delta 218 zcmV<0044v?0`&oqBYyx1a7bBm000XT000XT0n*)m`~Uy|r%6OXR7l6wl-mh_FbqZA zz<)P#1%KVjH5|+lA|jPGwp?m&q85ThY?Ya*PQN@K%!wEi~VQva%N^Vg0Uzm2E z2u%0jjpY$4JT96bhG~Hk$&-s%>iT-OEn~5uBz%-xA{PNz9#g44qGlTnP7>!H^z)h& zJtj;A0q81VN)q7j1UVp8;wMlbnxvF16ak8a<}5;i)|^Qw*qRd+<-19;)->Qhb{O4& U>JP!Ry#N3J07*qoM6N<$g5rr-dH?_b delta 311 zcmV-70m%OK0nq}GBYy!HNklZ2-k2y?|EB`J!? zwGahzq&NpgDH4TD1lE$42&APsAf#urz(7u;-{K_eU@XrZIe#fr4p9NHdq8VHo%=o; zmi_#AM?EqVz>oc+iEQge7dP4nbkzC)1js4!(c=Os$5|o{tb>K-vgzc$>7w!Pbybls z3Rr*@INiG;Vtno*Ac&e>I3_L**#nnGOkHTxbX*l7Xx(GfYg}Xn0%^pj3$e0Q!YwOmP6Iz@fnXJOW@V@BcE zB~w}6={aQt`TV>eO>(v?q=j_(^a7mF-xrWlT4>=DAVUjyVLY=Z7w($S=5*(UDl;)m zEqHPPP82-CGA|&d$e=E7FEL6|n0Nb_dV6g~n0GtJEkp2nB*!hY;P+UJDd>AkC76P~ zw^TqBj^>6a7|jh)Fq%&sh1M6~xsMF&xtY`?(%*XJpO?PB04K>~yu^D^Y7#t`8l>ih al=1~0Sf5t=92gb=0000YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGPO8-KO`_8h@piSsEL&qF z@NS6->vy?#kwrdVkBy{fNr%vq4=)$sgibFg>OxBsp8!?RLTed!_H<#A!JFpIg>J_n zrWZV2fD?fhhhZ)#>Y^7;eRv89XC~nW6mw$H%@XV_-#Qm{O<)$L#oi~ tuj~Wno;1V%^pj3$e0Q!YwOmP6Iz@fnXJOW@V@BcE zB~w}6={aQt`TV>eO>(v?q=j_(^a7mF-xrWlT4>=DAVUjyVLY=Z7w($S=5*(UDl;)m zEqHPPP82-CGA|&d$e=E7FEL6|n0Nb_dV6g~n0GtJEkp2nB*!hY;P+UJDd>AkC76P~ zw^TqBj^>6a7|jh)Fq%&sh1M6~xsMF&xtY`?(%*XJpO?PB04K>~yu^D^Y7#t`8l>ih al=1~0Sf5t=92gb=0000YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGPO8-KO`_8h@piSsEL&qF z@NS6->vy?#kwrdVkBy{fNr%vq4=)$sgibFg>OxBsp8!?RLTed!_H<#A!JFpIg>J_n zrWZV2fD?fhhhZ)#>Y^7;eRv89XC~nW6mw$H%@XV_-#Qm{O<)$L#oi~ tuj~Wno;1V5A@^M@i4EbyMO9$peSL*-=jSOg0%=5O6;tj7VCoEhDZdcsQT2ifERt&g@AtW- zkRY0CdXFOBH9*ilfkl>B1mtB~;@~($g8D#!_!?l6VLpMZr9fMt}gMWT*-) z@drSa&4wmTEjp9eDW3{KaC9CzXHbRs7BdH_exd9xO-IsgCw002ov JPDHLkV1oaVSdRbz delta 272 zcmV+r0q_3(0l)%~BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=)k#D_R7gv; zlFJPOF$_ev1MYN03tZ`nHYkh|0+YnZj=x!nCykP|XC{|D{z+T3MY~@|5GURHrhpmV zDN!L_1Ve@j?Sz2{@ggiMh|q3<3Y`vf(GI40(p@0TYXP0_=dEk{1S&+rH$rrJ1wfRL zD3pbP3S(9c164pJOes-oNr`rOyp%8>>liZ(VK*!>BESo1)?EQAuzq)!gJl*oHaGE% z-dy1sy}80Ol?pObw(o;goV=j$%hJyD@UU7=!bg5f&+vusbb+Cj$|E7X{8WL#aeM$r W&Uv$xXcA!n0000YE3(;OuQ(FmepY>G6KVhDyNQe8oj z?I;FN6b1w0d=$;d7%eT}G!R8Gx&biy{VY!~#%2gETfuygCK!#&00vxMfN3J68LI)v z&L*Upfrvo-Pf|L-VhCZ){K=cK;vr}Nx?!URkZAxGKFM_f=?36PE&rq!>DY=lk~0z( l14$19a&jbI1F2qx0|2u}V!ttZ-!}jN002ovPDHLkV1n+YM&1Ab delta 246 zcmVh^y;V9UlVDKFB5t(#> w`E+eUoSgm_C{PmeT7iu%d?$q}>)Df1Ub9DHza4mZcK`qY07*qoM6N<$g0Ze>n*aa+ diff --git a/examples/resource-bar/assets/Ranger_Strafe 2_3.png b/examples/resource-bar/assets/Ranger_Strafe 2_3.png index 6be5770dae8c010f7fa9d062337b193fc3b188b5..0410ad345df7e462097eb7e8bec9341206328176 100644 GIT binary patch delta 207 zcmV;=05Jc+0{sDyB#}WCf3HbIK~zY`#g*L&fG`Y%yMga+5A@^M@i4EbyMO9$peSL*-=jSOg0%=5O6;tj7VCoEhDZdcsQT2ifERt&g@AtW- zkRY0CdXFOBH9*ilfkl>B1mtB~;@~($g8D#!_!?l6VLpMZr9fMt}gMWT*-) z@drSa&4wmTEjp9eDW3{KaC9CzXHbRs7BdH_exd9xO-IsgCw002ov JPDHLkV1oaVSdRbz delta 272 zcmV+r0q_3(0l)%~BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=)k#D_R7gv; zlFJPOF$_ev1MYN03tZ`nHYkh|0+YnZj=x!nCykP|XC{|D{z+T3MY~@|5GURHrhpmV zDN!L_1Ve@j?Sz2{@ggiMh|q3<3Y`vf(GI40(p@0TYXP0_=dEk{1S&+rH$rrJ1wfRL zD3pbP3S(9c164pJOes-oNr`rOyp%8>>liZ(VK*!>BESo1)?EQAuzq)!gJl*oHaGE% z-dy1sy}80Ol?pObw(o;goV=j$%hJyD@UU7=!bg5f&+vusbb+Cj$|E7X{8WL#aeM$r W&Uv$xXcA!n0000YE3(;OuQ(FmepY>G6KVhDyNQe8oj z?I;FN6b1w0d=$;d7%eT}G!R8Gx&biy{VY!~#%2gETfuygCK!#&00vxMfN3J68LI)v z&L*Upfrvo-Pf|L-VhCZ){K=cK;vr}Nx?!URkZAxGKFM_f=?36PE&rq!>DY=lk~0z( l14$19a&jbI1F2qx0|2u}V!ttZ-!}jN002ovPDHLkV1n+YM&1Ab delta 246 zcmVh^y;V9UlVDKFB5t(#> w`E+eUoSgm_C{PmeT7iu%d?$q}>)Df1Ub9DHza4mZcK`qY07*qoM6N<$g0Ze>n*aa+ diff --git a/examples/resource-bar/assets/Ranger_Walk 1_1.png b/examples/resource-bar/assets/Ranger_Walk 1_1.png index 27081b03f196379049a806692aad1da2f86bc5a9..0b4a4ea497b1cdd322459cd7a94647ff3418e7b9 100644 GIT binary patch delta 199 zcmV;&0671_0`&oqB#}WCf2T=AK~zY`#g*F$fG`Y2yMh01Z1^(a_`9lYg2l8k%&6;*z>4?oQ5cbnae!_VA=QQIuA#n5SBTcs{y&}#{tj`wEmR} z$jq*Z^IVjQI6#)GWrqMVB;alqrrGP?JVfEM5IzUpv|OUe+yp4!Jwd~>%%1=(F%0<^ z;E8a6A#m>pPvCyeo&ft3Ar)9jJOO!aQtL$;UK=d$o-q-7QrG|h002ovPDHLkV1msG BT3P@A delta 273 zcmV+s0q*|w0l@;0BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=)=5M`R7gv; zlF<#qFbqVq0sm~o3jDGaYjiM12t6l`Y$vu`M4xm@a=vqgM7f%3bc*`CYr$)yoKg67 zi7Lx?zlV$3wo@Y^`1-d@`z_-!1sEJK*JNX)V*@01E~%lxKPz*Mkr zN;!C8&!6yuoOc^XLn&RIat`~^6>EaL;-N3sBWQi?Qi5v6YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwG;M1&07*qoM6N<$f)N@_LI3~& delta 243 zcmV#~LbIb_ z(+Zv}z==SQ!*DGqa*>NpHarD~q%hC6PrTfpjWEylm~#v28z;FF{I;MQ{`Uf-Ax&uc tH#PxvPa0waTqx!)y?~X=a^OQk*Z~(sg!4=MMgaf-002ovPDHLkV1nurB#}WCf2c`BK~zY`y_L}kfG`Y1yMh0134RA?f)J!1 zKrD1ath??4peqZ5gwh5xfr5j7XW%VNKXYD#+&BQ;-i|h?E*eAt0000;0ki^;BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=$w@>(R7gv` zlhF;rFbqVq0sm~o3jDGaYcLoilsb(g+ni&kls@T{*1o%{Qd|DbVl>5aziQEJTgCLi z-Vzm-_w9N}H}d&@-m2tml}k0*@N@y4q{9oEhE!AH6-ZxH12WS!?_}XBgYE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwG;M1&07*qoM6N<$f)N@_LI3~& delta 243 zcmV#~LbIb_ z(+Zv}z==SQ!*DGqa*>NpHarD~q%hC6PrTfpjWEylm~#v28z;FF{I;MQ{`Uf-Ax&uc tH#PxvPa0waTqx!)y?~X=a^OQk*Z~(sg!4=MMgaf-002ovPDHLkV1nYE3(;OuQ(FmepY>G6KVhDyNQe8oj z?I;FN6b1w0d=$;d7%eT}G!R8Gx&biy{VY!~#%2gETfuygCK!#&00vxMfN3J68LI)v z&L*Upfrvo-Pf|L-VhCZ){K=cK;vr}Nx?!URkZAxGKFM_f=?36PE&rq!>DY=lk~0z( l14$19a&jbI1F2qx0|2u}V!ttZ-!}jN002ovPDHLkV1n+YM&1Ab delta 246 zcmVh^y;V9UlVDKFB5t(#> w`E+eUoSgm_C{PmeT7iu%d?$q}>)Df1Ub9DHza4mZcK`qY07*qoM6N<$g0Ze>n*aa+ diff --git a/examples/resource-bar/assets/Ranger_Walk 2_2.png b/examples/resource-bar/assets/Ranger_Walk 2_2.png index 6a76bec781fc4348efb082f4f3ce77f7958e47d1..9e1df92a04b771840e7133e6da4454739a065241 100644 GIT binary patch delta 197 zcmV;$06PD*0`mcoB#}WCf2B!8K~zY`#g)MgfG`L}*}%ISxq?@>at#M_1Waq1vuXH8JcrC4$j9WZBD8x02=!n}`Hi^_G7BQG5mP|P_qpZZ zAkwb+J()_D03aQqm^3pBsLR&OU}z$`=753d=HONC=)}r6jihh4f8wr!DgRT7#H;m&*df z@J@*d$s!mcOlT(zR7e)#xPl7p7MRe-VJY5VIw#)>W$p_&U(Z|7=~I{xh2IEq&I*7k zp%{w7z=W||4Fgla5}^=auOuX29>-9)Rg2Fs4B=KSJ}Mv!xGOG)-n>;XGLLpsX67Fh z;9XaRwvS3Y6L+Iq!!w2d$jBgX^8(CMJ?#Utk3YE3(;OuQ(FmepY>G6KVhDyNQe8oj z?I;FN6b1w0d=$;d7%eT}G!R8Gx&biy{VY!~#%2gETfuygCK!#&00vxMfN3J68LI)v z&L*Upfrvo-Pf|L-VhCZ){K=cK;vr}Nx?!URkZAxGKFM_f=?36PE&rq!>DY=lk~0z( l14$19a&jbI1F2qx0|2u}V!ttZ-!}jN002ovPDHLkV1n+YM&1Ab delta 246 zcmVh^y;V9UlVDKFB5t(#> w`E+eUoSgm_C{PmeT7iu%d?$q}>)Df1Ub9DHza4mZcK`qY07*qoM6N<$g0Ze>n*aa+ diff --git a/examples/resource-bar/assets/Ranger_Walk 2_4.png b/examples/resource-bar/assets/Ranger_Walk 2_4.png index b6de07b12ce79f31f7cd03ef75e26fb1e2c40af0..09c31bf7f6cf6ce37e7d0a77540684bb76478b0d 100644 GIT binary patch delta 187 zcmV;s07UYE3(;OuQ(FmepY>G6KVhDyNQe8oj z?I;FN6b1w0d=$;d7%eT}G!R8Gx&biy{VY!~#%2gETfuygCK!#&00vxMfN3J68LI)v z&L*Upfrvo-Pf|L-VhC{wi9dNW1|C`lU>HJHi8PE1Ag5HuW;DZjhq~a)Bg;#1^@woHF+gG2S@+_002ovPDHLkV1gq#MM(ev delta 238 zcmV!$)> zN+cqUWDsP$%gP`WNQufxkfV|mby^-Fc)uTy`F#PnB!hn{z`i9-@Ahj2^q=U%{LX&3 omqWZv^Zo)=M4@j#RX|e83ju&NdAmfL`v3p{07*qoM6N<$f}e_KJOBUy diff --git a/examples/resource-bar/assets/Ranger_Walk 3_1.png b/examples/resource-bar/assets/Ranger_Walk 3_1.png index fa4c6a9349d8f4b65c61e144ed764b52720bf8d2..5d9c32e8653ac98e883477ec1c45e300986af619 100644 GIT binary patch delta 198 zcmV;%06G7=0`vipB#}WCf2K)9K~zY`V_={m_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGxMOg#e#JQ;#Z5%C7#D8`90 zfKZAfSVs`bECiD@p>$8UG$PKY8z5mM~Lk^d7Ae9|ezzB`0Oxs$4Ni28m?!K|(3jKJ9v z5$5;)oHC4b{=P31pX~}klMWv)fD?3iL01Zz7Cr%FK!az7XWH??T>`xncPdmK!B}d+ zju*fQ0go_D1zjoJsKZNUj1U*h+j>rYd^RJPw{?yi2Endba!g3y(Uo8V`i`yy6VP{b z1w`iS3e?;Xnbr%Gh^2zrA4l_OFT$Q-`b!T(VB&MXz!7Kmf+@WCRKZ=8@&{zgja`SN RMvedg002ovPDHLkV1n{0b(jDE diff --git a/examples/resource-bar/assets/Ranger_Walk 3_2.png b/examples/resource-bar/assets/Ranger_Walk 3_2.png index 10a48c75457d681298c896d3327159067364f61e..e45760c05aaca90c77b7e929db4427fb69b01732 100644 GIT binary patch delta 184 zcmV;p07w6$0_FjbB#}WCf0#)`K~zY`V_={m_>YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwGPO8-KO`_8h@piSsEL&qF z@NS6->vy?#kwrdVkBy{fNr%vq4=)$sgibFg>OxBsp8!?RLTed!_H<#A!JFpIg>J_n zrWZV2fD?fhhhZ)#>Y^7;eRv89XC~nW6mw$H%@XV_-#Qm{O<)$L#oi~ tuj~Wno;1VaB1FTx8;)O_c71re+$J?GZl&aFF{hK&S;xfGngR01r|G z00N*W-|VX_4NwM&Yrt6N-qjCaWD2!%)Lm-Grd+7&0K}e+T@6cG5C8xG07*qoM6N<$ Eg2ZK3b^rhX delta 268 zcmV+n0rUR&0lWf`BpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m=(Md!>R7gwB zlIsn^FbssV0sq;E75K|mtifQ65PEKG*-qm;0I8pJO8vNNDmDF+>@-EbU#-yFM}5Sw z8e+`4F3%yd$mjccBkA6zCbZA+0}KQuK5x*dZI zy)e@OIAJ)VY36{U5WVPU%|nPu3;liECtn_~O6c$7J|_v_b2h*jz6xNIuW2iwGWeRd z0{rq+fH9OB3YE3(;Ov*ib*j9u7O-bP&6a+i7^1h zb`br3mM0h!YY2+XFwG!>?3bVBG zQN!7g!fd~D-$f6%x;!S4ovmsjM{FJrK!r{PK&=;Kbx|`a2Y5khvLUF@JXc>-P&<&` z2GPDimn;s*eU+x!hTyPK2_1^e>=0sLVV>4L@p6Cegn3%~d^TYFMwRUWej89V|9b$* wWoH`wmDy1At6bQifo9&NW?*$0HoQp)FCKx0`}z{_=>Px#07*qoM6N<$f`pE1N&o-= diff --git a/examples/resource-bar/assets/Silver shield.png b/examples/resource-bar/assets/Silver shield.png index 9f691ed5b602056652f24989353b9befdfe7c5f4..8db2cb9275e7b20526a911aa7cba20476bba25f9 100644 GIT binary patch delta 57 zcmeBWd&xRMS(bsbz$3Dlfq`2Hgc&d0t^32kz%<*_#WBR=_(tuSOai^!>x~(Jz|+;w JWt~$(69B)45Ci}K delta 93 zcmaFK+RHXUnS*Jzr;B4q#jTAFGnqUMQ=jf*U|`TKag8Vm&QB{TPb^AhNUGFJ%E`}9 wNvYIJE~+dj$=A!wO-xVK3-EI{GI7mI&QD1#TESNT4ycjA)78&qol`;+01!GLl>h($ diff --git a/examples/resource-bar/assets/Star_LargeNarrow.png b/examples/resource-bar/assets/Star_LargeNarrow.png index 6ce8f2055e763e8782c9776314ff98b870bcd75d..43a12604bbed58be5f09abc1d04f3ad5985678a5 100644 GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GGLLkg|>2BR01_mY# zPZ!6Kid%1QUCce?Ai^4G<-s|{NmH{?D9Ficfr!_Q`i?0=8V3(@gm1{UJpaAt$$gDa zyA$0s+L?g{!oY#P8OvTK*X`-N!&q~!-+ZEV!~35f)r#0ZSli!oS@&PO#9;+0vEhHI z!wv*y`2V`01c(bDnBm`b#+N|+5Q_h-XTJ1zJ@X+b{t?f<kELz~Wk60I%VV|&KUCcf z(tw;YmcKw{ui|BFt=|3r!1kJd!Smn)@&EbQ3f@T^xGBBHz9IQIL*KoGJoXRu6-c-M li478`GT$B+y+HbgX#FW!@k#${Hg$tUJzf1=);T3K0RX7o7qkEX literal 707 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDImUKs7M+SzC{oH>NS%G|m0G|-o z|2V+;^S92QzXO*9DnEbzHjsNePj>~7!&egI7tEh8A3y(n|NZ&#_VxQ28XW5!7#NsT zJY5_^GVZ;-aoU$DP^97E<%We!&a7=*J)#m?1|beB8X_1=7Vt_)8sFlFXq8~>%%7&7khF}ap3$TzM%X8OWSe3gi9q%m$wP8u(52M z9Ik%hR{_)W`F0DIS3O{ATXkG7VbQG;#^9^lxL2&O+u0y|HC+5c(BA^a=d0$+CCp`P zRhWVY&tPm(z=H!=&U{Uem1sQ8yI~9C=c{ZHu`?P@OGHF9{M2IO+NQuN?ZI%mAYpGK z%Y^-`nl~JTBG{Ptx9{5gZXI*OmkK+@-+j*oH~p_LQ&fB$+0xRxoRd@bzN$)1&Fmkn z>)tsxte@S}zrkLx|9ws8Z^4rvube+|E0O!Q>J-m9dw!E&K$5{I(O!P29w`e2YV*Ivj-HI`rg!ANX=km zC_Tf_pq0kpz-!Eq&?CuUaEOQDMKT)$j{$QP2BR01_s8z zo-U3d6}R4Ax#)Y?L4-BX%9C@-B%vTF)qt-5ib6{zbf)kLt>0VhcI*F<_viNPWdxc7 z13pJ~t$Tm_v+6G9A9v>IU)=h?k;~<6{Q{=M-=PY5`?)s6v%dPan&Efo0_t%NF!I&^ ztd@UWvF(0A;lz6nc@N@4ubm5iybzGFvtnuQ=R5fDv2(<<-?@?d>ZU!dmi_2v{Hp$c z{pa6r4OAseTkbLNmHoKr{DSAfgLZk-mY?hen-0IXZK-50_;mO^kk4jt^I<%Y&t~xR zVZ3R}XMTmUAL;xL_b_+J|BH0CxX&Q-Z>6)vc_5|gZ1E3BEp@hd#~@QTT~Q{Vfp7n7 zfj(n~c6p7Uq~sRMv}2*f+dBz!(#|Ae!;paqR>D3RrK*uV?suSTv!257Qg| q@P@x1xi;9xP*;*27I{EA_#=19Q;WbQ^EtPGL_J;oT-G@yGywpqw*xu= literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDImUKs7M+SzC{oH>NS%G}T0G|-o z|NsA=KYs^I-U5N=&Q|1S7&mcJ&YShS3HPeB?RZZZ4g76CFlYXiJ4(o+97OY_5k_cg{G`M?L+JD<`cjbV- o-U9_$EKjyFN^fASXZyjn@>5?x(s3IlV6tHFboFyt=akR{09Q&2wg3PC diff --git a/examples/resource-bar/assets/Star_Medium.png b/examples/resource-bar/assets/Star_Medium.png index 315be23ea1c59acf4c3690db38087e05a19a3a65..6bce4c7a6efd824aec3571aef4010b014acf09b6 100644 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GGLLkg|>2BR01_nkE zPZ!6Kid%25JMuO=h_D36C@h>bp<#-b!yzvxCsl<+ZqJ=x9WGCqH23=?TcJsR>)S4r z0*%57)K_i2x9zc7k@$j~c~*znb;Ge(!QUA+yJI#|x&O z*Oh+~8Ml@9sZH3DZQ^2R@{mUwy~K!!DLk5WG`Y m;qOBrK8SInvh11sm5&we2Cp0Tt6q{7qH&t;ucLK6TJON1u? literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDImUKs7M+SzC{oH>NS%G|&0G|-o z|9AmV6;NLF((NiBi@PMqFS!4HJb(TB^ZxVY84ezOa1JQ^$C4kD}p zQPJfGLPF*|Kx(?>KC4F9i}-IA|ZdsCB`sU<=n4 zp`HWpY?#jP)%|czyNPi}-KXXa8yWLHnNI(DKqp_Ij_IAujdk%&yEXE)F2+tWXZ)FX zYQD|xS_95ydn(nR9XI^{;mvs`Lnga|8K(p}CUUC^WG;}_6v|Xwa6#)rL(po6+K48$ snwg8lSh(a_PEClH0l5z5%!qT`3+ipmdKI;Vst0FYjy*#H0l diff --git a/examples/resource-bar/assets/Star_Small.png b/examples/resource-bar/assets/Star_Small.png index 7eae179500e972fa3be1baf1ecc83781cd0c34db..0286d9fb50821fc878c2b1e90778ab7feae78ad0 100644 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GGLLkg|>2BR0px^;d z7srr_TW>ENVK74FRd}boFyt I=akR{07xBH8~^|S delta 279 zcmeBUTE;X%qMnJFfq`LPKxYJyVo7)Ob!1@J*w6hZkrl}23GfMV{SO8}9*|~bNI3*# zF_#4S1<#LXFqEq50CKl^x;TbJ9DaLcBX6q#k89xh!$LRPRV5Ua1C}Tla48$Gv5KCk z(Y#t8mecubr`^#|k?3s+Ee#-WpsBu;=Rgrl!agPgTf2x*cX6Fn?c8ZsPqR*b^|&#f z$&EuTp(O!A&0y&en9LxUB&6Wv!{qX(@yda_tUDVwb9*sYi(g@D`{%4WnL%MT3&T+r zh81dz_CAMLSR{o7M0^|q3=it~?P@-IDxKk!T!YmI9w7lBsA155ed|EEz-!0pg+M4&8ny$FBYyx1a7bBm000XT000XT0n*)m`~Uy}Xh}ptR9M69m%U2EP!z}W z3SAUB7o6%G=vb;tsiRJUUAknG4$f|ZLx+N+eSj`bB2K=5uiyjt4oChWM{W=I>l_nx z=!HM|Aj$8Sb8nKHf{2R0OtBZRoOIahlP{eMFlc=-ruUn3dVj9Y=<{w!kC&(Qx)6*gn1A~;NIsw zR0)#+zkr(UD1SIs3Db*6z>6HPRzd^+&g_LqrhG_uN47u+?!scxNMs4*fnRU6Dxuj~xUMD;(#V1bh-25k5WzR|}*>^GrSA{Vau7T|(8 zU=3XTHRP!m1{a5+4A#KS({ec%bitiX%m2lX$^PH4ixzwVXtE6yPHw3A00000NkvXX Hu0mjf((ki| delta 3336 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 UCZUPAyZ`_I07*qoM6N<$g8CZIW&i*H delta 3445 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 X7Osk%)XJW300000NkvXXu0mjfEia|4 From 789685160627de5379c776886b0517a044993abe Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Mon, 29 Aug 2022 19:49:33 -0600 Subject: [PATCH 03/24] Added new behavior based on a trimmed version of draggable slider --- examples/resource-bar/game.json | 2807 +++++++++++++++++++++++++++++-- 1 file changed, 2647 insertions(+), 160 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 41c09dddb..7392c8278 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1319,6 +1319,21 @@ "numberProperties": [], "stringProperties": [], "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ResourceBarNew", + "persistentUuid": "aa4df219-68f2-4026-8245-16258f68f586", + "width": 0, + "x": 448, + "y": 144, + "zOrder": 13, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] } ], "objects": [ @@ -1365,7 +1380,7 @@ }, { "name": "DrawResourceBar", - "type": "DrawResourceBar::DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD", "DraggableSliderBehavior": "DraggableSliderControl" } ], @@ -1428,7 +1443,7 @@ }, { "name": "DrawResourceBar", - "type": "DrawResourceBar::DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD", "DraggableSliderBehavior": "DraggableSliderControl" }, { @@ -1496,7 +1511,7 @@ }, { "name": "DrawResourceBar", - "type": "DrawResourceBar::DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD", "DraggableSliderBehavior": "DraggableSliderControl" } ], @@ -1559,7 +1574,7 @@ }, { "name": "DrawResourceBar", - "type": "DrawResourceBar::DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD", "DraggableSliderBehavior": "DraggableSliderControl" } ], @@ -2524,6 +2539,48 @@ "g": 255, "r": 255 } + }, + { + "assetStoreId": "", + "name": "ResourceBarNew", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "BarLength": 200, + "BarThickness": 4, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": "11;255;0", + "ActiveBarOpacity": 255, + "RoundedBar": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true } ], "events": [ @@ -2679,7 +2736,7 @@ "actions": [ { "type": { - "value": "DrawResourceBar::DrawResourceBar::DrawHealthBar" + "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawHealthBar" }, "parameters": [ "Health_Bar", @@ -2691,7 +2748,7 @@ }, { "type": { - "value": "DrawResourceBar::DrawResourceBar::DrawHealthBar" + "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawHealthBar" }, "parameters": [ "MiniHealth_Bar", @@ -2703,7 +2760,7 @@ }, { "type": { - "value": "DrawResourceBar::DrawResourceBar::DrawShieldBar" + "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawShieldBar" }, "parameters": [ "Shield_Bar", @@ -2715,7 +2772,7 @@ }, { "type": { - "value": "DrawResourceBar::DrawResourceBar::DrawResourceBar" + "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawResourceBar" }, "parameters": [ "ResourceMouseX_Bar", @@ -2727,6 +2784,11 @@ } ] }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, { "type": "BuiltinCommonInstructions::Comment", "color": { @@ -3190,7 +3252,7 @@ }, { "name": "DrawResourceBar", - "type": "DrawResourceBar::DrawResourceBar" + "type": "DrawResourceBarOLD::DrawResourceBarOLD" }, { "name": "Health", @@ -14016,38 +14078,39 @@ }, { "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", - "category": "Input", - "description": "Draws a draggable slider that users can move to select a numerical value.\nThe value range, tick spacing, and the appearance of the slider can be defined with properties.\n\nHow to use:\n- Add this behavior a **Shape Painter** object\n- Place an instance of that shape painter on the screen where you want the slider to appear\n- Use the \"Value\" expression to find the Value based on the position of the slider\n\nTips:\n- You can disable the slider to prevent a user from interacting with it\n- You can set the Value of the slider and the slider will move to the correct position\n\nFurther details can be found in [this tutorial video](https://youtu.be/iiTUwdAT_hs).\n\nBreaking changes (1.0.0)\n- Track thickness and length properties replaced track width and height. These 2 properties must be set again if they were different from the default size.\n- Hidden sliders can be dragged. The \"enable\" action must be used to disable them.\n", + "category": "General", + "description": "How to use:\n- \n\nTips:\n- ", "extensionNamespace": "", - "fullName": "Draggable slider", + "fullName": "Draw resource bar (NEW)", "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", - "name": "DraggableSliderControl", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", - "shortDescription": "A draggable slider that users can move to select a numerical value.", - "version": "1.0.5", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBkPSJNMjgsMTJIMTRINGMtMi4yLDAtNCwxLjgtNCw0czEuOCw0LDQsNGgxMGgxNGMyLjIsMCw0LTEuOCw0LTRTMzAuMiwxMiwyOCwxMnogTTQsMThjLTEuMSwwLTItMC45LTItMnMwLjktMiwyLTJoMTANCgljMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJINHoiLz4NCjwvc3ZnPg0K", + "name": "DrawResourceBar", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_loading_progress_bar.svg", + "shortDescription": "Draw a resource bar that represents health, shield, or any value.", + "version": "0.0.1", "origin": { "identifier": "DraggableSliderControl", "name": "gdevelop-extension-store" }, "tags": [ - "draggable", - "slider", + "health", + "shield", + "resource", "shape painter", "ui", "widget" ], "authorIds": [ - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" ], "dependencies": [], "eventsFunctions": [], "eventsBasedBehaviors": [ { - "description": "Let users select a numerical value by dragging a slider.", - "fullName": "Draggable slider", - "name": "DraggableSliderControl", + "description": "Draw a resource bar that represents health, shield, or any value.", + "fullName": "Draw resource bar", + "name": "DrawResourceBar", "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { @@ -14117,66 +14180,6 @@ } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set track height function (which enforces valid thumb sizes)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyTrackThickness()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Start halo at same size as thumb", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], @@ -14212,7 +14215,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -14223,7 +14226,7 @@ "fullName": "", "functionType": "Action", "group": "", - "name": "doStepPreEvents", + "name": "doStepPostEvents", "private": false, "sentence": "", "events": [ @@ -14232,7 +14235,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Slider logic", + "name": "Slider drawing", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -14241,85 +14244,2569 @@ "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::IsEnabled" + "value": "DraggableSliderControl::DraggableSliderControl::PropertyNeedRedraw" }, "parameters": [ "Object", - "Behavior", - "" + "Behavior" ] - } - ], - "actions": [], - "events": [ + }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "Visible" }, - "comment": "Track where the mouse is (in relation to object)", - "comment2": "" + "parameters": [ + "Object" + ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseX" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseY" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" - ] - } + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" ] - }, + } + ], + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" }, - "comment": "Move slider when being dragged", - "comment2": "" + "parameters": [ + "Object", + "Behavior", + "no" + ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ + "comment": "Set inactive track parameters (by default, use the active bar color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveBarOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive track", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of track (inactive side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength()", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "270", + "90", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active track parameters", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveBarOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "-(Object.Behavior::PropertyBarThickness() / 2)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of bar (active side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "0", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "90", + "270", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "The value of the resource bar.", + "fullName": "Value", + "functionType": "Expression", + "group": "Bar", + "name": "Value", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValue()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the value of the resource bar.", + "fullName": "Value", + "functionType": "Action", + "group": "Resource Bar", + "name": "SetValue", + "private": false, + "sentence": "Change the value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyValueMin()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the proper offset", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Resource bar value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The minimum value of the resource bar.", + "fullName": "Minimum value", + "functionType": "Expression", + "group": "Value configuration", + "name": "ValueMin", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMin()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of the resource bar.", + "fullName": "Minimum value", + "functionType": "Action", + "group": "Value configuration", + "name": "SetValueMin", + "private": false, + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMin" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMin\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Minimum value", + "longDescription": "", + "name": "ValueMin", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The maximum value of the resource bar.", + "fullName": "Maximum value", + "functionType": "Expression", + "group": "Value configuration", + "name": "ValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of the resource bar.", + "fullName": "Bar thickness", + "functionType": "Expression", + "group": "Bar configuration", + "name": "BarThickness", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Length of the resource bar.", + "fullName": "Bar length", + "functionType": "Expression", + "group": "Bar configuration", + "name": "BarLength", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarLength()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum value of a resource bar.", + "fullName": "Maximum value", + "functionType": "Action", + "group": "Bar value configuration", + "name": "SetValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMax\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum value", + "longDescription": "", + "name": "ValueMax", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The tick spacing of a bar.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Value configuration", + "name": "TickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTickSpacing()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the tick spacing of a resource bar.", + "fullName": "Tick spacing", + "functionType": "Action", + "group": "Value configuration", + "name": "SetTickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"TickSpacing\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change length of a resource bar.", + "fullName": "Bar length", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetBarLength", + "private": false, + "sentence": "Change bar length of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackLength" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new track size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Track width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change thickness of a resource bar", + "fullName": "Bar thickness", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetBarThickness", + "private": false, + "sentence": "Change the bar thickness of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than track height + 2 pixels (to prevent track ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Track thickness", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Make bar use rounded ends.", + "fullName": "Rounded bar ends", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetRoundedBar", + "private": false, + "sentence": "Draw _PARAM0_ with a rounded bar: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rounded bar", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of inactive bar.", + "fullName": "Inactive bar opacity", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetInactiveBarOpacity", + "private": false, + "sentence": "Change inactive bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of active bar.", + "fullName": "Active bar opacity", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetActiveBarOpacity", + "private": false, + "sentence": "Change active bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the left side of the bar.", + "fullName": "Active bar color ", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetActiveBarColor", + "private": false, + "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the right side of the resource bar.", + "fullName": "Inactive bar color", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetInactiveBarColor", + "private": false, + "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::SetRotationCenter" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength() / 2", + "Object.Behavior::PropertyBarThickness() / 2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::SetRectangularCollisionMask" + }, + "parameters": [ + "Object", + "0", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw health bar.", + "fullName": "Draw health bar", + "functionType": "Action", + "group": "", + "name": "DrawHealthBar", + "private": false, + "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithHealth.HealthBehavior::MaxHealth()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with health", + "longDescription": "", + "name": "ObjectWithHealth", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Health behavior", + "longDescription": "", + "name": "HealthBehavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw shield bar.", + "fullName": "Draw shield bar", + "functionType": "Action", + "group": "", + "name": "DrawShieldBar", + "private": false, + "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithShield.ShieldBehavior::MaxShield()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with shield", + "longDescription": "", + "name": "ObjectWithShield", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield behavior", + "longDescription": "", + "name": "ShieldBehavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw resource bar.", + "fullName": "Draw resource bar", + "functionType": "Action", + "group": "", + "name": "DrawResourceBar", + "private": false, + "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", + "" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "GetArgumentAsNumber(\"MaxValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Current value", + "longDescription": "", + "name": "CurrentValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Max value", + "longDescription": "", + "name": "MaxValue", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "Value", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "Value", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "Value", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "200", + "type": "Number", + "label": "Bar length", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarLength" + }, + { + "value": "4", + "type": "Number", + "label": "Bar thickness", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarThickness" + }, + { + "value": "11;255;0", + "type": "Color", + "label": "Inactive bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarOpacity" + }, + { + "value": "11;255;0", + "type": "Color", + "label": "Active bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarOpacity" + }, + { + "value": "false", + "type": "Boolean", + "label": "Rounded bar ends", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "RoundedBar" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Value" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" + }, + { + "value": "0", + "type": "Number", + "label": "Time to complete moving the bar when the value is changed (seconds)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ChangeDuration" + } + ] + } + ] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", + "category": "Input", + "description": "Draws a draggable slider that users can move to select a numerical value.\nThe value range, tick spacing, and the appearance of the slider can be defined with properties.\n\nHow to use:\n- Add this behavior a **Shape Painter** object\n- Place an instance of that shape painter on the screen where you want the slider to appear\n- Use the \"Value\" expression to find the Value based on the position of the slider\n\nTips:\n- You can disable the slider to prevent a user from interacting with it\n- You can set the Value of the slider and the slider will move to the correct position\n\nFurther details can be found in [this tutorial video](https://youtu.be/iiTUwdAT_hs).\n\nBreaking changes (1.0.0)\n- Track thickness and length properties replaced track width and height. These 2 properties must be set again if they were different from the default size.\n- Hidden sliders can be dragged. The \"enable\" action must be used to disable them.\n", + "extensionNamespace": "", + "fullName": "Draggable slider", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", + "name": "DraggableSliderControl", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", + "shortDescription": "A draggable slider that users can move to select a numerical value.", + "version": "1.0.5", + "origin": { + "identifier": "DraggableSliderControl", + "name": "gdevelop-extension-store" + }, + "tags": [ + "draggable", + "slider", + "shape painter", + "ui", + "widget" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Let users select a numerical value by dragging a slider.", + "fullName": "Draggable slider", + "name": "DraggableSliderControl", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get re-drawn every frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use correct min value (instead of always starting at 0)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set track height function (which enforces valid thumb sizes)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTrackThickness()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start halo at same size as thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPreEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider logic", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::IsEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Track where the mouse is (in relation to object)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move slider when being dragged", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ { "type": { "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" @@ -18377,12 +20864,12 @@ "category": "General", "description": "\nTo adjust the appearance of the resource bar, edit the Draggable Slider properties. The shape painter appearance settings will be overwritten by the Draggable Slider.", "extensionNamespace": "", - "fullName": "Draw resource bar (health, shield, etc)", + "fullName": "Draw resource bar (health, shield, etc) OLD", "helpPath": "", "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBkPSJNMjgsMTJIMTRINGMtMi4yLDAtNCwxLjgtNCw0czEuOCw0LDQsNGgxMGgxNGMyLjIsMCw0LTEuOCw0LTRTMzAuMiwxMiwyOCwxMnogTTQsMThjLTEuMSwwLTItMC45LTItMnMwLjktMiwyLTJoMTANCgljMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJINHoiLz4NCjwvc3ZnPg0K", - "name": "DrawResourceBar", + "name": "DrawResourceBarOLD", "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_loading_progress_bar.svg", - "shortDescription": "Draw a bar that displays a resource like health, shield, or any variable.", + "shortDescription": "Draw a bar that displays a resource like health, shield, or any value.", "version": "0.0.1", "tags": [], "authorIds": [ @@ -18393,8 +20880,8 @@ "eventsBasedBehaviors": [ { "description": "", - "fullName": "", - "name": "DrawResourceBar", + "fullName": "Draw resource bar (OLD)", + "name": "DrawResourceBarOLD", "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { @@ -18466,7 +20953,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" }, { @@ -18561,7 +21048,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" }, { @@ -18656,7 +21143,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" }, { @@ -18784,7 +21271,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" } ], From a1c8c15e06c2f8e7321d209751dfceaa3cac056d Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 4 Sep 2022 20:26:35 -0600 Subject: [PATCH 04/24] Started UnitResourceBar --- examples/resource-bar/assets/Emote Heart.png | Bin 0 -> 265 bytes examples/resource-bar/game.json | 4955 +++++++++++++++++- 2 files changed, 4951 insertions(+), 4 deletions(-) create mode 100644 examples/resource-bar/assets/Emote Heart.png diff --git a/examples/resource-bar/assets/Emote Heart.png b/examples/resource-bar/assets/Emote Heart.png new file mode 100644 index 0000000000000000000000000000000000000000..3e52a6e23d8afbe09cb3c1d52e557e6eeeb7e09a GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yJ!VDzCd0TD)DVB6cUq=Rpjs4tz5?O(Kl>na* z*Z&M5{~3b+GlYT}Kz1OI@ed>j6bS~Z0&=TW3$1}H?vfzC;QsaY_5S+j_w&DJ5d7Pi z2NbUKba4#PIG-HR$|k`!`M{)4Mfw75+!62Z?UigvWa=&hGK$S6TxjCbxx>pE6wr9p zpfPp_OV}ZnG)Gpk11vihFlld6{F57NP`<^H#pnTFvj(Gf!>^^h>lm~)Fugc8H}=H7 w-aC7%wYt7fKX*^ERZ4DRFnjWzfM^DWUd@S*&p%Ko2Reem)78&qol`;+0J{@iCjbBd literal 0 HcmV?d00001 diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 7392c8278..3097fd371 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1148,6 +1148,19 @@ "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Background/Moon.png", "name": "gdevelop-asset-store" } + }, + { + "alwaysLoaded": false, + "file": "assets/Emote Heart.png", + "kind": "image", + "metadata": "", + "name": "Emote Heart.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Emotes/Normal/Emote/Emote Heart.png", + "name": "gdevelop-asset-store" + } } ], "resourceFolders": [] @@ -1325,11 +1338,11 @@ "customSize": false, "height": 0, "layer": "", - "name": "ResourceBarNew", - "persistentUuid": "aa4df219-68f2-4026-8245-16258f68f586", + "name": "Heart_ResourceBar", + "persistentUuid": "0c4d4e97-0b53-4f05-8468-7d8b7a7fa8dd", "width": 0, - "x": 448, - "y": 144, + "x": 32, + "y": 464, "zOrder": 13, "numberProperties": [], "stringProperties": [], @@ -2581,6 +2594,98 @@ }, "absoluteCoordinates": false, "clearBetweenFrames": true + }, + { + "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", + "name": "Heart_ResourceBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "UnitResourceBar", + "type": "ResourceBar::UnitResourceBar", + "StartingUnits": 0, + "CurrentUnits": 5, + "MaxUnits": 0, + "UnitSpacing": 0, + "NextUnitToCreate": 0 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Emote Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", + "name": "Heart_Unit", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Emote Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] } ], "events": [ @@ -3219,6 +3324,24 @@ } ], "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::DisplayUnitResourceBar" + }, + "parameters": [ + "Heart_ResourceBar", + "UnitResourceBar", + "Heart_Unit", + "5", + "" + ] + } + ] } ], "layers": [ @@ -3269,12 +3392,4836 @@ { "name": "Sticker", "type": "Sticker::Sticker" + }, + { + "name": "UnitResourceBar", + "type": "ResourceBar::UnitResourceBar" } ] } ], "externalEvents": [], "eventsFunctionsExtensions": [ + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", + "category": "Input", + "description": "Solid resource bar\n\nUnit resource bar", + "extensionNamespace": "", + "fullName": "Resource bar", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", + "name": "ResourceBar", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", + "shortDescription": "Displays a bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "version": "0.0.1", + "origin": { + "identifier": "DraggableSliderControl", + "name": "gdevelop-extension-store" + }, + "tags": [ + "resource", + "bar", + "shape painter", + "health", + "mana", + "shield", + "hearts", + "lives" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Displays a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "fullName": "Solid resource bar", + "name": "SolidResourceBar", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get re-drawn every frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use correct min value (instead of always starting at 0)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set track height function (which enforces valid thumb sizes)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTrackThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTrackThickness()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start halo at same size as thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPreEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider logic", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::IsEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Track where the mouse is (in relation to object)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyMouseX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyMouseY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move slider when being dragged", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMouseX()" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "End sliding and update variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update \"Value\" based on the location of the thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValueMin() + (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin()) * Object.Behavior::PropertyThumbOffset() / Object.Behavior::PropertyTrackLength()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo even more when pressed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1.25 * Object.Behavior::PropertyHaloRadius()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect hover/touch/click (but only if the layer and object is visible, and the object is not already being dragged)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect mouse clicks near track, start dragging", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset hover detection ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo when hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "Object.Behavior::PropertyThumbOffset() - Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyThumbOffset() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "- Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shrink halo to zero when not hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ResourceBar::SolidResourceBar::PropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Redraw slider only when halo is not at final size", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyCurrentHaloRadius() - Object.Behavior::PropertyTargetHaloRadius())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Behavior::PropertyCurrentHaloRadius(), Object.Behavior::PropertyTargetHaloRadius(), Object.Behavior::PropertyHaloGrowSpeed())" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPostEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider drawing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive track", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set inactive track parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveTrackColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveTrackOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive track", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyTrackThickness() / 2", + "Object.Behavior::PropertyTrackLength()", + "Object.Behavior::PropertyTrackThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of track (inactive side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTrackLength()", + "0", + "Object.Behavior::PropertyTrackThickness() / 2", + "270", + "90", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active track", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active track parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveTrackColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveTrackOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active track (2 pixels bigger than property) ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "-(Object.Behavior::PropertyTrackThickness() / 2 + 1)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyTrackThickness() / 2 + 1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of track (active side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "0", + "0", + "1 + Object.Behavior::PropertyTrackThickness() / 2", + "90", + "270", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Halo", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare halo", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw halo (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityHover()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use a more opaque halo while being dragged (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityClick()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Thumb", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare thumb settings", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyThumbOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Circle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"circle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "ceil(max(Object.Behavior::PropertyThumbWidth(),Object.Behavior::PropertyThumbHeight())/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Rectangle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset() - (Object.Behavior::PropertyThumbWidth() / 2)", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyThumbOffset() + (Object.Behavior::PropertyThumbWidth() / 2)", + "Object.Behavior::PropertyThumbHeight() / 2" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the slider is being dragged.", + "fullName": "Being dragged", + "functionType": "Condition", + "group": "Slider", + "name": "IsBeingDragged", + "private": false, + "sentence": "_PARAM0_ is being dragged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the slider interations are enabled.", + "fullName": "Interactions enabled", + "functionType": "Condition", + "group": "Slider", + "name": "IsEnabled", + "private": false, + "sentence": "Interactions of _PARAM0_ are enabled", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the slider. Users cannot interact while it is disabled.", + "fullName": "Enable interactions", + "functionType": "Action", + "group": "Slider", + "name": "SetEnabled", + "private": false, + "sentence": "Enable interactions of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop dragging (so the slider won't be dragging when it gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset halo size (so halo won't appear when slider gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Enable", + "longDescription": "", + "name": "Enable", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "The value of the slider (based on position of the thumb).", + "fullName": "Slider value", + "functionType": "Expression", + "group": "Slider", + "name": "Value", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValue()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the value of a slider (this will move the thumb to the correct position).", + "fullName": "Slider value", + "functionType": "Action", + "group": "Slider", + "name": "SetValue", + "private": false, + "sentence": "Change the value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyValueMin()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the proper offset (it moves the slider)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTrackLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Slider value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMin", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMin()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMin", + "private": false, + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValueMin" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMin\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Minimum value", + "longDescription": "", + "name": "ValueMin", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of track.", + "fullName": "Slider track thickness", + "functionType": "Expression", + "group": "Slider track configuration", + "name": "TrackThickness", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTrackThickness()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Length of track.", + "fullName": "Slider track length", + "functionType": "Expression", + "group": "Slider track configuration", + "name": "TrackLength", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTrackLength()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Height of thumb.", + "fullName": "Slider thumb height", + "functionType": "Expression", + "group": "Slider thumb configuration", + "name": "ThumbHeight", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyThumbHeight()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMax\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum value", + "longDescription": "", + "name": "ValueMax", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "TickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTickSpacing()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetTickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"TickSpacing\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change length of track.", + "fullName": "Track length", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetTrackLength", + "private": false, + "sentence": "Change track length of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTrackLength" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new track size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Track width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change thickness of track.", + "fullName": "Track thickness", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetTrackThickness", + "private": false, + "sentence": "Change track thickness of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTrackThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than track height + 2 pixels (to prevent track ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness() + 2", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness() + 2", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Track thickness", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change width of thumb.", + "fullName": "Thumb width", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbWidth", + "private": false, + "sentence": "Change thumb width of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change height of thumb.", + "fullName": "Thumb height", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbHeight", + "private": false, + "sentence": "Change thumb height of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb height", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change radius of the halo around the thumb. This size is also used to detect interaction with the slider.", + "fullName": "Halo radius", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloRadius", + "private": false, + "sentence": "Change halo radius of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo radius", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the halo opacity when the thumb is hovered.", + "fullName": "Halo opacity (hover)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityHover", + "private": false, + "sentence": "Change the halo opacity when hovered of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyHaloOpacityHover" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo opacity (hover)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of halo when pressed.", + "fullName": "Halo opacity (pressed)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityPressed", + "private": false, + "sentence": "Change halo opacity when pressed of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyHaloOpacityClick" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo opacity (pressed)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change shape of thumb (circle or rectangle).", + "fullName": "Thumb shape", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbShape", + "private": false, + "sentence": "Change shape of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Shape\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than track height (to prevent track ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "New thumb shape", + "longDescription": "", + "name": "Shape", + "optional": false, + "supplementaryInformation": "[\"circle\",\"rectangle\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Make track use rounded ends.", + "fullName": "Rounded track ends", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetRoundedTrack", + "private": false, + "sentence": "Draw _PARAM0_ with a rounded track: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rounded track", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of thumb.", + "fullName": "Thumb opacity", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbOpacity", + "private": false, + "sentence": "Change thumb opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of inactive track.", + "fullName": "Inactive track opacity", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetInactiveTrackOpacity", + "private": false, + "sentence": "Change inactive track opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyInactiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive track opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of active track.", + "fullName": "Active track opacity", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetActiveTrackOpacity", + "private": false, + "sentence": "Change active track opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyActiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active track opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the track that is LEFT of the thumb.", + "fullName": "Active track color ", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetActiveTrackColor", + "private": false, + "sentence": "Change active track color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active track color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the track that is RIGHT of the thumb.", + "fullName": "Inactive track color", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetInactiveTrackColor", + "private": false, + "sentence": "Change inactive track color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive track color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the thumb color to a specific value.", + "fullName": "Thumb color", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbColor", + "private": false, + "sentence": "Change thumb color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbColor" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::SetRotationCenter" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTrackLength() / 2", + "Object.Behavior::PropertyTrackThickness() / 2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::SetRectangularCollisionMask" + }, + "parameters": [ + "Object", + "-Object.Behavior::PropertyThumbWidth() / 2", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyThumbWidth() / 2", + "Object.Behavior::PropertyThumbHeight() / 2" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "circle", + "type": "Choice", + "label": "Thumb shape", + "description": "", + "group": "Thumb", + "extraInformation": [ + "circle", + "rectangle" + ], + "hidden": false, + "name": "ThumbShape" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb width", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbWidth" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb height", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbHeight" + }, + { + "value": " 24;119;211", + "type": "Color", + "label": "Thumb Color", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbColor" + }, + { + "value": "255", + "type": "Number", + "label": "Thumb opacity", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbOpacity" + }, + { + "value": "200", + "type": "Number", + "label": "Track length", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "TrackLength" + }, + { + "value": "4", + "type": "Number", + "label": "Track thickness", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "TrackThickness" + }, + { + "value": "", + "type": "String", + "label": "Inactive track color (thumb color by default)", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "InactiveTrackColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive track opacity", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "InactiveTrackOpacity" + }, + { + "value": " ", + "type": "String", + "label": "Active track color (thumb color by default)", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "ActiveTrackColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active track opacity", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "ActiveTrackOpacity" + }, + { + "value": "24", + "type": "Number", + "label": "Halo size (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloRadius" + }, + { + "value": "32", + "type": "Number", + "label": "Halo opacity (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityHover" + }, + { + "value": "64", + "type": "Number", + "label": "Halo opacity (pressed)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityClick" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rounded track ends", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "RoundedTrack" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable interactions", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Enabled" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsBeingDragged" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Value" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsHovered" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentHaloRadius" + }, + { + "value": "0.2", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HaloGrowSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetHaloRadius" + } + ] + }, + { + "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc)", + "fullName": "Unit resource bar", + "name": "UnitResourceBar", + "objectType": "", + "eventsFunctions": [ + { + "description": "Display unit resource bar.", + "fullName": "Display unit resource bar", + "functionType": "Action", + "group": "", + "name": "DisplayUnitResourceBar", + "private": false, + "sentence": "Display _PARAM3_ units of _PARAM2_ located at _PARAM0_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create unit objects (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create first object (required because \"take into account\" is false when count is 0)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Not" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UnitObject", + "Object.X()", + "Object.Y()", + "Object.Layer()" + ] + }, + { + "type": { + "value": "LinkedObjects::LinkObjects" + }, + "parameters": [ + "", + "Object", + "UnitObject" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "UnitObject", + "__ResourceBar.UnitID", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create more objects as needed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + }, + { + "type": { + "value": "PickedInstancesCount" + }, + "parameters": [ + "UnitObject", + "<", + "GetArgumentAsNumber(\"Units\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "PickedInstancesCount(UnitObject) + 1" + ] + } + ], + "events": [ + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::PropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "GetArgumentAsNumber(\"Units\")" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UnitObject", + "Object.X()", + "Object.Y()", + "Object.Layer()" + ] + }, + { + "type": { + "value": "LinkedObjects::LinkObjects" + }, + "parameters": [ + "", + "Object", + "UnitObject" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "UnitObject", + "__ResourceBar.UnitID", + "=", + "Object.Behavior::PropertyNextUnitToCreate()" + ] + }, + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "disabled": true, + "name": "Update position of units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "UnitObject", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "UnitObject", + "=", + "Object.CenterX() + (Object.Behavior::PropertyUnitSpacing() + UnitObject.Width()) * (UnitObject.Variable(__ResourceBar.UnitID) - 1)", + "=", + "Object.CenterY()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "disabled": true, + "name": "Update unit visibility", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "UnitObject", + "__ResourceBar.UnitID", + ">", + "GetArgumentAsNumber(\"Units\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "UnitObject" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "UnitObject", + "__ResourceBar.UnitID", + "<=", + "GetArgumentAsNumber(\"Units\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "UnitObject", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::UnitResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object used to display each unit", + "longDescription": "", + "name": "UnitObject", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Units", + "longDescription": "", + "name": "Units", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Starting units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "StartingUnits" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "CurrentUnits" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum units (Use \"0\" for unlimited)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "MaxUnits" + }, + { + "value": "0", + "type": "Number", + "label": "Space between each unit (pixels)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "UnitSpacing" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NextUnitToCreate" + } + ] + } + ] + }, { "author": "@Bouh, D8H", "category": "General", From 0f1c624638f5a30326c5038166f8dc302622deac Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 6 Nov 2022 19:07:30 -0700 Subject: [PATCH 05/24] Starting over-ish --- examples/resource-bar/ResourceBar.json | 7578 ++++++++++++++++++++++++ examples/resource-bar/game.json | 7313 +++++++++++++---------- 2 files changed, 11610 insertions(+), 3281 deletions(-) create mode 100644 examples/resource-bar/ResourceBar.json diff --git a/examples/resource-bar/ResourceBar.json b/examples/resource-bar/ResourceBar.json new file mode 100644 index 000000000..d66648ba1 --- /dev/null +++ b/examples/resource-bar/ResourceBar.json @@ -0,0 +1,7578 @@ +{ + "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", + "category": "Input", + "description": "Solid resource bar\n\nUnit resource bar", + "extensionNamespace": "", + "fullName": "Resource bar", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", + "name": "ResourceBar", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", + "shortDescription": "Displays a bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "version": "0.0.1", + "origin": { + "identifier": "DraggableSliderControl", + "name": "gdevelop-extension-store" + }, + "tags": [ + "resource", + "bar", + "shape painter", + "health", + "mana", + "shield", + "hearts", + "lives" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Displays a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "fullName": "Solid resource bar", + "name": "SolidResourceBar", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get re-drawn every frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use correct min value (instead of always starting at 0)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set Bar height function (which enforces valid thumb sizes)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyBarThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start halo at same size as thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPreEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider logic", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::IsEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Bar where the mouse is (in relation to object)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyMouseX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyMouseY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move slider when being dragged", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMouseX()" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "End sliding and update variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update \"Value\" based on the location of the thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValueMin() + (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin()) * Object.Behavior::PropertyThumbOffset() / Object.Behavior::PropertyBarLength()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo even more when pressed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1.25 * Object.Behavior::PropertyHaloRadius()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect hover/touch/click (but only if the layer and object is visible, and the object is not already being dragged)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect mouse clicks near Bar, start dragging", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyBarLength() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset hover detection ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo when hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "Object.Behavior::PropertyThumbOffset() - Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyThumbOffset() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "- Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shrink halo to zero when not hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ResourceBar::SolidResourceBar::PropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Redraw slider only when halo is not at final size", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyCurrentHaloRadius() - Object.Behavior::PropertyTargetHaloRadius())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Behavior::PropertyCurrentHaloRadius(), Object.Behavior::PropertyTargetHaloRadius(), Object.Behavior::PropertyHaloGrowSpeed())" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPostEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider drawing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive Bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set inactive Bar parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveBarOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive Bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of Bar (inactive side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength()", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "270", + "90", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active Bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active Bar parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveBarOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active Bar (2 pixels bigger than property) ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "-(Object.Behavior::PropertyBarThickness() / 2 + 1)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyBarThickness() / 2 + 1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of Bar (active side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "0", + "0", + "1 + Object.Behavior::PropertyBarThickness() / 2", + "90", + "270", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Halo", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare halo", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw halo (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityHover()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use a more opaque halo while being dragged (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityClick()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Thumb", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare thumb settings", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyThumbOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Circle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"circle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "ceil(max(Object.Behavior::PropertyThumbWidth(),Object.Behavior::PropertyThumbHeight())/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Rectangle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset() - (Object.Behavior::PropertyThumbWidth() / 2)", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyThumbOffset() + (Object.Behavior::PropertyThumbWidth() / 2)", + "Object.Behavior::PropertyThumbHeight() / 2" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the slider is being dragged.", + "fullName": "Being dragged", + "functionType": "Condition", + "group": "Slider", + "name": "IsBeingDragged", + "private": false, + "sentence": "_PARAM0_ is being dragged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the slider interations are enabled.", + "fullName": "Interactions enabled", + "functionType": "Condition", + "group": "Slider", + "name": "IsEnabled", + "private": false, + "sentence": "Interactions of _PARAM0_ are enabled", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the slider. Users cannot interact while it is disabled.", + "fullName": "Enable interactions", + "functionType": "Action", + "group": "Slider", + "name": "SetEnabled", + "private": false, + "sentence": "Enable interactions of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop dragging (so the slider won't be dragging when it gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset halo size (so halo won't appear when slider gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Enable", + "longDescription": "", + "name": "Enable", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "The value of the slider (based on position of the thumb).", + "fullName": "Slider value", + "functionType": "Expression", + "group": "Slider", + "name": "Value", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValue()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the value of a slider (this will move the thumb to the correct position).", + "fullName": "Slider value", + "functionType": "Action", + "group": "Slider", + "name": "SetValue", + "private": false, + "sentence": "Change the value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyValueMin()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the proper offset (it moves the slider)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Slider value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMin", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMin()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMin", + "private": false, + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValueMin" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMin\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Minimum value", + "longDescription": "", + "name": "ValueMin", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of Bar.", + "fullName": "Slider Bar thickness", + "functionType": "Expression", + "group": "Slider Bar configuration", + "name": "BarThickness", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Length of Bar.", + "fullName": "Slider Bar length", + "functionType": "Expression", + "group": "Slider Bar configuration", + "name": "BarLength", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarLength()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Height of thumb.", + "fullName": "Slider thumb height", + "functionType": "Expression", + "group": "Slider thumb configuration", + "name": "ThumbHeight", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyThumbHeight()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMax\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum value", + "longDescription": "", + "name": "ValueMax", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "TickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTickSpacing()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetTickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"TickSpacing\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change length of Bar.", + "fullName": "Bar length", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetBarLength", + "private": false, + "sentence": "Change Bar length of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyBarLength" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new Bar size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Bar width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change thickness of Bar.", + "fullName": "Bar thickness", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetBarThickness", + "private": false, + "sentence": "Change Bar thickness of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyBarThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than Bar height + 2 pixels (to prevent Bar ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Bar thickness", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change width of thumb.", + "fullName": "Thumb width", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbWidth", + "private": false, + "sentence": "Change thumb width of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than Bar thickness (plus 2 pixels)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyBarThickness() + 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change height of thumb.", + "fullName": "Thumb height", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbHeight", + "private": false, + "sentence": "Change thumb height of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than Bar thickness (plus 2 pixels)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyBarThickness() + 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb height", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change radius of the halo around the thumb. This size is also used to detect interaction with the slider.", + "fullName": "Halo radius", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloRadius", + "private": false, + "sentence": "Change halo radius of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo radius", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the halo opacity when the thumb is hovered.", + "fullName": "Halo opacity (hover)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityHover", + "private": false, + "sentence": "Change the halo opacity when hovered of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyHaloOpacityHover" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo opacity (hover)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of halo when pressed.", + "fullName": "Halo opacity (pressed)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityPressed", + "private": false, + "sentence": "Change halo opacity when pressed of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyHaloOpacityClick" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Halo opacity (pressed)", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change shape of thumb (circle or rectangle).", + "fullName": "Thumb shape", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbShape", + "private": false, + "sentence": "Change shape of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Shape\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than Bar height (to prevent Bar ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "New thumb shape", + "longDescription": "", + "name": "Shape", + "optional": false, + "supplementaryInformation": "[\"circle\",\"rectangle\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Make Bar use rounded ends.", + "fullName": "Rounded Bar ends", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetRoundedBar", + "private": false, + "sentence": "Draw _PARAM0_ with a rounded Bar: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rounded Bar", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of thumb.", + "fullName": "Thumb opacity", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbOpacity", + "private": false, + "sentence": "Change thumb opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of inactive Bar.", + "fullName": "Inactive Bar opacity", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetInactiveBarOpacity", + "private": false, + "sentence": "Change inactive Bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyInactiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive Bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of active Bar.", + "fullName": "Active Bar opacity", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetActiveBarOpacity", + "private": false, + "sentence": "Change active Bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyActiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active Bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the Bar that is LEFT of the thumb.", + "fullName": "Active Bar color ", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetActiveBarColor", + "private": false, + "sentence": "Change active Bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active Bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the Bar that is RIGHT of the thumb.", + "fullName": "Inactive Bar color", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetInactiveBarColor", + "private": false, + "sentence": "Change inactive Bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive Bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the thumb color to a specific value.", + "fullName": "Thumb color", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbColor", + "private": false, + "sentence": "Change thumb color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyThumbColor" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Thumb color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::SetRotationCenter" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength() / 2", + "Object.Behavior::PropertyBarThickness() / 2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::SetRectangularCollisionMask" + }, + "parameters": [ + "Object", + "-Object.Behavior::PropertyThumbWidth() / 2", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyBarLength() + Object.Behavior::PropertyThumbWidth() / 2", + "Object.Behavior::PropertyThumbHeight() / 2" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SolidResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "circle", + "type": "Choice", + "label": "Thumb shape", + "description": "", + "group": "Thumb", + "extraInformation": [ + "circle", + "rectangle" + ], + "hidden": false, + "name": "ThumbShape" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb width", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbWidth" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb height", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbHeight" + }, + { + "value": " 24;119;211", + "type": "Color", + "label": "Thumb Color", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbColor" + }, + { + "value": "255", + "type": "Number", + "label": "Thumb opacity", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbOpacity" + }, + { + "value": "200", + "type": "Number", + "label": "Bar length", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarLength" + }, + { + "value": "4", + "type": "Number", + "label": "Bar thickness", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarThickness" + }, + { + "value": "", + "type": "String", + "label": "Inactive Bar color (thumb color by default)", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive Bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarOpacity" + }, + { + "value": " ", + "type": "String", + "label": "Active Bar color (thumb color by default)", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active Bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarOpacity" + }, + { + "value": "24", + "type": "Number", + "label": "Halo size (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloRadius" + }, + { + "value": "32", + "type": "Number", + "label": "Halo opacity (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityHover" + }, + { + "value": "64", + "type": "Number", + "label": "Halo opacity (pressed)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityClick" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rounded Bar ends", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "RoundedBar" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable interactions", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Enabled" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsBeingDragged" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Value" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsHovered" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentHaloRadius" + }, + { + "value": "0.2", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HaloGrowSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetHaloRadius" + } + ] + }, + { + "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image used for resource bar and unit objects.", + "fullName": "Unit resource bar", + "name": "UnitResourceBar", + "objectType": "", + "eventsFunctions": [ + { + "description": "Draw a unit resource bar.", + "fullName": "Draw a unit resource bar", + "functionType": "Action", + "group": "", + "name": "DrawUnitBar", + "private": false, + "sentence": "Draw unit bar _PARAM0_ with _PARAM2_ objects", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create unit objects", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::PropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UnitObject", + "Object.X() + Object.Width() * Object.Behavior::PropertyNextUnitToCreate()", + "Object.Y()", + "Object.Layer()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "UnitObject", + "__ResourceBar.UnitID", + "=", + "Object.Behavior::PropertyNextUnitToCreate()" + ] + }, + { + "type": { + "value": "LinkedObjects::LinkObjects" + }, + "parameters": [ + "", + "Object", + "UnitObject" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove excess units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delete all units higher than max unit value", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()", + "!=", + "0" + ] + }, + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "UnitObject", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update non-empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + "<=", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "UnitObject", + "" + ] + }, + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "\"255;255;255\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Color tint", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only apply color if it has change from default value", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Object.Behavior::PropertyEmptyColorTint()", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "Object.Behavior::PropertyEmptyColorTint()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Hide", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::PropertyHideEmptyUnits" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "UnitObject" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update counter", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "PickedInstancesCount(UnitObject)+1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::UnitResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object used to display each unit", + "longDescription": "", + "name": "UnitObject", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", + "fullName": "Color tint of empty units", + "functionType": "Action", + "group": "", + "name": "SetEmptyUnitColor", + "private": false, + "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyEmptyColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"ColorTint\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::UnitResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Color tint", + "longDescription": "Use \"white\" to remove all color tint", + "name": "ColorTint", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Hide empty units. Empty units exist between the current and maximum value.", + "fullName": "Hide (or show) empty units", + "functionType": "Action", + "group": "", + "name": "SetHideEmptyUnits", + "private": false, + "sentence": "Hide empty units of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"HideEmptyUnits\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyHideEmptyUnits" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"HideEmptyUnits\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyHideEmptyUnits" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::UnitResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Hide empty units", + "longDescription": "", + "name": "HideEmptyUnits", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change maximum units that can be displayed.", + "fullName": "Maximum units", + "functionType": "Action", + "group": "", + "name": "SetMaxUnits", + "private": false, + "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::UnitResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum units", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the current quantity of units.", + "fullName": "Unit quantity", + "functionType": "Action", + "group": "", + "name": "SetCurrentUnits", + "private": false, + "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::UnitResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Current units", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyStartingUnits()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::UnitResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Starting quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "StartingUnits" + }, + { + "value": "", + "type": "Number", + "label": "Quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "CurrentQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum quantity (Use \"0\" for unlimited)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "MaxQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NextUnitToCreate" + }, + { + "value": "", + "type": "Color", + "label": "Empty color tint", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyColorTint" + }, + { + "value": "true", + "type": "Boolean", + "label": "Hide empty units", + "description": "Empty units exist between the current and maximum value.", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "HideEmptyUnits" + } + ] + }, + { + "description": "Draw a resource bar that represents health, shield, or any value.", + "fullName": "Draw resource bar", + "name": "DrawResourceBar117", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "onCreated", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get re-drawn every frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use correct min value (instead of always starting at 0)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "", + "fullName": "", + "functionType": "Action", + "group": "", + "name": "doStepPostEvents", + "private": false, + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider drawing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set inactive Bar parameters (by default, use the active bar color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveBarOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive Bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of Bar (inactive side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength()", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "270", + "90", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active Bar parameters", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveBarOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "-(Object.Behavior::PropertyBarThickness() / 2)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of bar (active side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "0", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "90", + "270", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "The value of the resource bar.", + "fullName": "Value", + "functionType": "Expression", + "group": "Bar", + "name": "Value", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValue()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the value of the resource bar.", + "fullName": "Value", + "functionType": "Action", + "group": "Resource Bar", + "name": "SetValue", + "private": false, + "sentence": "Change the value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyValueMin()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the proper offset", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Resource bar value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The minimum value of the resource bar.", + "fullName": "Minimum value", + "functionType": "Expression", + "group": "Value configuration", + "name": "ValueMin", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMin()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of the resource bar.", + "fullName": "Minimum value", + "functionType": "Action", + "group": "Value configuration", + "name": "SetValueMin", + "private": false, + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValueMin" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMin\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Minimum value", + "longDescription": "", + "name": "ValueMin", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The maximum value of the resource bar.", + "fullName": "Maximum value", + "functionType": "Expression", + "group": "Value configuration", + "name": "ValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of the resource bar.", + "fullName": "Bar thickness", + "functionType": "Expression", + "group": "Bar configuration", + "name": "BarThickness", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Length of the resource bar.", + "fullName": "Bar length", + "functionType": "Expression", + "group": "Bar configuration", + "name": "BarLength", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarLength()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum value of a resource bar.", + "fullName": "Maximum value", + "functionType": "Action", + "group": "Bar value configuration", + "name": "SetValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMax\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum value", + "longDescription": "", + "name": "ValueMax", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The tick spacing of a bar.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Value configuration", + "name": "TickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTickSpacing()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the tick spacing of a resource bar.", + "fullName": "Tick spacing", + "functionType": "Action", + "group": "Value configuration", + "name": "SetTickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"TickSpacing\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change length of a resource bar.", + "fullName": "Bar length", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetBarLength", + "private": false, + "sentence": "Change bar length of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyBarLength" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new Bar size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Bar width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change thickness of a resource bar", + "fullName": "Bar thickness", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetBarThickness", + "private": false, + "sentence": "Change the bar thickness of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyBarThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than Bar height + 2 pixels (to prevent Bar ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Bar thickness", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Make bar use rounded ends.", + "fullName": "Rounded bar ends", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetRoundedBar", + "private": false, + "sentence": "Draw _PARAM0_ with a rounded bar: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rounded bar", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of inactive bar.", + "fullName": "Inactive bar opacity", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetInactiveBarOpacity", + "private": false, + "sentence": "Change inactive bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyInactiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of active bar.", + "fullName": "Active bar opacity", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetActiveBarOpacity", + "private": false, + "sentence": "Change active bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyActiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the left side of the bar.", + "fullName": "Active bar color ", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetActiveBarColor", + "private": false, + "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the right side of the resource bar.", + "fullName": "Inactive bar color", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetInactiveBarColor", + "private": false, + "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::SetRotationCenter" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength() / 2", + "Object.Behavior::PropertyBarThickness() / 2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::SetRectangularCollisionMask" + }, + "parameters": [ + "Object", + "0", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw health bar.", + "fullName": "Draw health bar", + "functionType": "Action", + "group": "", + "name": "DrawHealthBar", + "private": false, + "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithHealth.HealthBehavior::MaxHealth()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with health", + "longDescription": "", + "name": "ObjectWithHealth", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Health behavior", + "longDescription": "", + "name": "HealthBehavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw shield bar.", + "fullName": "Draw shield bar", + "functionType": "Action", + "group": "", + "name": "DrawShieldBar", + "private": false, + "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithShield.ShieldBehavior::MaxShield()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with shield", + "longDescription": "", + "name": "ObjectWithShield", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield behavior", + "longDescription": "", + "name": "ShieldBehavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw resource bar.", + "fullName": "Draw resource bar", + "functionType": "Action", + "group": "", + "name": "DrawResourceBar", + "private": false, + "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "GetArgumentAsNumber(\"MaxValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Current value", + "longDescription": "", + "name": "CurrentValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Max value", + "longDescription": "", + "name": "MaxValue", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "Value", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "Value", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "Value", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "200", + "type": "Number", + "label": "Bar length", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarLength" + }, + { + "value": "4", + "type": "Number", + "label": "Bar thickness", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarThickness" + }, + { + "value": "11;255;0", + "type": "Color", + "label": "Inactive bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarOpacity" + }, + { + "value": "11;255;0", + "type": "Color", + "label": "Active bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarOpacity" + }, + { + "value": "false", + "type": "Boolean", + "label": "Rounded bar ends", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "RoundedBar" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Value" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" + }, + { + "value": "0", + "type": "Number", + "label": "Time to complete moving the bar when the value is changed (seconds)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ChangeDuration" + } + ] + } + ], + "eventsBasedObjects": [] +} \ No newline at end of file diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 3097fd371..567b8bc8a 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1174,9 +1174,6 @@ "disableInputWhenNotFocused": true, "mangledName": "Game", "name": "Game", - "oglFOV": 90, - "oglZFar": 500, - "oglZNear": 1, "r": 0, "standardSortMethod": true, "stopSoundsOnStartup": true, @@ -1359,42 +1356,22 @@ "effects": [], "behaviors": [ { - "name": "DraggableSliderControl", - "type": "DraggableSliderControl::DraggableSliderControl", + "name": "DrawResourceBar116", + "type": "ResourceBar::DrawResourceBar116", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, - "ThumbShape": "rectangle", - "ThumbWidth": 20, - "ThumbHeight": 20, - "ThumbColor": "74;144;226", - "ThumbOpacity": 255, - "TrackLength": 200, - "TrackThickness": 16, - "InactiveTrackColor": "", - "InactiveTrackOpacity": 96, - "ActiveTrackColor": " ", - "ActiveTrackOpacity": 255, - "HaloRadius": 24, - "HaloOpacityHover": 32, - "HaloOpacityClick": 64, - "RoundedTrack": false, - "Enabled": true, - "IsBeingDragged": false, + "BarLength": 200, + "BarThickness": 4, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": "11;255;0", + "ActiveBarOpacity": 255, + "RoundedBar": false, "Value": 0, "ThumbOffset": 0, "NeedRedraw": true, - "IsHovered": false, - "MouseX": 0, - "MouseY": 0, - "CurrentHaloRadius": 0, - "HaloGrowSpeed": 0.2, - "TargetHaloRadius": 0 - }, - { - "name": "DrawResourceBar", - "type": "DrawResourceBarOLD::DrawResourceBarOLD", - "DraggableSliderBehavior": "DraggableSliderControl" + "ChangeDuration": 0 } ], "fillOpacity": 255, @@ -2607,9 +2584,9 @@ { "name": "UnitResourceBar", "type": "ResourceBar::UnitResourceBar", - "StartingUnits": 0, - "CurrentUnits": 5, - "MaxUnits": 0, + "StartingUnits": 3, + "CurrentUnits": 3, + "MaxUnits": 3, "UnitSpacing": 0, "NextUnitToCreate": 0 } @@ -2841,11 +2818,11 @@ "actions": [ { "type": { - "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawHealthBar" + "value": "ResourceBar::DrawResourceBar116::DrawHealthBar" }, "parameters": [ "Health_Bar", - "DrawResourceBar", + "DrawResourceBar116", "Fly", "Health", "" @@ -2889,11 +2866,6 @@ } ] }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [] - }, { "type": "BuiltinCommonInstructions::Comment", "color": { @@ -2931,7 +2903,6 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "folded": true, "name": "Spawn items", "source": "", "type": "BuiltinCommonInstructions::Group", @@ -3326,22 +3297,169 @@ "parameters": [] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Unit resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "ResourceBar::UnitResourceBar::DisplayUnitResourceBar" - }, - "parameters": [ - "Heart_ResourceBar", - "UnitResourceBar", - "Heart_Unit", - "5", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "=", + "3" + ] + }, + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetMaxUnits" + }, + "parameters": [ + "Heart_ResourceBar", + "UnitResourceBar", + "6", + "" + ] + }, + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetEmptyUnitColor" + }, + "parameters": [ + "Heart_ResourceBar", + "UnitResourceBar", + "\"74;144;226\"", + "" + ] + }, + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetHideEmptyUnits" + }, + "parameters": [ + "Heart_ResourceBar", + "UnitResourceBar", + "no", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Heart_ResourceBar" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "=", + "max(0,Variable(Unit)-1)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Right" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetCurrentUnits" + }, + "parameters": [ + "Heart_ResourceBar", + "UnitResourceBar", + "Variable(Units)", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::DrawUnitBar" + }, + "parameters": [ + "Heart_ResourceBar", + "UnitResourceBar", + "Heart_Unit", + "5", + "" + ] + } ] } - ] + ], + "parameters": [] } ], "layers": [ @@ -3377,6 +3495,10 @@ "name": "DrawResourceBar", "type": "DrawResourceBarOLD::DrawResourceBarOLD" }, + { + "name": "DrawResourceBar116", + "type": "ResourceBar::DrawResourceBar116" + }, { "name": "Health", "type": "Health::Health" @@ -3437,8 +3559,8 @@ "eventsBasedBehaviors": [ { "description": "Displays a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", - "fullName": "Solid resource bar", - "name": "SolidResourceBar", + "fullName": "Draw resource bar 222", + "name": "DrawResourceBar222", "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { @@ -3497,7 +3619,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyValue" + "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" }, "parameters": [ "Object", @@ -3508,73 +3630,13 @@ } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set track height function (which enforces valid thumb sizes)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTrackThickness" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyTrackThickness()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Start halo at same size as thumb", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::UpdateHitbox" + "value": "ResourceBar::DrawResourceBar222::UpdateHitbox" }, "parameters": [ "Object", @@ -3603,7 +3665,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar222", "type": "behavior" } ], @@ -3614,7 +3676,7 @@ "fullName": "", "functionType": "Action", "group": "", - "name": "doStepPreEvents", + "name": "doStepPostEvents", "private": false, "sentence": "", "events": [ @@ -3623,7 +3685,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Slider logic", + "name": "Slider drawing", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -3632,107 +3694,60 @@ "conditions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::IsEnabled" + "value": "ResourceBar::DrawResourceBar222::PropertyNeedRedraw" }, "parameters": [ "Object", - "Behavior", - "" + "Behavior" ] - } - ], - "actions": [], - "events": [ + }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "Visible" }, - "comment": "Track where the mouse is (in relation to object)", - "comment2": "" + "parameters": [ + "Object" + ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyMouseX" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyMouseY" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" - ] - } + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" ] - }, + } + ], + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" }, - "comment": "Move slider when being dragged", - "comment2": "" + "parameters": [ + "Object", + "Behavior", + "no" + ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOffset" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyMouseX()" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ], + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive Bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Comment", @@ -3744,7 +3759,7 @@ "textG": 0, "textR": 0 }, - "comment": "End sliding and update variables", + "comment": "Set inactive Bar parameters", "comment2": "" }, { @@ -3752,23 +3767,50 @@ "conditions": [ { "type": { - "value": "MouseButtonReleased" + "value": "ResourceBar::DrawResourceBar222::PropertyInactiveBarColor" }, "parameters": [ - "", - "Left" + "Object", + "Behavior", + "=", + "\"\"" ] } ], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" + "value": "PrimitiveDrawing::FillColor" }, "parameters": [ "Object", - "Behavior", - "no" + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveBarOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" ] } ] @@ -3783,7 +3825,7 @@ "textG": 0, "textR": 0 }, - "comment": "Update \"Value\" based on the location of the thumb", + "comment": "Draw inactive Bar", "comment2": "" }, { @@ -3792,13 +3834,14 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetValue" + "value": "PrimitiveDrawing::Rectangle" }, "parameters": [ "Object", - "Behavior", - "Object.Behavior::PropertyValueMin() + (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin()) * Object.Behavior::PropertyThumbOffset() / Object.Behavior::PropertyTrackLength()", - "" + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" ] } ] @@ -3813,56 +3856,51 @@ "textG": 0, "textR": 0 }, - "comment": "Grow halo even more when pressed", + "comment": "Draw half circle at end of Bar (inactive side)", "comment2": "" }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + "value": "PrimitiveDrawing::Arc" }, "parameters": [ "Object", - "Behavior", - "=", - "1.25 * Object.Behavior::PropertyHaloRadius()" + "Object.Behavior::PropertyBarLength()", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "270", + "90", + "", + "yes" ] } ] } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Detect hover/touch/click (but only if the layer and object is visible, and the object is not already being dragged)", - "comment2": "" + ], + "parameters": [] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [], + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active Bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Comment", @@ -3874,7 +3912,7 @@ "textG": 0, "textR": 0 }, - "comment": "Detect mouse clicks near track, start dragging", + "comment": "Set active Bar parameters (by default, use thumb color)", "comment2": "" }, { @@ -3882,116 +3920,67 @@ "conditions": [ { "type": { - "value": "SourisBouton" + "value": "ResourceBar::DrawResourceBar222::PropertyActiveBarColor" }, "parameters": [ - "", - "Left" + "Object", + "Behavior", + "=", + "\"\"" ] - }, + } + ], + "actions": [ { "type": { - "value": "BuiltinCommonInstructions::Once" + "value": "PrimitiveDrawing::FillColor" }, - "parameters": [] + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::PropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] } ], - "actions": [], - "events": [ + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseX()", - ">=", - "-Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseX()", - "<=", - "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseY()", - ">=", - "-Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseY()", - "<=", - "Object.Behavior::PropertyHaloRadius()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" ] } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset hover detection ", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyIsHovered" + "value": "PrimitiveDrawing::FillOpacity" }, "parameters": [ "Object", - "Behavior", - "no" + "=", + "Object.Behavior::PropertyActiveBarOpacity()" ] } ] @@ -4006,83 +3995,23 @@ "textG": 0, "textR": 0 }, - "comment": "Grow halo when hovered", + "comment": "Draw active Bar (2 pixels bigger than property) ", "comment2": "" }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "SourisBouton" - }, - "parameters": [ - "", - "Left" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseX()", - ">=", - "Object.Behavior::PropertyThumbOffset() - Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseX()", - "<=", - "Object.Behavior::PropertyThumbOffset() + Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseY()", - ">=", - "- Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseY()", - "<=", - "Object.Behavior::PropertyHaloRadius()" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyIsHovered" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + "value": "PrimitiveDrawing::Rectangle" }, "parameters": [ "Object", - "Behavior", - "=", - "Object.Behavior::PropertyHaloRadius()" + "0", + "-(Object.Behavior::PropertyBarThickness() / 2 + 1)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyBarThickness() / 2 + 1" ] } ] @@ -4097,7 +4026,7 @@ "textG": 0, "textR": 0 }, - "comment": "Shrink halo to zero when not hovered", + "comment": "Draw half circle at end of Bar (active side)", "comment2": "" }, { @@ -4105,8 +4034,7 @@ "conditions": [ { "type": { - "inverted": true, - "value": "ResourceBar::SolidResourceBar::PropertyIsHovered" + "value": "ResourceBar::DrawResourceBar222::PropertyRoundedBar" }, "parameters": [ "Object", @@ -4117,132 +4045,76 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" + "value": "PrimitiveDrawing::Arc" }, "parameters": [ "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + "0", + "0", + "1 + Object.Behavior::PropertyBarThickness() / 2", + "90", + "270", + "", + "yes" ] } ] } - ] + ], + "parameters": [] } ] - }, + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "The value of the slider (based on position of the thumb).", + "fullName": "Slider value", + "functionType": "Expression", + "group": "Slider", + "name": "Value", + "private": false, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "Object.Behavior::PropertyTargetHaloRadius()" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Redraw slider only when halo is not at final size", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "abs(Object.Behavior::PropertyCurrentHaloRadius() - Object.Behavior::PropertyTargetHaloRadius())", - "<", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyTargetHaloRadius()" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "Object.Behavior::PropertyTargetHaloRadius()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "lerp(Object.Behavior::PropertyCurrentHaloRadius(), Object.Behavior::PropertyTargetHaloRadius(), Object.Behavior::PropertyHaloGrowSpeed())" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValue()" ] } - ], - "parameters": [] + ] } ], "parameters": [ @@ -4263,740 +4135,1009 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar222", "type": "behavior" } ], "objectGroups": [] }, { - "description": "", - "fullName": "", + "description": "Change the value of a slider (this will move the thumb to the correct position).", + "fullName": "Slider value", "functionType": "Action", - "group": "", - "name": "doStepPostEvents", + "group": "Slider", + "name": "SetValue", "private": false, - "sentence": "", + "sentence": "Change the value of _PARAM0_: _PARAM2_", "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Slider drawing", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior" - ] - }, - { - "type": { - "value": "Visible" - }, - "parameters": [ - "Object" - ] - }, - { - "type": { - "value": "LayerVisible" - }, - "parameters": [ - "", - "Object.Layer()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Drawer::ClearShapes" - }, - "parameters": [ - "Object" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Inactive track", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set inactive track parameters (by default, use thumb color)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyInactiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyInactiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyInactiveTrackColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyInactiveTrackOpacity()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::OutlineOpacity" - }, - "parameters": [ - "Object", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw inactive track", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "-Object.Behavior::PropertyTrackThickness() / 2", - "Object.Behavior::PropertyTrackLength()", - "Object.Behavior::PropertyTrackThickness() / 2" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of track (inactive side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyRoundedTrack" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyTrackLength()", - "0", - "Object.Behavior::PropertyTrackThickness() / 2", - "270", - "90", - "", - "yes" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Active track", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set active track parameters (by default, use thumb color)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyActiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyActiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyActiveTrackColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyActiveTrackOpacity()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw active track (2 pixels bigger than property) ", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "0", - "-(Object.Behavior::PropertyTrackThickness() / 2 + 1)", - "Object.Behavior::PropertyThumbOffset()", - "Object.Behavior::PropertyTrackThickness() / 2 + 1" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of track (active side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyRoundedTrack" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "0", - "0", - "1 + Object.Behavior::PropertyTrackThickness() / 2", - "90", - "270", - "", - "yes" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Halo", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Prepare halo", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::OutlineOpacity" - }, - "parameters": [ - "Object", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw halo (it will grow or shrink as needed)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyHaloOpacityHover()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Circle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "0", - "Object.Behavior::PropertyCurrentHaloRadius()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Use a more opaque halo while being dragged (it will grow or shrink as needed)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyHaloOpacityClick()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Circle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "0", - "Object.Behavior::PropertyCurrentHaloRadius()" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Thumb", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Prepare thumb settings", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyThumbOpacity()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw Circle thumb", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"circle\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Circle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "0", - "ceil(max(Object.Behavior::PropertyThumbWidth(),Object.Behavior::PropertyThumbHeight())/2)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw Rectangle thumb", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"rectangle\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset() - (Object.Behavior::PropertyThumbWidth() / 2)", - "-Object.Behavior::PropertyThumbHeight() / 2", - "Object.Behavior::PropertyThumbOffset() + (Object.Behavior::PropertyThumbWidth() / 2)", - "Object.Behavior::PropertyThumbHeight() / 2" - ] - } - ] - } - ], - "parameters": [] - } + "type": { + "value": "ResourceBar::DrawResourceBar222::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyValueMin()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the proper offset (it moves the slider)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Slider value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMin", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMin()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMin", + "private": false, + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyValueMin" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMin\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Minimum value", + "longDescription": "", + "name": "ValueMin", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of Bar.", + "fullName": "Slider Bar thickness", + "functionType": "Expression", + "group": "Slider Bar configuration", + "name": "BarThickness", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Length of Bar.", + "fullName": "Slider Bar length", + "functionType": "Expression", + "group": "Slider Bar configuration", + "name": "BarLength", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarLength()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMax", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMax\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum value", + "longDescription": "", + "name": "ValueMax", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "The tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "TickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTickSpacing()" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetTickSpacing", + "private": false, + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"TickSpacing\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Tick spacing", + "longDescription": "", + "name": "TickSpacing", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change length of Bar.", + "fullName": "Bar length", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetBarLength", + "private": false, + "sentence": "Change Bar length of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyBarLength" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new Bar size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Bar width", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change thickness of Bar.", + "fullName": "Bar thickness", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetBarThickness", + "private": false, + "sentence": "Change Bar thickness of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyBarThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Bar thickness", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Make Bar use rounded ends.", + "fullName": "Rounded Bar ends", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetRoundedBar", + "private": false, + "sentence": "Draw _PARAM0_ with a rounded Bar: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rounded Bar", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change opacity of inactive Bar.", + "fullName": "Inactive Bar opacity", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetInactiveBarOpacity", + "private": false, + "sentence": "Change inactive Bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyInactiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" ] } - ], - "parameters": [] + ] } ], "parameters": [ @@ -5017,41 +5158,268 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar222", "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive Bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Check if the slider is being dragged.", - "fullName": "Being dragged", - "functionType": "Condition", - "group": "Slider", - "name": "IsBeingDragged", + "description": "Change opacity of active Bar.", + "fullName": "Active Bar opacity", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetActiveBarOpacity", "private": false, - "sentence": "_PARAM0_ is being dragged", + "sentence": "Change active Bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyActiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active Bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the Bar that is LEFT of the thumb.", + "fullName": "Active Bar color ", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetActiveBarColor", + "private": false, + "sentence": "Change active Bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active Bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the color of the Bar that is RIGHT of the thumb.", + "fullName": "Inactive Bar color", + "functionType": "Action", + "group": "Slider Bar configuration", + "name": "SetInactiveBarColor", + "private": false, + "sentence": "Change inactive Bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive Bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::PropertyIsBeingDragged" + "value": "PrimitiveDrawing::SetRotationCenter" }, "parameters": [ "Object", - "Behavior" + "Object.Behavior::PropertyBarLength() / 2", + "Object.Behavior::PropertyBarThickness() / 2" ] - } - ], - "actions": [ + }, { "type": { - "value": "SetReturnBoolean" + "value": "PrimitiveDrawing::SetRectangularCollisionMask" }, "parameters": [ - "True" + "Object", + "-Object.Behavior::PropertyThumbWidth() / 2", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyBarLength() + Object.Behavior::PropertyThumbWidth() / 2", + "Object.Behavior::PropertyThumbHeight() / 2" ] } ] @@ -5075,728 +5443,705 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar222", "type": "behavior" } ], "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "circle", + "type": "Choice", + "label": "Thumb shape", + "description": "", + "group": "Thumb", + "extraInformation": [ + "circle", + "rectangle" + ], + "hidden": false, + "name": "ThumbShape" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb width", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbWidth" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb height", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbHeight" + }, + { + "value": " 24;119;211", + "type": "Color", + "label": "Thumb Color", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbColor" + }, + { + "value": "255", + "type": "Number", + "label": "Thumb opacity", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbOpacity" + }, + { + "value": "200", + "type": "Number", + "label": "Bar length", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarLength" + }, + { + "value": "4", + "type": "Number", + "label": "Bar thickness", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarThickness" + }, + { + "value": "", + "type": "String", + "label": "Inactive Bar color (thumb color by default)", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive Bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarOpacity" + }, + { + "value": " ", + "type": "String", + "label": "Active Bar color (thumb color by default)", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active Bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarOpacity" + }, + { + "value": "24", + "type": "Number", + "label": "Halo size (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloRadius" + }, + { + "value": "32", + "type": "Number", + "label": "Halo opacity (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityHover" + }, + { + "value": "64", + "type": "Number", + "label": "Halo opacity (pressed)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityClick" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rounded Bar ends", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "RoundedBar" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable interactions", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Enabled" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsBeingDragged" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Value" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" }, { - "description": "Check if the slider interations are enabled.", - "fullName": "Interactions enabled", - "functionType": "Condition", - "group": "Slider", - "name": "IsEnabled", - "private": false, - "sentence": "Interactions of _PARAM0_ are enabled", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyEnabled" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsHovered" }, { - "description": "Enable or disable the slider. Users cannot interact while it is disabled.", - "fullName": "Enable interactions", - "functionType": "Action", - "group": "Slider", - "name": "SetEnabled", - "private": false, - "sentence": "Enable interactions of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Enable\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyEnabled" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Stop dragging (so the slider won't be dragging when it gets enabled)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset halo size (so halo won't appear when slider gets enabled)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTargetHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Enable\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyEnabled" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Enable", - "longDescription": "", - "name": "Enable", - "optional": false, - "supplementaryInformation": "", - "type": "yesorno" - } - ], - "objectGroups": [] + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentHaloRadius" }, { - "description": "The value of the slider (based on position of the thumb).", - "fullName": "Slider value", - "functionType": "Expression", - "group": "Slider", - "name": "Value", - "private": false, - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValue()" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] + "value": "0.2", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HaloGrowSpeed" }, { - "description": "Change the value of a slider (this will move the thumb to the correct position).", - "fullName": "Slider value", - "functionType": "Action", - "group": "Slider", - "name": "SetValue", - "private": false, - "sentence": "Change the value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyValueMin()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMin()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::PropertyValueMax()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMax()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set the proper offset (it moves the slider)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOffset" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyTrackLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Slider value", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetHaloRadius" + } + ] + }, + { + "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image used for resource bar and unit objects.", + "fullName": "Unit resource bar", + "name": "UnitResourceBar", + "objectType": "", + "eventsFunctions": [ { - "description": "The minimum value of a slider.", - "fullName": "Slider minimum value", - "functionType": "Expression", - "group": "Slider value configuration", - "name": "ValueMin", + "description": "Draw a unit resource bar.", + "fullName": "Draw a unit resource bar", + "functionType": "Action", + "group": "", + "name": "DrawUnitBar", "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "sentence": "Draw unit bar _PARAM0_ with _PARAM2_ objects", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create unit objects", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValueMin()" + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::PropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UnitObject", + "Object.X() + Object.Width() * Object.Behavior::PropertyNextUnitToCreate()", + "Object.Y()", + "Object.Layer()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "UnitObject", + "__ResourceBar.UnitID", + "=", + "Object.Behavior::PropertyNextUnitToCreate()" + ] + }, + { + "type": { + "value": "LinkedObjects::LinkObjects" + }, + "parameters": [ + "", + "Object", + "UnitObject" + ] + } + ] + } ] } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" + ], + "parameters": [] }, { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Change the minimum value of a slider.", - "fullName": "Slider minimum value", - "functionType": "Action", - "group": "Slider value configuration", - "name": "SetValueMin", - "private": false, - "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove excess units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyValueMin" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMin\")" - ] + "comment": "Delete all units higher than max unit value", + "comment2": "" }, { - "type": { - "value": "ResourceBar::SolidResourceBar::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()", + "!=", + "0" + ] + }, + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "UnitObject", + "" + ] + } ] } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" + ], + "parameters": [] }, { - "codeOnly": false, - "defaultValue": "", - "description": "Minimum value", - "longDescription": "", - "name": "ValueMin", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "The maximum value of a slider.", - "fullName": "Slider maximum value", - "functionType": "Expression", - "group": "Slider value configuration", - "name": "ValueMax", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update non-empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValueMax()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + "<=", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "UnitObject", + "" + ] + }, + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "\"255;255;255\"" + ] + } ] } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" + ], + "parameters": [] }, { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Thickness of track.", - "fullName": "Slider track thickness", - "functionType": "Expression", - "group": "Slider track configuration", - "name": "TrackThickness", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyTrackThickness()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Color tint", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only apply color if it has change from default value", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Object.Behavior::PropertyEmptyColorTint()", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "Object.Behavior::PropertyEmptyColorTint()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Hide", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::PropertyHideEmptyUnits" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "UnitObject" + ] + } + ] + } + ], + "parameters": [] + } ] } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" + ], + "parameters": [] }, { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Length of track.", - "fullName": "Slider track length", - "functionType": "Expression", - "group": "Slider track configuration", - "name": "TrackLength", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update counter", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyTrackLength()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "UnitObject", + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "PickedInstancesCount(UnitObject)+1" + ] + } ] } - ] + ], + "parameters": [] } ], "parameters": [ @@ -5807,7 +6152,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", + "supplementaryInformation": "", "type": "object" }, { @@ -5817,20 +6162,30 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::UnitResourceBar", "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object used to display each unit", + "longDescription": "", + "name": "UnitObject", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "objectList" } ], "objectGroups": [] }, { - "description": "Height of thumb.", - "fullName": "Slider thumb height", - "functionType": "Expression", - "group": "Slider thumb configuration", - "name": "ThumbHeight", + "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", + "fullName": "Color tint of empty units", + "functionType": "Action", + "group": "", + "name": "SetEmptyUnitColor", "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -5838,10 +6193,12 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResourceBar::UnitResourceBar::SetPropertyEmptyColorTint" }, "parameters": [ - "Object.Behavior::PropertyThumbHeight()" + "Object", + "Behavior", + "GetArgumentAsString(\"ColorTint\")" ] } ] @@ -5855,7 +6212,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", + "supplementaryInformation": "", "type": "object" }, { @@ -5865,45 +6222,78 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::UnitResourceBar", "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Color tint", + "longDescription": "Use \"white\" to remove all color tint", + "name": "ColorTint", + "optional": false, + "supplementaryInformation": "", + "type": "color" } ], "objectGroups": [] }, { - "description": "Change the maximum value of a slider.", - "fullName": "Slider maximum value", + "description": "Hide empty units. Empty units exist between the current and maximum value.", + "fullName": "Hide (or show) empty units", "functionType": "Action", - "group": "Slider value configuration", - "name": "SetValueMax", + "group": "", + "name": "SetHideEmptyUnits", "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "sentence": "Hide empty units of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"HideEmptyUnits\"" + ] + } + ], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyValueMax" + "value": "ResourceBar::UnitResourceBar::SetPropertyHideEmptyUnits" }, "parameters": [ "Object", "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMax\")" + "no" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"HideEmptyUnits\"" + ] + } + ], + "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetValue" + "value": "ResourceBar::UnitResourceBar::SetPropertyHideEmptyUnits" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::Value()", - "" + "yes" ] } ] @@ -5917,7 +6307,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", + "supplementaryInformation": "", "type": "object" }, { @@ -5927,30 +6317,30 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::UnitResourceBar", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Maximum value", + "description": "Hide empty units", "longDescription": "", - "name": "ValueMax", + "name": "HideEmptyUnits", "optional": false, "supplementaryInformation": "", - "type": "expression" + "type": "yesorno" } ], "objectGroups": [] }, { - "description": "The tick spacing of a slider.", - "fullName": "Tick spacing", - "functionType": "Expression", - "group": "Slider value configuration", - "name": "TickSpacing", + "description": "Change maximum units that can be displayed.", + "fullName": "Maximum units", + "functionType": "Action", + "group": "", + "name": "SetMaxUnits", "private": false, - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -5958,10 +6348,13 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResourceBar::UnitResourceBar::SetPropertyMaxQuantity" }, "parameters": [ - "Object.Behavior::PropertyTickSpacing()" + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -5975,7 +6368,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", + "supplementaryInformation": "", "type": "object" }, { @@ -5985,30 +6378,30 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::UnitResourceBar", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Tick spacing", + "description": "Maximum units", "longDescription": "", - "name": "TickSpacing", + "name": "Value", "optional": false, - "supplementaryInformation": "", + "supplementaryInformation": "Sprite", "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the tick spacing of a slider.", - "fullName": "Tick spacing", + "description": "Change the current quantity of units.", + "fullName": "Unit quantity", "functionType": "Action", - "group": "Slider value configuration", - "name": "SetTickSpacing", + "group": "", + "name": "SetCurrentUnits", "private": false, - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6016,24 +6409,13 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTickSpacing" + "value": "ResourceBar::UnitResourceBar::SetPropertyCurrentQuantity" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"TickSpacing\")" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -6047,7 +6429,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", + "supplementaryInformation": "", "type": "object" }, { @@ -6057,30 +6439,30 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::UnitResourceBar", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Tick spacing", + "description": "Current units", "longDescription": "", - "name": "TickSpacing", + "name": "Value", "optional": false, - "supplementaryInformation": "", + "supplementaryInformation": "Sprite", "type": "expression" } ], "objectGroups": [] }, { - "description": "Change length of track.", - "fullName": "Track length", + "description": "", + "fullName": "", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetTrackLength", + "group": "", + "name": "onCreated", "private": false, - "sentence": "Change track length of _PARAM0_ to _PARAM2_ px", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6088,63 +6470,13 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTrackLength" + "value": "ResourceBar::UnitResourceBar::SetPropertyCurrentQuantity" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move thumb to correct place (based on new track size)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyValue()", - "" + "Object.Behavior::PropertyStartingUnits()" ] } ] @@ -6158,7 +6490,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", + "supplementaryInformation": "", "type": "object" }, { @@ -6168,54 +6500,115 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::UnitResourceBar", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Track width", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" } ], "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Starting quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "StartingUnits" + }, + { + "value": "", + "type": "Number", + "label": "Quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "CurrentQuantity" }, { - "description": "Change thickness of track.", - "fullName": "Track thickness", + "value": "0", + "type": "Number", + "label": "Maximum quantity (Use \"0\" for unlimited)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "MaxQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NextUnitToCreate" + }, + { + "value": "", + "type": "Color", + "label": "Empty color tint", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyColorTint" + }, + { + "value": "true", + "type": "Boolean", + "label": "Hide empty units", + "description": "Empty units exist between the current and maximum value.", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "HideEmptyUnits" + } + ] + }, + { + "description": "Draw a resource bar that represents health, shield, or any value.", + "fullName": "Draw resource bar", + "name": "DrawResourceBar117", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "description": "", + "fullName": "", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetTrackThickness", + "group": "", + "name": "onCreated", "private": false, - "sentence": "Change track thickness of _PARAM0_ to _PARAM2_ px", + "sentence": "", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get re-drawn every frame", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyTrackThickness" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "PrimitiveDrawing::ClearBetweenFrames" }, "parameters": [ "Object", - "Behavior", - "yes" + "no" ] } ] @@ -6230,62 +6623,37 @@ "textG": 0, "textR": 0 }, - "comment": "Make sure thumb width is not smaller than track height + 2 pixels (to prevent track ends from showing)", + "comment": "Use correct min value (instead of always starting at 0)", "comment2": "" }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyTrackThickness() + 2" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetThumbWidth" + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::PropertyTrackThickness() + 2", - "" + "=", + "Object.Behavior::PropertyValueMin()" ] } ] }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::PropertyThumbHeight" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyTrackThickness() + 2" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetThumbHeight" + "value": "ResourceBar::DrawResourceBar117::UpdateHitbox" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::PropertyTrackThickness() + 2", "" ] } @@ -6310,86 +6678,408 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Track thickness", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change width of thumb.", - "fullName": "Thumb width", + "description": "", + "fullName": "", "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbWidth", + "group": "", + "name": "doStepPostEvents", "private": false, - "sentence": "Change thumb width of _PARAM0_ to _PARAM2_ px", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider drawing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set inactive Bar parameters (by default, use the active bar color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveBarOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive Bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of Bar (inactive side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength()", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "270", + "90", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active Bar parameters", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveBarOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "-(Object.Behavior::PropertyBarThickness() / 2)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of bar (active side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "0", + "0", + "Object.Behavior::PropertyBarThickness() / 2", + "90", + "270", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + } ] } - ] + ], + "parameters": [] } ], "parameters": [ @@ -6410,83 +7100,31 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Thumb width", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change height of thumb.", - "fullName": "Thumb height", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbHeight", + "description": "The value of the resource bar.", + "fullName": "Value", + "functionType": "Expression", + "group": "Bar", + "name": "Value", "private": false, - "sentence": "Change thumb height of _PARAM0_ to _PARAM2_ px", + "sentence": "", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyThumbHeight" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyValue()" ] } ] @@ -6510,38 +7148,40 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Thumb height", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change radius of the halo around the thumb. This size is also used to detect interaction with the slider.", - "fullName": "Halo radius", + "description": "Change the value of the resource bar.", + "fullName": "Value", "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetHaloRadius", + "group": "Resource Bar", + "name": "SetValue", "private": false, - "sentence": "Change halo radius of _PARAM0_ to _PARAM2_ px", + "sentence": "Change the value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyHaloRadius" + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" }, "parameters": [ "Object", @@ -6549,152 +7189,127 @@ "=", "GetArgumentAsNumber(\"Value\")" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar117::PropertyTickSpacing" }, "parameters": [ "Object", "Behavior", - "yes" + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" ] } ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Halo radius", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change the halo opacity when the thumb is hovered.", - "fullName": "Halo opacity (hover)", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetHaloOpacityHover", - "private": false, - "sentence": "Change the halo opacity when hovered of _PARAM0_ to _PARAM2_ px", - "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyHaloOpacityHover" + "value": "ResourceBar::DrawResourceBar117::PropertyValue" }, "parameters": [ "Object", "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "<", + "Object.Behavior::PropertyValueMin()" ] - }, + } + ], + "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" }, "parameters": [ "Object", "Behavior", - "yes" + "=", + "Object.Behavior::PropertyValueMin()" ] } ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" }, { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } + ] }, { - "codeOnly": false, - "defaultValue": "", - "description": "Halo opacity (hover)", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change opacity of halo when pressed.", - "fullName": "Halo opacity (pressed)", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetHaloOpacityPressed", - "private": false, - "sentence": "Change halo opacity when pressed of _PARAM0_ to _PARAM2_ px", - "events": [ + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the proper offset", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyHaloOpacityClick" + "value": "ResourceBar::DrawResourceBar117::SetPropertyThumbOffset" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" ] }, { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -6723,13 +7338,13 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Halo opacity (pressed)", + "description": "Resource bar value", "longDescription": "", "name": "Value", "optional": false, @@ -6740,13 +7355,13 @@ "objectGroups": [] }, { - "description": "Change shape of thumb (circle or rectangle).", - "fullName": "Thumb shape", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbShape", + "description": "The minimum value of the resource bar.", + "fullName": "Minimum value", + "functionType": "Expression", + "group": "Value configuration", + "name": "ValueMin", "private": false, - "sentence": "Change shape of _PARAM0_ to _PARAM2_", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6754,75 +7369,71 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyThumbShape" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Shape\")" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyValueMin()" ] } ] - }, + } + ], + "parameters": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure thumb width is not smaller than track height (to prevent track ends from showing)", - "comment2": "" + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of the resource bar.", + "fullName": "Minimum value", + "functionType": "Action", + "group": "Value configuration", + "name": "SetValueMin", + "private": false, + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::PropertyThumbShape" + "value": "ResourceBar::DrawResourceBar117::SetPropertyValueMin" }, "parameters": [ "Object", "Behavior", "=", - "\"rectangle\"" + "GetArgumentAsNumber(\"ValueMin\")" ] }, { "type": { - "value": "ResourceBar::SolidResourceBar::PropertyThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyTrackThickness()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetThumbWidth" + "value": "ResourceBar::DrawResourceBar117::SetValue" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::PropertyTrackThickness()", + "Object.Behavior::Value()", "" ] } @@ -6847,97 +7458,89 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "New thumb shape", + "description": "Minimum value", "longDescription": "", - "name": "Shape", + "name": "ValueMin", "optional": false, - "supplementaryInformation": "[\"circle\",\"rectangle\"]", - "type": "stringWithSelector" + "supplementaryInformation": "", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Make track use rounded ends.", - "fullName": "Rounded track ends", - "functionType": "Action", - "group": "Slider track configuration", - "name": "SetRoundedTrack", + "description": "The maximum value of the resource bar.", + "fullName": "Maximum value", + "functionType": "Expression", + "group": "Value configuration", + "name": "ValueMax", "private": false, - "sentence": "Draw _PARAM0_ with a rounded track: _PARAM2_", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "0" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyRoundedTrack" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "no" + "Object.Behavior::PropertyValueMax()" ] } ] - }, + } + ], + "parameters": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyRoundedTrack" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of the resource bar.", + "fullName": "Bar thickness", + "functionType": "Expression", + "group": "Bar configuration", + "name": "BarThickness", + "private": false, + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyBarThickness()" ] } ] @@ -6961,30 +7564,20 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Rounded track", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "yesorno" } ], "objectGroups": [] }, { - "description": "Change opacity of thumb.", - "fullName": "Thumb opacity", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbOpacity", + "description": "Length of the resource bar.", + "fullName": "Bar length", + "functionType": "Expression", + "group": "Bar configuration", + "name": "BarLength", "private": false, - "sentence": "Change thumb opacity of _PARAM0_ to _PARAM2_", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6992,23 +7585,10 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyThumbOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyBarLength()" ] } ] @@ -7032,30 +7612,20 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Thumb opacity", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change opacity of inactive track.", - "fullName": "Inactive track opacity", + "description": "Change the maximum value of a resource bar.", + "fullName": "Maximum value", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetInactiveTrackOpacity", + "group": "Bar value configuration", + "name": "SetValueMax", "private": false, - "sentence": "Change inactive track opacity of _PARAM0_ to _PARAM2_", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -7063,23 +7633,24 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyInactiveTrackOpacity" + "value": "ResourceBar::DrawResourceBar117::SetPropertyValueMax" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "GetArgumentAsNumber(\"ValueMax\")" ] }, { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar117::SetValue" }, "parameters": [ "Object", "Behavior", - "yes" + "Object.Behavior::Value()", + "" ] } ] @@ -7103,15 +7674,15 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Inactive track opacity", + "description": "Maximum value", "longDescription": "", - "name": "Value", + "name": "ValueMax", "optional": false, "supplementaryInformation": "", "type": "expression" @@ -7120,13 +7691,13 @@ "objectGroups": [] }, { - "description": "Change opacity of active track.", - "fullName": "Active track opacity", - "functionType": "Action", - "group": "Slider track configuration", - "name": "SetActiveTrackOpacity", + "description": "The tick spacing of a bar.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Value configuration", + "name": "TickSpacing", "private": false, - "sentence": "Change active track opacity of _PARAM0_ to _PARAM2_", + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -7134,23 +7705,10 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyActiveTrackOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyTickSpacing()" ] } ] @@ -7174,15 +7732,15 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Active track opacity", + "description": "Tick spacing", "longDescription": "", - "name": "Value", + "name": "TickSpacing", "optional": false, "supplementaryInformation": "", "type": "expression" @@ -7191,13 +7749,13 @@ "objectGroups": [] }, { - "description": "Change the color of the track that is LEFT of the thumb.", - "fullName": "Active track color ", + "description": "Change the tick spacing of a resource bar.", + "fullName": "Tick spacing", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetActiveTrackColor", + "group": "Value configuration", + "name": "SetTickSpacing", "private": false, - "sentence": "Change active track color of _PARAM0_ to _PARAM2_", + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -7205,23 +7763,24 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyActiveTrackColor" + "value": "ResourceBar::DrawResourceBar117::SetPropertyTickSpacing" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsString(\"Color\")" + "GetArgumentAsNumber(\"TickSpacing\")" ] }, { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar117::SetValue" }, "parameters": [ "Object", "Behavior", - "yes" + "Object.Behavior::Value()", + "" ] } ] @@ -7245,30 +7804,30 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Active track color", + "description": "Tick spacing", "longDescription": "", - "name": "Color", + "name": "TickSpacing", "optional": false, "supplementaryInformation": "", - "type": "color" + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the color of the track that is RIGHT of the thumb.", - "fullName": "Inactive track color", + "description": "Change length of a resource bar.", + "fullName": "Bar length", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetInactiveTrackColor", + "group": "Bar configuration", + "name": "SetBarLength", "private": false, - "sentence": "Change inactive track color of _PARAM0_ to _PARAM2_", + "sentence": "Change bar length of _PARAM0_ to _PARAM2_ px", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -7276,18 +7835,28 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyInactiveTrackColor" + "value": "ResourceBar::DrawResourceBar117::SetPropertyBarLength" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsString(\"Color\")" + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" ] }, { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -7296,6 +7865,36 @@ ] } ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new Bar size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] } ], "parameters": [ @@ -7316,30 +7915,30 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Inactive track color", + "description": "Bar width", "longDescription": "", - "name": "Color", + "name": "Value", "optional": false, "supplementaryInformation": "", - "type": "color" + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the thumb color to a specific value.", - "fullName": "Thumb color", + "description": "Change thickness of a resource bar", + "fullName": "Bar thickness", "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbColor", + "group": "Bar configuration", + "name": "SetBarThickness", "private": false, - "sentence": "Change thumb color of _PARAM0_ to _PARAM2_", + "sentence": "Change the bar thickness of _PARAM0_ to _PARAM2_ px", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -7347,17 +7946,18 @@ "actions": [ { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyThumbColor" + "value": "ResourceBar::DrawResourceBar117::SetPropertyBarThickness" }, "parameters": [ "Object", "Behavior", - "GetArgumentAsString(\"Color\")" + "=", + "GetArgumentAsNumber(\"Value\")" ] }, { "type": { - "value": "ResourceBar::SolidResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -7366,6 +7966,77 @@ ] } ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than Bar height + 2 pixels (to prevent Bar ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::PropertyThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyBarThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyBarThickness() + 2", + "" + ] + } + ] } ], "parameters": [ @@ -7386,55 +8057,97 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Thumb color", + "description": "Bar thickness", "longDescription": "", - "name": "Color", + "name": "Value", "optional": false, "supplementaryInformation": "", - "type": "color" + "type": "expression" } ], "objectGroups": [] }, { - "description": "Update the hitbox.", - "fullName": "Update hitbox", + "description": "Make bar use rounded ends.", + "fullName": "Rounded bar ends", "functionType": "Action", - "group": "Private", - "name": "UpdateHitbox", - "private": true, - "sentence": "Update the hitbox of _PARAM0_", + "group": "Bar configuration", + "name": "SetRoundedBar", + "private": false, + "sentence": "Draw _PARAM0_ with a rounded bar: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], "actions": [ { "type": { - "value": "PrimitiveDrawing::SetRotationCenter" + "value": "ResourceBar::DrawResourceBar117::SetPropertyRoundedBar" }, "parameters": [ "Object", - "Object.Behavior::PropertyTrackLength() / 2", - "Object.Behavior::PropertyTrackThickness() / 2" + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyRoundedBar" + }, + "parameters": [ + "Object", + "Behavior", + "yes" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { "type": { - "value": "PrimitiveDrawing::SetRectangularCollisionMask" + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" }, "parameters": [ "Object", - "-Object.Behavior::PropertyThumbWidth() / 2", - "-Object.Behavior::PropertyThumbHeight() / 2", - "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyThumbWidth() / 2", - "Object.Behavior::PropertyThumbHeight() / 2" + "Behavior", + "yes" ] } ] @@ -7457,669 +8170,608 @@ "description": "Behavior", "longDescription": "", "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::SolidResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "0", - "type": "Number", - "label": "Minimum value", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMin" - }, - { - "value": "1", - "type": "Number", - "label": "Maximum value", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMax" - }, - { - "value": "0", - "type": "Number", - "label": "Tick spacing", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "TickSpacing" - }, - { - "value": "circle", - "type": "Choice", - "label": "Thumb shape", - "description": "", - "group": "Thumb", - "extraInformation": [ - "circle", - "rectangle" - ], - "hidden": false, - "name": "ThumbShape" - }, - { - "value": "20", - "type": "Number", - "label": "Thumb width", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbWidth" - }, - { - "value": "20", - "type": "Number", - "label": "Thumb height", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbHeight" - }, - { - "value": " 24;119;211", - "type": "Color", - "label": "Thumb Color", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbColor" - }, - { - "value": "255", - "type": "Number", - "label": "Thumb opacity", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbOpacity" - }, - { - "value": "200", - "type": "Number", - "label": "Track length", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "TrackLength" - }, - { - "value": "4", - "type": "Number", - "label": "Track thickness", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "TrackThickness" - }, - { - "value": "", - "type": "String", - "label": "Inactive track color (thumb color by default)", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "InactiveTrackColor" - }, - { - "value": "96", - "type": "Number", - "label": "Inactive track opacity", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "InactiveTrackOpacity" - }, - { - "value": " ", - "type": "String", - "label": "Active track color (thumb color by default)", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "ActiveTrackColor" - }, - { - "value": "255", - "type": "Number", - "label": "Active track opacity", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "ActiveTrackOpacity" - }, - { - "value": "24", - "type": "Number", - "label": "Halo size (hover)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloRadius" - }, - { - "value": "32", - "type": "Number", - "label": "Halo opacity (hover)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloOpacityHover" - }, - { - "value": "64", - "type": "Number", - "label": "Halo opacity (pressed)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloOpacityClick" - }, - { - "value": "true", - "type": "Boolean", - "label": "Rounded track ends", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "RoundedTrack" - }, - { - "value": "true", - "type": "Boolean", - "label": "Enable interactions", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "Enabled" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "IsBeingDragged" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "Value" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ThumbOffset" - }, - { - "value": "true", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "NeedRedraw" + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Rounded bar", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "yesorno" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "IsHovered" + "description": "Change opacity of inactive bar.", + "fullName": "Inactive bar opacity", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetInactiveBarOpacity", + "private": false, + "sentence": "Change inactive bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyInactiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "MouseX" + "description": "Change opacity of active bar.", + "fullName": "Active bar opacity", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetActiveBarOpacity", + "private": false, + "sentence": "Change active bar opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyActiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active bar opacity", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "MouseY" + "description": "Change the color of the left side of the bar.", + "fullName": "Active bar color ", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetActiveBarColor", + "private": false, + "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Active bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "CurrentHaloRadius" + "description": "Change the color of the right side of the resource bar.", + "fullName": "Inactive bar color", + "functionType": "Action", + "group": "Bar configuration", + "name": "SetInactiveBarColor", + "private": false, + "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Inactive bar color", + "longDescription": "", + "name": "Color", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] }, { - "value": "0.2", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "HaloGrowSpeed" + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::SetRotationCenter" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength() / 2", + "Object.Behavior::PropertyBarThickness() / 2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::SetRectangularCollisionMask" + }, + "parameters": [ + "Object", + "0", + "-Object.Behavior::PropertyBarThickness() / 2", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness() / 2" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "TargetHaloRadius" - } - ] - }, - { - "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc)", - "fullName": "Unit resource bar", - "name": "UnitResourceBar", - "objectType": "", - "eventsFunctions": [ - { - "description": "Display unit resource bar.", - "fullName": "Display unit resource bar", + "description": "Draw health bar.", + "fullName": "Draw health bar", "functionType": "Action", "group": "", - "name": "DisplayUnitResourceBar", + "name": "DrawHealthBar", "private": false, - "sentence": "Display _PARAM3_ units of _PARAM2_ located at _PARAM0_", + "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Create unit objects (if needed)", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" }, - "comment": "Create first object (required because \"take into account\" is false when count is 0)", - "comment2": "" + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", + "" + ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Not" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "LinkedObjects::PickObjectsLinkedTo" - }, - "parameters": [ - "", - "UnitObject", - "Object", - "" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "UnitObject", - "Object.X()", - "Object.Y()", - "Object.Layer()" - ] - }, - { - "type": { - "value": "LinkedObjects::LinkObjects" - }, - "parameters": [ - "", - "Object", - "UnitObject" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "UnitObject", - "__ResourceBar.UnitID", - "=", - "1" - ] - } + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithHealth.HealthBehavior::MaxHealth()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with health", + "longDescription": "", + "name": "ObjectWithHealth", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Health behavior", + "longDescription": "", + "name": "HealthBehavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw shield bar.", + "fullName": "Draw shield bar", + "functionType": "Action", + "group": "", + "name": "DrawShieldBar", + "private": false, + "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", + "" ] }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValueMax" }, - "comment": "Create more objects as needed", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "LinkedObjects::PickObjectsLinkedTo" - }, - "parameters": [ - "", - "UnitObject", - "Object", - "" - ] - }, - { - "type": { - "value": "PickedInstancesCount" - }, - "parameters": [ - "UnitObject", - "<", - "GetArgumentAsNumber(\"Units\")" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "PickedInstancesCount(UnitObject) + 1" - ] - } - ], - "events": [ - { - "infiniteLoopWarning": true, - "type": "BuiltinCommonInstructions::While", - "whileConditions": [ - { - "type": { - "value": "ResourceBar::UnitResourceBar::PropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "GetArgumentAsNumber(\"Units\")" - ] - } - ], - "conditions": [], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "UnitObject", - "Object.X()", - "Object.Y()", - "Object.Layer()" - ] - }, - { - "type": { - "value": "LinkedObjects::LinkObjects" - }, - "parameters": [ - "", - "Object", - "UnitObject" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "UnitObject", - "__ResourceBar.UnitID", - "=", - "Object.Behavior::PropertyNextUnitToCreate()" - ] - }, - { - "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "1" - ] - } - ] - } - ] - } + "parameters": [ + "Object", + "DraggableSliderBehavior", + "ObjectWithShield.ShieldBehavior::MaxShield()", + "" ] } - ], - "parameters": [] + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "disabled": true, - "name": "Update position of units", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "LinkedObjects::PickObjectsLinkedTo" - }, - "parameters": [ - "", - "UnitObject", - "Object", - "" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::ForEach", - "object": "UnitObject", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetCenter" - }, - "parameters": [ - "UnitObject", - "=", - "Object.CenterX() + (Object.Behavior::PropertyUnitSpacing() + UnitObject.Width()) * (UnitObject.Variable(__ResourceBar.UnitID) - 1)", - "=", - "Object.CenterY()" - ] - } - ] - } - ] - } - ], - "parameters": [] + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar117", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with shield", + "longDescription": "", + "name": "ObjectWithShield", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield behavior", + "longDescription": "", + "name": "ShieldBehavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw resource bar.", + "fullName": "Draw resource bar", + "functionType": "Action", + "group": "", + "name": "DrawResourceBar", + "private": false, + "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "disabled": true, - "name": "Update unit visibility", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "LinkedObjects::PickObjectsLinkedTo" - }, - "parameters": [ - "", - "UnitObject", - "Object", - "" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "UnitObject", - "__ResourceBar.UnitID", - ">", - "GetArgumentAsNumber(\"Units\")" - ] - } - ], - "actions": [ - { - "type": { - "value": "Cache" - }, - "parameters": [ - "UnitObject" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "UnitObject", - "__ResourceBar.UnitID", - "<=", - "GetArgumentAsNumber(\"Units\")" - ] - } - ], - "actions": [ - { - "type": { - "value": "Montre" - }, - "parameters": [ - "UnitObject", - "" - ] - } - ] - } + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValue" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar117::SetValueMax" + }, + "parameters": [ + "Object", + "DraggableSliderBehavior", + "GetArgumentAsNumber(\"MaxValue\")", + "" ] } - ], - "parameters": [] + ] } ], "parameters": [ @@ -8130,7 +8782,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "", + "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { @@ -8140,27 +8792,27 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::UnitResourceBar", + "supplementaryInformation": "ResourceBar::DrawResourceBar117", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Object used to display each unit", + "description": "Current value", "longDescription": "", - "name": "UnitObject", + "name": "CurrentValue", "optional": false, "supplementaryInformation": "", - "type": "objectList" + "type": "expression" }, { "codeOnly": false, "defaultValue": "", - "description": "Units", + "description": "Max value", "longDescription": "", - "name": "Units", + "name": "MaxValue", "optional": false, - "supplementaryInformation": "", + "supplementaryInformation": "Health::Health", "type": "expression" } ], @@ -8171,56 +8823,147 @@ { "value": "0", "type": "Number", - "label": "Starting units", + "label": "Minimum value", "description": "", - "group": "", + "group": "Value", "extraInformation": [], "hidden": false, - "name": "StartingUnits" + "name": "ValueMin" }, { - "value": "", + "value": "1", "type": "Number", - "label": "", + "label": "Maximum value", "description": "", - "group": "", + "group": "Value", "extraInformation": [], "hidden": false, - "name": "CurrentUnits" + "name": "ValueMax" }, { "value": "0", "type": "Number", - "label": "Maximum units (Use \"0\" for unlimited)", + "label": "Tick spacing", "description": "", - "group": "", + "group": "Value", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "200", + "type": "Number", + "label": "Bar length", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarLength" + }, + { + "value": "4", + "type": "Number", + "label": "Bar thickness", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarThickness" + }, + { + "value": "11;255;0", + "type": "Color", + "label": "Inactive bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarOpacity" + }, + { + "value": "11;255;0", + "type": "Color", + "label": "Active bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarOpacity" + }, + { + "value": "false", + "type": "Boolean", + "label": "Rounded bar ends", + "description": "", + "group": "Bar", "extraInformation": [], "hidden": false, - "name": "MaxUnits" + "name": "RoundedBar" }, { "value": "0", "type": "Number", - "label": "Space between each unit (pixels)", + "label": "", "description": "", "group": "", "extraInformation": [], - "hidden": false, - "name": "UnitSpacing" + "hidden": true, + "name": "Value" }, { - "value": "", + "value": "0", "type": "Number", "label": "", "description": "", "group": "", "extraInformation": [], "hidden": true, - "name": "NextUnitToCreate" + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" + }, + { + "value": "0", + "type": "Number", + "label": "Time to complete moving the bar when the value is changed (seconds)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ChangeDuration" } ] } - ] + ], + "eventsBasedObjects": [] }, { "author": "@Bouh, D8H", @@ -9586,7 +10329,8 @@ "objectGroups": [] } ], - "eventsBasedBehaviors": [] + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] }, { "author": "D8H", @@ -9945,7 +10689,8 @@ } ] } - ] + ], + "eventsBasedObjects": [] }, { "author": "Tristan Rhodes (https://victrisgames.itch.io/)", @@ -14560,7 +15305,8 @@ ], "propertyDescriptors": [] } - ] + ], + "eventsBasedObjects": [] }, { "author": "VegeTato, arthuro555", @@ -15187,7 +15933,8 @@ } ] } - ] + ], + "eventsBasedObjects": [] }, { "author": "@4ian", @@ -19021,7 +19768,8 @@ } ] } - ] + ], + "eventsBasedObjects": [] }, { "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", @@ -21446,7 +22194,8 @@ } ] } - ] + ], + "eventsBasedObjects": [] }, { "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", @@ -25804,7 +26553,8 @@ } ] } - ] + ], + "eventsBasedObjects": [] }, { "author": "", @@ -26250,7 +27000,8 @@ } ] } - ] + ], + "eventsBasedObjects": [] } ], "externalLayouts": [], From 0f8aaa3fb396d7590659beb8e6b3e19139913e87 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 6 Nov 2022 19:20:45 -0700 Subject: [PATCH 06/24] Basic shape painter version working --- examples/resource-bar/game.json | 2928 +++++-------------------------- 1 file changed, 436 insertions(+), 2492 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 567b8bc8a..f23d19179 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1356,22 +1356,37 @@ "effects": [], "behaviors": [ { - "name": "DrawResourceBar116", - "type": "ResourceBar::DrawResourceBar116", + "name": "DrawResourceBar222", + "type": "ResourceBar::DrawResourceBar222", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, + "ThumbShape": "circle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": " 24;119;211", + "ThumbOpacity": 255, "BarLength": 200, "BarThickness": 4, - "InactiveBarColor": "11;255;0", + "InactiveBarColor": "", "InactiveBarOpacity": 96, - "ActiveBarColor": "11;255;0", + "ActiveBarColor": " ", "ActiveBarOpacity": 255, - "RoundedBar": false, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedBar": true, + "Enabled": true, + "IsBeingDragged": false, "Value": 0, "ThumbOffset": 0, "NeedRedraw": true, - "ChangeDuration": 0 + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0.19999992847442627 } ], "fillOpacity": 255, @@ -1467,26 +1482,26 @@ "effects": [], "behaviors": [ { - "name": "DraggableSliderControl", - "type": "DraggableSliderControl::DraggableSliderControl", + "name": "DrawResourceBar222", + "type": "ResourceBar::DrawResourceBar222", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, - "ThumbShape": "rectangle", + "ThumbShape": "circle", "ThumbWidth": 20, "ThumbHeight": 20, - "ThumbColor": "144;19;254", + "ThumbColor": " 24;119;211", "ThumbOpacity": 255, - "TrackLength": 200, - "TrackThickness": 16, - "InactiveTrackColor": "", - "InactiveTrackOpacity": 96, - "ActiveTrackColor": " ", - "ActiveTrackOpacity": 255, + "BarLength": 200, + "BarThickness": 4, + "InactiveBarColor": "144;19;254", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 144;19;254", + "ActiveBarOpacity": 255, "HaloRadius": 24, "HaloOpacityHover": 32, "HaloOpacityClick": 64, - "RoundedTrack": false, + "RoundedBar": true, "Enabled": true, "IsBeingDragged": false, "Value": 0, @@ -1497,12 +1512,7 @@ "MouseY": 0, "CurrentHaloRadius": 0, "HaloGrowSpeed": 0.2, - "TargetHaloRadius": 0 - }, - { - "name": "DrawResourceBar", - "type": "DrawResourceBarOLD::DrawResourceBarOLD", - "DraggableSliderBehavior": "DraggableSliderControl" + "TargetHaloRadius": 0.19999992847442627 } ], "fillOpacity": 255, @@ -1530,8 +1540,8 @@ "effects": [], "behaviors": [ { - "name": "DraggableSliderControl", - "type": "DraggableSliderControl::DraggableSliderControl", + "name": "DrawResourceBar222", + "type": "ResourceBar::DrawResourceBar222", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -1540,16 +1550,16 @@ "ThumbHeight": 20, "ThumbColor": "248;231;28", "ThumbOpacity": 255, - "TrackLength": 200, - "TrackThickness": 16, - "InactiveTrackColor": "", - "InactiveTrackOpacity": 96, - "ActiveTrackColor": " ", - "ActiveTrackOpacity": 255, + "BarLength": 200, + "BarThickness": 4, + "InactiveBarColor": "", + "InactiveBarOpacity": 96, + "ActiveBarColor": " ", + "ActiveBarOpacity": 255, "HaloRadius": 24, "HaloOpacityHover": 32, "HaloOpacityClick": 64, - "RoundedTrack": true, + "RoundedBar": true, "Enabled": true, "IsBeingDragged": false, "Value": 0, @@ -1560,12 +1570,7 @@ "MouseY": 0, "CurrentHaloRadius": 0, "HaloGrowSpeed": 0.2, - "TargetHaloRadius": 0 - }, - { - "name": "DrawResourceBar", - "type": "DrawResourceBarOLD::DrawResourceBarOLD", - "DraggableSliderBehavior": "DraggableSliderControl" + "TargetHaloRadius": 0.19999992847442627 } ], "fillOpacity": 255, @@ -2818,47 +2823,87 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar116::DrawHealthBar" + "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawHealthBar" }, "parameters": [ - "Health_Bar", - "DrawResourceBar116", + "MiniHealth_Bar", + "DrawResourceBar", "Fly", "Health", "" ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Health_Bar", + "DrawResourceBar222", + "Fly.Health::Health()", + "" + ] }, { "type": { - "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawHealthBar" + "value": "ResourceBar::DrawResourceBar222::SetValueMin" }, "parameters": [ - "MiniHealth_Bar", - "DrawResourceBar", - "Fly", - "Health", + "Health_Bar", + "DrawResourceBar222", + "0", "" ] }, { "type": { - "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawShieldBar" + "value": "ResourceBar::DrawResourceBar222::SetValueMax" + }, + "parameters": [ + "Health_Bar", + "DrawResourceBar222", + "Fly.Health::MaxHealth()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::DrawShieldBar" }, "parameters": [ "Shield_Bar", - "DrawResourceBar", + "DrawResourceBar222", "Fly", "Shield", "" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { "type": { - "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawResourceBar" + "value": "ResourceBar::DrawResourceBar222::DrawResourceBar" }, "parameters": [ "ResourceMouseX_Bar", - "DrawResourceBar", + "DrawResourceBar222", "Variable(MyResource)", "Variable(MaxResource)", "" @@ -2866,6 +2911,24 @@ } ] }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::DrawHealthBar" + }, + "parameters": [ + "Health_Bar", + "DrawResourceBar222", + "Fly", + "Health", + "" + ] + } + ] + }, { "type": "BuiltinCommonInstructions::Comment", "color": { @@ -3496,8 +3559,8 @@ "type": "DrawResourceBarOLD::DrawResourceBarOLD" }, { - "name": "DrawResourceBar116", - "type": "ResourceBar::DrawResourceBar116" + "name": "DrawResourceBar222", + "type": "ResourceBar::DrawResourceBar222" }, { "name": "Health", @@ -3582,7 +3645,7 @@ "textG": 0, "textR": 0 }, - "comment": "Make sure object doesn't get re-drawn every frame", + "comment": "Make sure object doesn't get redrawn every frame", "comment2": "" }, { @@ -3764,19 +3827,7 @@ }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyInactiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], + "conditions": [], "actions": [ { "type": { @@ -3784,7 +3835,7 @@ }, "parameters": [ "Object", - "Object.Behavior::PropertyThumbColor()" + "Object.Behavior::PropertyInactiveBarColor()" ] } ] @@ -5448,40 +5499,325 @@ } ], "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "0", - "type": "Number", - "label": "Minimum value", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMin" }, { - "value": "1", - "type": "Number", - "label": "Maximum value", - "description": "", + "description": "Draw health bar.", + "fullName": "Draw health bar", + "functionType": "Action", "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMax" + "name": "DrawHealthBar", + "private": false, + "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithHealth.HealthBehavior::MaxHealth()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with health", + "longDescription": "", + "name": "ObjectWithHealth", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Health behavior", + "longDescription": "", + "name": "HealthBehavior", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "value": "0", - "type": "Number", - "label": "Tick spacing", - "description": "", + "description": "Draw shield bar.", + "fullName": "Draw shield bar", + "functionType": "Action", "group": "", - "extraInformation": [], - "hidden": false, - "name": "TickSpacing" - }, - { + "name": "DrawShieldBar", + "private": false, + "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithShield.ShieldBehavior::MaxShield()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object with shield", + "longDescription": "", + "name": "ObjectWithShield", + "optional": false, + "supplementaryInformation": "", + "type": "objectList" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Shield behavior", + "longDescription": "", + "name": "ShieldBehavior", + "optional": false, + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw resource bar.", + "fullName": "Draw resource bar", + "functionType": "Action", + "group": "", + "name": "DrawResourceBar", + "private": false, + "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::DrawResourceBar222::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"MaxValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Current value", + "longDescription": "", + "name": "CurrentValue", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Max value", + "longDescription": "", + "name": "MaxValue", + "optional": false, + "supplementaryInformation": "Health::Health", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { "value": "circle", "type": "Choice", "label": "Thumb shape", @@ -5555,9 +5891,9 @@ "name": "BarThickness" }, { - "value": "", + "value": "11;255;0", "type": "String", - "label": "Inactive Bar color (thumb color by default)", + "label": "Inactive Bar color", "description": "", "group": "Bar", "extraInformation": [], @@ -5575,9 +5911,9 @@ "name": "InactiveBarOpacity" }, { - "value": " ", + "value": " 11;255;0", "type": "String", - "label": "Active Bar color (thumb color by default)", + "label": "Active Bar color", "description": "", "group": "Bar", "extraInformation": [], @@ -6569,2398 +6905,6 @@ "name": "HideEmptyUnits" } ] - }, - { - "description": "Draw a resource bar that represents health, shield, or any value.", - "fullName": "Draw resource bar", - "name": "DrawResourceBar117", - "objectType": "PrimitiveDrawing::Drawer", - "eventsFunctions": [ - { - "description": "", - "fullName": "", - "functionType": "Action", - "group": "", - "name": "onCreated", - "private": false, - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure object doesn't get re-drawn every frame", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::ClearBetweenFrames" - }, - "parameters": [ - "Object", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Use correct min value (instead of always starting at 0)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMin()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "", - "fullName": "", - "functionType": "Action", - "group": "", - "name": "doStepPostEvents", - "private": false, - "sentence": "", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Slider drawing", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::PropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior" - ] - }, - { - "type": { - "value": "Visible" - }, - "parameters": [ - "Object" - ] - }, - { - "type": { - "value": "LayerVisible" - }, - "parameters": [ - "", - "Object.Layer()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Drawer::ClearShapes" - }, - "parameters": [ - "Object" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Inactive bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set inactive Bar parameters (by default, use the active bar color)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyActiveBarColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyInactiveBarColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyInactiveBarOpacity()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::OutlineOpacity" - }, - "parameters": [ - "Object", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw inactive Bar", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "-Object.Behavior::PropertyBarThickness() / 2", - "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness() / 2" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of Bar (inactive side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyBarLength()", - "0", - "Object.Behavior::PropertyBarThickness() / 2", - "270", - "90", - "", - "yes" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Active bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set active Bar parameters", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyActiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyActiveBarColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyActiveBarOpacity()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw active bar", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "0", - "-(Object.Behavior::PropertyBarThickness() / 2)", - "Object.Behavior::PropertyThumbOffset()", - "Object.Behavior::PropertyBarThickness() / 2" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of bar (active side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "0", - "0", - "Object.Behavior::PropertyBarThickness() / 2", - "90", - "270", - "", - "yes" - ] - } - ] - } - ], - "parameters": [] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "The value of the resource bar.", - "fullName": "Value", - "functionType": "Expression", - "group": "Bar", - "name": "Value", - "private": false, - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValue()" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Change the value of the resource bar.", - "fullName": "Value", - "functionType": "Action", - "group": "Resource Bar", - "name": "SetValue", - "private": false, - "sentence": "Change the value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyValueMin()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMin()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::PropertyValueMax()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMax()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set the proper offset", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyThumbOffset" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Resource bar value", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "The minimum value of the resource bar.", - "fullName": "Minimum value", - "functionType": "Expression", - "group": "Value configuration", - "name": "ValueMin", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValueMin()" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Change the minimum value of the resource bar.", - "fullName": "Minimum value", - "functionType": "Action", - "group": "Value configuration", - "name": "SetValueMin", - "private": false, - "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyValueMin" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMin\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Minimum value", - "longDescription": "", - "name": "ValueMin", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "The maximum value of the resource bar.", - "fullName": "Maximum value", - "functionType": "Expression", - "group": "Value configuration", - "name": "ValueMax", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValueMax()" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Thickness of the resource bar.", - "fullName": "Bar thickness", - "functionType": "Expression", - "group": "Bar configuration", - "name": "BarThickness", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyBarThickness()" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Length of the resource bar.", - "fullName": "Bar length", - "functionType": "Expression", - "group": "Bar configuration", - "name": "BarLength", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyBarLength()" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Change the maximum value of a resource bar.", - "fullName": "Maximum value", - "functionType": "Action", - "group": "Bar value configuration", - "name": "SetValueMax", - "private": false, - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyValueMax" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMax\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Maximum value", - "longDescription": "", - "name": "ValueMax", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "The tick spacing of a bar.", - "fullName": "Tick spacing", - "functionType": "Expression", - "group": "Value configuration", - "name": "TickSpacing", - "private": false, - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyTickSpacing()" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Tick spacing", - "longDescription": "", - "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change the tick spacing of a resource bar.", - "fullName": "Tick spacing", - "functionType": "Action", - "group": "Value configuration", - "name": "SetTickSpacing", - "private": false, - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"TickSpacing\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Tick spacing", - "longDescription": "", - "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change length of a resource bar.", - "fullName": "Bar length", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetBarLength", - "private": false, - "sentence": "Change bar length of _PARAM0_ to _PARAM2_ px", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyBarLength" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move thumb to correct place (based on new Bar size)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyValue()", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Bar width", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change thickness of a resource bar", - "fullName": "Bar thickness", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetBarThickness", - "private": false, - "sentence": "Change the bar thickness of _PARAM0_ to _PARAM2_ px", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyBarThickness" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure thumb width is not smaller than Bar height + 2 pixels (to prevent Bar ends from showing)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::PropertyThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyBarThickness() + 2" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyBarThickness() + 2", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::PropertyThumbHeight" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyBarThickness() + 2" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetThumbHeight" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyBarThickness() + 2", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Bar thickness", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Make bar use rounded ends.", - "fullName": "Rounded bar ends", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetRoundedBar", - "private": false, - "sentence": "Draw _PARAM0_ with a rounded bar: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Rounded bar", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Change opacity of inactive bar.", - "fullName": "Inactive bar opacity", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetInactiveBarOpacity", - "private": false, - "sentence": "Change inactive bar opacity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyInactiveBarOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Inactive bar opacity", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change opacity of active bar.", - "fullName": "Active bar opacity", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetActiveBarOpacity", - "private": false, - "sentence": "Change active bar opacity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyActiveBarOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Active bar opacity", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change the color of the left side of the bar.", - "fullName": "Active bar color ", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetActiveBarColor", - "private": false, - "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyActiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Color\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Active bar color", - "longDescription": "", - "name": "Color", - "optional": false, - "supplementaryInformation": "", - "type": "color" - } - ], - "objectGroups": [] - }, - { - "description": "Change the color of the right side of the resource bar.", - "fullName": "Inactive bar color", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetInactiveBarColor", - "private": false, - "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyInactiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Color\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Inactive bar color", - "longDescription": "", - "name": "Color", - "optional": false, - "supplementaryInformation": "", - "type": "color" - } - ], - "objectGroups": [] - }, - { - "description": "Update the hitbox.", - "fullName": "Update hitbox", - "functionType": "Action", - "group": "Private", - "name": "UpdateHitbox", - "private": true, - "sentence": "Update the hitbox of _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::SetRotationCenter" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyBarLength() / 2", - "Object.Behavior::PropertyBarThickness() / 2" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::SetRectangularCollisionMask" - }, - "parameters": [ - "Object", - "0", - "-Object.Behavior::PropertyBarThickness() / 2", - "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness() / 2" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Draw health bar.", - "fullName": "Draw health bar", - "functionType": "Action", - "group": "", - "name": "DrawHealthBar", - "private": false, - "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValue" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", - "" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValueMax" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "ObjectWithHealth.HealthBehavior::MaxHealth()", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Object with health", - "longDescription": "", - "name": "ObjectWithHealth", - "optional": false, - "supplementaryInformation": "", - "type": "objectList" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Health behavior", - "longDescription": "", - "name": "HealthBehavior", - "optional": false, - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Draw shield bar.", - "fullName": "Draw shield bar", - "functionType": "Action", - "group": "", - "name": "DrawShieldBar", - "private": false, - "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValue" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", - "" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValueMax" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "ObjectWithShield.ShieldBehavior::MaxShield()", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Object with shield", - "longDescription": "", - "name": "ObjectWithShield", - "optional": false, - "supplementaryInformation": "", - "type": "objectList" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Shield behavior", - "longDescription": "", - "name": "ShieldBehavior", - "optional": false, - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Draw resource bar.", - "fullName": "Draw resource bar", - "functionType": "Action", - "group": "", - "name": "DrawResourceBar", - "private": false, - "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValue" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", - "" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar117::SetValueMax" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "GetArgumentAsNumber(\"MaxValue\")", - "" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar117", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Current value", - "longDescription": "", - "name": "CurrentValue", - "optional": false, - "supplementaryInformation": "", - "type": "expression" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Max value", - "longDescription": "", - "name": "MaxValue", - "optional": false, - "supplementaryInformation": "Health::Health", - "type": "expression" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "0", - "type": "Number", - "label": "Minimum value", - "description": "", - "group": "Value", - "extraInformation": [], - "hidden": false, - "name": "ValueMin" - }, - { - "value": "1", - "type": "Number", - "label": "Maximum value", - "description": "", - "group": "Value", - "extraInformation": [], - "hidden": false, - "name": "ValueMax" - }, - { - "value": "0", - "type": "Number", - "label": "Tick spacing", - "description": "", - "group": "Value", - "extraInformation": [], - "hidden": false, - "name": "TickSpacing" - }, - { - "value": "200", - "type": "Number", - "label": "Bar length", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "BarLength" - }, - { - "value": "4", - "type": "Number", - "label": "Bar thickness", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "BarThickness" - }, - { - "value": "11;255;0", - "type": "Color", - "label": "Inactive bar color", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "InactiveBarColor" - }, - { - "value": "96", - "type": "Number", - "label": "Inactive bar opacity", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "InactiveBarOpacity" - }, - { - "value": "11;255;0", - "type": "Color", - "label": "Active bar color", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "ActiveBarColor" - }, - { - "value": "255", - "type": "Number", - "label": "Active bar opacity", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "ActiveBarOpacity" - }, - { - "value": "false", - "type": "Boolean", - "label": "Rounded bar ends", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "RoundedBar" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "Value" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ThumbOffset" - }, - { - "value": "true", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "NeedRedraw" - }, - { - "value": "0", - "type": "Number", - "label": "Time to complete moving the bar when the value is changed (seconds)", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ChangeDuration" - } - ] } ], "eventsBasedObjects": [] From 046dc040400dc7230f3ce202a1eeb4e0f6a72d45 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 6 Nov 2022 19:31:17 -0700 Subject: [PATCH 07/24] Good defaults set --- examples/resource-bar/game.json | 288 ++------------------------------ 1 file changed, 15 insertions(+), 273 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index f23d19179..019a32c01 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1361,32 +1361,16 @@ "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, - "ThumbShape": "circle", - "ThumbWidth": 20, - "ThumbHeight": 20, - "ThumbColor": " 24;119;211", - "ThumbOpacity": 255, "BarLength": 200, - "BarThickness": 4, - "InactiveBarColor": "", + "BarThickness": 16, + "InactiveBarColor": "11;255;0", "InactiveBarOpacity": 96, - "ActiveBarColor": " ", + "ActiveBarColor": " 11;255;0", "ActiveBarOpacity": 255, - "HaloRadius": 24, - "HaloOpacityHover": 32, - "HaloOpacityClick": 64, - "RoundedBar": true, - "Enabled": true, - "IsBeingDragged": false, + "RoundedBar": false, "Value": 0, "ThumbOffset": 0, - "NeedRedraw": true, - "IsHovered": false, - "MouseX": 0, - "MouseY": 0, - "CurrentHaloRadius": 0, - "HaloGrowSpeed": 0.2, - "TargetHaloRadius": 0.19999992847442627 + "NeedRedraw": true } ], "fillOpacity": 255, @@ -1493,7 +1477,7 @@ "ThumbColor": " 24;119;211", "ThumbOpacity": 255, "BarLength": 200, - "BarThickness": 4, + "BarThickness": 16, "InactiveBarColor": "144;19;254", "InactiveBarOpacity": 96, "ActiveBarColor": " 144;19;254", @@ -1501,7 +1485,7 @@ "HaloRadius": 24, "HaloOpacityHover": 32, "HaloOpacityClick": 64, - "RoundedBar": true, + "RoundedBar": false, "Enabled": true, "IsBeingDragged": false, "Value": 0, @@ -1551,15 +1535,15 @@ "ThumbColor": "248;231;28", "ThumbOpacity": 255, "BarLength": 200, - "BarThickness": 4, - "InactiveBarColor": "", + "BarThickness": 16, + "InactiveBarColor": "248;231;28", "InactiveBarOpacity": 96, - "ActiveBarColor": " ", + "ActiveBarColor": "248;231;28", "ActiveBarOpacity": 255, "HaloRadius": 24, "HaloOpacityHover": 32, "HaloOpacityClick": 64, - "RoundedBar": true, + "RoundedBar": false, "Enabled": true, "IsBeingDragged": false, "Value": 0, @@ -2835,46 +2819,6 @@ } ] }, - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" - }, - "parameters": [ - "Health_Bar", - "DrawResourceBar222", - "Fly.Health::Health()", - "" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar222::SetValueMin" - }, - "parameters": [ - "Health_Bar", - "DrawResourceBar222", - "0", - "" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar222::SetValueMax" - }, - "parameters": [ - "Health_Bar", - "DrawResourceBar222", - "Fly.Health::MaxHealth()", - "" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], @@ -3621,7 +3565,7 @@ "eventsFunctions": [], "eventsBasedBehaviors": [ { - "description": "Displays a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "description": "Draws a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", "fullName": "Draw resource bar 222", "name": "DrawResourceBar222", "objectType": "PrimitiveDrawing::Drawer", @@ -3968,46 +3912,7 @@ }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyActiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyActiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], + "conditions": [], "actions": [ { "type": { @@ -5817,59 +5722,6 @@ "hidden": false, "name": "TickSpacing" }, - { - "value": "circle", - "type": "Choice", - "label": "Thumb shape", - "description": "", - "group": "Thumb", - "extraInformation": [ - "circle", - "rectangle" - ], - "hidden": false, - "name": "ThumbShape" - }, - { - "value": "20", - "type": "Number", - "label": "Thumb width", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbWidth" - }, - { - "value": "20", - "type": "Number", - "label": "Thumb height", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbHeight" - }, - { - "value": " 24;119;211", - "type": "Color", - "label": "Thumb Color", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbColor" - }, - { - "value": "255", - "type": "Number", - "label": "Thumb opacity", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbOpacity" - }, { "value": "200", "type": "Number", @@ -5892,7 +5744,7 @@ }, { "value": "11;255;0", - "type": "String", + "type": "Color", "label": "Inactive Bar color", "description": "", "group": "Bar", @@ -5912,7 +5764,7 @@ }, { "value": " 11;255;0", - "type": "String", + "type": "Color", "label": "Active Bar color", "description": "", "group": "Bar", @@ -5930,36 +5782,6 @@ "hidden": false, "name": "ActiveBarOpacity" }, - { - "value": "24", - "type": "Number", - "label": "Halo size (hover)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloRadius" - }, - { - "value": "32", - "type": "Number", - "label": "Halo opacity (hover)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloOpacityHover" - }, - { - "value": "64", - "type": "Number", - "label": "Halo opacity (pressed)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloOpacityClick" - }, { "value": "true", "type": "Boolean", @@ -5970,26 +5792,6 @@ "hidden": false, "name": "RoundedBar" }, - { - "value": "true", - "type": "Boolean", - "label": "Enable interactions", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "Enabled" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "IsBeingDragged" - }, { "value": "0", "type": "Number", @@ -6019,66 +5821,6 @@ "extraInformation": [], "hidden": true, "name": "NeedRedraw" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "IsHovered" - }, - { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "MouseX" - }, - { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "MouseY" - }, - { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "CurrentHaloRadius" - }, - { - "value": "0.2", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "HaloGrowSpeed" - }, - { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "TargetHaloRadius" } ] }, From 6016c1905b74825597d962185d4a1eb46b26929a Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 6 Nov 2022 19:41:17 -0700 Subject: [PATCH 08/24] Renaming behavior, preparing to adjust drawing position --- examples/resource-bar/game.json | 416 ++++++++------------------------ 1 file changed, 96 insertions(+), 320 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 019a32c01..6686bdb3a 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1195,21 +1195,6 @@ "objectsGroups": [], "variables": [], "instances": [ - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Health_Bar", - "persistentUuid": "a703603b-6259-4e18-bfa0-7d8794e4f837", - "width": 0, - "x": 192, - "y": 112, - "zOrder": 1, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, { "angle": 0, "customSize": false, @@ -1344,6 +1329,21 @@ "numberProperties": [], "stringProperties": [], "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Health_Bar", + "persistentUuid": "577d11e6-1574-4e9c-9620-bb2a66afb452", + "width": 0, + "x": 192, + "y": 112, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] } ], "objects": [ @@ -1357,7 +1357,7 @@ "behaviors": [ { "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar222", + "type": "ResourceBar::DrawResourceBar", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -1367,7 +1367,7 @@ "InactiveBarOpacity": 96, "ActiveBarColor": " 11;255;0", "ActiveBarOpacity": 255, - "RoundedBar": false, + "RoundedBar": true, "Value": 0, "ThumbOffset": 0, "NeedRedraw": true @@ -1467,7 +1467,7 @@ "behaviors": [ { "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar222", + "type": "ResourceBar::DrawResourceBar", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -1485,7 +1485,7 @@ "HaloRadius": 24, "HaloOpacityHover": 32, "HaloOpacityClick": 64, - "RoundedBar": false, + "RoundedBar": true, "Enabled": true, "IsBeingDragged": false, "Value": 0, @@ -1525,7 +1525,7 @@ "behaviors": [ { "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar222", + "type": "ResourceBar::DrawResourceBar", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -2825,7 +2825,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::DrawShieldBar" + "value": "ResourceBar::DrawResourceBar::DrawShieldBar" }, "parameters": [ "Shield_Bar", @@ -2843,7 +2843,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::DrawResourceBar" + "value": "ResourceBar::DrawResourceBar::DrawResourceBar" }, "parameters": [ "ResourceMouseX_Bar", @@ -2861,7 +2861,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::DrawHealthBar" + "value": "ResourceBar::DrawResourceBar::DrawHealthBar" }, "parameters": [ "Health_Bar", @@ -3504,7 +3504,7 @@ }, { "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar222" + "type": "ResourceBar::DrawResourceBar" }, { "name": "Health", @@ -3566,8 +3566,8 @@ "eventsBasedBehaviors": [ { "description": "Draws a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", - "fullName": "Draw resource bar 222", - "name": "DrawResourceBar222", + "fullName": "Draw resource bar", + "name": "DrawResourceBar", "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { @@ -3626,7 +3626,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + "value": "ResourceBar::DrawResourceBar::SetPropertyValue" }, "parameters": [ "Object", @@ -3643,7 +3643,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::UpdateHitbox" + "value": "ResourceBar::DrawResourceBar::UpdateHitbox" }, "parameters": [ "Object", @@ -3672,7 +3672,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -3701,7 +3701,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::PropertyNeedRedraw" }, "parameters": [ "Object", @@ -3729,7 +3729,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -3781,13 +3781,7 @@ "Object", "Object.Behavior::PropertyInactiveBarColor()" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { "value": "PrimitiveDrawing::FillOpacity" @@ -3840,50 +3834,6 @@ ] } ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of Bar (inactive side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyBarLength()", - "0", - "Object.Behavior::PropertyBarThickness() / 2", - "270", - "90", - "", - "yes" - ] - } - ] } ], "parameters": [] @@ -3907,7 +3857,7 @@ "textG": 0, "textR": 0 }, - "comment": "Set active Bar parameters (by default, use thumb color)", + "comment": "Set active Bar parameters", "comment2": "" }, { @@ -3922,13 +3872,7 @@ "Object", "Object.Behavior::PropertyActiveBarColor()" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { "value": "PrimitiveDrawing::FillOpacity" @@ -3951,7 +3895,7 @@ "textG": 0, "textR": 0 }, - "comment": "Draw active Bar (2 pixels bigger than property) ", + "comment": "Draw active Bar", "comment2": "" }, { @@ -3965,53 +3909,9 @@ "parameters": [ "Object", "0", - "-(Object.Behavior::PropertyBarThickness() / 2 + 1)", + "-(Object.Behavior::PropertyBarThickness() / 2)", "Object.Behavior::PropertyThumbOffset()", - "Object.Behavior::PropertyBarThickness() / 2 + 1" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of Bar (active side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "0", - "0", - "1 + Object.Behavior::PropertyBarThickness() / 2", - "90", - "270", - "", - "yes" + "Object.Behavior::PropertyBarThickness() / 2" ] } ] @@ -4043,7 +3943,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -4091,7 +3991,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -4111,7 +4011,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyTickSpacing" + "value": "ResourceBar::DrawResourceBar::PropertyTickSpacing" }, "parameters": [ "Object", @@ -4124,7 +4024,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + "value": "ResourceBar::DrawResourceBar::SetPropertyValue" }, "parameters": [ "Object", @@ -4140,7 +4040,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyTickSpacing" + "value": "ResourceBar::DrawResourceBar::PropertyTickSpacing" }, "parameters": [ "Object", @@ -4153,7 +4053,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + "value": "ResourceBar::DrawResourceBar::SetPropertyValue" }, "parameters": [ "Object", @@ -4169,7 +4069,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyValue" + "value": "ResourceBar::DrawResourceBar::PropertyValue" }, "parameters": [ "Object", @@ -4182,7 +4082,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + "value": "ResourceBar::DrawResourceBar::SetPropertyValue" }, "parameters": [ "Object", @@ -4198,7 +4098,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::PropertyValue" + "value": "ResourceBar::DrawResourceBar::PropertyValue" }, "parameters": [ "Object", @@ -4211,7 +4111,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyValue" + "value": "ResourceBar::DrawResourceBar::SetPropertyValue" }, "parameters": [ "Object", @@ -4232,7 +4132,7 @@ "textG": 0, "textR": 0 }, - "comment": "Set the proper offset (it moves the slider)", + "comment": "Set the proper offset", "comment2": "" }, { @@ -4241,7 +4141,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyThumbOffset" + "value": "ResourceBar::DrawResourceBar::SetPropertyThumbOffset" }, "parameters": [ "Object", @@ -4252,7 +4152,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -4281,7 +4181,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -4339,7 +4239,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -4360,7 +4260,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyValueMin" + "value": "ResourceBar::DrawResourceBar::SetPropertyValueMin" }, "parameters": [ "Object", @@ -4371,7 +4271,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" + "value": "ResourceBar::DrawResourceBar::SetValue" }, "parameters": [ "Object", @@ -4401,7 +4301,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -4459,7 +4359,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -4507,7 +4407,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -4555,7 +4455,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -4576,7 +4476,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyValueMax" + "value": "ResourceBar::DrawResourceBar::SetPropertyValueMax" }, "parameters": [ "Object", @@ -4587,7 +4487,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" + "value": "ResourceBar::DrawResourceBar::SetValue" }, "parameters": [ "Object", @@ -4617,7 +4517,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -4675,7 +4575,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -4706,7 +4606,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyTickSpacing" + "value": "ResourceBar::DrawResourceBar::SetPropertyTickSpacing" }, "parameters": [ "Object", @@ -4717,7 +4617,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" + "value": "ResourceBar::DrawResourceBar::SetValue" }, "parameters": [ "Object", @@ -4747,7 +4647,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -4778,7 +4678,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyBarLength" + "value": "ResourceBar::DrawResourceBar::SetPropertyBarLength" }, "parameters": [ "Object", @@ -4789,7 +4689,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::UpdateHitbox" + "value": "ResourceBar::DrawResourceBar::UpdateHitbox" }, "parameters": [ "Object", @@ -4799,7 +4699,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -4828,7 +4728,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" + "value": "ResourceBar::DrawResourceBar::SetValue" }, "parameters": [ "Object", @@ -4858,7 +4758,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -4889,7 +4789,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyBarThickness" + "value": "ResourceBar::DrawResourceBar::SetPropertyBarThickness" }, "parameters": [ "Object", @@ -4900,7 +4800,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -4929,7 +4829,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -4945,120 +4845,6 @@ ], "objectGroups": [] }, - { - "description": "Make Bar use rounded ends.", - "fullName": "Rounded Bar ends", - "functionType": "Action", - "group": "Slider Bar configuration", - "name": "SetRoundedBar", - "private": false, - "sentence": "Draw _PARAM0_ with a rounded Bar: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "codeOnly": false, - "defaultValue": "", - "description": "Object", - "longDescription": "", - "name": "Object", - "optional": false, - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Behavior", - "longDescription": "", - "name": "Behavior", - "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", - "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Rounded Bar", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "", - "type": "yesorno" - } - ], - "objectGroups": [] - }, { "description": "Change opacity of inactive Bar.", "fullName": "Inactive Bar opacity", @@ -5074,7 +4860,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyInactiveBarOpacity" + "value": "ResourceBar::DrawResourceBar::SetPropertyInactiveBarOpacity" }, "parameters": [ "Object", @@ -5085,7 +4871,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -5114,7 +4900,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -5145,7 +4931,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyActiveBarOpacity" + "value": "ResourceBar::DrawResourceBar::SetPropertyActiveBarOpacity" }, "parameters": [ "Object", @@ -5156,7 +4942,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -5185,7 +4971,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -5216,7 +5002,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyActiveBarColor" + "value": "ResourceBar::DrawResourceBar::SetPropertyActiveBarColor" }, "parameters": [ "Object", @@ -5227,7 +5013,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -5256,7 +5042,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -5287,7 +5073,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyInactiveBarColor" + "value": "ResourceBar::DrawResourceBar::SetPropertyInactiveBarColor" }, "parameters": [ "Object", @@ -5298,7 +5084,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetPropertyNeedRedraw" + "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -5327,7 +5113,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -5399,7 +5185,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } ], @@ -5433,7 +5219,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" + "value": "ResourceBar::DrawResourceBar::SetValue" }, "parameters": [ "Object", @@ -5444,7 +5230,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValueMax" + "value": "ResourceBar::DrawResourceBar::SetValueMax" }, "parameters": [ "Object", @@ -5474,7 +5260,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -5528,7 +5314,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" + "value": "ResourceBar::DrawResourceBar::SetValue" }, "parameters": [ "Object", @@ -5539,7 +5325,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValueMax" + "value": "ResourceBar::DrawResourceBar::SetValueMax" }, "parameters": [ "Object", @@ -5569,7 +5355,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -5623,7 +5409,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValue" + "value": "ResourceBar::DrawResourceBar::SetValue" }, "parameters": [ "Object", @@ -5634,7 +5420,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar222::SetValueMax" + "value": "ResourceBar::DrawResourceBar::SetValueMax" }, "parameters": [ "Object", @@ -5664,7 +5450,7 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::DrawResourceBar222", + "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { @@ -5782,16 +5568,6 @@ "hidden": false, "name": "ActiveBarOpacity" }, - { - "value": "true", - "type": "Boolean", - "label": "Rounded Bar ends", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "RoundedBar" - }, { "value": "0", "type": "Number", @@ -5825,7 +5601,7 @@ ] }, { - "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image used for resource bar and unit objects.", + "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image for the resource bar and the unit objects.", "fullName": "Unit resource bar", "name": "UnitResourceBar", "objectType": "", From 7200bc25b8b88d16b0efe4275558f8542e1be112 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 6 Nov 2022 19:44:01 -0700 Subject: [PATCH 09/24] Change Y start position to draw same as shape painter --- examples/resource-bar/game.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 6686bdb3a..e3181f86d 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1182,8 +1182,8 @@ "uiSettings": { "grid": true, "gridType": "rectangular", - "gridWidth": 16, - "gridHeight": 16, + "gridWidth": 8, + "gridHeight": 8, "gridOffsetX": 0, "gridOffsetY": 0, "gridColor": 10401023, @@ -1204,7 +1204,7 @@ "persistentUuid": "b581caf8-44ee-423e-b57e-cdd910fb7374", "width": 0, "x": 192, - "y": 224, + "y": 216, "zOrder": 2, "numberProperties": [], "stringProperties": [], @@ -1219,7 +1219,7 @@ "persistentUuid": "17a23f4a-a442-4b52-8380-9f2b6a9c2494", "width": 0, "x": 192, - "y": 544, + "y": 536, "zOrder": 3, "numberProperties": [], "stringProperties": [], @@ -1336,10 +1336,10 @@ "height": 0, "layer": "", "name": "Health_Bar", - "persistentUuid": "577d11e6-1574-4e9c-9620-bb2a66afb452", + "persistentUuid": "c411b32c-f357-4b8f-9e87-f3fdde7657d5", "width": 0, "x": 192, - "y": 112, + "y": 104, "zOrder": 1, "numberProperties": [], "stringProperties": [], @@ -3828,9 +3828,9 @@ "parameters": [ "Object", "Object.Behavior::PropertyThumbOffset()", - "-Object.Behavior::PropertyBarThickness() / 2", + "0", "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness() / 2" + "Object.Behavior::PropertyBarThickness()" ] } ] @@ -3909,9 +3909,9 @@ "parameters": [ "Object", "0", - "-(Object.Behavior::PropertyBarThickness() / 2)", + "0", "Object.Behavior::PropertyThumbOffset()", - "Object.Behavior::PropertyBarThickness() / 2" + "Object.Behavior::PropertyBarThickness()" ] } ] From 601ae201b74216611f147110eda75b9c55ea06e7 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 6 Nov 2022 19:48:06 -0700 Subject: [PATCH 10/24] Done for tonight! --- examples/resource-bar/game.json | 53 ++++++++------------------------- 1 file changed, 13 insertions(+), 40 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index e3181f86d..f4f3cd5c0 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1189,7 +1189,7 @@ "gridColor": 10401023, "gridAlpha": 0.2, "snap": true, - "zoomFactor": 0.8599999999999999, + "zoomFactor": 0.8799999999999999, "windowMask": false }, "objectsGroups": [], @@ -1398,42 +1398,20 @@ "effects": [], "behaviors": [ { - "name": "DraggableSliderControl", - "type": "DraggableSliderControl::DraggableSliderControl", + "name": "DrawResourceBar", + "type": "ResourceBar::DrawResourceBar", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, - "ThumbShape": "rectangle", - "ThumbWidth": 20, - "ThumbHeight": 20, - "ThumbColor": "11;255;0", - "ThumbOpacity": 255, - "TrackLength": 50, - "TrackThickness": 4, - "InactiveTrackColor": "", - "InactiveTrackOpacity": 96, - "ActiveTrackColor": " ", - "ActiveTrackOpacity": 255, - "HaloRadius": 24, - "HaloOpacityHover": 32, - "HaloOpacityClick": 64, - "RoundedTrack": false, - "Enabled": true, - "IsBeingDragged": false, + "BarLength": 50, + "BarThickness": 4, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 11;255;0", + "ActiveBarOpacity": 255, "Value": 0, "ThumbOffset": 0, - "NeedRedraw": true, - "IsHovered": false, - "MouseX": 0, - "MouseY": 0, - "CurrentHaloRadius": 0, - "HaloGrowSpeed": 0.2, - "TargetHaloRadius": 0 - }, - { - "name": "DrawResourceBar", - "type": "DrawResourceBarOLD::DrawResourceBarOLD", - "DraggableSliderBehavior": "DraggableSliderControl" + "NeedRedraw": true }, { "name": "Sticker", @@ -2660,7 +2638,6 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "folded": true, "name": "Initialize game", "source": "", "type": "BuiltinCommonInstructions::Group", @@ -2769,7 +2746,7 @@ "parameters": [ "MiniHealth_Bar", "=", - "Fly.CenterX() - MiniHealth_Bar.DraggableSliderControl::TrackLength()/2", + "Fly.CenterX() - MiniHealth_Bar.DrawResourceBar::BarLength()/2", "=", "Fly.BoundingBoxTop()" ] @@ -2807,7 +2784,7 @@ "actions": [ { "type": { - "value": "DrawResourceBarOLD::DrawResourceBarOLD::DrawHealthBar" + "value": "ResourceBar::DrawResourceBar::DrawHealthBar" }, "parameters": [ "MiniHealth_Bar", @@ -3494,10 +3471,6 @@ } ], "behaviorsSharedData": [ - { - "name": "DraggableSliderControl", - "type": "DraggableSliderControl::DraggableSliderControl" - }, { "name": "DrawResourceBar", "type": "DrawResourceBarOLD::DrawResourceBarOLD" @@ -5519,7 +5492,7 @@ "name": "BarLength" }, { - "value": "4", + "value": "16", "type": "Number", "label": "Bar thickness", "description": "", From 309e7003040073dccd61dcdb40fc3dd92825a130 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 7 Nov 2022 02:50:17 +0000 Subject: [PATCH 11/24] Optimised images with calibre/image-actions --- examples/resource-bar/assets/Emote Heart.png | Bin 265 -> 248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/resource-bar/assets/Emote Heart.png b/examples/resource-bar/assets/Emote Heart.png index 3e52a6e23d8afbe09cb3c1d52e557e6eeeb7e09a..6b98f3d59fc9e7cee50e3fe646dc735645ca9f7c 100644 GIT binary patch delta 232 zcmV0{8)t7=H)`0001`Bbn&{000SaNLh0L01FZT01FZU(%pXi00020Nklw-_>!^8cWiC|T)j{(r^E9{8!z|yODgy%O*55otx?x4eZzS~R0C(>j^aKMk zfkt2g4YCD^ZO{Yez3YLlVr&T990(z29uY#`d>g{I8Lsw_`4XZ?&qKJgB7Nz1+=qD4 i{21Z`b3zCqM3M>YhV68Cg$err0000G0%E(!7r?q6?T@2`J;KmU6M!M}}pK;cSH7sn8d^T`pd zY!Ymf4@~-0q%Y9M9r6C&UdfiCM5gXCAgkDH!i6R-ojbg&K>>|d4H{#2u!J3ANpoZs zJHWDI0h9J7#Xq^R2IX5ES&Sa=HES?xH~d=4yN*F?1JjFhb7N2J>%FtLTC3~(^mF$l lTczYC2D2yc35aH3=+&I~`1}Kfa-b_1JYD@<);T3K0RV(&T_FGf From fb2613a520cef41fec7957c7f58b4c243546a42c Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Mon, 7 Nov 2022 22:05:37 -0700 Subject: [PATCH 12/24] Lots of progress! All three behaviors working (partially) Sprites have 3 ways to change (opacity, tint, animation) --- .../assets/tiled_Tiled Empty UI Heart.png | Bin 0 -> 237 bytes .../assets/tiled_Tiled Filler UI Heart.png | Bin 0 -> 166 bytes examples/resource-bar/game.json | 2030 ++++++++++++----- 3 files changed, 1415 insertions(+), 615 deletions(-) create mode 100644 examples/resource-bar/assets/tiled_Tiled Empty UI Heart.png create mode 100644 examples/resource-bar/assets/tiled_Tiled Filler UI Heart.png diff --git a/examples/resource-bar/assets/tiled_Tiled Empty UI Heart.png b/examples/resource-bar/assets/tiled_Tiled Empty UI Heart.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d881edf91464e1e0a4daeb2e604173c19b18f2 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq!^2X+?^QKos)S99?cWeR59BOXqXisw6o02`rL`G}dg0`&C%QkjA0fAouHIRe}b?o|gi$HdW^j z6#RUXwnp`&!^`6uZiSLf=RY-G@elD3Nd5^F$x_&)xFo_Z;>%&)iW|^(Q~g`u jeBzo7$CrMlDh3AWM1GlN$?6tBCo_1u`njxgN@xNA&JtDa literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/tiled_Tiled Filler UI Heart.png b/examples/resource-bar/assets/tiled_Tiled Filler UI Heart.png new file mode 100644 index 0000000000000000000000000000000000000000..8d409e4134a8f61bb8d9116ceb4df83be0a77f7a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SNCq!^2X+?^QKos)S91{cc1t;@Yv29fVB4)_!aXfVE*^Avk*<^?u_-NxVegm6Ul>%UT@JR7", - "Object.Behavior::PropertyCurrentQuantity()" - ] - } - ], - "actions": [ - { - "type": { - "value": "Delete" - }, - "parameters": [ - "UnitObject", - "" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update non-empty units", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "LinkedObjects::PickObjectsLinkedTo" - }, - "parameters": [ - "", - "UnitObject", - "Object", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "UnitObject.Variable(__ResourceBar.UnitID)", - "<=", - "Object.Behavior::PropertyCurrentQuantity()" - ] - } - ], - "actions": [ - { - "type": { - "value": "Montre" - }, - "parameters": [ - "UnitObject", - "" - ] - }, - { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "UnitObject", - "\"255;255;255\"" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update empty units", - "source": "", - "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -5823,106 +6008,260 @@ "Object", "" ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "UnitObject.Variable(__ResourceBar.UnitID)", - ">", - "Object.Behavior::PropertyCurrentQuantity()" - ] } ], "actions": [], "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Color tint", - "source": "", - "type": "BuiltinCommonInstructions::Group", + "type": "BuiltinCommonInstructions::ForEach", + "object": "UnitObject", + "conditions": [], + "actions": [], "events": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Only apply color if it has change from default value", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Delete units higher than max unit value", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "Object.Behavior::PropertyEmptyColorTint()", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "UnitObject", - "Object.Behavior::PropertyEmptyColorTint()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()", + "!=", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyMaxQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "UnitObject", + "" + ] + } ] } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Hide", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + ], + "parameters": [] + }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update non-empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "ResourceBar::UnitResourceBar::PropertyHideEmptyUnits" - }, - "parameters": [ - "Object", - "Behavior" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + "<=", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "Object.Behavior::PropertyActiveUnitColorTint()" + ] + }, + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyActiveUnitOpacity()" + ] + }, + { + "type": { + "value": "ChangeAnimation" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyActiveUnitAnimationNumber()" + ] + } ] } ], - "actions": [ + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "Cache" - }, - "parameters": [ - "UnitObject" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Color tint", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only apply color if it has change from default value", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Object.Behavior::PropertyEmptyUnitColorTint()", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "Object.Behavior::PropertyEmptyUnitColorTint()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Opacity", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyEmptyUnitOpacity()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Animation", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeAnimation" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyEmptyUnitAnimationNumber()" + ] + } + ] + } + ], + "parameters": [] + } ] } - ] + ], + "parameters": [] } - ], - "parameters": [] + ] } ] } @@ -5956,7 +6295,7 @@ "actions": [ { "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyNextUnitToCreate" + "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" }, "parameters": [ "Object", @@ -5967,8 +6306,433 @@ } ] } - ], - "parameters": [] + ], + "parameters": [] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Object used to display each unit", + "longDescription": "", + "name": "UnitObject", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", + "fullName": "Color tint of empty units", + "functionType": "Action", + "group": "", + "name": "SetEmptyUnitColor", + "private": false, + "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyEmptyUnitColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"ColorTint\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Color tint", + "longDescription": "Use \"white\" to remove all color tint", + "name": "ColorTint", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Apply color tint to active units.", + "fullName": "Color tint of active units", + "functionType": "Action", + "group": "", + "name": "SetActiveUnitColor", + "private": false, + "sentence": "Apply color tint _PARAM2_ to active units of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyActiveUnitColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"ColorTint\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Color tint", + "longDescription": "Use \"white\" to remove all color tint", + "name": "ColorTint", + "optional": false, + "supplementaryInformation": "", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the opacity of empty units. Empty units exist between the current and maximum value.", + "fullName": "Opacity of empty units", + "functionType": "Action", + "group": "", + "name": "SetEmptyUnitOpacity", + "private": false, + "sentence": "Change the opacity of empty units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyEmptyUnitOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Opacity\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Opacity of empty units", + "longDescription": "Range: 0 to 255", + "name": "Opacity", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the opacity of active units. ", + "fullName": "Opacity of active units", + "functionType": "Action", + "group": "", + "name": "SetActiveUnitOpacity", + "private": false, + "sentence": "Change the opacity of active units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyActiveUnitOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Opacity\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Opacity of empty units", + "longDescription": "Range: 0 to 255", + "name": "Opacity", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the animation of empty units. Empty units exist between the current and maximum value.", + "fullName": "Animation of empty units", + "functionType": "Action", + "group": "", + "name": "SetEmptyUnitAnimation", + "private": false, + "sentence": "Change the animation of empty units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyEmptyUnitAnimationNumber" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"AnimationNumber\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Animation number", + "longDescription": "", + "name": "AnimationNumber", + "optional": false, + "supplementaryInformation": "", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change maximum units that can be displayed.", + "fullName": "Maximum units", + "functionType": "Action", + "group": "", + "name": "SetMaxQuantity", + "private": false, + "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "codeOnly": false, + "defaultValue": "", + "description": "Object", + "longDescription": "", + "name": "Object", + "optional": false, + "supplementaryInformation": "", + "type": "object" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Behavior", + "longDescription": "", + "name": "Behavior", + "optional": false, + "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Maximum units", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "Sprite", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the current quantity of units.", + "fullName": "Unit quantity", + "functionType": "Action", + "group": "", + "name": "SetCurrentQuantity", + "private": false, + "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] } ], "parameters": [ @@ -5989,30 +6753,30 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::UnitResourceBar", + "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Object used to display each unit", + "description": "Current units", "longDescription": "", - "name": "UnitObject", + "name": "Value", "optional": false, "supplementaryInformation": "Sprite", - "type": "objectList" + "type": "expression" } ], "objectGroups": [] }, { - "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", - "fullName": "Color tint of empty units", + "description": "Increase the current quantity of units.", + "fullName": "Increase quantity", "functionType": "Action", "group": "", - "name": "SetEmptyUnitColor", + "name": "IncreaseQuantity", "private": false, - "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", + "sentence": "Increase the quantity of _PARAM0_ by _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6020,12 +6784,13 @@ "actions": [ { "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyEmptyColorTint" + "value": "ResourceBar::SpriteResourceBar::SetPropertyCurrentQuantity" }, "parameters": [ "Object", "Behavior", - "GetArgumentAsString(\"ColorTint\")" + "=", + "min(Object.Behavior::PropertyMaxQuantity(), Object.Behavior::PropertyCurrentQuantity() + GetArgumentAsNumber(\"Value\"))" ] } ] @@ -6049,78 +6814,44 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::UnitResourceBar", + "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Color tint", - "longDescription": "Use \"white\" to remove all color tint", - "name": "ColorTint", + "description": "Value", + "longDescription": "", + "name": "Value", "optional": false, - "supplementaryInformation": "", - "type": "color" + "supplementaryInformation": "Sprite", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Hide empty units. Empty units exist between the current and maximum value.", - "fullName": "Hide (or show) empty units", + "description": "Decrease the current quantity of units.", + "fullName": "Decrease quantity", "functionType": "Action", "group": "", - "name": "SetHideEmptyUnits", + "name": "DecreaseQuantity", "private": false, - "sentence": "Hide empty units of _PARAM0_: _PARAM2_", + "sentence": "Decrease the quantity of _PARAM0_ by _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"HideEmptyUnits\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyHideEmptyUnits" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"HideEmptyUnits\"" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyHideEmptyUnits" + "value": "ResourceBar::SpriteResourceBar::SetPropertyCurrentQuantity" }, "parameters": [ "Object", "Behavior", - "yes" + "=", + "max(0,Object.Behavior::PropertyCurrentQuantity() - GetArgumentAsNumber(\"Value\"))" ] } ] @@ -6144,30 +6875,140 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::UnitResourceBar", + "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { "codeOnly": false, "defaultValue": "", - "description": "Hide empty units", + "description": "Value", "longDescription": "", - "name": "HideEmptyUnits", + "name": "Value", "optional": false, - "supplementaryInformation": "", - "type": "yesorno" + "supplementaryInformation": "Sprite", + "type": "expression" } ], "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Starting quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "StartingUnits" }, { - "description": "Change maximum units that can be displayed.", - "fullName": "Maximum units", + "value": "", + "type": "Number", + "label": "Quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "CurrentQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum quantity (Use \"0\" for unlimited)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "MaxQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NextUnitToCreate" + }, + { + "value": "", + "type": "Color", + "label": "Empty color tint", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyUnitColorTint" + }, + { + "value": "0", + "type": "Number", + "label": "Opacity of empty units (Range: 0 to 255)", + "description": "Empty units exist between the current and maximum value.", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyUnitOpacity" + }, + { + "value": "", + "type": "Number", + "label": "Animation number for empty units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyUnitAnimationNumber" + }, + { + "value": "255", + "type": "Number", + "label": "Opacity of active units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ActiveUnitOpacity" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Color tint of active units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ActiveUnitColorTint" + }, + { + "value": "0", + "type": "Number", + "label": "Animation number for active units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ActiveUnitAnimationNumber" + } + ] + }, + { + "description": "Uses a tiled sprite to display repeated objects to represent a resource in the game (hearts, lives, ammo, etc). ", + "fullName": "Tiled resource bar", + "name": "TiledResourceBar", + "objectType": "TiledSpriteObject::TiledSprite", + "eventsFunctions": [ + { + "description": "", + "fullName": "", "functionType": "Action", "group": "", - "name": "SetMaxUnits", + "name": "onCreated", "private": false, - "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6175,13 +7016,13 @@ "actions": [ { "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyMaxQuantity" + "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "Object.Behavior::PropertyStartingQuantity()" ] } ] @@ -6195,7 +7036,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", "type": "object" }, { @@ -6205,30 +7046,20 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::UnitResourceBar", + "supplementaryInformation": "ResourceBar::TiledResourceBar", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Maximum units", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "Sprite", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the current quantity of units.", - "fullName": "Unit quantity", + "description": "Display a tiled resource bar.", + "fullName": "Display a tiled resource bar", "functionType": "Action", "group": "", - "name": "SetCurrentUnits", + "name": "DisplayTiledBar", "private": false, - "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", + "sentence": "Display resource bar using _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6236,13 +7067,12 @@ "actions": [ { "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyCurrentQuantity" + "value": "TiledSpriteObject::Width" }, "parameters": [ "Object", - "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "Object.Behavior::PropertyUnitWidth() * Object.Behavior::PropertyCurrentQuantity()" ] } ] @@ -6256,7 +7086,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", "type": "object" }, { @@ -6266,30 +7096,20 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::UnitResourceBar", + "supplementaryInformation": "ResourceBar::TiledResourceBar", "type": "behavior" - }, - { - "codeOnly": false, - "defaultValue": "", - "description": "Current units", - "longDescription": "", - "name": "Value", - "optional": false, - "supplementaryInformation": "Sprite", - "type": "expression" } ], "objectGroups": [] }, { - "description": "", - "fullName": "", + "description": "Change the quantity of a tiled resource bar.", + "fullName": "Quantity", "functionType": "Action", "group": "", - "name": "onCreated", + "name": "SetQuantity", "private": false, - "sentence": "", + "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6297,13 +7117,13 @@ "actions": [ { "type": { - "value": "ResourceBar::UnitResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" }, "parameters": [ "Object", "Behavior", "=", - "Object.Behavior::PropertyStartingUnits()" + "max(0,GetArgumentAsNumber(\"Value\"))" ] } ] @@ -6317,7 +7137,7 @@ "longDescription": "", "name": "Object", "optional": false, - "supplementaryInformation": "", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", "type": "object" }, { @@ -6327,8 +7147,18 @@ "longDescription": "", "name": "Behavior", "optional": false, - "supplementaryInformation": "ResourceBar::UnitResourceBar", + "supplementaryInformation": "ResourceBar::TiledResourceBar", "type": "behavior" + }, + { + "codeOnly": false, + "defaultValue": "", + "description": "Value", + "longDescription": "", + "name": "Value", + "optional": false, + "supplementaryInformation": "", + "type": "expression" } ], "objectGroups": [] @@ -6343,7 +7173,7 @@ "group": "", "extraInformation": [], "hidden": false, - "name": "StartingUnits" + "name": "StartingQuantity" }, { "value": "", @@ -6352,48 +7182,18 @@ "description": "", "group": "", "extraInformation": [], - "hidden": false, + "hidden": true, "name": "CurrentQuantity" }, { - "value": "0", - "type": "Number", - "label": "Maximum quantity (Use \"0\" for unlimited)", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "MaxQuantity" - }, - { - "value": "0", + "value": "16", "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "NextUnitToCreate" - }, - { - "value": "", - "type": "Color", - "label": "Empty color tint", + "label": "Unit width (pixels)", "description": "", "group": "", "extraInformation": [], "hidden": false, - "name": "EmptyColorTint" - }, - { - "value": "true", - "type": "Boolean", - "label": "Hide empty units", - "description": "Empty units exist between the current and maximum value.", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "HideEmptyUnits" + "name": "UnitWidth" } ] } From 08097e2f98f20a7537f4ec2f6f1910761511c6d3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 05:19:30 +0000 Subject: [PATCH 13/24] Optimised images with calibre/image-actions --- .../assets/tiled_Tiled Empty UI Heart.png | Bin 237 -> 202 bytes .../assets/tiled_Tiled Filler UI Heart.png | Bin 166 -> 158 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/resource-bar/assets/tiled_Tiled Empty UI Heart.png b/examples/resource-bar/assets/tiled_Tiled Empty UI Heart.png index e7d881edf91464e1e0a4daeb2e604173c19b18f2..ffcb6312e4927e24677cf4eb5cc9057ada3d45fa 100644 GIT binary patch delta 174 zcmV;f08#(#0m=c8B!3BTNLh0L01FZT01FZU(%pXi0001dNkl5FK zGZGR<2Lqv>1zC}TC;+_a5FI>v&%ki`>}ISb$x1-!$0$Z|8G_I9fz(e_ zNDyQBKC5TqU2!vGnLC ghgb4I15_9oZXOM7SeH=p5@mdKI;Vst0M&Ug`~Uy| delta 138 zcmV;50CoSK0j2?vB!2;OQb$4nuFf3k0001BNklY(=w~8i7_w$k0KN3%^Z+H6(^EfQ4-5r>ksk5+8ejSyDE(Ls#AXOFmJft} sl1l_~95E33F$@`s`bWVi7zqFXI89i8%^?E#00000NkvXXt^-0~f@dZ(JOBUy From 98469deb9f768262c806765c30bb9cb8e4ae2917 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Mon, 14 Nov 2022 23:40:05 -0700 Subject: [PATCH 14/24] Using v150 - Experimenting with new functions for extensions - Fixed sprite creation - Added max quantity to tiled resource --- examples/resource-bar/game.json | 3115 ++++++------------------------- 1 file changed, 570 insertions(+), 2545 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 6b554bba0..e8e87284b 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1215,7 +1215,7 @@ "gridColor": 10401023, "gridAlpha": 0.2, "snap": true, - "zoomFactor": 1.7000000000000006, + "zoomFactor": 1.1800000000000002, "windowMask": false }, "objectsGroups": [], @@ -1380,7 +1380,7 @@ "persistentUuid": "a1be0010-4eb7-4e54-a651-7d77ae646149", "width": 0, "x": 40, - "y": 448, + "y": 416, "zOrder": 14, "numberProperties": [], "stringProperties": [], @@ -1395,7 +1395,7 @@ "persistentUuid": "be98771a-978f-443c-80e8-197098aef457", "width": 0, "x": 40, - "y": 448, + "y": 416, "zOrder": 15, "numberProperties": [], "stringProperties": [], @@ -3431,11 +3431,12 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetQuantity" + "value": "ResourceBar::TiledResourceBar::SetQuantityOp" }, "parameters": [ "Tiled_ResourceBar", "TiledResourceBar", + "=", "Variable(Units)", "" ] @@ -3474,48 +3475,74 @@ "parameters": [ "Units", "=", - "3" - ] - }, - { - "type": { - "value": "ResourceBar::SpriteResourceBar::SetMaxQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "6", - "" - ] - }, - { - "type": { - "value": "ResourceBar::SpriteResourceBar::SetEmptyUnitColor" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "\"74;144;226\"", - "" + "5" ] - }, + } + ], + "events": [ { - "type": { - "value": "ResourceBar::SpriteResourceBar::SetEmptyUnitOpacity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "no", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::TiledResourceBar::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + } ] }, { - "type": { - "value": "Cache" - }, - "parameters": [ - "Unit_ResourceBar" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Unit_ResourceBar" + ] + }, + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetMaxQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "10", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetEmptyUnitColor" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "\"74;144;226\"", + "" + ] + }, + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetEmptyUnitOpacity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "0", + "" + ] + } ] } ] @@ -3719,7 +3746,6 @@ { "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", "category": "Input", - "description": "Solid resource bar\n\nUnit resource bar", "extensionNamespace": "", "fullName": "Resource bar", "helpPath": "", @@ -3728,6 +3754,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", "shortDescription": "Displays a bar that represents a resource in the game (health, shield, mana, ammo, etc)", "version": "0.0.1", + "description": "Solid resource bar\n\nUnit resource bar", "origin": { "identifier": "DraggableSliderControl", "name": "gdevelop-extension-store" @@ -3756,12 +3783,9 @@ "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -3841,22 +3865,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -3864,12 +3880,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPostEvents", - "private": false, "sentence": "", "events": [ { @@ -4112,22 +4125,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -4140,7 +4145,6 @@ "functionType": "Expression", "group": "Slider", "name": "Value", - "private": false, "sentence": "", "events": [ { @@ -4158,24 +4162,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -4188,7 +4187,6 @@ "functionType": "Action", "group": "Slider", "name": "SetValue", - "private": false, "sentence": "Change the value of _PARAM0_: _PARAM2_", "events": [ { @@ -4350,33 +4348,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Slider value", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -4388,7 +4373,6 @@ "functionType": "Expression", "group": "Slider value configuration", "name": "ValueMin", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -4406,24 +4390,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -4436,7 +4415,6 @@ "functionType": "Action", "group": "Slider value configuration", "name": "SetValueMin", - "private": false, "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", "events": [ { @@ -4470,33 +4448,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Minimum value", - "longDescription": "", "name": "ValueMin", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -4508,7 +4473,6 @@ "functionType": "Expression", "group": "Slider value configuration", "name": "ValueMax", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -4526,24 +4490,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -4556,7 +4515,6 @@ "functionType": "Expression", "group": "Slider Bar configuration", "name": "BarThickness", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -4574,24 +4532,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -4604,7 +4557,6 @@ "functionType": "Expression", "group": "Slider Bar configuration", "name": "BarLength", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -4622,24 +4574,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -4652,7 +4599,6 @@ "functionType": "Action", "group": "Slider value configuration", "name": "SetValueMax", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -4686,33 +4632,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Maximum value", - "longDescription": "", "name": "ValueMax", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -4724,7 +4657,6 @@ "functionType": "Expression", "group": "Slider value configuration", "name": "TickSpacing", - "private": false, "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { @@ -4742,35 +4674,25 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Tick spacing", - "longDescription": "", "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -4782,7 +4704,6 @@ "functionType": "Action", "group": "Slider value configuration", "name": "SetTickSpacing", - "private": false, "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { @@ -4816,33 +4737,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Tick spacing", - "longDescription": "", "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -4854,7 +4762,6 @@ "functionType": "Action", "group": "Slider Bar configuration", "name": "SetBarLength", - "private": false, "sentence": "Change Bar length of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -4927,33 +4834,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Bar width", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -4965,7 +4859,6 @@ "functionType": "Action", "group": "Slider Bar configuration", "name": "SetBarThickness", - "private": false, "sentence": "Change Bar thickness of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -4998,33 +4891,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Bar thickness", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -5036,7 +4916,6 @@ "functionType": "Action", "group": "Slider Bar configuration", "name": "SetInactiveBarOpacity", - "private": false, "sentence": "Change inactive Bar opacity of _PARAM0_ to _PARAM2_", "events": [ { @@ -5069,33 +4948,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Inactive Bar opacity", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -5107,7 +4973,6 @@ "functionType": "Action", "group": "Slider Bar configuration", "name": "SetActiveBarOpacity", - "private": false, "sentence": "Change active Bar opacity of _PARAM0_ to _PARAM2_", "events": [ { @@ -5140,33 +5005,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Active Bar opacity", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -5178,7 +5030,6 @@ "functionType": "Action", "group": "Slider Bar configuration", "name": "SetActiveBarColor", - "private": false, "sentence": "Change active Bar color of _PARAM0_ to _PARAM2_", "events": [ { @@ -5211,33 +5062,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Active Bar color", - "longDescription": "", "name": "Color", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -5249,7 +5087,6 @@ "functionType": "Action", "group": "Slider Bar configuration", "name": "SetInactiveBarColor", - "private": false, "sentence": "Change inactive Bar color of _PARAM0_ to _PARAM2_", "events": [ { @@ -5282,33 +5119,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Inactive Bar color", - "longDescription": "", "name": "Color", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -5354,22 +5178,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" } @@ -5380,9 +5196,7 @@ "description": "Draw health bar.", "fullName": "Draw health bar", "functionType": "Action", - "group": "", "name": "DrawHealthBar", - "private": false, "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", "events": [ { @@ -5429,42 +5243,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object with health", - "longDescription": "", "name": "ObjectWithHealth", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Health behavior", - "longDescription": "", "name": "HealthBehavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -5475,9 +5272,7 @@ "description": "Draw shield bar.", "fullName": "Draw shield bar", "functionType": "Action", - "group": "", "name": "DrawShieldBar", - "private": false, "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", "events": [ { @@ -5524,42 +5319,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object with shield", - "longDescription": "", "name": "ObjectWithShield", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Shield behavior", - "longDescription": "", "name": "ShieldBehavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -5570,9 +5348,7 @@ "description": "Draw resource bar.", "fullName": "Draw resource bar", "functionType": "Action", - "group": "", "name": "DrawResourceBar", - "private": false, "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", "events": [ { @@ -5619,42 +5395,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Current value", - "longDescription": "", "name": "CurrentValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Max value", - "longDescription": "", "name": "MaxValue", - "optional": false, "supplementaryInformation": "Health::Health", "type": "expression" } @@ -5805,7 +5564,8 @@ "hidden": false, "name": "EasingSpeed" } - ] + ], + "sharedPropertyDescriptors": [] }, { "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image for the resource bar and the unit objects.", @@ -5814,12 +5574,9 @@ "objectType": "", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -5842,22 +5599,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" } @@ -5868,41 +5616,9 @@ "description": "Draw a unit resource bar made from objects.", "fullName": "Draw a unit resource bar", "functionType": "Action", - "group": "", "name": "DrawUnitBar", - "private": false, "sentence": "Draw unit bar _PARAM0_ with _PARAM2_ objects", "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Prepare", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ] - } - ], - "parameters": [] - }, { "colorB": 228, "colorG": 176, @@ -5924,7 +5640,7 @@ "Object", "Behavior", "<", - "Object.Behavior::PropertyCurrentQuantity()" + "max(Object.Behavior::PropertyCurrentQuantity(),Object.Behavior::PropertyMaxQuantity())" ] } ], @@ -5935,17 +5651,6 @@ "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ - { - "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "1" - ] - }, { "type": { "value": "Create" @@ -5953,7 +5658,7 @@ "parameters": [ "", "UnitObject", - "Object.X() + Object.Width() * (Object.Behavior::PropertyNextUnitToCreate() - 1)", + "Object.X() + Object.Width() * (Object.Behavior::PropertyNextUnitToCreate())", "Object.Y()", "Object.Layer()" ] @@ -5978,6 +5683,17 @@ "Object", "UnitObject" ] + }, + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] } ] } @@ -5991,7 +5707,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Remove excess units", + "name": "Update state of units", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -6084,7 +5800,7 @@ }, "parameters": [ "UnitObject.Variable(__ResourceBar.UnitID)", - "<=", + "<", "Object.Behavior::PropertyCurrentQuantity()" ] } @@ -6142,7 +5858,7 @@ }, "parameters": [ "UnitObject.Variable(__ResourceBar.UnitID)", - ">", + ">=", "Object.Behavior::PropertyCurrentQuantity()" ] } @@ -6262,46 +5978,35 @@ "parameters": [] } ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update counter", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { - "type": { - "value": "LinkedObjects::PickObjectsLinkedTo" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "", - "UnitObject", - "Object", - "" - ] - } - ], - "actions": [ + "comment": "Update counter", + "comment2": "" + }, { - "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "PickedInstancesCount(UnitObject)+1" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "PickedInstancesCount(UnitObject)" + ] + } ] } ] @@ -6312,32 +6017,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object used to display each unit", - "longDescription": "", "name": "UnitObject", - "optional": false, "supplementaryInformation": "Sprite", "type": "objectList" } @@ -6348,9 +6040,7 @@ "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", "fullName": "Color tint of empty units", "functionType": "Action", - "group": "", "name": "SetEmptyUnitColor", - "private": false, "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", "events": [ { @@ -6364,7 +6054,8 @@ "parameters": [ "Object", "Behavior", - "GetArgumentAsString(\"ColorTint\")" + "GetArgumentAsString(\"ColorTint\")", + "" ] } ] @@ -6372,33 +6063,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Color tint", "longDescription": "Use \"white\" to remove all color tint", "name": "ColorTint", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -6408,9 +6086,7 @@ "description": "Apply color tint to active units.", "fullName": "Color tint of active units", "functionType": "Action", - "group": "", "name": "SetActiveUnitColor", - "private": false, "sentence": "Apply color tint _PARAM2_ to active units of _PARAM0_", "events": [ { @@ -6424,7 +6100,8 @@ "parameters": [ "Object", "Behavior", - "GetArgumentAsString(\"ColorTint\")" + "GetArgumentAsString(\"ColorTint\")", + "" ] } ] @@ -6432,33 +6109,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Color tint", "longDescription": "Use \"white\" to remove all color tint", "name": "ColorTint", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -6468,9 +6132,7 @@ "description": "Change the opacity of empty units. Empty units exist between the current and maximum value.", "fullName": "Opacity of empty units", "functionType": "Action", - "group": "", "name": "SetEmptyUnitOpacity", - "private": false, "sentence": "Change the opacity of empty units of _PARAM0_ to _PARAM2_", "events": [ { @@ -6493,33 +6155,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Opacity of empty units", "longDescription": "Range: 0 to 255", "name": "Opacity", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -6529,9 +6178,7 @@ "description": "Change the opacity of active units. ", "fullName": "Opacity of active units", "functionType": "Action", - "group": "", "name": "SetActiveUnitOpacity", - "private": false, "sentence": "Change the opacity of active units of _PARAM0_ to _PARAM2_", "events": [ { @@ -6554,33 +6201,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Opacity of empty units", "longDescription": "Range: 0 to 255", "name": "Opacity", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -6590,9 +6224,7 @@ "description": "Change the animation of empty units. Empty units exist between the current and maximum value.", "fullName": "Animation of empty units", "functionType": "Action", - "group": "", "name": "SetEmptyUnitAnimation", - "private": false, "sentence": "Change the animation of empty units of _PARAM0_ to _PARAM2_", "events": [ { @@ -6615,33 +6247,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Animation number", - "longDescription": "", "name": "AnimationNumber", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -6651,9 +6269,7 @@ "description": "Change maximum units that can be displayed.", "fullName": "Maximum units", "functionType": "Action", - "group": "", "name": "SetMaxQuantity", - "private": false, "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", "events": [ { @@ -6676,32 +6292,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Maximum units", - "longDescription": "", "name": "Value", - "optional": false, "supplementaryInformation": "Sprite", "type": "expression" } @@ -6712,9 +6315,7 @@ "description": "Change the current quantity of units.", "fullName": "Unit quantity", "functionType": "Action", - "group": "", "name": "SetCurrentQuantity", - "private": false, "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", "events": [ { @@ -6729,7 +6330,7 @@ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "min(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyMaxQuantity())" ] } ] @@ -6737,32 +6338,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Current units", - "longDescription": "", "name": "Value", - "optional": false, "supplementaryInformation": "Sprite", "type": "expression" } @@ -6773,9 +6361,7 @@ "description": "Increase the current quantity of units.", "fullName": "Increase quantity", "functionType": "Action", - "group": "", "name": "IncreaseQuantity", - "private": false, "sentence": "Increase the quantity of _PARAM0_ by _PARAM2_", "events": [ { @@ -6798,32 +6384,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "Value", - "optional": false, "supplementaryInformation": "Sprite", "type": "expression" } @@ -6834,9 +6407,7 @@ "description": "Decrease the current quantity of units.", "fullName": "Decrease quantity", "functionType": "Action", - "group": "", "name": "DecreaseQuantity", - "private": false, "sentence": "Decrease the quantity of _PARAM0_ by _PARAM2_", "events": [ { @@ -6859,32 +6430,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::SpriteResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "Value", - "optional": false, "supplementaryInformation": "Sprite", "type": "expression" } @@ -6993,26 +6551,219 @@ "hidden": false, "name": "ActiveUnitAnimationNumber" } - ] + ], + "sharedPropertyDescriptors": [] }, { - "description": "Uses a tiled sprite to display repeated objects to represent a resource in the game (hearts, lives, ammo, etc). ", + "description": "Use a tiled sprite to display repeated objects to represent a resource in the game (hearts, lives, ammo, etc). ", "fullName": "Tiled resource bar", "name": "TiledResourceBar", "objectType": "TiledSpriteObject::TiledSprite", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyStartingQuantity()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::TiledResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Display a tiled resource bar.", + "fullName": "Display a tiled resource bar", + "functionType": "Action", + "name": "DisplayTiledBar", + "sentence": "Display resource bar using _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledSpriteObject::Width" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyUnitWidth() * Object.Behavior::PropertyCurrentQuantity()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::TiledResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the quantity of a tiled resource bar.", + "fullName": "Quantity", + "functionType": "Action", + "name": "SetQuantity", + "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,GetArgumentAsNumber(\"Value\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::TiledResourceBar", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the quantity of a tiled resource bar.", + "fullName": "Quantity", + "functionType": "ActionWithOperator", + "getterName": "Quantity", + "name": "SetQuantityOp", + "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If max quantity has NOT been set, do not enforce it.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::TiledResourceBar::PropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,GetArgumentAsNumber(\"Value\"))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If max quantity has been set, make sure quantity does not exceed it.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::TiledResourceBar::PropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], "actions": [ { "type": { @@ -7022,7 +6773,7 @@ "Object", "Behavior", "=", - "Object.Behavior::PropertyStartingQuantity()" + "clamp(GetArgumentAsNumber(\"Value\"), 0, Object.Behavior::PropertyMaxQuantity())" ] } ] @@ -7030,36 +6781,31 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "TiledSpriteObject::TiledSprite", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::TiledResourceBar", "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Display a tiled resource bar.", - "fullName": "Display a tiled resource bar", + "description": "Change the maximum quantity of a tiled resource bar.", + "fullName": "Maximum quantity", "functionType": "Action", - "group": "", - "name": "DisplayTiledBar", - "private": false, - "sentence": "Display resource bar using _PARAM0_", + "name": "SetMaxQuantity", + "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -7067,12 +6813,13 @@ "actions": [ { "type": { - "value": "TiledSpriteObject::Width" + "value": "ResourceBar::TiledResourceBar::SetPropertyMaxQuantity" }, "parameters": [ "Object", + "Behavior", "=", - "Object.Behavior::PropertyUnitWidth() * Object.Behavior::PropertyCurrentQuantity()" + "max(0,GetArgumentAsNumber(\"Value\"))" ] } ] @@ -7080,36 +6827,32 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "TiledSpriteObject::TiledSprite", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::TiledResourceBar", "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the quantity of a tiled resource bar.", - "fullName": "Quantity", - "functionType": "Action", - "group": "", - "name": "SetQuantity", - "private": false, - "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", + "description": "Change the maximum quantity of a tiled resource bar.", + "fullName": "Maximum quantity", + "functionType": "ActionWithOperator", + "getterName": "MaxQuantity", + "name": "SetMaxQuantityOp", + "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -7117,7 +6860,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::TiledResourceBar::SetPropertyMaxQuantity" }, "parameters": [ "Object", @@ -7131,37 +6874,106 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "TiledSpriteObject::TiledSprite", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ResourceBar::TiledResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], "objectGroups": [] + }, + { + "description": "the quantity of a tiled resource bar.", + "fullName": "Quantity", + "functionType": "ExpressionAndCondition", + "name": "Quantity", + "sentence": "Quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::TiledResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum quantity of a tiled resource bar.", + "fullName": "Max quantity", + "functionType": "ExpressionAndCondition", + "name": "MaxQuantity", + "sentence": "Max quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::TiledResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] } ], "propertyDescriptors": [ @@ -7194,8 +7006,19 @@ "extraInformation": [], "hidden": false, "name": "UnitWidth" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "MaxQuantity" } - ] + ], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] @@ -7203,7 +7026,6 @@ { "author": "@Bouh, D8H", "category": "General", - "description": "This extension provides: \n- Conditions to check if a global/scene/object variable exists.\n- Actions to copy object variables, global and scene variables.\n- Actions to delete an existing global/scene variable from memory.\n- Actions to create a global/scene variable using a text expression, rather than a variable name input.\n- Expressions to get the value or text from a global/scene variable using a text expression, rather than a variable name.\n\nText expressions allows to enter the name of the variable with an expression like `\"MyVar\"+ ToString(Variable(Health))`", "extensionNamespace": "", "fullName": "Extended variables support", "helpPath": "", @@ -7212,6 +7034,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/variable-box.svg", "shortDescription": "Add conditions, actions and expressions to check for the existence of a variable, copy variables, delete existing ones from memory, and create dynamic variables.", "version": "1.0.0", + "description": "This extension provides: \n- Conditions to check if a global/scene/object variable exists.\n- Actions to copy object variables, global and scene variables.\n- Actions to delete an existing global/scene variable from memory.\n- Actions to create a global/scene variable using a text expression, rather than a variable name input.\n- Expressions to get the value or text from a global/scene variable using a text expression, rather than a variable name.\n\nText expressions allows to enter the name of the variable with an expression like `\"MyVar\"+ ToString(Variable(Health))`", "origin": { "identifier": "ExtendedVariables", "name": "gdevelop-extension-store" @@ -7286,13 +7109,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7304,7 +7122,6 @@ "functionType": "Condition", "group": "Global variables", "name": "GlobalVariableExist", - "private": false, "sentence": "If the global variable _PARAM1_ exist", "events": [ { @@ -7317,13 +7134,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7380,13 +7192,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7398,7 +7205,6 @@ "functionType": "Condition", "group": "Scene variables", "name": "SceneVariableExist", - "private": false, "sentence": "If the scene variable _PARAM1_ exist", "events": [ { @@ -7411,13 +7217,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7475,23 +7276,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "ObjectToCheck", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Name of object variable", - "longDescription": "", "name": "ObjectVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7503,7 +7294,6 @@ "functionType": "Condition", "group": "Object variables", "name": "ObjectVariableExist", - "private": false, "sentence": "Object _PARAM1_ has object variable _PARAM2_", "events": [ { @@ -7516,23 +7306,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "ObjectToCheck", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Name of object variable", - "longDescription": "", "name": "ObjectVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7566,13 +7346,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable to delete", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7584,7 +7359,6 @@ "functionType": "Action", "group": "Global variables", "name": "DeleteGlobalVariable", - "private": false, "sentence": "Delete the global variable _PARAM1_ from memory", "events": [ { @@ -7597,13 +7371,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable to delete", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -7638,23 +7407,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "SceneVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -7666,7 +7425,6 @@ "functionType": "Action", "group": "Scene variables", "name": "ModifySceneVariableString", - "private": false, "sentence": "Change the text of scene variable _PARAM1_ to _PARAM2_", "events": [ { @@ -7679,23 +7437,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "SceneVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -7707,7 +7455,6 @@ "functionType": "Action", "group": "Global variables", "name": "ModifyGlobalVariableString", - "private": false, "sentence": "Change the text of global variable _PARAM1_ to _PARAM2_", "events": [ { @@ -7720,23 +7467,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "GlobalVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -7771,23 +7508,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "SceneVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -7822,23 +7549,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "SceneVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -7850,7 +7567,6 @@ "functionType": "Action", "group": "Global variables", "name": "ModifyGlobalVariable", - "private": false, "sentence": "Change the global variable _PARAM1_ with value: _PARAM2_", "events": [ { @@ -7863,23 +7579,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "GlobalVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -7914,23 +7620,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "SceneVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -7942,7 +7638,6 @@ "functionType": "Action", "group": "Scene variables", "name": "ModifySceneVariable", - "private": false, "sentence": "Change the scene variable _PARAM1_ with value: _PARAM2_", "events": [ { @@ -7955,23 +7650,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value", - "longDescription": "", "name": "SceneVariableValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -8005,13 +7690,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable to delete", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8023,7 +7703,6 @@ "functionType": "Action", "group": "Scene variables", "name": "DeleteSceneVariable", - "private": false, "sentence": "Delete the scene variable _PARAM1_ from memory", "events": [ { @@ -8036,13 +7715,8 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable to delete", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8080,43 +7754,24 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Source object", - "longDescription": "", "name": "SourceObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Variable to copy", - "longDescription": "", "name": "SourceVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Destination object", "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", "name": "TargetObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Destination variable", - "longDescription": "", "name": "TargetVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8128,7 +7783,6 @@ "functionType": "Action", "group": "Object variables", "name": "CopyObjectVariable", - "private": false, "sentence": "Copy the variable _PARAM2_ of _PARAM1_ to the variable _PARAM4_ of _PARAM3_ (clear destination first: _PARAM5_)", "events": [ { @@ -8141,53 +7795,31 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Source object", - "longDescription": "", "name": "SourceObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Variable to copy", - "longDescription": "", "name": "SourceVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Destination object", "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", "name": "TargetObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Destination variable", - "longDescription": "", "name": "TargetVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, "defaultValue": "yes", "description": "Clear destination first", - "longDescription": "", "name": "isExactCopy", "optional": true, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -8223,23 +7855,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Source object", - "longDescription": "", "name": "SourceObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Destination object", - "longDescription": "", "name": "TargetObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" } ], @@ -8251,7 +7873,6 @@ "functionType": "Action", "group": "Object variables", "name": "CopyAllObjectVariables", - "private": false, "sentence": "Copy all variables from object _PARAM1_ to object _PARAM2_ (clear destination first: _PARAM3_)", "events": [ { @@ -8264,33 +7885,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Source object", - "longDescription": "", "name": "SourceObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Destination object", - "longDescription": "", "name": "TargetObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, "defaultValue": "yes", "description": "Clear destination first", - "longDescription": "", "name": "isExactCopy", "optional": true, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -8302,7 +7910,6 @@ "functionType": "Action", "group": "Object variables", "name": "DeleteObjectVariable", - "private": false, "sentence": "Delete for the object _PARAM1_ the object variable _PARAM2_ from the memory", "events": [ { @@ -8315,23 +7922,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Name of object variable", - "longDescription": "", "name": "VariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8343,7 +7940,6 @@ "functionType": "StringExpression", "group": "Global variables", "name": "GlobalVariableString", - "private": false, "sentence": "", "events": [ { @@ -8354,15 +7950,13 @@ "eventsSheetExpanded": false } ], + "expressionType": { + "type": "string" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8374,7 +7968,6 @@ "functionType": "StringExpression", "group": "Scene variables", "name": "VariableString", - "private": false, "sentence": "", "events": [ { @@ -8385,15 +7978,13 @@ "eventsSheetExpanded": false } ], + "expressionType": { + "type": "string" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8405,7 +7996,6 @@ "functionType": "Expression", "group": "Global variables", "name": "GlobalVariable", - "private": false, "sentence": "", "events": [ { @@ -8416,15 +8006,13 @@ "eventsSheetExpanded": false } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the global variable", - "longDescription": "", "name": "GlobalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8436,7 +8024,6 @@ "functionType": "Expression", "group": "Scene variables", "name": "Variable", - "private": false, "sentence": "", "events": [ { @@ -8447,15 +8034,13 @@ "eventsSheetExpanded": false } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Name of the scene variable", - "longDescription": "", "name": "SceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" } ], @@ -8467,7 +8052,6 @@ "functionType": "Action", "group": "Convert", "name": "CopyGlobalVariableToScene", - "private": false, "sentence": "Copy the global variable:_PARAM1_ to a scene variable:_PARAM2_ (clear destination first: _PARAM3_)", "events": [ { @@ -8480,33 +8064,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Global variable to copy", - "longDescription": "", "name": "globalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Scene variable destination", - "longDescription": "", "name": "sceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, "defaultValue": "yes", "description": "Clear destination first", - "longDescription": "", "name": "isExactCopy", "optional": true, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -8518,7 +8089,6 @@ "functionType": "Action", "group": "Copy variables", "name": "CopySceneVariableToGlobal", - "private": false, "sentence": "Copy the scene variable:_PARAM1_ to a global variable:_PARAM2_ (clear destination first: _PARAM3_)", "events": [ { @@ -8531,33 +8101,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Scene variable to copy", - "longDescription": "", "name": "sceneVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "Global variable destination", - "longDescription": "", "name": "globalVariableName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, "defaultValue": "yes", "description": "Clear destination first", - "longDescription": "", "name": "isExactCopy", "optional": true, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -8570,7 +8127,6 @@ { "author": "D8H", "category": "", - "description": "This extension can be useful for:\n* Stick an accessory to a moving object,\n* Animate a skeleton.", "extensionNamespace": "", "fullName": "Stick objects to others", "helpPath": "", @@ -8579,6 +8135,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/sticker-outline.svg", "shortDescription": "Behavior to stick objects to other objects - so that they follow the position and rotation of the object they are stuck to.", "version": "0.3.4", + "description": "This extension can be useful for:\n* Stick an accessory to a moving object,\n* Animate a skeleton.", "origin": { "identifier": "Sticker", "name": "gdevelop-extension-store" @@ -8599,9 +8156,7 @@ "description": "Check if the object is stuck to another object.", "fullName": "Is stuck to another object", "functionType": "Condition", - "group": "", "name": "IsStuck", - "private": false, "sentence": "_PARAM1_ is stuck to _PARAM3_", "events": [ { @@ -8614,33 +8169,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Sticker", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Sticker behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Sticker::Sticker", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Basis", - "longDescription": "", "name": "BasisObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" } ], @@ -8655,12 +8196,9 @@ "objectType": "", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -8673,22 +8211,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Sticker::Sticker", "type": "behavior" } @@ -8696,12 +8225,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPreEvents", - "private": false, "sentence": "", "events": [ { @@ -8714,22 +8240,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Sticker::Sticker", "type": "behavior" } @@ -8737,12 +8254,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPostEvents", - "private": false, "sentence": "", "events": [ { @@ -8755,22 +8269,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Sticker::Sticker", "type": "behavior" } @@ -8781,9 +8286,7 @@ "description": "Stick on another object.", "fullName": "Stick", "functionType": "Action", - "group": "", "name": "Stick", - "private": false, "sentence": "Stick _PARAM0_ to _PARAM2_", "events": [ { @@ -8796,33 +8299,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Sticker::Sticker", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object to stick to", - "longDescription": "", "name": "BasisObject", - "optional": false, - "supplementaryInformation": "", "type": "objectList" } ], @@ -8832,9 +8321,7 @@ "description": "Unstick from the object it was stuck to.", "fullName": "Unstick", "functionType": "Action", - "group": "", "name": "Unstick", - "private": false, "sentence": "Unstick _PARAM0_", "events": [ { @@ -8847,22 +8334,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Sticker::Sticker", "type": "behavior" } @@ -8870,12 +8348,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onDestroy", - "private": false, "sentence": "", "events": [ { @@ -8888,22 +8363,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Sticker::Sticker", "type": "behavior" } @@ -8922,7 +8388,8 @@ "hidden": false, "name": "OnlyFollowPosition" } - ] + ], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] @@ -8930,7 +8397,6 @@ { "author": "Tristan Rhodes (https://victrisgames.itch.io/)", "category": "", - "description": "Select one or more methods of shaking:\n- Position: Shake the X and/or Y position of the object \n- Angle: Shake the angle (rotation) of the object \n- Scale: Shake the scale of the object (must be a sprite)\n\nControl how the object shakes:\n- Amplitude: How far the object moves during each shake\n- Duration: Amount of time to shake the object\n- Time between shakes: Amount of time between each movement of the object\n- Keep shaking until stopped (boolean)\n\nTips:\n- For a single-shake effect, set the \"Time between shakes\" to be equal to \"Duration\" (great for a hit or impact)\n- To make the single-shake move in the opposite direction, use negative numbers \n- To repeat a single-shake effect in a loop, add a condition \"Object is not shaking\" \n- Use a long \"Time between shakes\" to simulate a slow moving object (like a ship rocking back and forth)\n- Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. \n- Use \"Shake until stopped\" to simulate engine vibration, earthquake, or pulsing", "extensionNamespace": "", "fullName": "Shake Object (position, angle, scale)", "helpPath": "https://victrisgames.itch.io/gdevelop-camera-shake-example", @@ -8939,6 +8405,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/arrow-all.svg", "shortDescription": "Shake an object, using one or more ways to shake (position, angle, scale).", "version": "1.5.5", + "description": "Select one or more methods of shaking:\n- Position: Shake the X and/or Y position of the object \n- Angle: Shake the angle (rotation) of the object \n- Scale: Shake the scale of the object (must be a sprite)\n\nControl how the object shakes:\n- Amplitude: How far the object moves during each shake\n- Duration: Amount of time to shake the object\n- Time between shakes: Amount of time between each movement of the object\n- Keep shaking until stopped (boolean)\n\nTips:\n- For a single-shake effect, set the \"Time between shakes\" to be equal to \"Duration\" (great for a hit or impact)\n- To make the single-shake move in the opposite direction, use negative numbers \n- To repeat a single-shake effect in a loop, add a condition \"Object is not shaking\" \n- Use a long \"Time between shakes\" to simulate a slow moving object (like a ship rocking back and forth)\n- Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. \n- Use \"Shake until stopped\" to simulate engine vibration, earthquake, or pulsing", "origin": { "identifier": "ShakeObject", "name": "gdevelop-extension-store" @@ -8969,9 +8436,7 @@ "description": "Shake an object, using one or more ways to shake (position, angle).", "fullName": "Shake object (position, angle)", "functionType": "Action", - "group": "", "name": "ShakeObject_PositionAngle", - "private": false, "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_. Wait _PARAM6_ seconds between shakes. Keep shaking until stopped: _PARAM7_", "events": [ { @@ -9330,95 +8795,54 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Duration of shake (in seconds) (Default: 0.5) ", - "longDescription": "", "name": "Duration", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", - "longDescription": "", "name": "PowerX", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", - "longDescription": "", "name": "PowerY", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", - "longDescription": "", "name": "PowerAngle", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amount of time between shakes (in seconds) (Default: 0.08)", - "longDescription": "", "name": "TimeBetweenShakes", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Keep shaking until stopped", "longDescription": "Duration value will be ignored", "name": "ShakeForever", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPostEvents", - "private": false, "sentence": "", "events": [ { @@ -10904,22 +10328,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" } @@ -10930,9 +10345,7 @@ "description": "Stop any shaking of object that was initiated by the Shake Object extension.", "fullName": "Stop shaking the object", "functionType": "Action", - "group": "", "name": "StopShaking", - "private": false, "sentence": "Stop shaking _PARAM0_", "events": [ { @@ -10966,22 +10379,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" } @@ -10992,9 +10396,7 @@ "description": "Check if an object is shaking.", "fullName": "Check if an object is shaking", "functionType": "Condition", - "group": "", "name": "IsShaking", - "private": false, "sentence": "_PARAM0_ is shaking", "events": [ { @@ -11026,22 +10428,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" } @@ -11049,7 +10442,8 @@ "objectGroups": [] } ], - "propertyDescriptors": [] + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] }, { "description": "Shake an object, using one or more ways to shake (position, angle, scale)\nThis behavior can only be used on sprite objects.", @@ -11061,9 +10455,7 @@ "description": "Shake an object, using one or more ways to shake (position, angle, scale).", "fullName": "Shake object (position, angle, scale)", "functionType": "Action", - "group": "", "name": "ShakeObject_PositionAngleScale", - "private": false, "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_, and scale amplitude _PARAM6_. Wait _PARAM7_ seconds between shakes. Keep shaking until stopped: _PARAM8_", "events": [ { @@ -11433,105 +10825,60 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "Sprite", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Duration of shake (in seconds) (Default: 0.5)", - "longDescription": "", "name": "Duration", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", - "longDescription": "", "name": "PowerX", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", - "longDescription": "", "name": "PowerY", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", - "longDescription": "", "name": "PowerAngle", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amplitude of scale shake (in percent change) (For example: 5)", - "longDescription": "", "name": "PowerScale", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Amount of time between shakes (in seconds) (Default: 0.08)", - "longDescription": "", "name": "TimeBetweenShakes", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Keep shaking until stopped", "longDescription": "Duration value will be ignored", "name": "ShakeForever", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPostEvents", - "private": false, "sentence": "", "events": [ { @@ -13393,22 +12740,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "Sprite", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", "type": "behavior" } @@ -13419,9 +12758,7 @@ "description": "Stop shaking an object.", "fullName": "Stop shaking an object", "functionType": "Action", - "group": "", "name": "StopShaking", - "private": false, "sentence": "Stop shaking _PARAM0_", "events": [ { @@ -13455,22 +12792,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "Sprite", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", "type": "behavior" } @@ -13481,9 +12810,7 @@ "description": "Check if an object is shaking.", "fullName": "Check if an object is shaking", "functionType": "Condition", - "group": "", "name": "IsShaking", - "private": false, "sentence": "_PARAM0_ is shaking", "events": [ { @@ -13515,22 +12842,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "Sprite", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", "type": "behavior" } @@ -13538,7 +12857,8 @@ "objectGroups": [] } ], - "propertyDescriptors": [] + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] @@ -13546,7 +12866,6 @@ { "author": "VegeTato, arthuro555", "category": "", - "description": "Convenience conditions, actions and behaviors for timers to trigger a condition every X seconds.", "extensionNamespace": "", "fullName": "Repeat every X seconds", "helpPath": "", @@ -13555,6 +12874,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/repeat.svg", "shortDescription": "This allows to trigger an event every X seconds.", "version": "0.1.0", + "description": "Convenience conditions, actions and behaviors for timers to trigger a condition every X seconds.", "origin": { "identifier": "RepeatEveryXSeconds", "name": "gdevelop-extension-store" @@ -13575,9 +12895,7 @@ "description": "Triggers every X seconds.", "fullName": "Repeat every X seconds", "functionType": "Condition", - "group": "", "name": "Repeat", - "private": false, "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds", "events": [ { @@ -13639,23 +12957,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "The name of the timer to loop", - "longDescription": "", "name": "timerName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "The time in seconds between each trigger", - "longDescription": "", "name": "time", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -13665,9 +12973,7 @@ "description": "Triggers every X seconds X amount of times.", "fullName": "Repeat every X seconds in X number", "functionType": "Condition", - "group": "", "name": "RepeatXTimes", - "private": false, "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds _PARAM3_ times", "events": [ { @@ -13777,33 +13083,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "The name of the timer to loop", - "longDescription": "", "name": "timerName", - "optional": false, - "supplementaryInformation": "", "type": "string" }, { - "codeOnly": false, - "defaultValue": "", "description": "The time in seconds between each trigger", - "longDescription": "", "name": "time", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "The limit of loops", "longDescription": "The condition will trigger at most this amount of times. Make it -1 for looping forever.", "name": "limit", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -13818,12 +13110,9 @@ "objectType": "", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -13844,22 +13133,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", "type": "behavior" } @@ -13870,9 +13150,7 @@ "description": "Triggers every X seconds, where X is defined in the behavior properties.", "fullName": "Repeat every X seconds", "functionType": "Condition", - "group": "", "name": "Repeat", - "private": false, "sentence": "Recurring timer _PARAM1_ of _PARAM0_ has triggered", "events": [ { @@ -13953,22 +13231,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", "type": "behavior" } @@ -13979,9 +13248,7 @@ "description": "Pauses a recurring timer.", "fullName": "Pause a recurring timer", "functionType": "Action", - "group": "", "name": "Pause", - "private": false, "sentence": "Pause recurring timer _PARAM1_ of _PARAM0_", "events": [ { @@ -14002,22 +13269,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", "type": "behavior" } @@ -14028,9 +13286,7 @@ "description": "Resumes a paused recurring timer.", "fullName": "Resume a recurring timer", "functionType": "Action", - "group": "", "name": "Resume", - "private": false, "sentence": "Resume recurring timer _PARAM1_ of _PARAM0_", "events": [ { @@ -14051,22 +13307,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", "type": "behavior" } @@ -14077,9 +13324,7 @@ "description": "Allows to trigger the recurring timer X times again.", "fullName": "Reset the limit", "functionType": "Action", - "group": "", "name": "ResetLimit", - "private": false, "sentence": "Allow to trigger the recurring timer _PARAM1_ of _PARAM0_ X times again", "events": [ { @@ -14102,22 +13347,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", "type": "behavior" } @@ -14166,7 +13402,8 @@ "hidden": true, "name": "Counter" } - ] + ], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] @@ -14174,7 +13411,6 @@ { "author": "@4ian", "category": "General", - "description": "Manage health (life) and shield points of an object. Health can be assigned to players, enemies, NPCs, or even inanimate objects such as breaking doors and mining rocks.\n\nHow to use:\n\n- Set desired values in \"Health\" and \"Shield\" behavior properties\n- To apply damage use “Damage an object” or “Damage an object protected by a shield”\n- To heal health, use “Heal object” action \n- To activate the shield, use “Activate Shield” action\n- Health and shield regeneration will happen automatically based on properties\n \nTips:\n\n- While damage cooldown is active, no damage will be applied to health or shield\n- Try using the “Blink” extension while damage cooldown is active\n- Use the “Is just damaged” condition to trigger audio and visual effects\n\nHealth properties:\n\n- Health (life points) Used for starting health\n- Maximum health (0 for no maximum)\n- Damage cooldown (seconds) Use \"0\" for no cooldown\n- Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled\n- Delay (seconds) before health regeneration starts after being hit\n- Allow heal to increase health above max health (will not exceed max health)\n\nShield properties:\n\n- Max shield points (Shield will start with this many points when activated)\n- Duration of shield (seconds) Use \"0\" to disable shield timer\n- Rate of shield regeneration (points per second)\n- Shield will block all excess damage when shield is destroyed\n- Delay (seconds) before shield regeneration starts after being hit\n- Regenerate shield when it has zero points\n", "extensionNamespace": "", "fullName": "Health (life) points and shield", "helpPath": "", @@ -14183,6 +13419,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/heart-half-full.svg", "shortDescription": "Manage life points and a protective shield.", "version": "0.1.0", + "description": "Manage health (life) and shield points of an object. Health can be assigned to players, enemies, NPCs, or even inanimate objects such as breaking doors and mining rocks.\n\nHow to use:\n\n- Set desired values in \"Health\" and \"Shield\" behavior properties\n- To apply damage use “Damage an object” or “Damage an object protected by a shield”\n- To heal health, use “Heal object” action \n- To activate the shield, use “Activate Shield” action\n- Health and shield regeneration will happen automatically based on properties\n \nTips:\n\n- While damage cooldown is active, no damage will be applied to health or shield\n- Try using the “Blink” extension while damage cooldown is active\n- Use the “Is just damaged” condition to trigger audio and visual effects\n\nHealth properties:\n\n- Health (life points) Used for starting health\n- Maximum health (0 for no maximum)\n- Damage cooldown (seconds) Use \"0\" for no cooldown\n- Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled\n- Delay (seconds) before health regeneration starts after being hit\n- Allow heal to increase health above max health (will not exceed max health)\n\nShield properties:\n\n- Max shield points (Shield will start with this many points when activated)\n- Duration of shield (seconds) Use \"0\" to disable shield timer\n- Rate of shield regeneration (points per second)\n- Shield will block all excess damage when shield is destroyed\n- Delay (seconds) before shield regeneration starts after being hit\n- Regenerate shield when it has zero points\n", "origin": { "identifier": "Health", "name": "gdevelop-extension-store" @@ -14211,12 +13448,9 @@ "objectType": "", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPreEvents", - "private": false, "sentence": "", "events": [ { @@ -14370,22 +13604,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -14398,7 +13623,6 @@ "functionType": "Action", "group": "Health", "name": "Hit", - "private": false, "sentence": "Damage _PARAM0_, removing _PARAM2_ points from its health", "events": [ { @@ -14553,33 +13777,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value of the damage to do (will be removed from object health)", - "longDescription": "", "name": "DamageValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -14591,7 +13801,6 @@ "functionType": "Action", "group": "Health", "name": "SetHealth", - "private": false, "sentence": "Set health of _PARAM0_ to _PARAM2_ points", "events": [ { @@ -14643,33 +13852,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "New health value", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -14681,7 +13876,6 @@ "functionType": "Action", "group": "Health", "name": "Heal", - "private": false, "sentence": "Heal _PARAM0_ with _PARAM2_ health points", "events": [ { @@ -14769,33 +13963,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Points to heal (will be added to object health)", - "longDescription": "", "name": "HealValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -14807,7 +13987,6 @@ "functionType": "Action", "group": "Health", "name": "SetMaxHealth", - "private": false, "sentence": "Set maximum health of _PARAM0_ to _PARAM2_ points", "events": [ { @@ -14830,33 +14009,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Maximum health", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -14868,7 +14033,6 @@ "functionType": "Action", "group": "Shield", "name": "SetHealthRegenRate", - "private": false, "sentence": "Set rate of health regen of _PARAM0_ to _PARAM2_ points per second", "events": [ { @@ -14891,33 +14055,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Rate of regen", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -14929,7 +14079,6 @@ "functionType": "Action", "group": "Health", "name": "SetCooldownDuration", - "private": false, "sentence": "Set duration of damage cooldown on _PARAM0_ to _PARAM2_ seconds", "events": [ { @@ -14952,33 +14101,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Duration of damage cooldown (seconds)", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -14990,7 +14125,6 @@ "functionType": "Action", "group": "Health", "name": "SetHealthRegenDelay", - "private": false, "sentence": "Set delay before health regeneration starts on _PARAM0_ to _PARAM2_ seconds", "events": [ { @@ -15013,33 +14147,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Delay (seconds)", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -15051,7 +14171,6 @@ "functionType": "Action", "group": "Health", "name": "AllowOverHealing", - "private": false, "sentence": "Allow over-healing on _PARAM0_: _PARAM2_", "events": [ { @@ -15098,33 +14217,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Allow over-healing", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -15136,7 +14241,6 @@ "functionType": "Action", "group": "Health", "name": "SetHitAtLeastOnce", - "private": false, "sentence": "Mark _PARAM0_ as hit at least once: _PARAM2_", "events": [ { @@ -15183,33 +14287,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Hit at least once", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -15221,7 +14311,6 @@ "functionType": "Action", "group": "Health", "name": "SetJustDamaged", - "private": false, "sentence": "Mark _PARAM0_ as just damaged: _PARAM2_", "events": [ { @@ -15268,33 +14357,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Just damaged", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -15306,7 +14381,6 @@ "functionType": "Condition", "group": "Health", "name": "HitAtLeastOnce", - "private": false, "sentence": "_PARAM0_ has just been hit at least once", "events": [ { @@ -15350,22 +14424,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15378,7 +14443,6 @@ "functionType": "Condition", "group": "Health", "name": "IsJustDamaged", - "private": false, "sentence": "_PARAM0_ has just been damaged", "events": [ { @@ -15422,22 +14486,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15450,7 +14505,6 @@ "functionType": "Condition", "group": "Health", "name": "IsDamageCooldownActive", - "private": false, "sentence": "Damage cooldown on _PARAM0_ is active", "events": [ { @@ -15516,22 +14570,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15544,7 +14589,6 @@ "functionType": "Condition", "group": "Health", "name": "IsDead", - "private": false, "sentence": "_PARAM0_ is dead", "events": [ { @@ -15590,22 +14634,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15618,7 +14653,6 @@ "functionType": "Expression", "group": "Health", "name": "MaxHealth", - "private": false, "sentence": "", "events": [ { @@ -15636,24 +14670,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15666,7 +14694,6 @@ "functionType": "Expression", "group": "Health", "name": "DamageCooldownDuration", - "private": false, "sentence": "", "events": [ { @@ -15684,24 +14711,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15714,7 +14735,6 @@ "functionType": "Expression", "group": "Health", "name": "Health", - "private": false, "sentence": "", "events": [ { @@ -15732,24 +14752,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15762,7 +14776,6 @@ "functionType": "Expression", "group": "Health", "name": "HealthRegenDelay", - "private": false, "sentence": "", "events": [ { @@ -15780,24 +14793,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15810,7 +14817,6 @@ "functionType": "Expression", "group": "Health", "name": "HealthRegenRate", - "private": false, "sentence": "", "events": [ { @@ -15828,24 +14834,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15858,7 +14858,6 @@ "functionType": "Expression", "group": "Health", "name": "DamageCooldownRemaining", - "private": false, "sentence": "", "events": [ { @@ -15901,24 +14900,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15931,7 +14924,6 @@ "functionType": "Expression", "group": "Health", "name": "TimeSinceLastHit", - "private": false, "sentence": "", "events": [ { @@ -15949,24 +14941,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -15974,12 +14960,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -16009,22 +14992,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -16113,7 +15087,8 @@ "hidden": true, "name": "HitAtLeastOnce" } - ] + ], + "sharedPropertyDescriptors": [] }, { "description": "Protective shield that prevents damage to health points.", @@ -16122,12 +15097,9 @@ "objectType": "", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPreEvents", - "private": false, "sentence": "", "events": [ { @@ -16376,22 +15348,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -16404,7 +15367,6 @@ "functionType": "Action", "group": "Health", "name": "ShieldHit", - "private": false, "sentence": "Damage shield and health of _PARAM0_ for _PARAM2_ points of damage", "events": [ { @@ -16737,33 +15699,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Value of the damage to do (will be removed from object health)", - "longDescription": "", "name": "DamageValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -16775,7 +15723,6 @@ "functionType": "Action", "group": "Shield", "name": "SetMaxShield", - "private": false, "sentence": "Set maximum shield of _PARAM0_ to _PARAM2_ points", "events": [ { @@ -16798,33 +15745,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Maximum shield", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -16836,7 +15769,6 @@ "functionType": "Action", "group": "Shield", "name": "SeShieldPoints", - "private": false, "sentence": "Set shield on _PARAM0_ to _PARAM2_ points", "events": [ { @@ -16859,33 +15791,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Shield points", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -16897,7 +15815,6 @@ "functionType": "Action", "group": "Shield", "name": "SetShieldRegenRate", - "private": false, "sentence": "Set rate of shield regeneration of _PARAM0_ to _PARAM2_ points per second", "events": [ { @@ -16920,33 +15837,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Rate of regen", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -16958,7 +15861,6 @@ "functionType": "Action", "group": "Shield", "name": "SetShieldRegenDelay", - "private": false, "sentence": "Set delay before shield regeneration starts on _PARAM0_ to _PARAM2_ seconds", "events": [ { @@ -16981,33 +15883,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Delay (seconds)", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -17019,7 +15907,6 @@ "functionType": "Action", "group": "Shield", "name": "SetShieldDuration", - "private": false, "sentence": "Set duration of shield on _PARAM0_ to _PARAM2_ seconds", "events": [ { @@ -17042,33 +15929,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Duration of shield (seconds)", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -17080,7 +15953,6 @@ "functionType": "Action", "group": "Shield", "name": "ActivateShield", - "private": false, "sentence": "Activate (or renew) shield on _PARAM0_", "events": [ { @@ -17112,22 +15984,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17140,7 +16003,6 @@ "functionType": "Action", "group": "Shield", "name": "SetMaxShieldPoints", - "private": false, "sentence": "Set max shield of _PARAM0_ to _PARAM2_ points", "events": [ { @@ -17163,33 +16025,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Shield points", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -17201,7 +16049,6 @@ "functionType": "Action", "group": "Shield", "name": "ShieldBlockExcessDamage", - "private": false, "sentence": "Shield on _PARAM0_ blocks excess damage when it breaks: _PARAM2_", "events": [ { @@ -17248,33 +16095,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Shield blocks excess damage", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -17286,7 +16119,6 @@ "functionType": "Action", "group": "Shield", "name": "RegenShieldWhenZero", - "private": false, "sentence": "Regenerate shield on _PARAM0_ when it has zero points: _PARAM2_", "events": [ { @@ -17333,33 +16165,19 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Regen shield when it has zero points", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -17371,7 +16189,6 @@ "functionType": "Condition", "group": "Shield", "name": "IsShieldJustDamaged", - "private": false, "sentence": "Shield on _PARAM0_ has just been damaged", "events": [ { @@ -17415,22 +16232,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17443,7 +16251,6 @@ "functionType": "Condition", "group": "Shield", "name": "IsShieldActive", - "private": false, "sentence": "Shield on _PARAM0_ is active", "events": [ { @@ -17571,22 +16378,13 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17599,7 +16397,6 @@ "functionType": "Expression", "group": "Shield", "name": "MaxShield", - "private": false, "sentence": "", "events": [ { @@ -17617,24 +16414,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17647,7 +16438,6 @@ "functionType": "Expression", "group": "Shield", "name": "ShieldDuration", - "private": false, "sentence": "", "events": [ { @@ -17665,24 +16455,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17695,7 +16479,6 @@ "functionType": "Expression", "group": "Shield", "name": "ShieldRegenDelay", - "private": false, "sentence": "", "events": [ { @@ -17713,24 +16496,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17743,7 +16520,6 @@ "functionType": "Expression", "group": "Shield", "name": "ShieldRegenRate", - "private": false, "sentence": "", "events": [ { @@ -17761,24 +16537,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17791,7 +16561,6 @@ "functionType": "Expression", "group": "Shield", "name": "ShieldTimeRemaining", - "private": false, "sentence": "", "events": [ { @@ -17835,24 +16604,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -17865,7 +16628,6 @@ "functionType": "Expression", "group": "Shield", "name": "ShieldPoints", - "private": false, "sentence": "", "events": [ { @@ -17883,24 +16645,18 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, - "supplementaryInformation": "", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -18001,7 +16757,8 @@ "hidden": true, "name": "IsShieldJustDamaged" } - ] + ], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] @@ -18009,7 +16766,6 @@ { "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", "category": "General", - "description": "How to use:\n- \n\nTips:\n- ", "extensionNamespace": "", "fullName": "Draw resource bar (NEW)", "helpPath": "", @@ -18018,6 +16774,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_loading_progress_bar.svg", "shortDescription": "Draw a resource bar that represents health, shield, or any value.", "version": "0.0.1", + "description": "How to use:\n- \n\nTips:\n- ", "origin": { "identifier": "DraggableSliderControl", "name": "gdevelop-extension-store" @@ -18044,12 +16801,9 @@ "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -18129,22 +16883,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -18152,12 +16898,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPostEvents", - "private": false, "sentence": "", "events": [ { @@ -18551,22 +17294,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -18579,7 +17314,6 @@ "functionType": "Expression", "group": "Bar", "name": "Value", - "private": false, "sentence": "", "events": [ { @@ -18597,24 +17331,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -18627,7 +17356,6 @@ "functionType": "Action", "group": "Resource Bar", "name": "SetValue", - "private": false, "sentence": "Change the value of _PARAM0_: _PARAM2_", "events": [ { @@ -18789,33 +17517,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Resource bar value", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -18827,7 +17542,6 @@ "functionType": "Expression", "group": "Value configuration", "name": "ValueMin", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -18845,24 +17559,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -18875,7 +17584,6 @@ "functionType": "Action", "group": "Value configuration", "name": "SetValueMin", - "private": false, "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", "events": [ { @@ -18909,33 +17617,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Minimum value", - "longDescription": "", "name": "ValueMin", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -18947,7 +17642,6 @@ "functionType": "Expression", "group": "Value configuration", "name": "ValueMax", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -18965,24 +17659,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -18995,7 +17684,6 @@ "functionType": "Expression", "group": "Bar configuration", "name": "BarThickness", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -19013,24 +17701,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -19043,7 +17726,6 @@ "functionType": "Expression", "group": "Bar configuration", "name": "BarLength", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -19061,24 +17743,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -19091,7 +17768,6 @@ "functionType": "Action", "group": "Bar value configuration", "name": "SetValueMax", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -19125,33 +17801,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Maximum value", - "longDescription": "", "name": "ValueMax", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -19163,7 +17826,6 @@ "functionType": "Expression", "group": "Value configuration", "name": "TickSpacing", - "private": false, "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { @@ -19181,35 +17843,25 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Tick spacing", - "longDescription": "", "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -19221,7 +17873,6 @@ "functionType": "Action", "group": "Value configuration", "name": "SetTickSpacing", - "private": false, "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { @@ -19255,33 +17906,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Tick spacing", - "longDescription": "", "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -19293,7 +17931,6 @@ "functionType": "Action", "group": "Bar configuration", "name": "SetBarLength", - "private": false, "sentence": "Change bar length of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -19366,33 +18003,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Track width", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -19404,7 +18028,6 @@ "functionType": "Action", "group": "Bar configuration", "name": "SetBarThickness", - "private": false, "sentence": "Change the bar thickness of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -19508,33 +18131,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Track thickness", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -19546,7 +18156,6 @@ "functionType": "Action", "group": "Bar configuration", "name": "SetRoundedBar", - "private": false, "sentence": "Draw _PARAM0_ with a rounded bar: _PARAM2_", "events": [ { @@ -19622,33 +18231,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Rounded bar", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -19660,7 +18256,6 @@ "functionType": "Action", "group": "Bar configuration", "name": "SetInactiveBarOpacity", - "private": false, "sentence": "Change inactive bar opacity of _PARAM0_ to _PARAM2_", "events": [ { @@ -19693,33 +18288,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Inactive bar opacity", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -19731,7 +18313,6 @@ "functionType": "Action", "group": "Bar configuration", "name": "SetActiveBarOpacity", - "private": false, "sentence": "Change active bar opacity of _PARAM0_ to _PARAM2_", "events": [ { @@ -19764,33 +18345,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Active bar opacity", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -19802,7 +18370,6 @@ "functionType": "Action", "group": "Bar configuration", "name": "SetActiveBarColor", - "private": false, "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", "events": [ { @@ -19835,33 +18402,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Active bar color", - "longDescription": "", "name": "Color", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -19873,7 +18427,6 @@ "functionType": "Action", "group": "Bar configuration", "name": "SetInactiveBarColor", - "private": false, "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", "events": [ { @@ -19906,33 +18459,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Inactive bar color", - "longDescription": "", "name": "Color", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -19978,22 +18518,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" } @@ -20004,9 +18536,7 @@ "description": "Draw health bar.", "fullName": "Draw health bar", "functionType": "Action", - "group": "", "name": "DrawHealthBar", - "private": false, "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", "events": [ { @@ -20053,42 +18583,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object with health", - "longDescription": "", "name": "ObjectWithHealth", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Health behavior", - "longDescription": "", "name": "HealthBehavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -20099,9 +18612,7 @@ "description": "Draw shield bar.", "fullName": "Draw shield bar", "functionType": "Action", - "group": "", "name": "DrawShieldBar", - "private": false, "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", "events": [ { @@ -20148,42 +18659,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object with shield", - "longDescription": "", "name": "ObjectWithShield", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Shield behavior", - "longDescription": "", "name": "ShieldBehavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -20194,9 +18688,7 @@ "description": "Draw resource bar.", "fullName": "Draw resource bar", "functionType": "Action", - "group": "", "name": "DrawResourceBar", - "private": false, "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", "events": [ { @@ -20243,42 +18735,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBar::DrawResourceBar", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Current value", - "longDescription": "", "name": "CurrentValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Max value", - "longDescription": "", "name": "MaxValue", - "optional": false, "supplementaryInformation": "Health::Health", "type": "expression" } @@ -20427,7 +18902,8 @@ "hidden": false, "name": "ChangeDuration" } - ] + ], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] @@ -20435,7 +18911,6 @@ { "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", "category": "Input", - "description": "Draws a draggable slider that users can move to select a numerical value.\nThe value range, tick spacing, and the appearance of the slider can be defined with properties.\n\nHow to use:\n- Add this behavior a **Shape Painter** object\n- Place an instance of that shape painter on the screen where you want the slider to appear\n- Use the \"Value\" expression to find the Value based on the position of the slider\n\nTips:\n- You can disable the slider to prevent a user from interacting with it\n- You can set the Value of the slider and the slider will move to the correct position\n\nFurther details can be found in [this tutorial video](https://youtu.be/iiTUwdAT_hs).\n\nBreaking changes (1.0.0)\n- Track thickness and length properties replaced track width and height. These 2 properties must be set again if they were different from the default size.\n- Hidden sliders can be dragged. The \"enable\" action must be used to disable them.\n", "extensionNamespace": "", "fullName": "Draggable slider", "helpPath": "", @@ -20444,6 +18919,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", "shortDescription": "A draggable slider that users can move to select a numerical value.", "version": "1.0.5", + "description": "Draws a draggable slider that users can move to select a numerical value.\nThe value range, tick spacing, and the appearance of the slider can be defined with properties.\n\nHow to use:\n- Add this behavior a **Shape Painter** object\n- Place an instance of that shape painter on the screen where you want the slider to appear\n- Use the \"Value\" expression to find the Value based on the position of the slider\n\nTips:\n- You can disable the slider to prevent a user from interacting with it\n- You can set the Value of the slider and the slider will move to the correct position\n\nFurther details can be found in [this tutorial video](https://youtu.be/iiTUwdAT_hs).\n\nBreaking changes (1.0.0)\n- Track thickness and length properties replaced track width and height. These 2 properties must be set again if they were different from the default size.\n- Hidden sliders can be dragged. The \"enable\" action must be used to disable them.\n", "origin": { "identifier": "DraggableSliderControl", "name": "gdevelop-extension-store" @@ -20469,12 +18945,9 @@ "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -20614,22 +19087,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -20637,12 +19102,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPreEvents", - "private": false, "sentence": "", "events": [ { @@ -21274,22 +19736,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -21297,12 +19751,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "doStepPostEvents", - "private": false, "sentence": "", "events": [ { @@ -22028,22 +20479,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22056,7 +20499,6 @@ "functionType": "Condition", "group": "Slider", "name": "IsBeingDragged", - "private": false, "sentence": "_PARAM0_ is being dragged", "events": [ { @@ -22086,22 +20528,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22114,7 +20548,6 @@ "functionType": "Condition", "group": "Slider", "name": "IsEnabled", - "private": false, "sentence": "Interactions of _PARAM0_ are enabled", "events": [ { @@ -22144,22 +20577,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22172,7 +20597,6 @@ "functionType": "Action", "group": "Slider", "name": "SetEnabled", - "private": false, "sentence": "Enable interactions of _PARAM0_: _PARAM2_", "events": [ { @@ -22306,33 +20730,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Enable", - "longDescription": "", "name": "Enable", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -22344,7 +20755,6 @@ "functionType": "Expression", "group": "Slider", "name": "Value", - "private": false, "sentence": "", "events": [ { @@ -22362,24 +20772,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22392,7 +20797,6 @@ "functionType": "Action", "group": "Slider", "name": "SetValue", - "private": false, "sentence": "Change the value of _PARAM0_: _PARAM2_", "events": [ { @@ -22554,33 +20958,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Slider value", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -22592,7 +20983,6 @@ "functionType": "Expression", "group": "Slider value configuration", "name": "ValueMin", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -22610,24 +21000,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22640,7 +21025,6 @@ "functionType": "Action", "group": "Slider value configuration", "name": "SetValueMin", - "private": false, "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", "events": [ { @@ -22674,33 +21058,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Minimum value", - "longDescription": "", "name": "ValueMin", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -22712,7 +21083,6 @@ "functionType": "Expression", "group": "Slider value configuration", "name": "ValueMax", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -22730,24 +21100,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22760,7 +21125,6 @@ "functionType": "Expression", "group": "Slider track configuration", "name": "TrackThickness", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -22778,24 +21142,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22808,7 +21167,6 @@ "functionType": "Expression", "group": "Slider track configuration", "name": "TrackLength", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -22826,24 +21184,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22856,7 +21209,6 @@ "functionType": "Expression", "group": "Slider thumb configuration", "name": "ThumbHeight", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -22874,24 +21226,19 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -22904,7 +21251,6 @@ "functionType": "Action", "group": "Slider value configuration", "name": "SetValueMax", - "private": false, "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { @@ -22938,33 +21284,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Maximum value", - "longDescription": "", "name": "ValueMax", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -22976,7 +21309,6 @@ "functionType": "Expression", "group": "Slider value configuration", "name": "TickSpacing", - "private": false, "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { @@ -22994,35 +21326,25 @@ ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Tick spacing", - "longDescription": "", "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23034,7 +21356,6 @@ "functionType": "Action", "group": "Slider value configuration", "name": "SetTickSpacing", - "private": false, "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { @@ -23068,33 +21389,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Tick spacing", - "longDescription": "", "name": "TickSpacing", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23106,7 +21414,6 @@ "functionType": "Action", "group": "Slider track configuration", "name": "SetTrackLength", - "private": false, "sentence": "Change track length of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -23179,33 +21486,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Track width", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23217,7 +21511,6 @@ "functionType": "Action", "group": "Slider track configuration", "name": "SetTrackThickness", - "private": false, "sentence": "Change track thickness of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -23321,33 +21614,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Track thickness", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23359,7 +21639,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetThumbWidth", - "private": false, "sentence": "Change thumb width of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -23421,33 +21700,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Thumb width", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23459,7 +21725,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetThumbHeight", - "private": false, "sentence": "Change thumb height of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -23521,33 +21786,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Thumb height", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23559,7 +21811,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetHaloRadius", - "private": false, "sentence": "Change halo radius of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -23592,33 +21843,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Halo radius", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23630,7 +21868,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetHaloOpacityHover", - "private": false, "sentence": "Change halo opacity when hovered of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -23663,33 +21900,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Halo opacity (hover)", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23701,7 +21925,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetHaloOpacityPressed", - "private": false, "sentence": "Change halo opacity when pressed of _PARAM0_ to _PARAM2_ px", "events": [ { @@ -23734,33 +21957,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Halo opacity (pressed)", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -23772,7 +21982,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetThumbShape", - "private": false, "sentence": "Change shape of _PARAM0_ to _PARAM2_", "events": [ { @@ -23858,32 +22067,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "New thumb shape", - "longDescription": "", "name": "Shape", - "optional": false, "supplementaryInformation": "[\"circle\",\"rectangle\"]", "type": "stringWithSelector" } @@ -23896,7 +22093,6 @@ "functionType": "Action", "group": "Slider track configuration", "name": "SetRoundedTrack", - "private": false, "sentence": "Draw _PARAM0_ with a rounded track: _PARAM2_", "events": [ { @@ -23972,33 +22168,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Rounded track", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "yesorno" } ], @@ -24010,7 +22193,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetThumbOpacity", - "private": false, "sentence": "Change thumb opacity of _PARAM0_ to _PARAM2_", "events": [ { @@ -24043,33 +22225,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Thumb opacity", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -24081,7 +22250,6 @@ "functionType": "Action", "group": "Slider track configuration", "name": "SetInactiveTrackOpacity", - "private": false, "sentence": "Change inactive track opacity of _PARAM0_ to _PARAM2_", "events": [ { @@ -24114,33 +22282,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Inactive track opacity", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -24152,7 +22307,6 @@ "functionType": "Action", "group": "Slider track configuration", "name": "SetActiveTrackOpacity", - "private": false, "sentence": "Change active track opacity of _PARAM0_ to _PARAM2_", "events": [ { @@ -24185,33 +22339,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Active track opacity", - "longDescription": "", "name": "Value", - "optional": false, - "supplementaryInformation": "", "type": "expression" } ], @@ -24223,7 +22364,6 @@ "functionType": "Action", "group": "Slider track configuration", "name": "SetActiveTrackColor", - "private": false, "sentence": "Change active track color of _PARAM0_ to _PARAM2_", "events": [ { @@ -24256,33 +22396,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Active track color", - "longDescription": "", "name": "Color", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -24294,7 +22421,6 @@ "functionType": "Action", "group": "Slider track configuration", "name": "SetInactiveTrackColor", - "private": false, "sentence": "Change inactive track color of _PARAM0_ to _PARAM2_", "events": [ { @@ -24327,33 +22453,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Inactive track color", - "longDescription": "", "name": "Color", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -24365,7 +22478,6 @@ "functionType": "Action", "group": "Slider thumb configuration", "name": "SetThumbColor", - "private": false, "sentence": "Change thumb color of _PARAM0_ to _PARAM2_", "events": [ { @@ -24397,33 +22509,20 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Thumb color", - "longDescription": "", "name": "Color", - "optional": false, - "supplementaryInformation": "", "type": "color" } ], @@ -24469,22 +22568,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } @@ -24786,7 +22877,8 @@ "hidden": true, "name": "TargetHaloRadius" } - ] + ], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] @@ -24794,7 +22886,6 @@ { "author": "", "category": "General", - "description": "\nTo adjust the appearance of the resource bar, edit the Draggable Slider properties. The shape painter appearance settings will be overwritten by the Draggable Slider.", "extensionNamespace": "", "fullName": "Draw resource bar (health, shield, etc) OLD", "helpPath": "", @@ -24803,6 +22894,7 @@ "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_loading_progress_bar.svg", "shortDescription": "Draw a bar that displays a resource like health, shield, or any value.", "version": "0.0.1", + "description": "\nTo adjust the appearance of the resource bar, edit the Draggable Slider properties. The shape painter appearance settings will be overwritten by the Draggable Slider.", "tags": [], "authorIds": [ "gqDaZjCfevOOxBYkK6zlhtZnXCg1" @@ -24820,9 +22912,7 @@ "description": "Draw health bar.", "fullName": "Draw health bar", "functionType": "Action", - "group": "", "name": "DrawHealthBar", - "private": false, "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", "events": [ { @@ -24869,42 +22959,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object with health", - "longDescription": "", "name": "ObjectWithHealth", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Health behavior", - "longDescription": "", "name": "HealthBehavior", - "optional": false, "supplementaryInformation": "Health::Health", "type": "behavior" } @@ -24915,9 +22988,7 @@ "description": "Draw shield bar.", "fullName": "Draw shield bar", "functionType": "Action", - "group": "", "name": "DrawShieldBar", - "private": false, "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", "events": [ { @@ -24964,42 +23035,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Object with shield", - "longDescription": "", "name": "ObjectWithShield", - "optional": false, - "supplementaryInformation": "", "type": "objectList" }, { - "codeOnly": false, - "defaultValue": "", "description": "Shield behavior", - "longDescription": "", "name": "ShieldBehavior", - "optional": false, "supplementaryInformation": "Health::Shield", "type": "behavior" } @@ -25010,9 +23064,7 @@ "description": "Draw resource bar.", "fullName": "Draw resource bar", "functionType": "Action", - "group": "", "name": "DrawResourceBar", - "private": false, "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", "events": [ { @@ -25059,42 +23111,25 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" }, { - "codeOnly": false, - "defaultValue": "", "description": "Current value", - "longDescription": "", "name": "CurrentValue", - "optional": false, - "supplementaryInformation": "", "type": "expression" }, { - "codeOnly": false, - "defaultValue": "", "description": "Max value", - "longDescription": "", "name": "MaxValue", - "optional": false, "supplementaryInformation": "Health::Health", "type": "expression" } @@ -25102,12 +23137,9 @@ "objectGroups": [] }, { - "description": "", "fullName": "", "functionType": "Action", - "group": "", "name": "onCreated", - "private": false, "sentence": "", "events": [ { @@ -25187,22 +23219,14 @@ ], "parameters": [ { - "codeOnly": false, - "defaultValue": "", "description": "Object", - "longDescription": "", "name": "Object", - "optional": false, "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { - "codeOnly": false, - "defaultValue": "", "description": "Behavior", - "longDescription": "", "name": "Behavior", - "optional": false, "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", "type": "behavior" } @@ -25233,7 +23257,8 @@ "hidden": false, "name": "ChangeDuration" } - ] + ], + "sharedPropertyDescriptors": [] } ], "eventsBasedObjects": [] From 78db7ef9605e80e4557ac80d06c2557c36d75245 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Mon, 14 Nov 2022 23:46:37 -0700 Subject: [PATCH 15/24] Updated default empty opacity to 64 --- examples/resource-bar/game.json | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index e8e87284b..4f00238d8 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -2613,9 +2613,10 @@ "UnitSpacing": 0, "NextUnitToCreate": 0, "HideEmptyUnits": false, - "EmptyUnitOpacity": 255, + "EmptyUnitOpacity": 64, "EmptyUnitAnimation": 0, - "EmptyColorTint": "255;255;255" + "EmptyColorTint": "255;255;255", + "ActiveUnitOpacity": 255 } ], "animations": [ @@ -2857,6 +2858,7 @@ ] }, { + "disabled": true, "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ @@ -3539,7 +3541,7 @@ "parameters": [ "Unit_ResourceBar", "UnitResourceBar", - "0", + "64", "" ] } @@ -5591,7 +5593,7 @@ "Object", "Behavior", "=", - "Object.Behavior::PropertyStartingUnits()" + "Object.Behavior::PropertyStartingQuantity()" ] } ] @@ -5884,7 +5886,7 @@ "textG": 0, "textR": 0 }, - "comment": "Only apply color if it has change from default value", + "comment": "Only apply color if it has changed from default value", "comment2": "" }, { @@ -6212,7 +6214,7 @@ "type": "behavior" }, { - "description": "Opacity of empty units", + "description": "Opacity of active units", "longDescription": "Range: 0 to 255", "name": "Opacity", "type": "expression" @@ -6459,7 +6461,7 @@ "group": "", "extraInformation": [], "hidden": false, - "name": "StartingUnits" + "name": "StartingQuantity" }, { "value": "", @@ -6468,11 +6470,11 @@ "description": "", "group": "", "extraInformation": [], - "hidden": false, + "hidden": true, "name": "CurrentQuantity" }, { - "value": "0", + "value": "10", "type": "Number", "label": "Maximum quantity (Use \"0\" for unlimited)", "description": "", @@ -6502,7 +6504,7 @@ "name": "EmptyUnitColorTint" }, { - "value": "0", + "value": "64", "type": "Number", "label": "Opacity of empty units (Range: 0 to 255)", "description": "Empty units exist between the current and maximum value.", @@ -6512,7 +6514,7 @@ "name": "EmptyUnitOpacity" }, { - "value": "", + "value": "0", "type": "Number", "label": "Animation number for empty units", "description": "", From 9b0c75e45f1afdbf53c88e914c58bb448a6b54fd Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Thu, 17 Nov 2022 22:25:03 -0700 Subject: [PATCH 16/24] Started unifying wording between behaviors TODO: Change "value" to "quantity" everywhere? --- .../resource-bar/assets/Health Bar Box.png | Bin 0 -> 2983 bytes examples/resource-bar/assets/Health Bar.png | Bin 0 -> 1465 bytes .../Health Indicator_Black Outline Empty.png | Bin 0 -> 109 bytes .../Health Indicator_Black Outline Heart.png | Bin 0 -> 185 bytes .../Health Indicator_White Outline Empty.png | Bin 0 -> 110 bytes .../Health Indicator_White Outline Heart.png | Bin 0 -> 171 bytes examples/resource-bar/assets/Heart.png | Bin 0 -> 372 bytes .../assets/tiled_Energy Bar Fill.png | Bin 0 -> 2836 bytes .../assets/tiled_Health Bar Fill.png | Bin 0 -> 2849 bytes examples/resource-bar/game.json | 9066 +++++++++++++++-- 10 files changed, 8459 insertions(+), 607 deletions(-) create mode 100644 examples/resource-bar/assets/Health Bar Box.png create mode 100644 examples/resource-bar/assets/Health Bar.png create mode 100644 examples/resource-bar/assets/Health Indicator_Black Outline Empty.png create mode 100644 examples/resource-bar/assets/Health Indicator_Black Outline Heart.png create mode 100644 examples/resource-bar/assets/Health Indicator_White Outline Empty.png create mode 100644 examples/resource-bar/assets/Health Indicator_White Outline Heart.png create mode 100644 examples/resource-bar/assets/Heart.png create mode 100644 examples/resource-bar/assets/tiled_Energy Bar Fill.png create mode 100644 examples/resource-bar/assets/tiled_Health Bar Fill.png diff --git a/examples/resource-bar/assets/Health Bar Box.png b/examples/resource-bar/assets/Health Bar Box.png new file mode 100644 index 0000000000000000000000000000000000000000..e02e8033917d6f3c47c281eff86506bb9d0ecda3 GIT binary patch literal 2983 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Health Bar.png b/examples/resource-bar/assets/Health Bar.png new file mode 100644 index 0000000000000000000000000000000000000000..1d75d85c697c830eae1fadc3229b57ac0f72437d GIT binary patch literal 1465 zcmV;q1xEUbP) zy>8n;499te-y=h&B3lvzSu)uVktuW02P!&e%0swQ76Y!k8J#@zNz@^xLeqDr`~Fb) z0|LjgEDF+JLq1&?!nORr?$SHx>W@cguC{^9TYT5)oYcEbyP*k8d^4!;9ng z0018k$S@4U-Eyq}0RH^`Rqw(n3JKR4G8HvjQGl-o%W06xIMu2!_DZ;guWQtHrU?L3GU)c zCvn+4SSisxy}XUv_qz?;E!RrIXM2ooG;C1&2rh(Fo=H4gUl@C9rv~=fHW$&+P&!47 zSkRNbK0l8Ci$`mhh3NyOl;YlP`TZvVm<2~W1sGaUbT(1Z@aGD41cW{?3Jt&{<0LdhDWy*7kRW5| z)u=dP!lrn_ez1m44iBNJpkl+uy-7sk!TQ9hMraaPNa};wbH`Djq(y30Ymk+(iH`bxhvF^f`VEzFwq+hXe2{*}0;-54=nVP`0gR%%kCr zzkaxJ76JW^iBJ*uh|73BzF!JL?pY?U5?j2yRzW`+%(g{4At>l9#Y`CUe_r8>}2DpX{yx1R!X`MnvReQ81jVoZbv+t2lRrvl)1!CdvqZ*fXlXtPuAOa-#OW7g(ecV zp<~c|GvuMn%}x!f3oWLcVjD2YpZL#erxmJ)&e#xOYU8B75p%Osn(7|S7yguUFJRmM zGux?6b&nQ`E~B2~Cd|!FExPk)2yNr!Y`@IS4iZvxj-d&mr5=fpVkXrb?3miWr5DHE z?>6;?rt4w(ejgzJu$dn1n95WoCk5d`K-GoD6PJju086!JTDIdd3(fWTQ_IHs&Vi^d zG>-51Ea3y+!hUQtv4NfpC&CmR^oZlp=qli@lU77@m-u)vfb%u!T(76E=b{1wfN{1} zF^}dm=rQM$HYapx5MS{DOfS`d+iil=35e)=~Ho*&BOmaP?w* z#ZNj5p3_VlP1dt*1HRz34xPXNF1;9~n$S!OG50dJv?qKXUYGEQaDmaN#TSyP?$Pih zF;m^^FYUFAZK+mQsK|IjUkBe_RcN$>zy&9qKXg-T`TB=2* zsV9rcQ~LHgizaM^I8us?zJ`Ea5d}vVWInyW5S)0l2GNC1N{U=#%BqV?+Cw~AhuC_b zHOh9}!|4#Ab%LuG%RMT?W{>{HJ-|mORZ6LD=L~!{O!+X{=F-i8&y9<{+xwNY(OM&B zC{=6F#hJyUH46Q?$~n}3rH$4YnC#?LlHSE8p|e4#$mTHEV87dl&{{?(xL)}W T$@q^D00000NkvXXu0mjfO{dZo literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Health Indicator_Black Outline Empty.png b/examples/resource-bar/assets/Health Indicator_Black Outline Empty.png new file mode 100644 index 0000000000000000000000000000000000000000..0c83dbc508227982f0aebae1cc1827989c3a1aaa GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmSN`)Ym%P6qN-JY5_^ zB&H_+`TyUZ+3r9~__P#OqeY+or@B1-|2U+9*Wl8NOZ;s)By;OXk;vd$@?2>{4|N;?1m literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Health Indicator_White Outline Empty.png b/examples/resource-bar/assets/Health Indicator_White Outline Empty.png new file mode 100644 index 0000000000000000000000000000000000000000..87a2eb04fd09be56c5e112f03d3ee3161823cc8f GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmSN`)Ym%P6qN-JzX3_ zB&H_+`TyUZ+3r9~__P$(|NClx{eORZ`F{)11m>PCUftDnm{ Hr-UW|SBxat literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Health Indicator_White Outline Heart.png b/examples/resource-bar/assets/Health Indicator_White Outline Heart.png new file mode 100644 index 0000000000000000000000000000000000000000..88f175a130c4bdd48a53b1165b2edaebb84bc8ee GIT binary patch literal 171 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 4f00238d8..878e3f075 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1187,6 +1187,123 @@ "identifier": "https://resources.gdevelop-app.com/assets/16x16 Dungeon Tileset/UI/tiled_Tiled Filler UI Heart.png", "name": "gdevelop-asset-store" } + }, + { + "alwaysLoaded": false, + "file": "assets/Health Bar.png", + "kind": "image", + "metadata": "", + "name": "Health Bar.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Pirate Bomb Pack/Objects/Health Bar/Health Bar.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/tiled_Health Bar Fill.png", + "kind": "image", + "metadata": "", + "name": "tiled_Health Bar Fill.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter by Pixel boy/Hud/tiled_Health Bar Fill.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/tiled_Energy Bar Fill.png", + "kind": "image", + "metadata": "", + "name": "tiled_Energy Bar Fill.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter by Pixel boy/Hud/tiled_Energy Bar Fill.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Health Bar Box.png", + "kind": "image", + "metadata": "", + "name": "Health Bar Box.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Western FPS 2D/Hud/Bar/Health Bar Box.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Health Indicator_Black Outline Empty.png", + "kind": "image", + "metadata": "", + "name": "Health Indicator_Black Outline Empty.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_Black Outline Empty.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Health Indicator_Black Outline Heart.png", + "kind": "image", + "metadata": "", + "name": "Health Indicator_Black Outline Heart.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_Black Outline Heart.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Health Indicator_White Outline Empty.png", + "kind": "image", + "metadata": "", + "name": "Health Indicator_White Outline Empty.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_White Outline Empty.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Health Indicator_White Outline Heart.png", + "kind": "image", + "metadata": "", + "name": "Health Indicator_White Outline Heart.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_White Outline Heart.png", + "name": "gdevelop-asset-store" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Heart.png", + "kind": "image", + "metadata": "", + "name": "Heart.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Pirate Bomb Pack/Objects/Health Bar/Heart.png", + "name": "gdevelop-asset-store" + } } ], "resourceFolders": [] @@ -1198,8 +1315,8 @@ { "b": 0, "disableInputWhenNotFocused": true, - "mangledName": "Game", - "name": "Game", + "mangledName": "Game2", + "name": "Game2", "r": 0, "standardSortMethod": true, "stopSoundsOnStartup": true, @@ -1215,7 +1332,7 @@ "gridColor": 10401023, "gridAlpha": 0.2, "snap": true, - "zoomFactor": 1.1800000000000002, + "zoomFactor": 1.8600000000000008, "windowMask": false }, "objectsGroups": [], @@ -1388,18 +1505,123 @@ }, { "angle": 0, - "customSize": false, - "height": 0, + "customSize": true, + "height": 16, "layer": "", "name": "Tiled_ResourceBar", "persistentUuid": "be98771a-978f-443c-80e8-197098aef457", - "width": 0, + "width": 16, "x": 40, "y": 416, "zOrder": 15, "numberProperties": [], "stringProperties": [], "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 24, + "layer": "", + "name": "HealthBarBox", + "persistentUuid": "fddebf95-4d5f-40b5-a087-80bd8c33b68c", + "width": 98, + "x": 32, + "y": 360, + "zOrder": 16, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 16, + "layer": "", + "name": "HealthBarFill", + "persistentUuid": "1e7ce7cc-5104-4c95-95a0-343f3d97e140", + "width": 80, + "x": 41, + "y": 364, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 62, + "layer": "", + "name": "HealthBar", + "persistentUuid": "e57b54cd-d15f-45ae-91e7-56a12aaf0d2f", + "width": 368, + "x": 64, + "y": 288, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Heart", + "persistentUuid": "a45e39e0-8703-466e-9ece-c114c69b92bd", + "width": 0, + "x": 154, + "y": 309, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Heart", + "persistentUuid": "d575e256-78f3-4b72-8f11-1c0003d651ce", + "width": 0, + "x": 104, + "y": 309, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Heart", + "persistentUuid": "a6abf64b-8fa3-4d12-9bad-22314ac4a313", + "width": 0, + "x": 130, + "y": 309, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 62, + "layer": "", + "name": "NewPanelSprite", + "persistentUuid": "d0461165-f597-4574-b3e8-8e78014d1c61", + "width": 272, + "x": 168, + "y": 376, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] } ], "objects": [ @@ -1413,7 +1635,7 @@ "behaviors": [ { "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar", + "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -1455,7 +1677,7 @@ "behaviors": [ { "name": "DrawResourceBar", - "type": "ResourceBar::DrawResourceBar", + "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -1501,7 +1723,7 @@ "behaviors": [ { "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar", + "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -1559,7 +1781,7 @@ "behaviors": [ { "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar", + "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -2606,7 +2828,7 @@ "behaviors": [ { "name": "UnitResourceBar", - "type": "ResourceBar::SpriteResourceBar", + "type": "ResourceBar::ResourceBar_Sprite", "StartingUnits": 3, "CurrentUnits": 3, "MaxUnits": 3, @@ -2702,7 +2924,16 @@ "width": 16, "variables": [], "effects": [], - "behaviors": [] + "behaviors": [ + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite", + "StartingQuantity": 0, + "CurrentQuantity": 0, + "UnitWidth": 16, + "MaxQuantity": 0 + } + ] }, { "assetStoreId": "abf51d082db5a117d9ee2e65299660f6787d47664e4571bad6db3075b3393c5f", @@ -2717,79 +2948,228 @@ "behaviors": [ { "name": "TiledResourceBar", - "type": "ResourceBar::TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite", "StartingQuantity": 6, "CurrentQuantity": 0, "UnitWidth": 16 } ] - } - ], - "events": [ + }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Initialize game", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "assetStoreId": "45107bbfbc2b5cbc83e3785f802b99664a23d59e74414e332c9afafac63e1ca3", + "name": "HealthBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DepartScene" - }, - "parameters": [ - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Opacity" - }, - "parameters": [ - "Moon", - "=", - "128" - ] - }, - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "MaxResource", - "=", - "CameraBorderRight()" - ] - } - ], - "events": [ + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ChangeColor" + "hasCustomCollisionMask": false, + "image": "Health Bar.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "\"144;19;254\"" - ] - }, - { - "type": { - "value": "SetCenter" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "=", + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "1f3dba67c868b7320572a6591d1d0418f23b7c132df0963cf77286a9149971d9", + "height": 128, + "name": "HealthBarFill", + "tags": "", + "texture": "tiled_Health Bar Fill.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite", + "StartingQuantity": 5, + "CurrentQuantity": 0, + "UnitWidth": 16, + "MaxQuantity": 10 + } + ] + }, + { + "assetStoreId": "3bd9517a10ad3d98341eea33f0c139f08a1b04f26500e85ac49bb7f9e157a303", + "height": 128, + "name": "EnergyBarFill", + "tags": "", + "texture": "tiled_Energy Bar Fill.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "138ee716846635e3e0e5ab7b63752d1a36754f1ac874c70e1b5fa372d5a05474", + "bottomMargin": 6, + "height": 15, + "leftMargin": 11, + "name": "HealthBarBox", + "rightMargin": 9, + "tags": "", + "texture": "Health Bar Box.png", + "tiled": true, + "topMargin": 6, + "type": "PanelSpriteObject::PanelSprite", + "width": 96, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "0714257da345b4ec7de558ac0e42290362b85a79c97160c0e09636cd2fc31e3c", + "name": "Heart", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 62, + "leftMargin": 64, + "name": "NewPanelSprite", + "rightMargin": 64, + "tags": "", + "texture": "Health Bar.png", + "tiled": true, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 154, + "variables": [], + "effects": [], + "behaviors": [] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "Moon", + "=", + "128" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MaxResource", + "=", + "CameraBorderRight()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Moon", + "\"144;19;254\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Moon", + "=", "Fly.CenterX()", "=", "Fly.CenterY()-10" @@ -3333,7 +3713,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::DrawHealthBar" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" }, "parameters": [ "MiniHealth_Bar", @@ -3351,7 +3731,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::DrawShieldBar" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawShieldBar" }, "parameters": [ "Shield_Bar", @@ -3369,7 +3749,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::DrawResourceBar" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawResourceBar" }, "parameters": [ "ResourceMouseX_Bar", @@ -3387,7 +3767,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::DrawHealthBar" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" }, "parameters": [ "Health_Bar", @@ -3417,11 +3797,81 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::DisplayTiledBar" + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", + "=", + "10", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "-", + "1", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Right" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" }, "parameters": [ "Tiled_ResourceBar", "TiledResourceBar", + "+", + "1", "" ] } @@ -3433,13 +3883,37 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetQuantityOp" + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" }, "parameters": [ "Tiled_ResourceBar", "TiledResourceBar", - "=", - "Variable(Units)", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + }, + "parameters": [ + "HealthBarFill", + "TiledResourceBar", "" ] } @@ -3488,7 +3962,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetMaxQuantityOp" + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" }, "parameters": [ "Tiled_ResourceBar", @@ -3514,7 +3988,7 @@ }, { "type": { - "value": "ResourceBar::SpriteResourceBar::SetMaxQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetMaxQuantity" }, "parameters": [ "Unit_ResourceBar", @@ -3525,7 +3999,7 @@ }, { "type": { - "value": "ResourceBar::SpriteResourceBar::SetEmptyUnitColor" + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitColor" }, "parameters": [ "Unit_ResourceBar", @@ -3536,7 +4010,7 @@ }, { "type": { - "value": "ResourceBar::SpriteResourceBar::SetEmptyUnitOpacity" + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitOpacity" }, "parameters": [ "Unit_ResourceBar", @@ -3575,6 +4049,24 @@ } ], "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "-", + "1", + "" + ] + } + ] + }, { "disabled": true, "type": "BuiltinCommonInstructions::Standard", @@ -3582,7 +4074,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::DecreaseQuantity" + "value": "ResourceBar::ResourceBar_Sprite::DecreaseQuantity" }, "parameters": [ "Unit_ResourceBar", @@ -3628,7 +4120,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::IncreaseQuantity" + "value": "ResourceBar::ResourceBar_Sprite::IncreaseQuantity" }, "parameters": [ "Unit_ResourceBar", @@ -3638,22 +4130,23 @@ ] } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "ResourceBar::SpriteResourceBar::SetCurrentQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "Variable(Units)", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "+", + "1", + "" + ] + } ] } ] @@ -3664,7 +4157,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::DrawUnitBar" + "value": "ResourceBar::ResourceBar_Sprite::DrawResourceBar" }, "parameters": [ "Unit_ResourceBar", @@ -3704,47 +4197,7261 @@ "width": 0 } ], - "effects": [] + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD" + }, + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield" + }, + { + "name": "Sticker", + "type": "Sticker::Sticker" + }, + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite" + }, + { + "name": "UnitResourceBar", + "type": "ResourceBar::ResourceBar_Sprite" + } + ] + }, + { + "b": 0, + "disableInputWhenNotFocused": true, + "mangledName": "Game", + "name": "Game", + "r": 0, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 0, + "uiSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 8, + "gridHeight": 8, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.2, + "snap": true, + "zoomFactor": 1.1800000000000002, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Shield_Bar", + "persistentUuid": "b581caf8-44ee-423e-b57e-cdd910fb7374", + "width": 0, + "x": 192, + "y": 216, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ResourceMouseX_Bar", + "persistentUuid": "17a23f4a-a442-4b52-8380-9f2b6a9c2494", + "width": 0, + "x": 192, + "y": 536, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 80, + "layer": "", + "name": "Fly", + "persistentUuid": "e0b70af7-7a81-41c3-88ac-88305df91ed2", + "width": 128, + "x": 481.13275146484375, + "y": 293, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "name": "Moon", + "persistentUuid": "8428ea9d-6d1e-41b0-9f54-1840f3378846", + "width": 129.1327362060547, + "x": 480, + "y": 272, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Health_Text", + "persistentUuid": "921b2f28-8bee-4ab2-a6cc-1ee823c5215e", + "width": 0, + "x": 48, + "y": 96, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Shield_Text", + "persistentUuid": "a231209b-a5d8-4280-868d-1e9beb31527b", + "width": 0, + "x": 48, + "y": 208, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ResourceMouseX_Text", + "persistentUuid": "07fda015-55f8-4959-80fc-f1ee3074d028", + "width": 0, + "x": 32, + "y": 512, + "zOrder": 11, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Title_Text", + "persistentUuid": "29ae792c-1331-430c-aadf-70fa8d9e36d6", + "width": 0, + "x": 208, + "y": 16, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Unit_ResourceBar", + "persistentUuid": "0c4d4e97-0b53-4f05-8468-7d8b7a7fa8dd", + "width": 0, + "x": 32, + "y": 464, + "zOrder": 13, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Health_Bar", + "persistentUuid": "c411b32c-f357-4b8f-9e87-f3fdde7657d5", + "width": 0, + "x": 192, + "y": 104, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "TiledEmptyUiHeart", + "persistentUuid": "a1be0010-4eb7-4e54-a651-7d77ae646149", + "width": 0, + "x": 40, + "y": 416, + "zOrder": 14, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 16, + "layer": "", + "name": "Tiled_ResourceBar", + "persistentUuid": "be98771a-978f-443c-80e8-197098aef457", + "width": 16, + "x": 40, + "y": 416, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "assetStoreId": "", + "name": "Health_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "BarLength": 200, + "BarThickness": 16, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 11;255;0", + "ActiveBarOpacity": 255, + "RoundedBar": true, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "MiniHealth_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "BarLength": 50, + "BarThickness": 4, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 11;255;0", + "ActiveBarOpacity": 255, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true + }, + { + "name": "Sticker", + "type": "Sticker::Sticker", + "OnlyFollowPosition": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "Shield_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "circle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": " 24;119;211", + "ThumbOpacity": 255, + "BarLength": 200, + "BarThickness": 16, + "InactiveBarColor": "144;19;254", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 144;19;254", + "ActiveBarOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedBar": true, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0.19999992847442627 + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "ResourceMouseX_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "circle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": "248;231;28", + "ThumbOpacity": 255, + "BarLength": 200, + "BarThickness": 16, + "InactiveBarColor": "248;231;28", + "InactiveBarOpacity": 96, + "ActiveBarColor": "248;231;28", + "ActiveBarOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedBar": false, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0.19999992847442627 + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "48a2d179a1921276abe3f99ce3cf195fa7c310bc511fa215d9647c3fb9027921", + "name": "Fly", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Health", + "type": "Health::Health", + "Health": 100, + "DamageCooldown": 0, + "MaxHealth": 100, + "IsJustDamaged": false, + "HealthRegenRate": 0, + "HealthRegenDelay": 0, + "AllowOverHealing": false, + "HitAtLeastOnce": false + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield", + "RequireHealth": "Health", + "MaxShieldPoints": 30, + "ShieldDuration": 5, + "ShieldPoints": 0, + "ShieldRegenRate": 0, + "ShieldBlocksExcessDamage": false, + "ShieldRegenDelay": 0, + "RegenShieldWhenZeroPoints": false, + "IsShieldJustDamaged": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.05000000074505806, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Fly_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "574655a4565bd983af8f5dd98e0fd8cda3bd67cf929c00d3db317e898322e06b", + "name": "Star", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "LargeNarrow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_LargeNarrow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "LargeWide", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_LargeWide.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Medium", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_Medium.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Small", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_Small.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "8d92592738465177b86ec18299ef6e6394ae24eeb7a7d6dfdcbbdb55fab902aa", + "name": "BlueLaser01", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Blue laser (01).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "794ab341df538c9b3bdad418dfdcccc7be5d90f3d0b5929d6d528a542c6ed3ae", + "name": "SilverShield", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Silver shield.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 14.592423439025879, + "y": 15.103429794311523 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "d2bc2d266f5bb666ef68023abc14f51bc8fe8b5222af931efa378ac10c50f98a", + "name": "MeteorDetailed", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Large", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Meteor Detailed_Large.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 65.07723999023438, + "y": 63.82252502441406 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 20, + "y": 20 + }, + { + "x": 110, + "y": 20 + }, + { + "x": 110, + "y": 110 + }, + { + "x": 20, + "y": 110 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Small", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Meteor Detailed_Small.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 65.07723999023438, + "y": 63.82252502441406 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 20, + "y": 20 + }, + { + "x": 110, + "y": 20 + }, + { + "x": 110, + "y": 110 + }, + { + "x": 20, + "y": 110 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "a1e62f5a19d1fe476e2ad0b8977768d020cc1dc55423427f79a486664cebb631", + "name": "UpgradedPotionBlue", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "No Shadow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Upgraded Potion Blue_No Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.793042182922363, + "y": 15.89681625366211 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Shadow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Upgraded Potion Blue_Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.793042182922363, + "y": 15.89681625366211 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "c2ce913ddbcd055c4e49a1c01b63aff1a3d59e4e1c1845db4c38aedda3712d3a", + "name": "Moon", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Sticker", + "type": "Sticker::Sticker", + "OnlyFollowPosition": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Moon.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Health_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Health", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Shield_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Shield", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "ResourceMouseX_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Resource \n(Mouse X)", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Title_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Extension: Draw Resource Bar", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "name": "ResourceBarNew", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "BarLength": 200, + "BarThickness": 4, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": "11;255;0", + "ActiveBarOpacity": 255, + "RoundedBar": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", + "name": "Unit_ResourceBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "UnitResourceBar", + "type": "ResourceBar::ResourceBar_Sprite", + "StartingUnits": 3, + "CurrentUnits": 3, + "MaxUnits": 3, + "UnitSpacing": 0, + "NextUnitToCreate": 0, + "HideEmptyUnits": false, + "EmptyUnitOpacity": 64, + "EmptyUnitAnimation": 0, + "EmptyColorTint": "255;255;255", + "ActiveUnitOpacity": 255 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Emote Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", + "name": "Heart_Unit", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Emote Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "752e405ef67d9f9d1bd36f9763f1b6fc05633d64700982c0f3118a25a32e39b2", + "height": 16, + "name": "TiledEmptyUiHeart", + "tags": "", + "texture": "tiled_Tiled Empty UI Heart.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite", + "StartingQuantity": 0, + "CurrentQuantity": 0, + "UnitWidth": 16, + "MaxQuantity": 0 + } + ] + }, + { + "assetStoreId": "abf51d082db5a117d9ee2e65299660f6787d47664e4571bad6db3075b3393c5f", + "height": 16, + "name": "Tiled_ResourceBar", + "tags": "", + "texture": "tiled_Tiled Filler UI Heart.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite", + "StartingQuantity": 6, + "CurrentQuantity": 0, + "UnitWidth": 16 + } + ] + }, + { + "assetStoreId": "45107bbfbc2b5cbc83e3785f802b99664a23d59e74414e332c9afafac63e1ca3", + "name": "HealthBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Health Bar.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "1f3dba67c868b7320572a6591d1d0418f23b7c132df0963cf77286a9149971d9", + "height": 128, + "name": "HealthBarFill", + "tags": "", + "texture": "tiled_Health Bar Fill.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "3bd9517a10ad3d98341eea33f0c139f08a1b04f26500e85ac49bb7f9e157a303", + "height": 128, + "name": "EnergyBarFill", + "tags": "", + "texture": "tiled_Energy Bar Fill.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "138ee716846635e3e0e5ab7b63752d1a36754f1ac874c70e1b5fa372d5a05474", + "bottomMargin": 6, + "height": 15, + "leftMargin": 11, + "name": "HealthBarBox", + "rightMargin": 9, + "tags": "", + "texture": "Health Bar Box.png", + "tiled": true, + "topMargin": 6, + "type": "PanelSpriteObject::PanelSprite", + "width": 96, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "7c1048053bc2d851157c4e0868c4ac0338f4ca93170d28990a7f64eaed2a1723", + "name": "HealthIndicator", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Black Outline Empty", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Health Indicator_Black Outline Empty.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Black Outline Heart", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Health Indicator_Black Outline Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "White Outline Empty", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Health Indicator_White Outline Empty.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "White Outline Heart", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Health Indicator_White Outline Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "0714257da345b4ec7de558ac0e42290362b85a79c97160c0e09636cd2fc31e3c", + "name": "Heart", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "Moon", + "=", + "128" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MaxResource", + "=", + "CameraBorderRight()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Moon", + "\"144;19;254\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Moon", + "=", + "Fly.CenterX()", + "=", + "Fly.CenterY()-10" + ] + }, + { + "type": { + "value": "Sticker::Sticker::Stick" + }, + "parameters": [ + "Moon", + "Sticker", + "Fly", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Moon" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MiniHealth_Bar", + "Fly.X()", + "Fly.Y()", + "\"\"" + ] + }, + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "MiniHealth_Bar", + "=", + "Fly.CenterX() - MiniHealth_Bar.DrawResourceBar::BarLength()/2", + "=", + "Fly.BoundingBoxTop()" + ] + }, + { + "type": { + "value": "Sticker::Sticker::Stick" + }, + "parameters": [ + "MiniHealth_Bar", + "Sticker", + "Fly", + "" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::EnableDebugDraw" + }, + "parameters": [ + "", + "", + "", + "", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Spawn items", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnShield\"", + "5", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "SilverShield", + "Fly.CenterX()", + "CameraBorderTop()", + "" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "SilverShield", + "90", + "75", + "1" + ] + }, + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "SilverShield", + "\"144;19;254\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnHealth\"", + "12", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UpgradedPotionBlue", + "Fly.CenterX()", + "CameraBorderBottom()", + "" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "UpgradedPotionBlue", + "270", + "75", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnRock\"", + "1", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MeteorDetailed", + "CameraBorderLeft()", + "Fly.CenterY()", + "" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "MeteorDetailed", + "0", + "300", + "1" + ] + }, + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "MeteorDetailed", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Rotate" + }, + "parameters": [ + "MeteorDetailed", + "30", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Collisions", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Moon", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Moon" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "SilverShield", + "Fly", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::ActivateShield" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "SilverShield", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "UpgradedPotionBlue", + "Fly", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::Heal" + }, + "parameters": [ + "Fly", + "Health", + "100", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "UpgradedPotionBlue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "MeteorDetailed", + "Fly", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::ShieldHit" + }, + "parameters": [ + "Fly", + "Shield", + "10", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "MeteorDetailed", + "" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Fly", + "ShakeObject_PositionAngleScale", + "", + "10", + "10", + "5", + "", + "", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Draw Resource bars", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This resource shows the horizontal mouse position in scene, but it can be used for anything!", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MyResource", + "=", + "MouseX()" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shape painter resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" + }, + "parameters": [ + "MiniHealth_Bar", + "DrawResourceBar", + "Fly", + "Health", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::DrawShieldBar" + }, + "parameters": [ + "Shield_Bar", + "DrawResourceBar222", + "Fly", + "Shield", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::DrawResourceBar" + }, + "parameters": [ + "ResourceMouseX_Bar", + "DrawResourceBar222", + "Variable(MyResource)", + "Variable(MaxResource)", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" + }, + "parameters": [ + "Health_Bar", + "DrawResourceBar222", + "Fly", + "Health", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tiled resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", + "=", + "10", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "-", + "1", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Right" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "+", + "1", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Unit resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "=", + "5" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Unit_ResourceBar" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetMaxQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "10", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitColor" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "\"74;144;226\"", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitOpacity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "64", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "=", + "max(0,Variable(Units)-1)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "-", + "1", + "" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::DecreaseQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "1", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Right" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "+", + "1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::IncreaseQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "1", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "+", + "1", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::DrawResourceBar" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "Heart_Unit", + "5", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 32, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD" + }, + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield" + }, + { + "name": "Sticker", + "type": "Sticker::Sticker" + }, + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite" + }, + { + "name": "UnitResourceBar", + "type": "ResourceBar::ResourceBar_Sprite" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "@4ian", + "category": "Game mechanic", + "extensionNamespace": "", + "fullName": "Fire bullets", + "helpPath": "https://gdevelop.io/game-example/fire-bullet", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWJ1bGxldCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNCwyMkgxMFYyMUgxNFYyMk0xMywxMFY3SDExVjEwTDEwLDExLjVWMjBIMTRWMTEuNUwxMywxME0xMiwyQzEyLDIgMTEsMyAxMSw1VjZIMTNWNUMxMyw1IDEzLDMgMTIsMloiIC8+PC9zdmc+", + "name": "FireBullet", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/bullet.svg", + "shortDescription": "Fire bullets, manage ammo, reloading, and overheating.", + "version": "0.3.0", + "description": "Fire bullets, manage ammo, reloading, and overheating.\n\nFiring bullets:\n- Cooldown: Time between shots (seconds)\n- Bullet Quantity: Number of bullets created each time Fire Bullet action is used. \n- Angle Variance: Each bullet trajectory will be adjusted by a random value within this range (degrees)\n- Firing Arc: Range of angles (in degrees) that bullets will shoot. Bullets are evenly spread within this range.\n- Rotate bullet: Change the angle of each bullet to match the direction it is travelling (enabled by default)\n\n Ammo:\n- Starting ammo\n- Max ammo\n- Shots per reload. Use 0 to disable reloading\n- Reload duration\n- Automatic reloading is enabled by default, but it can also be done manually.\n\nOverheat:\n- Heat increase per shot. Object is Overheated when Heat reaches 1.\n- Cooling rate per second\n- When overheated, the object cannot fire any bullets\n\nStatistics:\n- Total bullets created\n- Total shots taken\n- Total reloads completed\n\nBullets:\n- Each bullet is assigned several variables that can be used for advanced object picking\n- __FireBullet.BulletID = Unique number for every bullet created\n- __FireBullet.BatchID = Unique number for all bullets created in the same frame\n- __FireBullet.BatchOrderID = Unique number for each bullet in the same batch. Can be used to identify the position in the firing arc.", + "origin": { + "identifier": "FireBullet", + "name": "gdevelop-extension-store" + }, + "tags": [ + "fire", + "bullet", + "spawn", + "firerate", + "reload", + "weapon", + "ranged", + "ammo", + "overheat" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Fire bullets, manage ammo, reloading, and overheating.", + "fullName": "Fire bullets", + "name": "FireBullet", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.FiringCooldown\"" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyStartingAmmo()" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyShotsPerReload()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Take a shot (if triggered)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Creators can use the \"FireBullet\" action multiple times in a frame and it will be counted as a single \"shot\".", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyHasJustFired" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset firing cooldown", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.FiringCooldown\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update ammo", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Subtract 1 from ammo (if not unlimited ammo)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::PropertyUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update reloading counter", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyShotsPerReload" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Automatically reload gun when needed", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::ReloadAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update Overheat", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase heat (if needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyHeatIncreasePerShot" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyHeatIncreasePerShot()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Check if this caused overheat", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyOverheatDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::IsOverheated" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.OverheatDuration\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update statistics", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalShotsFired" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset firing detection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHasJustFired" + }, + "parameters": [ + "Object", + "Behavior", + "=" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reload gun when needed", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect when reload is completed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.ReloadingTimer\"", + ">=", + "Object.Behavior::PropertyReloadDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalReloadsCompleted" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyShotsPerReload()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only reload the amount of ammo available", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyShotsPerReload(), Object.Behavior::PropertyAmmoQuantity())" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reduce heat level (based on cooling rate)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::HeatLevel()", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyExponentialCoolingRate" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyHeatLevel() - TimeDelta() * Object.Behavior::PropertyExponentialCoolingRate() * Object.Behavior::PropertyHeatLevel())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyLinearCoolingRate" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyHeatLevel() - TimeDelta() * Object.Behavior::PropertyLinearCoolingRate())" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Fire bullets toward a position.", + "fullName": "Fire bullets toward a position", + "functionType": "Action", + "name": "FireTowardPosition", + "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward position _PARAM5_;_PARAM6_ with speed _PARAM7_ px/s", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate the trajectory angle and use the \"Fire bullets\" action", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::Fire" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "Bullet", + "Object.AngleToPosition(GetArgumentAsNumber(\"TargetXPosition\"),GetArgumentAsNumber(\"TargetYPosition\"))", + "GetArgumentAsNumber(\"Speed\")", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectList" + }, + { + "description": "Target X position", + "name": "TargetXPosition", + "type": "expression" + }, + { + "description": "Target Y position", + "name": "TargetYPosition", + "type": "expression" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Fire bullets in the direction of a given angle.", + "fullName": "Fire bullets toward an angle", + "functionType": "Action", + "name": "Fire", + "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward angle _PARAM5_ and speed _PARAM6_ px/s", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check if ready to shoot", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReadyToShoot" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHasJustFired" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Single bullet", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyBulletQuantity()", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::FireSingleBullet" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "Bullet", + "GetArgumentAsNumber(\"Angle\")", + "GetArgumentAsNumber(\"Speed\")", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Multiple bullets", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyBulletQuantity()", + ">", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.CurrentBulletAngle", + "=", + "GetArgumentAsNumber(\"Angle\") - Object.Behavior::PropertyFiringArc()/2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.BatchOrderID", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.Behavior::PropertyBulletQuantity()", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::FireSingleBullet" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "Bullet", + "Object.Variable(__FireBullet.CurrentBulletAngle) + RandomInRange(-Object.Behavior::PropertyAngleVariance(),Object.Behavior::PropertyAngleVariance())", + "GetArgumentAsNumber(\"Speed\")", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move temp variable to the next angle a bullet will be sent", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.CurrentBulletAngle", + "+", + "Object.Behavior::PropertyFiringArc() / (Object.Behavior::PropertyBulletQuantity() - 1)" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.BatchOrderID", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectList" + }, + { + "description": "Angle of the bullet, in degrees", + "name": "Angle", + "type": "expression" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Fire a single bullet. This is only meant to be used inside the \"Fire bullet\" action.", + "fullName": "Fire a single bullet", + "functionType": "Action", + "group": "Firing", + "name": "FireSingleBullet", + "private": true, + "sentence": "Fire a single bullet _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, with angle _PARAM5_ and speed _PARAM6_ px/s", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Fire a single bullet", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create bullet", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Bullet", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "\"\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move bullet", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "Bullet", + "GetArgumentAsNumber(\"Angle\") + RandomInRange(-Object.Behavior::PropertyAngleVariance(), Object.Behavior::PropertyAngleVariance())", + "GetArgumentAsNumber(\"Speed\")", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add identifier variables (to enable advanced picking by users)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Bullet", + "__FireBullet.BulletID", + "=", + "Object.Behavior::PropertyTotalBulletsCreated()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Bullet", + "__FireBullet.BatchID", + "=", + "Object.Behavior::PropertyTotalShotsFired()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Bullet", + "__FireBullet.BatchOrderID", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Rotate newly created bullet, if needed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Bullet", + "=", + "GetArgumentAsNumber(\"Angle\")" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update statistics", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalBulletsCreated" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectList" + }, + { + "description": "Angle of the bullet, in degrees", + "name": "Angle", + "type": "expression" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Reload ammo.", + "fullName": "Reload ammo", + "functionType": "Action", + "name": "ReloadAmmo", + "sentence": "Reload ammo on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOutOfAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.ReloadingTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object has just fired something.", + "fullName": "Has just fired", + "functionType": "Condition", + "group": "Firing", + "name": "HasJustFired", + "sentence": "_PARAM0_ has just fired", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyHasJustFired" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if bullet rotates to match trajectory.", + "fullName": "Is bullet rotation enabled", + "functionType": "Condition", + "group": "Firing", + "name": "BulletRotationEnabled", + "sentence": "Bullet rotation enabled on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the firing arc (in degrees) where bullets will be shot. Bullets will be evenly spaced out inside the firing arc.", + "fullName": "Set firing arc", + "functionType": "Action", + "group": "Multi-Fire", + "name": "SetFiringArc", + "sentence": "Set firing arc of _PARAM0_ to _PARAM2_ degrees", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyFiringArc" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Firing arc (degrees) Range: 0 to 360", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle variance (in degrees) applied to each bullet.", + "fullName": "Set angle variance", + "functionType": "Action", + "group": "Firing", + "name": "SetAngleVariance", + "sentence": "Set angle variance of _PARAM0_ to _PARAM2_ degrees", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAngleVariance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Angle variance (degrees) Range: 0 to 180", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the number of bullets shot every time the \"fire bullet\" action is used.", + "fullName": "Set number of bullets per shot", + "functionType": "Action", + "group": "Multi-Fire", + "name": "SetBulletQuantity", + "sentence": "Set number of bullets per shot of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyBulletQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Bullets", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Enable bullet rotation.", + "fullName": "Enable (or disable) bullet rotation", + "functionType": "Action", + "group": "Firing", + "name": "SetRotateBullet", + "sentence": "Enable bullet rotation on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"RotateBullet\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"RotateBullet\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Rotate bullet to match trajetory", + "name": "RotateBullet", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable unlimited ammo.", + "fullName": "Enable (or disable) unlimited ammo", + "functionType": "Action", + "group": "Ammo", + "name": "SetUnlimitedAmmo", + "sentence": "Enable unlimited ammo on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"UnlimitedAmmo\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"UnlimitedAmmo\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Unlimited ammo", + "name": "UnlimitedAmmo", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the firing cooldown, which changes the rate of fire.", + "fullName": "Set firing cooldown", + "functionType": "Action", + "group": "Firing", + "name": "SetCooldown", + "sentence": "Set the fire rate of _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyFireCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"NewCooldown\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Cooldown in seconds", + "name": "NewCooldown", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration to reload ammo.", + "fullName": "Set reload duration", + "functionType": "Action", + "group": "Reload", + "name": "SetReloadDuration", + "sentence": "Set the reload duration of _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyReloadDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Reload duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration after becoming overheated.", + "fullName": "Set overheat duration", + "functionType": "Action", + "group": "Overheat", + "name": "SetOverheatDuration", + "sentence": "Set the overheat duration of _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyOverheatDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Overheat duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the quantity of ammo.", + "fullName": "Set ammo quantity", + "functionType": "Action", + "group": "Ammo", + "name": "SetAmmoQuantity", + "sentence": "Set the ammo quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Ammo", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the heat increase per shot.", + "fullName": "Set heat increase per shot", + "functionType": "Action", + "group": "Overheat", + "name": "SetHeatPerShot", + "sentence": "Set the heat increase of _PARAM0_ to _PARAM2_ per shot", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHeatIncreasePerShot" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Heat increase per shot (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the max ammo.", + "fullName": "Set max ammo", + "functionType": "Action", + "group": "Ammo", + "name": "SetMaxAmmo", + "sentence": "Set the max ammo of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyMaxAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyMaxAmmo" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::MaxAmmo(),Object.Behavior::AmmoQuantity())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Max ammo", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Reset total shots fired.", + "fullName": "Reset total shots fired", + "functionType": "Action", + "group": "Stats", + "name": "ResetTotalShotsFired", + "sentence": "Reset total shots fired by _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalShotsFired" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset total bullets created.", + "fullName": "Reset total bullets created", + "functionType": "Action", + "group": "Stats", + "name": "ResetTotalBulletsCreated", + "sentence": "Reset total bullets created by _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalBulletsCreated" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset total reloads completed.", + "fullName": "Reset total reloads completed", + "functionType": "Action", + "group": "Stats", + "name": "ResetTotalReloadsCompleted", + "sentence": "Reset total reloads completed by _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalReloadsCompleted" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the number of shots per reload.", + "fullName": "Set shots per reload", + "functionType": "Action", + "group": "Reload", + "name": "SetShotsPerReload", + "sentence": "Set the shots per reload of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsPerReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyShotsPerReload()" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyShotsPerReload()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Shots per reload", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automatic reloading.", + "fullName": "Enable (or disable) automatic reloading", + "functionType": "Action", + "group": "Reload", + "name": "SetAutomaticReload", + "sentence": "Enable automatic reloading on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior", + "=" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Enable automatic reloading", + "name": "Value", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the linear rate of cooling.", + "fullName": "Set linear cooling rate", + "functionType": "Action", + "group": "Overheat", + "name": "SetLinearCoolingRate", + "sentence": "Set the linear cooling rate of _PARAM0_ to _PARAM2_ per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyLinearCoolingRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Heat cooling rate (per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the exponential rate of cooling.", + "fullName": "Set exponential cooling rate", + "functionType": "Action", + "group": "Overheat", + "name": "SetExponentialCoolingRate", + "sentence": "Set the exponential cooling rate of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyExponentialCoolingRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Exponential cooling rate", + "name": "Value", + "supplementaryInformation": "[\"Exponential\",\"Linear\"]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Increase ammo quantity.", + "fullName": "Increase ammo", + "functionType": "Action", + "name": "IncreaseAmmo", + "sentence": "Increase ammo of _PARAM0_ by _PARAM2_ shots", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "GetArgumentAsNumber(\"AmmoGained\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Ammo is set, do not exceed the value", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyMaxAmmo" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::MaxAmmo(),Object.Behavior::AmmoQuantity())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::PropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::ReloadAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Ammo gained", + "name": "AmmoGained", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Number of bullets to shoot at once (evenly spaced inside the Firing Arc).", + "fullName": "Bullet quantity", + "functionType": "Expression", + "group": "Multi-Fire", + "name": "BulletQuantity", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBulletQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Angle variance, in degrees.", + "fullName": "Angle variance", + "functionType": "Expression", + "group": "Firing", + "name": "AngleVariance", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyAngleVariance()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Firing arc, in degrees.", + "fullName": "Firing arc", + "functionType": "Expression", + "group": "Multi-Fire", + "name": "FiringArc", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFiringArc()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Heat level (Range: 0 to 1).", + "fullName": "Heat level", + "functionType": "Expression", + "group": "Overheat", + "name": "HeatLevel", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "min(1,Object.Behavior::PropertyHeatLevel())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Firing cooldown, in seconds.", + "fullName": "Firing cooldown", + "functionType": "Expression", + "group": "Firing", + "name": "Cooldown", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFireCooldown()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reload duration, in seconds.", + "fullName": "Reload duration", + "functionType": "Expression", + "group": "Ammo", + "name": "ReloadDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyReloadDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Overheat duration, in seconds.", + "fullName": "Overheat duration", + "functionType": "Expression", + "group": "Overheat", + "name": "OverheatDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyOverheatDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Heat increase per shot.", + "fullName": "Heat increase per shot", + "functionType": "Expression", + "group": "Overheat", + "name": "HeatIncreasePerShot", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHeatIncreasePerShot()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Linear cooling rate, per second.", + "fullName": "Linear cooling rate", + "functionType": "Expression", + "group": "Overheat", + "name": "LinearCoolingRate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyLinearCoolingRate()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Exponential cooling rate, per second.", + "fullName": "Exponential cooling rate", + "functionType": "Expression", + "group": "Overheat", + "name": "ExponentialCoolingRate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyExponentialCoolingRate()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Max ammo.", + "fullName": "Max ammo", + "functionType": "Expression", + "group": "Ammo", + "name": "MaxAmmo", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxAmmo()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Total shots fired (multi-bullet shots are considered one shot).", + "fullName": "Shots fired", + "functionType": "Expression", + "group": "Stats", + "name": "TotalShotsFired", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTotalShotsFired()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Total bullets created.", + "fullName": "Bullets created", + "functionType": "Expression", + "group": "Stats", + "name": "TotalBulletsCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTotalBulletsCreated()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reloads completed.", + "fullName": "Reloads completed", + "functionType": "Expression", + "group": "Stats", + "name": "TotalReloadsCompleted", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTotalReloadsCompleted()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Ammo quantity.", + "fullName": "Ammo quantity", + "functionType": "Expression", + "group": "Ammo", + "name": "AmmoQuantity", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyAmmoQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Shots remaining before the next reload is required.", + "fullName": "Shots before next reload", + "functionType": "Expression", + "group": "Reload", + "name": "ShotsBeforeNextReload", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShotsBeforeNextReload()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Shots per reload.", + "fullName": "Shots per reload", + "functionType": "Expression", + "group": "Reload", + "name": "ShotsPerReload", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShotsPerReload()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Seconds remaining before the cooldown will permit a bullet to be fired.", + "fullName": "Time remaining before a bullet may be fired", + "functionType": "Expression", + "group": "Firing", + "name": "CooldownTimeLeft", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,Object.Behavior::Cooldown() - Object.ObjectTimerElapsedTime(\"__FireBullet.FiringCooldown\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Seconds remaining before the overheat penalty ends.", + "fullName": "Time remaining before overheat penalty ends", + "functionType": "Expression", + "group": "Overheat", + "name": "OverheatTimeLeft", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.OverheatDuration\"", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, Object.Behavior::PropertyOverheatDuration() - Object.ObjectTimerElapsedTime(\"__FireBullet.OverheatDuration\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object is currently performing an ammo reload.", + "fullName": "Is ammo reloading in progress", + "functionType": "Condition", + "group": "Reload", + "name": "IsReloadInProgress", + "sentence": "_PARAM0_ is reloading ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object is ready to shoot.", + "fullName": "Is ready to shoot", + "functionType": "Condition", + "group": "Firing", + "name": "IsReadyToShoot", + "sentence": "_PARAM0_ is ready to shoot", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check if ready to shoot", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify that the gun has ammo", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOutOfAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify that the gun does not need to be reloaded and is not currently reloading", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify gun is not shooting sooner than the proper rate of fire", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsFiringCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify the gun is not overheated", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOverheated" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if automatic reloading is enabled.", + "fullName": "Is automatic reloading enabled", + "functionType": "Condition", + "group": "Reload", + "name": "IsAutomaticReloadingEnabled", + "sentence": "Automatic reloading is enabled on_PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if ammo is unlimited.", + "fullName": "Is ammo unlimited", + "functionType": "Condition", + "group": "Ammo", + "name": "IsUnlimitedAmmo", + "sentence": "_PARAM0_ has unlimited ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object has no ammo available.", + "fullName": "Is out of ammo", + "functionType": "Condition", + "group": "Ammo", + "name": "IsOutOfAmmo", + "sentence": "_PARAM0_ is out of ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::PropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object needs to reload ammo.", + "fullName": "Is a reload needed", + "functionType": "Condition", + "group": "Reload", + "name": "IsReloadNeeded", + "sentence": "_PARAM0_ needs to reload ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shots per reload must not be \"0\"", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyShotsPerReload" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::PropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object is overheated.", + "fullName": "Is overheated", + "functionType": "Condition", + "group": "Overheat", + "name": "IsOverheated", + "sentence": "_PARAM0_ is overheated", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "1" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::OverheatTimeLeft()", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if firing cooldown is active.", + "fullName": "Is firing cooldown active", + "functionType": "Condition", + "group": "Firing", + "name": "IsFiringCooldownActive", + "sentence": "Firing cooldown is active on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CooldownTimeLeft()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.1", + "type": "Number", + "label": "Firing cooldown (seconds)", + "description": "Object cannot shoot while firing cooldown is active", + "group": "Shooting configuration", + "extraInformation": [], + "hidden": false, + "name": "FireCooldown" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HasJustFired" + }, + { + "value": "45", + "type": "Number", + "label": "Firing arc (degrees)", + "description": "Multi-Fire bullets will be evenly spaced inside the Firing Arc", + "group": "Multi-Fire", + "extraInformation": [], + "hidden": false, + "name": "FiringArc" + }, + { + "value": "1", + "type": "Number", + "label": "Number of bullets created at once (Multi-Fire)", + "description": "Multi-Fire bullets will be evenly spaced inside the Firing Arc", + "group": "Multi-Fire", + "extraInformation": [], + "hidden": false, + "name": "BulletQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "Angle variance (degrees)", + "description": "Used to simulate imperfect aim (Range: 0 to 180 degrees)", + "group": "Shooting configuration", + "extraInformation": [], + "hidden": false, + "name": "AngleVariance" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rotate bullet to match trajectory", + "description": "", + "group": "Shooting configuration", + "extraInformation": [], + "hidden": false, + "name": "RotateBullet" + }, + { + "value": "0", + "type": "Number", + "label": "Ammo quantity (current)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "AmmoQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "Shots per reload ", + "description": "Use 0 to disable reloading", + "group": "Reload", + "extraInformation": [], + "hidden": false, + "name": "ShotsPerReload" + }, + { + "value": "1", + "type": "Number", + "label": "Reloading duration (seconds)", + "description": "Object cannot shoot while reloading is in progress", + "group": "Reload", + "extraInformation": [], + "hidden": false, + "name": "ReloadDuration" + }, + { + "value": "0", + "type": "Number", + "label": "Max ammo ", + "description": "Use \"0\" to disable restrictions on ammo capacity", + "group": "Ammo", + "extraInformation": [], + "hidden": false, + "name": "MaxAmmo" + }, + { + "value": "0", + "type": "Number", + "label": "Shots before next reload", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShotsBeforeNextReload" + }, + { + "value": "0", + "type": "Number", + "label": "Total shots fired", + "description": "Regardless of how many bullets are created, only 1 shot will be counted per frame", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TotalShotsFired" + }, + { + "value": "0", + "type": "Number", + "label": "Total bullets created", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TotalBulletsCreated" + }, + { + "value": "0", + "type": "Number", + "label": "Starting ammo", + "description": "", + "group": "Ammo", + "extraInformation": [], + "hidden": false, + "name": "StartingAmmo" + }, + { + "value": "0", + "type": "Number", + "label": "Total reloads completed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TotalReloadsCompleted" + }, + { + "value": "true", + "type": "Boolean", + "label": "Unlimited ammo", + "description": "", + "group": "Ammo", + "extraInformation": [], + "hidden": false, + "name": "UnlimitedAmmo" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ReloadInProgress" + }, + { + "value": "0", + "type": "Number", + "label": "Heat increase per shot (Range: 0 to 1)", + "description": " Object is overheated when Heat reaches 1", + "group": "Overheat", + "extraInformation": [], + "hidden": false, + "name": "HeatIncreasePerShot" + }, + { + "value": "0", + "type": "Number", + "label": "Heat level (Range: 0 to 1)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HeatLevel" + }, + { + "value": "true", + "type": "Boolean", + "label": "Reload automatically", + "description": "", + "group": "Reload", + "extraInformation": [], + "hidden": false, + "name": "AutomaticReloading" + }, + { + "value": "0", + "type": "Number", + "label": "Overheat duration (seconds) ", + "description": "Object cannot shoot while overheat duration is active", + "group": "Overheat", + "extraInformation": [], + "hidden": false, + "name": "OverheatDuration" + }, + { + "value": "0.1", + "type": "Number", + "label": "Linear cooling rate (per second)", + "description": "", + "group": "Overheat", + "extraInformation": [], + "hidden": false, + "name": "LinearCoolingRate" + }, + { + "value": "0.3", + "type": "Number", + "label": "Exponential cooling rate (per second)", + "description": "Exponential cooling happens faster when heat is high and slower when heat is low", + "group": "Overheat", + "extraInformation": [ + "Linear", + "Exponential" + ], + "hidden": false, + "name": "ExponentialCoolingRate" + } + ], + "sharedPropertyDescriptors": [] } ], - "behaviorsSharedData": [ - { - "name": "DrawResourceBar", - "type": "DrawResourceBarOLD::DrawResourceBarOLD" - }, - { - "name": "DrawResourceBar222", - "type": "ResourceBar::DrawResourceBar" - }, - { - "name": "Health", - "type": "Health::Health" - }, - { - "name": "ShakeObject_PositionAngleScale", - "type": "ShakeObject::ShakeObject_PositionAngleScale" - }, - { - "name": "Shield", - "type": "Health::Shield" - }, - { - "name": "Sticker", - "type": "Sticker::Sticker" - }, - { - "name": "TiledResourceBar", - "type": "ResourceBar::TiledResourceBar" - }, - { - "name": "UnitResourceBar", - "type": "ResourceBar::SpriteResourceBar" - } - ] - } - ], - "externalEvents": [], - "eventsFunctionsExtensions": [ + "eventsBasedObjects": [] + }, { "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", "category": "Input", @@ -3754,9 +11461,9 @@ "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", "name": "ResourceBar", "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", - "shortDescription": "Displays a bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "shortDescription": "Display a bar that represents a resource in the game (health, shield, mana, ammo, etc)", "version": "0.0.1", - "description": "Solid resource bar\n\nUnit resource bar", + "description": "The resource bar can be displayed using these objects:\n\n- Shape painter\n- Tiled sprite\n- Sprite\n", "origin": { "identifier": "DraggableSliderControl", "name": "gdevelop-extension-store" @@ -3769,7 +11476,8 @@ "mana", "shield", "hearts", - "lives" + "lives", + "ammo" ], "authorIds": [ "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", @@ -3780,8 +11488,8 @@ "eventsBasedBehaviors": [ { "description": "Draws a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", - "fullName": "Draw resource bar", - "name": "DrawResourceBar", + "fullName": "Resource bar (shape painter)", + "name": "ResourceBar_ShapePainter", "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { @@ -3837,7 +11545,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" }, "parameters": [ "Object", @@ -3854,7 +11562,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::UpdateHitbox" + "value": "ResourceBar::ResourceBar_ShapePainter::UpdateHitbox" }, "parameters": [ "Object", @@ -3875,7 +11583,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" } ], @@ -3892,7 +11600,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Slider drawing", + "name": "Draw resource bar (if needed)", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -3901,7 +11609,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::PropertyNeedRedraw" + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyNeedRedraw" }, "parameters": [ "Object", @@ -3929,7 +11637,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -4121,8 +11829,301 @@ } ] } - ], - "parameters": [] + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw a resource bar that shows current and max values.", + "fullName": "Draw a resource bar (shape painter)", + "functionType": "Action", + "name": "DrawResourceBar", + "sentence": "Draw a resource bar using _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), Object.Behavior::PropertyEasingSpeed())", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"MaxValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Current value", + "name": "CurrentValue", + "type": "expression" + }, + { + "description": "Max value", + "name": "MaxValue", + "supplementaryInformation": "Health::Health", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Draw a resource bar based on the health points of an object.", + "fullName": "Draw a health bar", + "functionType": "Action", + "name": "DrawHealthBar", + "sentence": "Draw a resource bar using _PARAM0_ based on the health points of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), Object.Behavior::PropertyEasingSpeed())", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithHealth.HealthBehavior::MaxHealth()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Object with health", + "name": "ObjectWithHealth", + "type": "objectList" + }, + { + "description": "Health behavior", + "name": "HealthBehavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw a resource bar based on the shield points of an object.", + "fullName": "Draw a shield bar", + "functionType": "Action", + "name": "DrawShieldBar", + "sentence": "Draw a resource bar using _PARAM0_ based on the shield points of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), Object.Behavior::PropertyEasingSpeed())", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithShield.ShieldBehavior::MaxShield()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Object with shield", + "name": "ObjectWithShield", + "type": "objectList" + }, + { + "description": "Shield behavior", + "name": "ShieldBehavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw a resource bar based on the ammo of an object.", + "fullName": "Draw an ammo bar", + "functionType": "Action", + "name": "DrawAmmoBar", + "sentence": "Draw a resource bar using _PARAM0_ based on the ammo of _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithFireBullet.FireBulletBehavior::AmmoQuantity(), Object.Behavior::PropertyEasingSpeed())", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithFireBullet.FireBulletBehavior::MaxAmmo()", + "" + ] + } + ] } ], "parameters": [ @@ -4135,17 +12136,28 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Object with fire bullet", + "name": "ObjectWithFireBullet", + "type": "objectList" + }, + { + "description": "Fire bullet behavior", + "name": "FireBulletBehavior", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], "objectGroups": [] }, { - "description": "The value of the slider (based on position of the thumb).", - "fullName": "Slider value", + "description": "Value of the resource.", + "fullName": "Resource value", "functionType": "Expression", - "group": "Slider", + "group": "Resource value", "name": "Value", "sentence": "", "events": [ @@ -4177,17 +12189,17 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Change the value of a slider (this will move the thumb to the correct position).", - "fullName": "Slider value", + "description": "Change the value of the resource.", + "fullName": "Resource value", "functionType": "Action", - "group": "Slider", + "group": "Resource value", "name": "SetValue", "sentence": "Change the value of _PARAM0_: _PARAM2_", "events": [ @@ -4196,7 +12208,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::PropertyTickSpacing" + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyTickSpacing" }, "parameters": [ "Object", @@ -4209,7 +12221,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" }, "parameters": [ "Object", @@ -4225,7 +12237,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::PropertyTickSpacing" + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyTickSpacing" }, "parameters": [ "Object", @@ -4238,7 +12250,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" }, "parameters": [ "Object", @@ -4254,7 +12266,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::PropertyValue" + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyValue" }, "parameters": [ "Object", @@ -4267,7 +12279,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" }, "parameters": [ "Object", @@ -4283,7 +12295,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::PropertyValue" + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyValue" }, "parameters": [ "Object", @@ -4296,7 +12308,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" }, "parameters": [ "Object", @@ -4326,7 +12338,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValueOffset" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueOffset" }, "parameters": [ "Object", @@ -4337,7 +12349,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -4358,7 +12370,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { @@ -4370,10 +12382,10 @@ "objectGroups": [] }, { - "description": "The minimum value of a slider.", - "fullName": "Slider minimum value", + "description": "Minimum value of the resource.", + "fullName": "Resource minimum value", "functionType": "Expression", - "group": "Slider value configuration", + "group": "Resource value", "name": "ValueMin", "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ @@ -4405,17 +12417,17 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Change the minimum value of a slider.", - "fullName": "Slider minimum value", + "description": "Change the minimum value of the resource.", + "fullName": "Resource minimum value", "functionType": "Action", - "group": "Slider value configuration", + "group": "Resource value", "name": "SetValueMin", "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", "events": [ @@ -4425,7 +12437,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValueMin" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueMin" }, "parameters": [ "Object", @@ -4436,7 +12448,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ "Object", @@ -4458,7 +12470,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { @@ -4470,10 +12482,10 @@ "objectGroups": [] }, { - "description": "The maximum value of a slider.", - "fullName": "Slider maximum value", + "description": "Maximum value of the resource.", + "fullName": "Resource maximum value", "functionType": "Expression", - "group": "Slider value configuration", + "group": "Resource value", "name": "ValueMax", "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ @@ -4505,17 +12517,17 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Thickness of Bar.", - "fullName": "Slider Bar thickness", + "description": "Thickness of the resource bar.", + "fullName": "Resource bar thickness", "functionType": "Expression", - "group": "Slider Bar configuration", + "group": "Resource bar configuration", "name": "BarThickness", "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ @@ -4547,17 +12559,17 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Length of Bar.", - "fullName": "Slider Bar length", + "description": "Length of the resource bar.", + "fullName": "Resource bar length", "functionType": "Expression", - "group": "Slider Bar configuration", + "group": "Resource bar configuration", "name": "BarLength", "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ @@ -4589,17 +12601,17 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Change the maximum value of a slider.", - "fullName": "Slider maximum value", + "description": "Change the maximum value of the resource.", + "fullName": "Resource maximum value", "functionType": "Action", - "group": "Slider value configuration", + "group": "Resource value", "name": "SetValueMax", "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ @@ -4609,7 +12621,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyValueMax" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueMax" }, "parameters": [ "Object", @@ -4620,7 +12632,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ "Object", @@ -4642,7 +12654,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { @@ -4654,10 +12666,10 @@ "objectGroups": [] }, { - "description": "The tick spacing of a slider.", + "description": "Tick spacing of the resource bar.", "fullName": "Tick spacing", "functionType": "Expression", - "group": "Slider value configuration", + "group": "Resource bar configuration", "name": "TickSpacing", "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ @@ -4689,7 +12701,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { @@ -4701,10 +12713,10 @@ "objectGroups": [] }, { - "description": "Change the tick spacing of a slider.", + "description": "Change the tick spacing of the resource bar.", "fullName": "Tick spacing", "functionType": "Action", - "group": "Slider value configuration", + "group": "Resource bar configuration", "name": "SetTickSpacing", "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ @@ -4714,7 +12726,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyTickSpacing" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyTickSpacing" }, "parameters": [ "Object", @@ -4725,7 +12737,7 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ "Object", @@ -4747,7 +12759,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { @@ -4759,12 +12771,12 @@ "objectGroups": [] }, { - "description": "Change length of Bar.", + "description": "Change length of the resource bar.", "fullName": "Bar length", "functionType": "Action", - "group": "Slider Bar configuration", + "group": "Resource bar configuration", "name": "SetBarLength", - "sentence": "Change Bar length of _PARAM0_ to _PARAM2_ px", + "sentence": "Change length of _PARAM0_ to _PARAM2_ px", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -4772,7 +12784,7 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyBarLength" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyBarLength" }, "parameters": [ "Object", @@ -4783,161 +12795,17 @@ }, { "type": { - "value": "ResourceBar::DrawResourceBar::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move thumb to correct place (based on new Bar size)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar::SetValue" + "value": "ResourceBar::ResourceBar_ShapePainter::UpdateHitbox" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::PropertyValue()", "" ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Bar width", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change thickness of Bar.", - "fullName": "Bar thickness", - "functionType": "Action", - "group": "Slider Bar configuration", - "name": "SetBarThickness", - "sentence": "Change Bar thickness of _PARAM0_ to _PARAM2_ px", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyBarThickness" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Bar thickness", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change opacity of inactive Bar.", - "fullName": "Inactive Bar opacity", - "functionType": "Action", - "group": "Slider Bar configuration", - "name": "SetInactiveBarOpacity", - "sentence": "Change inactive Bar opacity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyInactiveBarOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -4946,60 +12814,20 @@ ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", - "type": "behavior" }, - { - "description": "Inactive Bar opacity", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change opacity of active Bar.", - "fullName": "Active Bar opacity", - "functionType": "Action", - "group": "Slider Bar configuration", - "name": "SetActiveBarOpacity", - "sentence": "Change active Bar opacity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyActiveBarOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ "Object", "Behavior", - "yes" + "Object.Behavior::PropertyValue()", + "" ] } ] @@ -5015,11 +12843,11 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Active Bar opacity", + "description": "Bar width", "name": "Value", "type": "expression" } @@ -5027,12 +12855,12 @@ "objectGroups": [] }, { - "description": "Change the color of the Bar that is LEFT of the thumb.", - "fullName": "Active Bar color ", + "description": "Change thickness of the resource bar.", + "fullName": "Bar thickness", "functionType": "Action", - "group": "Slider Bar configuration", - "name": "SetActiveBarColor", - "sentence": "Change active Bar color of _PARAM0_ to _PARAM2_", + "group": "Resource bar configuration", + "name": "SetBarThickness", + "sentence": "Change thickness of _PARAM0_ to _PARAM2_ px", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -5040,18 +12868,18 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyActiveBarColor" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyBarThickness" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsString(\"Color\")" + "GetArgumentAsNumber(\"Value\")" ] }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -5072,24 +12900,24 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Active Bar color", - "name": "Color", - "type": "color" + "description": "Bar thickness", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the color of the Bar that is RIGHT of the thumb.", - "fullName": "Inactive Bar color", + "description": "Change opacity of the inactive portion of a resource bar.", + "fullName": "Inactive opacity", "functionType": "Action", - "group": "Slider Bar configuration", - "name": "SetInactiveBarColor", - "sentence": "Change inactive Bar color of _PARAM0_ to _PARAM2_", + "group": "Resource bar configuration", + "name": "SetInactiveBarOpacity", + "sentence": "Change opacity of inactive part of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -5097,18 +12925,18 @@ "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyInactiveBarColor" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyInactiveBarOpacity" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsString(\"Color\")" + "GetArgumentAsNumber(\"Value\")" ] }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetPropertyNeedRedraw" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", @@ -5129,25 +12957,24 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Inactive Bar color", - "name": "Color", - "type": "color" + "description": "Inactive bar opacity", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Update the hitbox.", - "fullName": "Update hitbox", + "description": "Change opacity of the active portion of a resource bar.", + "fullName": "Active bar opacity", "functionType": "Action", - "group": "Private", - "name": "UpdateHitbox", - "private": true, - "sentence": "Update the hitbox of _PARAM0_", + "group": "Resource bar configuration", + "name": "SetActiveBarOpacity", + "sentence": "Change opacity of active part of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -5155,24 +12982,23 @@ "actions": [ { "type": { - "value": "PrimitiveDrawing::SetRotationCenter" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyActiveBarOpacity" }, "parameters": [ "Object", - "Object.Behavior::PropertyBarLength() / 2", - "Object.Behavior::PropertyBarThickness() / 2" + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] }, { "type": { - "value": "PrimitiveDrawing::SetRectangularCollisionMask" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", - "0", - "0", - "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness()" + "Behavior", + "yes" ] } ] @@ -5188,56 +13014,48 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" + }, + { + "description": "Active bar opacity", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Draw health bar.", - "fullName": "Draw health bar", + "description": "Change the color of the active area of bar.", + "fullName": "Active bar color ", "functionType": "Action", - "name": "DrawHealthBar", - "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", + "group": "Resource bar configuration", + "name": "SetActiveBarColor", + "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyActiveBarColor" }, "parameters": [ "Object", "Behavior", - "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), Object.Behavior::PropertyEasingSpeed())", - "" + "=", + "GetArgumentAsString(\"Color\")" ] }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetValueMax" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", "Behavior", - "ObjectWithHealth.HealthBehavior::MaxHealth()", - "" + "yes" ] } ] @@ -5253,67 +13071,48 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Object with health", - "name": "ObjectWithHealth", - "type": "objectList" - }, - { - "description": "Health behavior", - "name": "HealthBehavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" + "description": "Active bar color", + "name": "Color", + "type": "color" } ], "objectGroups": [] }, { - "description": "Draw shield bar.", - "fullName": "Draw shield bar", + "description": "Change the color of the inactive area of bar.", + "fullName": "Inactive bar color", "functionType": "Action", - "name": "DrawShieldBar", - "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", + "group": "Resource bar configuration", + "name": "SetInactiveBarColor", + "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetValue" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyInactiveBarColor" }, "parameters": [ "Object", "Behavior", - "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), Object.Behavior::PropertyEasingSpeed())", - "" + "=", + "GetArgumentAsString(\"Color\")" ] }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetValueMax" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" }, "parameters": [ "Object", "Behavior", - "ObjectWithShield.ShieldBehavior::MaxShield()", - "" + "yes" ] } ] @@ -5329,67 +13128,50 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Object with shield", - "name": "ObjectWithShield", - "type": "objectList" - }, - { - "description": "Shield behavior", - "name": "ShieldBehavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" + "description": "Inactive bar color", + "name": "Color", + "type": "color" } ], "objectGroups": [] }, { - "description": "Draw resource bar.", - "fullName": "Draw resource bar", + "description": "Update the hitbox.", + "fullName": "Update hitbox", "functionType": "Action", - "name": "DrawResourceBar", - "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::DrawResourceBar::SetValue" + "value": "PrimitiveDrawing::SetRotationCenter" }, "parameters": [ "Object", - "Behavior", - "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), Object.Behavior::PropertyEasingSpeed())", - "" + "Object.Behavior::PropertyBarLength() / 2", + "Object.Behavior::PropertyBarThickness() / 2" ] }, { "type": { - "value": "ResourceBar::DrawResourceBar::SetValueMax" + "value": "PrimitiveDrawing::SetRectangularCollisionMask" }, "parameters": [ "Object", - "Behavior", - "GetArgumentAsNumber(\"MaxValue\")", - "" + "0", + "0", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness()" ] } ] @@ -5405,19 +13187,8 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::DrawResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" - }, - { - "description": "Current value", - "name": "CurrentValue", - "type": "expression" - }, - { - "description": "Max value", - "name": "MaxValue", - "supplementaryInformation": "Health::Health", - "type": "expression" } ], "objectGroups": [] @@ -5571,8 +13342,8 @@ }, { "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image for the resource bar and the unit objects.", - "fullName": "Unit resource bar", - "name": "SpriteResourceBar", + "fullName": "Resource bar (sprite)", + "name": "ResourceBar_Sprite", "objectType": "", "eventsFunctions": [ { @@ -5587,7 +13358,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -5608,18 +13379,18 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Draw a unit resource bar made from objects.", - "fullName": "Draw a unit resource bar", + "description": "Draw a resource bar made from sprite objects.", + "fullName": "Draw a resource bar (sprite)", "functionType": "Action", - "name": "DrawUnitBar", - "sentence": "Draw unit bar _PARAM0_ with _PARAM2_ objects", + "name": "DrawResourceBar", + "sentence": "Draw a resource bar located at _PARAM0_ that is made from _PARAM2_", "events": [ { "colorB": 228, @@ -5636,7 +13407,7 @@ "whileConditions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::PropertyNextUnitToCreate" + "value": "ResourceBar::ResourceBar_Sprite::PropertyNextUnitToCreate" }, "parameters": [ "Object", @@ -5688,7 +13459,7 @@ }, { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyNextUnitToCreate" }, "parameters": [ "Object", @@ -6000,7 +13771,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyNextUnitToCreate" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyNextUnitToCreate" }, "parameters": [ "Object", @@ -6026,7 +13797,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6051,7 +13822,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyEmptyUnitColorTint" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitColorTint" }, "parameters": [ "Object", @@ -6072,7 +13843,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6097,7 +13868,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyActiveUnitColorTint" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyActiveUnitColorTint" }, "parameters": [ "Object", @@ -6118,7 +13889,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6143,7 +13914,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyEmptyUnitOpacity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitOpacity" }, "parameters": [ "Object", @@ -6164,7 +13935,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6189,7 +13960,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyActiveUnitOpacity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyActiveUnitOpacity" }, "parameters": [ "Object", @@ -6210,7 +13981,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6235,7 +14006,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyEmptyUnitAnimationNumber" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitAnimationNumber" }, "parameters": [ "Object", @@ -6256,7 +14027,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6280,7 +14051,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyMaxQuantity" }, "parameters": [ "Object", @@ -6301,7 +14072,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6316,7 +14087,8 @@ { "description": "Change the current quantity of units.", "fullName": "Unit quantity", - "functionType": "Action", + "functionType": "ActionWithOperator", + "getterName": "CurrentQuantity", "name": "SetCurrentQuantity", "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", "events": [ @@ -6326,7 +14098,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -6347,7 +14119,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6372,7 +14144,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -6393,7 +14165,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6418,7 +14190,7 @@ "actions": [ { "type": { - "value": "ResourceBar::SpriteResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -6439,7 +14211,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::SpriteResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { @@ -6450,6 +14222,86 @@ } ], "objectGroups": [] + }, + { + "description": "quantity", + "fullName": "Current quantity", + "functionType": "ExpressionAndCondition", + "name": "CurrentQuantity", + "sentence": "quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "max quantity", + "fullName": "Max quantity", + "functionType": "ExpressionAndCondition", + "name": "MaxQuantity", + "sentence": "max quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] } ], "propertyDescriptors": [ @@ -6558,8 +14410,8 @@ }, { "description": "Use a tiled sprite to display repeated objects to represent a resource in the game (hearts, lives, ammo, etc). ", - "fullName": "Tiled resource bar", - "name": "TiledResourceBar", + "fullName": "Resource bar (tiled sprite)", + "name": "ResourceBar_TiledSprite", "objectType": "TiledSpriteObject::TiledSprite", "eventsFunctions": [ { @@ -6574,7 +14426,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -6596,7 +14448,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" } ], @@ -6604,9 +14456,9 @@ }, { "description": "Display a tiled resource bar.", - "fullName": "Display a tiled resource bar", + "fullName": "Draw a resource bar (tiled sprite)", "functionType": "Action", - "name": "DisplayTiledBar", + "name": "DrawResourceBar", "sentence": "Display resource bar using _PARAM0_", "events": [ { @@ -6636,7 +14488,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" } ], @@ -6655,7 +14507,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -6677,7 +14529,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" }, { @@ -6714,7 +14566,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::PropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::PropertyMaxQuantity" }, "parameters": [ "Object", @@ -6727,7 +14579,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -6756,7 +14608,7 @@ "conditions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::PropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::PropertyMaxQuantity" }, "parameters": [ "Object", @@ -6769,7 +14621,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" }, "parameters": [ "Object", @@ -6791,7 +14643,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" }, { @@ -6815,7 +14667,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetPropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyMaxQuantity" }, "parameters": [ "Object", @@ -6837,7 +14689,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" }, { @@ -6862,7 +14714,7 @@ "actions": [ { "type": { - "value": "ResourceBar::TiledResourceBar::SetPropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyMaxQuantity" }, "parameters": [ "Object", @@ -6884,7 +14736,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" }, { @@ -6896,11 +14748,11 @@ "objectGroups": [] }, { - "description": "the quantity of a tiled resource bar.", + "description": "the quantity", "fullName": "Quantity", "functionType": "ExpressionAndCondition", "name": "Quantity", - "sentence": "Quantity", + "sentence": "the quantity", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6930,18 +14782,18 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" } ], "objectGroups": [] }, { - "description": "the maximum quantity of a tiled resource bar.", + "description": "the max quantity", "fullName": "Max quantity", "functionType": "ExpressionAndCondition", "name": "MaxQuantity", - "sentence": "Max quantity", + "sentence": "the max quantity", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -6971,7 +14823,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::TiledResourceBar", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", "type": "behavior" } ], From fa9df3e9ed98924581b1abe16b602d3b53240917 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 18 Nov 2022 05:26:52 +0000 Subject: [PATCH 17/24] Optimised images with calibre/image-actions --- .../resource-bar/assets/Health Bar Box.png | Bin 2983 -> 246 bytes examples/resource-bar/assets/Health Bar.png | Bin 1465 -> 945 bytes .../Health Indicator_Black Outline Empty.png | Bin 109 -> 107 bytes .../Health Indicator_Black Outline Heart.png | Bin 185 -> 143 bytes .../Health Indicator_White Outline Empty.png | Bin 110 -> 107 bytes .../Health Indicator_White Outline Heart.png | Bin 171 -> 132 bytes examples/resource-bar/assets/Heart.png | Bin 372 -> 283 bytes .../assets/tiled_Energy Bar Fill.png | Bin 2836 -> 127 bytes .../assets/tiled_Health Bar Fill.png | Bin 2849 -> 143 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/resource-bar/assets/Health Bar Box.png b/examples/resource-bar/assets/Health Bar Box.png index e02e8033917d6f3c47c281eff86506bb9d0ecda3..34250327ca41e3df957ed796cb844296e10ae6fc 100644 GIT binary patch delta 198 zcmV;%06G7s7xn>=IDY`BNklo)fu$NrES3(mbBIfW3{D;juWIqs25fN(m%hby}H0}@Y@mXpTA^}>FRtWddvJCU| z?LR75=h0z{{FyMHp=GID=-AekfUa#JgOq@Sgme2zwID*xBR|!G5P$##AfPq@cb=hy z`i+3-6_hgv5bC!An1pMYgxLj^-vzM^EwmBc0MTz~8yAWMm;e9(07*qoM6N<$g53>T A&Hw-a delta 2957 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 delta 78 zcmV-U0I~mTZIC2M1ZP1_K>z@;j(q!3lK=n!BuPX;R2Y?G{Qv(y13tinSC(W2GNSVT kWkluw<5YkRFw)+U0K4x9rwlpvtN;K207*qoM6N<$g27B5%>V!Z diff --git a/examples/resource-bar/assets/Health Indicator_Black Outline Heart.png b/examples/resource-bar/assets/Health Indicator_Black Outline Heart.png index 5aa581445ec690be21757417ba1f3b0b5397b3ca..63fb0516c6f97a261882860b6d9147c7f9882480 100644 GIT binary patch delta 114 zcmdnV*v~jYC7ZLrBeIx*fm;ZK886+f`@_J%;OOb%7$R{w`N#kN_RMxX=^ouD{<0^Q zn8kbw+#n>ecypl0pV>03(~qoTkX#=S=&0ck&NA7hP{l`ZlS&)Y45bu1hU~2Am+U#` Rz5*J?;OXk;vd$@?2>`!=Cw~9{ delta 157 zcmV;O0Al}-0l5K?B!2{FK}|sb0I`mI`%#ks003}FL_t&-m1F$>|33p>@c;jRhX4Qn zGf0cb{g)Pz`;X3MVPIfjkP(&tf83sh0UMhI*)$mk3x?wiCs1r)LgqXO>_%)r1c1j3A$?$-TbU|^8-ba4!kxSags|9^XCyE6{4to8fr{_r1q eqP?J3nepniLs#SeS9JjuGI+ZBxvXgSZjdBO1ZP1_K>z@;j(q!3lK=n!B}qg3{zI`e@Iw zc=N+a{Y_I3NX+eB$RH`ao?*6|33phzyxFb`}XPo zzi*%Zqq7D%PDHLkV1nRcMIZnG diff --git a/examples/resource-bar/assets/Heart.png b/examples/resource-bar/assets/Heart.png index a0177a83aedfdc89fbc31bcab299953b66bf85bf..7201cc3d32aa5c7f780a9962de3e23c262762077 100644 GIT binary patch delta 256 zcmV+b0ssE=0-FMmBYyx1a7bBm000XT000XT0n*)m`~Uy|%}GQ-R5;7El*;?gdq^FenPVaLGGYC~l6^u!)fUix;jJ@sW@@&o z38m%?JT#vOtjw7y!YjtC@1}h^1mo#?b8ol_oNP@v&&C@W72$C3#d!??0000D%45QhI$ktP+Dlow7Ks9Kd8mGudN{1)Tm zV||1mKS5bhXw|A9QZzJP5>#o(1KoM&^Tmq#OHpF`{NI<8eFgrs-fY3-*>?e5NzD0l zj3=0>2Y}C)SqOOl>16^B0Eguw#O$u$2?RHeOy6Gr&G}|-sDG`KCmAQCWZrgtl4QD? zN8|hDmY7e}^o&@Vj@6)XPWQ_#P}2KpWBUE+Y91awFI9?TmZi)QN~y%p)|IRH+JATe zsOkp5_>)0uyT>`F^X{y980Rj>Sn{^(lZ#Z+h%#|h($07*qoM6N<$g3S=Fk^lez diff --git a/examples/resource-bar/assets/tiled_Energy Bar Fill.png b/examples/resource-bar/assets/tiled_Energy Bar Fill.png index 933d8ffd410a45800f07b8c7812830583562c04f..9ad5090ffe0121d45a1a3a5390d6177e46695ddc 100644 GIT binary patch delta 77 zcmbOtRzJbQox#x4#WBR=cydLEp1~7=!xKurtpC~M%xCz=eudGK3o918%i6w?u~qTz hSA6;6qSQn`4hGdbTT{18Y;0oy0#8>zmvv4FO#tRYAD93D delta 2807 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 JPDHLkV1ke0Npb)H diff --git a/examples/resource-bar/assets/tiled_Health Bar Fill.png b/examples/resource-bar/assets/tiled_Health Bar Fill.png index 89211888888a016889ab1d6cbea22d59082c6fd9..646d2ea5e32d16397bd4eb1153a6e9b05ef92ed4 100644 GIT binary patch delta 94 zcmZ1|*3US>BAmg|)5S3);&5_Ao`BUNfx{i2KL`qc7i@K#*DfCw)u&R}*%e^tem y!;9tQzJ6HI?r!U2&)>goY5VSW_uq#P%P=y?J7{*ft+86o00f?{elF{r5}E)V=Ox$x delta 2821 zcmV+g3;Ohr0ihOf59&ghTmgWD z0l;*TI7e|ZE3OddDgXd@nX){&BsoQaTL>+22Uk}v9w^R9 z7b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&VLTB&dxTDwhmt{>c0m6B4T3W z{^ifBa6kY6;dFk{{wy!E8h|?nfNlPwCGG@hUJIag_lst-4?wj5py}FI^KkfnJUm6A zkh$5}<>chpO2k52Vaiv1{%68pz*qfj`F=e7_x0eu;v|7GU4cgg_~63K^h~83&yop* zV%+ABM}Pdc3;+Bb(;~!4V!2o<6ys46agIcqjPo+3B8fthDa9qy|77CdEc*jK-!%ZR zYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S1Au6Q;m>#f??3%Vpd|o+W=WE9003S@ zBra6Svp>fO002awfhw>;8}z{#EWidF!3EsG3xE7zHiSYX#KJ-lLJDMn9CBbOtb#%) zhRv`YDqt_vKpix|QD}yfa1JiQRk#j4a1Z)n2%fLC6RbVIkUx0b+_+BaR3c znT7Zv!AJxWizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifqlp|(=5QHQ7#Gr)$3XMd?XsE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*S zAPZv|vv@2aYYnT0b%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5c zP6_8IrP_yNQcbz0DW*G2J50yT%*~?B)|oY%Ju%lZ z=bPu7*PGwBU|M)uEVih&xMfMQuC{HqePL%}7iYJ{uEXw=y_0>qeSeMpJqHbk*$%56 zS{;6Kv~mM9! zg3B(KJ}#RZ#@)!hR=4N)wtYw9={>5&Kw=W)*2gz%*kgNq+ zEef_mrsz~!DAy_nvS(#iX1~pe$~l&+o-57m%(KedkbgIv@1Ote62cPUlD4IWOIIx& zSmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGAUct(O!LkCy1 z<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}TincS4LsjI}fWY1>O zX6feMEq|U{4wkBy=9dm`4cXeX4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC- zq*U}&`cyXV(%rRT*Z6MH?i+i&_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-N zmiuj8txj!m?Z*Ss1N{dh4z}01)YTo*JycSU)_*JOM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&VO9;xODQe+vO8ixL2C5I$v$-bm~0*lhaSfyPUh4uDM)mx$b(swR>jw=^LIm&fWCA zdGQwi*43UlJ>9+YdT;l|_x0Zv-F|W>{m#p~*>@-It-MdXU-UrjLD@syht)q@{@mE_ z+<$7occAmp+(-8Yg@e!jk@b%cLj{kSkAKUC4TkHUI6gT!;y-fz>HMcd&t%Ugo)`Y2 z{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P`?ZJ24cOCDe z-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy001CkNK#Dz0D2_=0Dyx40Dk%Z z004mL004C`008P>0026e000+nl3&F}0000?Nkls#ET2YW zczDM!>u3y*dU({sqaGgh@TiAJJv{2+Q4iCmrS3w8pFdH00000|NjF3 Xm!t<+*EhhG00000NkvXXu0mjfKaotE From 54a8d8b543a4d2a7fa234160f199e60820861d57 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sat, 26 Nov 2022 15:38:14 -0700 Subject: [PATCH 18/24] Started second scene - And deleted unused assets --- .../resource-bar/assets/Blue laser (01).png | Bin 708 -> 0 bytes .../resource-bar/assets/Bomb_No Shadow.png | Bin 0 -> 3145 bytes examples/resource-bar/assets/Bomb_Shadow.png | Bin 0 -> 3164 bytes examples/resource-bar/assets/Heart-1-1.png | Bin 0 -> 375 bytes examples/resource-bar/assets/Heart-1.png | Bin 0 -> 369 bytes examples/resource-bar/assets/Minus Key.png | Bin 0 -> 1225 bytes examples/resource-bar/assets/Plus Key.png | Bin 0 -> 1337 bytes .../resource-bar/assets/Ranger_Carry_1.png | Bin 242 -> 0 bytes .../resource-bar/assets/Ranger_Carry_2.png | Bin 224 -> 0 bytes .../resource-bar/assets/Ranger_Carry_3.png | Bin 243 -> 0 bytes .../resource-bar/assets/Ranger_Carry_4.png | Bin 224 -> 0 bytes .../resource-bar/assets/Ranger_Climb_1.png | Bin 213 -> 0 bytes .../resource-bar/assets/Ranger_Climb_2.png | Bin 230 -> 0 bytes .../resource-bar/assets/Ranger_Climb_3.png | Bin 213 -> 0 bytes .../resource-bar/assets/Ranger_Climb_4.png | Bin 232 -> 0 bytes .../resource-bar/assets/Ranger_Daze_1.png | Bin 238 -> 0 bytes .../resource-bar/assets/Ranger_Daze_2.png | Bin 244 -> 0 bytes .../resource-bar/assets/Ranger_Daze_3.png | Bin 238 -> 0 bytes .../resource-bar/assets/Ranger_Daze_4.png | Bin 238 -> 0 bytes examples/resource-bar/assets/Ranger_Dead.png | Bin 220 -> 0 bytes .../resource-bar/assets/Ranger_Get Up.png | Bin 217 -> 0 bytes .../resource-bar/assets/Ranger_Headbutt_1.png | Bin 262 -> 0 bytes .../resource-bar/assets/Ranger_Headbutt_2.png | Bin 259 -> 0 bytes examples/resource-bar/assets/Ranger_Hurt.png | Bin 240 -> 0 bytes .../resource-bar/assets/Ranger_Idle 1_1.png | Bin 247 -> 0 bytes .../resource-bar/assets/Ranger_Idle 1_2.png | Bin 248 -> 0 bytes .../resource-bar/assets/Ranger_Idle 1_3.png | Bin 245 -> 0 bytes .../resource-bar/assets/Ranger_Idle 1_4.png | Bin 247 -> 0 bytes .../resource-bar/assets/Ranger_Idle 2_1.png | Bin 230 -> 0 bytes .../resource-bar/assets/Ranger_Idle 2_2.png | Bin 232 -> 0 bytes .../resource-bar/assets/Ranger_Idle 2_3.png | Bin 227 -> 0 bytes .../resource-bar/assets/Ranger_Idle 2_4.png | Bin 231 -> 0 bytes .../assets/Ranger_Jump Kick_1.png | Bin 243 -> 0 bytes .../assets/Ranger_Jump Kick_2.png | Bin 257 -> 0 bytes .../assets/Ranger_Jump Kick_3.png | Bin 259 -> 0 bytes .../assets/Ranger_Jump Kick_4.png | Bin 243 -> 0 bytes .../resource-bar/assets/Ranger_Kick 1.png | Bin 261 -> 0 bytes .../resource-bar/assets/Ranger_Kick 2.png | Bin 265 -> 0 bytes .../resource-bar/assets/Ranger_Knockdown.png | Bin 250 -> 0 bytes .../assets/Ranger_Over Throw_1.png | Bin 244 -> 0 bytes .../assets/Ranger_Over Throw_2.png | Bin 253 -> 0 bytes .../resource-bar/assets/Ranger_Pick Up 2.png | Bin 228 -> 0 bytes .../resource-bar/assets/Ranger_Pick Up.png | Bin 238 -> 0 bytes .../resource-bar/assets/Ranger_Punch 1.png | Bin 240 -> 0 bytes .../resource-bar/assets/Ranger_Punch 2.png | Bin 258 -> 0 bytes examples/resource-bar/assets/Ranger_Run_1.png | Bin 239 -> 0 bytes examples/resource-bar/assets/Ranger_Run_2.png | Bin 244 -> 0 bytes examples/resource-bar/assets/Ranger_Run_3.png | Bin 243 -> 0 bytes examples/resource-bar/assets/Ranger_Run_4.png | Bin 246 -> 0 bytes examples/resource-bar/assets/Ranger_Stab.png | Bin 245 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 1_1.png | Bin 247 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 1_2.png | Bin 230 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 1_3.png | Bin 247 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 1_4.png | Bin 230 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 2_1.png | Bin 253 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 2_2.png | Bin 229 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 2_3.png | Bin 253 -> 0 bytes .../resource-bar/assets/Ranger_Strafe 2_4.png | Bin 229 -> 0 bytes .../resource-bar/assets/Ranger_Walk 1_1.png | Bin 245 -> 0 bytes .../resource-bar/assets/Ranger_Walk 1_2.png | Bin 232 -> 0 bytes .../resource-bar/assets/Ranger_Walk 1_3.png | Bin 246 -> 0 bytes .../resource-bar/assets/Ranger_Walk 1_4.png | Bin 232 -> 0 bytes .../resource-bar/assets/Ranger_Walk 2_1.png | Bin 229 -> 0 bytes .../resource-bar/assets/Ranger_Walk 2_2.png | Bin 243 -> 0 bytes .../resource-bar/assets/Ranger_Walk 2_3.png | Bin 229 -> 0 bytes .../resource-bar/assets/Ranger_Walk 2_4.png | Bin 233 -> 0 bytes .../resource-bar/assets/Ranger_Walk 3_1.png | Bin 244 -> 0 bytes .../resource-bar/assets/Ranger_Walk 3_2.png | Bin 230 -> 0 bytes .../resource-bar/assets/Ranger_Walk 3_3.png | Bin 248 -> 0 bytes .../resource-bar/assets/Ranger_Walk 3_4.png | Bin 242 -> 0 bytes examples/resource-bar/game.json | 2192 +++++++---------- 71 files changed, 908 insertions(+), 1284 deletions(-) delete mode 100644 examples/resource-bar/assets/Blue laser (01).png create mode 100644 examples/resource-bar/assets/Bomb_No Shadow.png create mode 100644 examples/resource-bar/assets/Bomb_Shadow.png create mode 100644 examples/resource-bar/assets/Heart-1-1.png create mode 100644 examples/resource-bar/assets/Heart-1.png create mode 100644 examples/resource-bar/assets/Minus Key.png create mode 100644 examples/resource-bar/assets/Plus Key.png delete mode 100644 examples/resource-bar/assets/Ranger_Carry_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Carry_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Carry_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Carry_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Climb_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Climb_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Climb_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Climb_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Daze_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Daze_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Daze_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Daze_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Dead.png delete mode 100644 examples/resource-bar/assets/Ranger_Get Up.png delete mode 100644 examples/resource-bar/assets/Ranger_Headbutt_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Headbutt_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Hurt.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 1_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 1_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 1_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 1_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 2_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 2_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 2_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Idle 2_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Jump Kick_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Kick 1.png delete mode 100644 examples/resource-bar/assets/Ranger_Kick 2.png delete mode 100644 examples/resource-bar/assets/Ranger_Knockdown.png delete mode 100644 examples/resource-bar/assets/Ranger_Over Throw_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Over Throw_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Pick Up 2.png delete mode 100644 examples/resource-bar/assets/Ranger_Pick Up.png delete mode 100644 examples/resource-bar/assets/Ranger_Punch 1.png delete mode 100644 examples/resource-bar/assets/Ranger_Punch 2.png delete mode 100644 examples/resource-bar/assets/Ranger_Run_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Run_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Run_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Run_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Stab.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 1_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Strafe 2_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 1_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 1_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 1_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 1_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 2_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 2_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 2_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 2_4.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 3_1.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 3_2.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 3_3.png delete mode 100644 examples/resource-bar/assets/Ranger_Walk 3_4.png diff --git a/examples/resource-bar/assets/Blue laser (01).png b/examples/resource-bar/assets/Blue laser (01).png deleted file mode 100644 index 937b258d35d221760c85a377537a7b6d751b29cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^oIq^G!3HEn_ioMr2^4rl7Bet#3xP1>rMq>17#Nt! zJY5_^EKZkR_4g1-lsNuzdGK_F7gto9tTcsIST_Z_u=5Mb+K8}}YIMAKptwk*tLsC6 zfW$C(7nNCO zBfD453B8v0)V6$=MBDVVSa#p@lW*0FPMf2__1J29lf|^Tw|vqi|ExHtV7>CNZiDPK z$&_$*{qxQ%S8e;{T~?}Q&7bW!*RiaYRX*WpzhsKKa<>1WNz%qA)@{??-^Qw*HX*kD zvWCc;8IEOHXQL!%tUkiCX?64M^NR6(5-Hci4H%4DKAWJT=`tQ3gk+S?*PpQ~1u`HfV!Nu3Cc>DKX zl>j>T@tlVC_|-tM?o9b+_ExRtHz_>Pa|`nKol@AntLaqYj^9gxtbbce4!qq7l+3dJ z%}`R$Cy^4Kzig{`UL6<6+!9OH>z^2#-&~oZ`L0o0o|*0D%G48i4c(hTVkR;7c%P@& z039h2bDuHxeJxPdaPKbJbH2ZUwpQ1tO3#`3Nit>mv42-}3tr7VuV8)g@1Zmc%a_2= z_#bC>@FQoxW7(v~FQWS!C%HYB?pG|lII$2!E)3Umezd4>I*4pe29dSOVVVC|oQ`_5 mXq))A-fx1_zb=1M&#)?a`l{ZDH4eaJ$>8bg=d#Wzp$PzT8AHMV diff --git a/examples/resource-bar/assets/Bomb_No Shadow.png b/examples/resource-bar/assets/Bomb_No Shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..65b4770fcd106341af80cdfcb44bb9597ad36b21 GIT binary patch literal 3145 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Bomb_Shadow.png b/examples/resource-bar/assets/Bomb_Shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..a784165a1e3396559b3967369a2dba9beb8933c7 GIT binary patch literal 3164 zcmV-i45RajP)uJ@VVD_U zC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1Q zpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X z6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv1)yUy0P^?0*fb9UASvow z`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q{wNRKos+;6rV8ldy0Owz z(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E` zvOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G41dM~{UdP z6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4Es0sQWIt5*Tu0n&*J!lk~ zf_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+AA{TB3-ERLHar49hi4Ih z5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=natP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+e zdD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVb znL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0WMyP6Wy582WNT#4$d1qu znl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8dZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iutvy=3T65Yu+7a4Yv^%sX zb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i^lS773}6Fm1Fpe-gF!>I zp{*g$u-szvGhed; zvo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*ZvFf(^Xl-N7w{EeXveC4O zv)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChY zI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_WICNY@+|jrX%s^&6b2i>5 zeqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!ql}XcFH*PieWwLj2ZSq`7 zV9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I-?$tAVKYn8-l({mqQ$Q8{ zO!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;cwT88(J6|n-WB%w`m$h~4 zpmp)YIh_3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dlbFb#!9eY1iCsp6Bajj|H zr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syTu9enWavU5N9)I?I-1m1* z_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$mU2Q)a|9JSc+Uc4zvS-T9 z63!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;;JuhGEb?H5K#o@~7t9DmU zU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX=)z6+o0o6-+`4{y+3mqQ z%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@>;2q1Vm)$Z)P1z?N$8UY zW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHsy69KwU-!MxeeuI@&cF4| zM9z%Al6!vl ze|gdn#u$o>y+YOh9iVGSKanIQpoYl+z;SJo7t?+s;l&6~&lad*GRL(^9zc-*)G(Q| z7-2Y`fS%L=0G)0d)G*m`^I>~UN(gNUxHuOEh~<5&=WQPR?%L${eWVpm3K2O4oo*X< zw~yd+FE(JD&`nC=&jP6l{i))o2Z%+DN-wJzFNHq~$|>N^cip&w%6#$+3Bd31K?BM! zs8Q)T?!2W0Pzn1zAn#B%A*U19yNFOH%uAS$U|7T+L&vqrhjpI`W;Gi?EbmTzAnNpq z0g_}v6!)LrU)~fMAXXHFPF&h8&3l38in1}OQZ9;%&7BIs4*_@d2_Q(Vfga{9vr(_1ufy6Ph+yK%>;eSX92lxXYat^=O$@Sv^0000J=ma literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Heart-1-1.png b/examples/resource-bar/assets/Heart-1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6132a435ae20722a03406d3c1d88fffed1f2220b GIT binary patch literal 375 zcmV--0f_#IP)Px$F-b&0R7gv`m9Y*1K@f(iBr1(wB@%@YtxD$!R31U6zh37NRGvVm(h5;XM5WhU zB~g*tB)lUo{o0|>yf zRm*Ay`*W^_AM6DL0YI9KCyX{ij03o!1Gp!E;>hmcn&yB4mRGsfMU)#7%nU)q-8q73B2Lu?&OtO-$eCW2UlKZfXPgFF8n|$ zh!Px$D@jB_R7gu>WWWK8Oq~D2q|Tk$%ZN=GF={Y0!ZdZW3&71R{rLgRhFJttvrS(C zuEy))0~9qd2^0&^4cFE{SOU@jGX&XSWS?QP1a1K~mxDBeEV+8)1DHkzT!x}3{BP%9 zgZb!|;I#nVP`X+Gvkc@DnCmI_0n9M;-~ky-^&rBPyortjeBqDFaGXJOYf=L^Q$;K~ z4AzUB2k@mNm_?ve1_H4BvLenF%vZ~6V8ojbV20y!F|sA-84@IiVgVtaAX^A?H7=Kf z%);;i%r*Ej9kOrGg9clfg;5s4e1R`cV3weVIV{|f9f7r!B;*rp7Jz~STU_C_09Tw~ zb2&EGV?;8p)Ph{@BdftxPY@MEuvCC8PLR_%p(Knqh|o2|EW;Jv*enA8E*!rUS_nx- P00000NkvXXu0mjf{CAQi literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Minus Key.png b/examples/resource-bar/assets/Minus Key.png new file mode 100644 index 0000000000000000000000000000000000000000..1e6dcf7224dfda73c32b082acc5ea6b547bf115a GIT binary patch literal 1225 zcmV;)1UCDLP)?EyIfDl3mA%qY@2qAUI@ltSy9S1Aq{s9mnzI)6>(hmFrz)<9faR(f9pt08UqJNJ0F~ zIsdjwFxr7Mo6S$2=UoE$pj$^ly~J^R-05_F>TK-k?$z_WGf)^RA0~aHMJteIv-uT3 zOLwOmpf%~ErTID=F~&|+<=flaD3wZYUqu#0(c9N>I86L}(nsHytyedYW4SB{0_^VY z>Qt9|zVD;o@6VN~`X~+UIYhRpVF15J22+*}q*|^1A(t^`prJkL}1fvT_Gt!vp0 zdcEGia+wff*=h<$)d#A+dXLr|vaBEou(!8|t*x!M?``6oV>leHyr1d3FdB`}?RFFM zgbliZv>~1LMp2|ZvpPCDLbY1e+>IXJ_l<-;ts@8m)M_<6KR=`0ZYO>(iXzqK$zM!C zYf_)y!Y)XDDIQB#zrJ)zVA#4!|zV<-^EP#})68b}dNecwCfHI4p597BOPh5~Vn(}ViX&JH}! z{NK#$>#OlPO>sJqX0wTtlM|zLUSD71;^M++ohCUQ2mn+nm322EQ#6Md;KJ?qOSvF# zFVC7px8Dnl0&xrl;uzg`F1F;dqA$?-KdNKbU4^U_$aMMhEDB_vs*lp3AMF34?{k8SODd(*rgBEKg#&#Q3dw#&!1_SZv*J+v%3 zg)G}{Es)V@H1~a}R6@C2wzWHJDwRrNNE!?V*7j%Z^^oy+jL~TH_KYkbyTj+wIz{ej&z~l`uHxxWB(QUhgd3KoSp7R*kb^7^2tfY3{-;oO9gV z+$?$|tZEajhfM2Uhx{p*Et((h?(PtVVPa0nlU}d4FbqI_?5aLWBa_$E!!Se`hFRP{{!w|0Fvi*d&K@2feyqDK ngb+dqA%qY@2qA z!A|Qq6o&t#DF{IX6%|rj5S3W6U}nP_A+er$g9~qRA7y6A4&DG*!eY2f7Kjd|>4vJk zDr%J~iSL3If#Y5hCk{?~KB)`b_}D%_^|2j00SJO12!bF8f*=TjAP9mWi2P%uVWd*2 zY@4QeU>HUn01U&ZGsfy^*wz)pFdB@p1^_U|8bJ_TwA=0f6WdLaxl*ZYTbA`5z;V)w z%n1K@p7%Y8Fw%n5YPCJnG%oSG_p#*)co7{;+EeQ9Y4g+k%&Gt2nC|MnRUhoSGsKKeJVU0Fd6_%z$L zvAn!2V=nhtmW6)5{~=A}qbNwn5T1Dz19kcuI3v27dc>+4utTzvamC7$PDI2*idQyOHkb=WiiCIZCKVv z^MkJVr%UkRG291VO^8asM0jzvcx%epHQgx?KVC=^gE7F89ejD>}TP?t0q43w3pY#uTijo`ZOhb^61JqD05 z2H*FUoJZ;R`$`8WO1rF1r=!yRR1CvVB8KOAczk?J-R^s21qmH}74@@@dvy>qKgv z7>!16ZGX?$N3oF&>SqwVRYz2@IY#OoBGQXAo12^e$qwyi9md%0)6>(RGI^zgI%Dh@ zlIQ4VoZi?sQb-HZYPEg@L2w`&yk-%`*lm*cPXQ^tHg9Wd>n{L*&-$zKrePRH1Hf6c v+0^HJH9-&rK@bE%5ClOG1VIo4@rC>Xj-sNpD;Aq+1_&)Cm*S=j-vn^&QCtPY_$$Z)Pbv zTsQA{v4X_g*HfC$inW;fHkh3LZs72ID%-b=R6<}%?hk)*7@O1TaS?83{1OOBcU+Mq= diff --git a/examples/resource-bar/assets/Ranger_Carry_2.png b/examples/resource-bar/assets/Ranger_Carry_2.png deleted file mode 100644 index 6dcee5873cd9ee5aa4aae0b7052c8051ed6f93c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkWF zPZ!4!kK@S+3lx9!w{>1)NOSjGnB>&j-sNmC;Az?1_&)Cm*S=j-vn^&QyXdgY`l4>RCh6gUY4@hL9Gmvy=s~wc z=U;K@y8OqU?^EgA$vV+C)*W|C|5*yMZ}Bb7XH1gda!@$+!E!-bgTiBmv}B1(yY@LVtk1pcek@KY pgW>!0k4z$8jU^cBa%Q^qaL-a*qIDvxx(4WA22WQ%mvv4FO#n{0UW)(# diff --git a/examples/resource-bar/assets/Ranger_Carry_4.png b/examples/resource-bar/assets/Ranger_Carry_4.png deleted file mode 100644 index 6dcee5873cd9ee5aa4aae0b7052c8051ed6f93c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkWF zPZ!4!kK@S+3lx9!w{>1)NOSjGnB>&Uqds*r%SPb_rxqu!zcD~;(yd{mLKEA#T)A|OA!f!lHU;UXc|sFSADcD=m^?CKNM}+~cNDzjQ{}d3HRJ!Elg%F=W%=uG z%6#E6W2BzLb)R_V3nG0Y%paCoEed*4Z?pAcy;t_Czy@{(29=7Q1I_v`ZUCLc;OXk; Jvd$@?2>?GbPC@_x diff --git a/examples/resource-bar/assets/Ranger_Climb_2.png b/examples/resource-bar/assets/Ranger_Climb_2.png deleted file mode 100644 index 5a67543caaf2e9e2e6dde4ae016f07c103c893e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkV? zPZ!4!kK<>jUgT|1;BndA_&@In*S}p;vkhh_U&&a+c<7+$g$qyqy?E@^*!AFo$Fd8h ze5s9lIO~jdI<_l*EAuuN bJ+NS$USB)?cvV?4(2We9u6{1-oD!MUqds*r%SPb_rxqu!zcD~;(yd{mLKEA#T)A|OA!f!lHU;UXc|sFSADcD=m^?CKNM}+~cNDzjQ{}d3HRJ!Elg%F=W%=uG z%6#E6W2BzLb)R_V3nG0Y%paCoEed*4Z?pAcy;t_Czy@{(29=7Q1I_v`ZUCLc;OXk; Jvd$@?2>?GbPC@_x diff --git a/examples/resource-bar/assets/Ranger_Climb_4.png b/examples/resource-bar/assets/Ranger_Climb_4.png deleted file mode 100644 index 7f26ff71cc6527cd639e36df1e521337a7cf57c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkWN zPZ!4!kK@S+2YCN2PMmb$zlLUrPnTi=?}=HShEMF}#09_m!qB8Lk@uizuf=7CGYmE7)GhfZOqS=6beN~@@aWIU*#~D# zP%LQOVQ{bE$nwq<<_VV>Po8t^TxR3`uc diff --git a/examples/resource-bar/assets/Ranger_Daze_1.png b/examples/resource-bar/assets/Ranger_Daze_1.png deleted file mode 100644 index 2b39c4cc5e52ddac59e397fd313ea884120f5bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkV& zPZ!4!kK@S+3k-ksw|QQcQElz=G-O%V7~>pZqWrnjkl|>Vz~8!Q>Jq})99?G(&ZqU^E#cq>*|Q9XQW?#bPtIl774Ei*amh7aiCG?cmp+O-|L?gf&inOHU*HDNtqh*7elF{r5}E+PI8!_T diff --git a/examples/resource-bar/assets/Ranger_Daze_2.png b/examples/resource-bar/assets/Ranger_Daze_2.png deleted file mode 100644 index b8f3fb6e63f7f0eb9fbcfd758a42250e98e3696a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkWT zPZ!4!kK@S+3z&cOw|QQcQElz=G-O%V7~>pZqWrnjkl|>Vz~8!Q>Jq})99?G(&ZDo zRrpfRL#9=d49UXLD-MW0GH58UY&iQeMY`eLq=WekUvt&B`W?97QWV&?T;jifP-@dV nrb(}ub6h1)o}6*#)D)mQFG|my;q+q#$Qulvu6{1-oD!M<0XpZqWrnjkl|>Vz~8!Q>Jq})99?G(&ZqU^E#cq>*|Q9XQW?#bPtIl774Ei*amh7aiCG?cmp+O-|L?gf&inOHU*HDNtqh*7elF{r5}E+PI8!_T diff --git a/examples/resource-bar/assets/Ranger_Daze_4.png b/examples/resource-bar/assets/Ranger_Daze_4.png deleted file mode 100644 index 6db8160092943fe95de7dbdc5236b7a23d5c7d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkV& zPZ!4!kK@S+3j}}kw|QQcQElz=G-O%V7~>pZqWrnjkl|>Vz~8!Q>Jq})99?G(&Z%Z~e{3WMY@3N{~<-gHo iHffTv>Qrq{28J2S7oO%Vn7bC}Rt8U3KbLh*2~7YhG*s#U diff --git a/examples/resource-bar/assets/Ranger_Dead.png b/examples/resource-bar/assets/Ranger_Dead.png deleted file mode 100644 index 6d33f273dee34e2fdee83cb338b66cf22c115fa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^vOvtu!3HFoW!gG{6lZ})WHAE+-(e7DJf6QI1t{3( z>Eak-aeD9Mi@XgA0?zr&|L>j<{Zp!ay}-cTVsU5CDaP_nuS*UdFBbE5>@gPk(%r~+ z`kMyVKE5-_lMX8|yB*{Sa!=a3aK|?%;|KfvTGw<(yj04J4Op}HVuy6hjLHQmIoEos zzjz3*nYL&ukA7N1mYq`0nb&cDd7dtj=+ZXNc6nfVU2Z0;OU8TYSJ$l=wyp9Hxqq{H QFVJNSp00i_>zopr0EL}YQvd(} diff --git a/examples/resource-bar/assets/Ranger_Get Up.png b/examples/resource-bar/assets/Ranger_Get Up.png deleted file mode 100644 index f2f274bb69d147166b5f00a69601f6fbd0ed7ea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Q+(IDCc;8GTc;X@|2h^-r?o)VpbxXfR9Ut(0|T^SBwmtUaq${?Oh)UbQXiB LtDnm{r-UW|o_Rz4 diff --git a/examples/resource-bar/assets/Ranger_Headbutt_1.png b/examples/resource-bar/assets/Ranger_Headbutt_1.png deleted file mode 100644 index 143243f8c5cb55e484719c56cd9f60846321a8cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^5ACn2IvO{Pgg&e IbxsLQ029=mh z8k^T|=9%Kse28T#*So(v^>qc93O}*SiH6h_`98?qvchz&dHdwO@1KbHZ4NY&6wXk6 zu=r)`YNp(8&R@4bm~gRXvP0aO9LJZY;+h$gGOb+>7+rXd-2 z7QFOxgt>NLet}}+CN4A1lKADDZBOz}PndqdYZhw`ljgx9S((f^2ZURi7q>NWcc?tP zGm#-r;rGotJ&9>=FP`bFaZgbFW~sU%bA`yg+bdc4e7yIGDs+fjF#OS0X2{EAxv^W3 l_ds(igX`rh_qez2Tv!K=KBGS;yj*&@##P#&;qKUYHSApwplE|rp&YbH!& zc~Rmm?!j1+ao}$3jI>a(`>nobO>}OnzHrl;xtrmq^{Tqle>e{aU7k?S=y8OZhjEUe u2Sa_PO2gR}mVyHcjqa(x?j_#Z!?)(}BF6uW@i9PGGkCiCxvXj-sNpj;Ay#epxnHOHU91?Q<*b@2D1_}a`!U#cwLe>d-wW$j+PJ4MMI~| zJRax9`NZUkQ;TJNI)l>he=*M=a)>DzsTUh6O#N%oFst$E{y@i)&C!oc#1|`ZUU(XH zQ?r4OcgO73Y`4F=XRpZ8FS%UAStTFwOwHk6@2mU9`jUgT|1;BmQopx(TQwf^oYQ<*b@1``r)ITh!6hD>V9co*jwJ!6@DzsjNX zdt!2OCz3myX3VsUX3(jgw?0`nv30|lt8bVta4^2ur^@j6TGF{Bu9XY!-C@W$#x?o0 zxb`K+TmMWqbG^LUvYP$SQkyH>pXGZSx$GV?w>IXWS!PC{xWt~$(697D^Ue*8r diff --git a/examples/resource-bar/assets/Ranger_Idle 2_1.png b/examples/resource-bar/assets/Ranger_Idle 2_1.png deleted file mode 100644 index e45760c05aaca90c77b7e929db4427fb69b01732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkV? zPZ!4!kK@S+3lx9!w|QQcQElz=G-O%V7~>pZqWrnjkl|>Vz~8!Q>Jq})99?G(&ZpZqWrnjkl|>Vz~8!Q>Jq})99?G(&ZQjbAhX3)tU!acsB9+D#jR#i7%9Dco&ny=rM)yg~VNkn#9InW5xfE z&$Onbs{MO%R-)noPs7LdKE?>s{t{-7wbK8BXHEGi`uxA=s*nq@4ncbxRDVyJKK10v c5KlG+Ba`;j(EEW=Kvyz&y85}Sb4q9e00A#j^8f$< diff --git a/examples/resource-bar/assets/Ranger_Idle 2_3.png b/examples/resource-bar/assets/Ranger_Idle 2_3.png deleted file mode 100644 index 41ccf9b6abf93dabcd1938ef57db895c03d54a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkW# zPZ!4!kK@S+5@#OROR4!5PZ7~lJ1Ve)t%%q0V$T`%V+DS;=`t+t}ECUSc}ho>mu3EcaisixR`~h@F)9oJ}zN# z5B%@-G_s##kf?tl(GdFC!@S|jqQCY_JtgBa|IA-v#dw!hMf7#VCjH9DnRBcr0-d$+ XK=roT$zrF04rK6j^>bP0l+XkK?UPfq diff --git a/examples/resource-bar/assets/Ranger_Idle 2_4.png b/examples/resource-bar/assets/Ranger_Idle 2_4.png deleted file mode 100644 index 7dca05bbc42a6530d65db49033688e8571a74846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkWt zPZ!4!kK@S+5@#OROR4!5PZ7~lJ1Ve)t%%q0V$T`%V+!zto1fLcX znSPjO`7YKC2@7|#hIBILJnTQp{{Li|t=Zv(k4;D2mqa$m$=rzX7v;WSxQlhl5mvv$ zn!NRMT4m0jQkpf@`OnGO4<(*)m)Kp^aWIqUJ}MHbcV#<+cSZ8nhD9+wKFQtOU6<^m otd4JJxOAmu-A8*yn+gVoSE|0>c8GDk13H+&)78&qol`;+0FlmF)c^nh diff --git a/examples/resource-bar/assets/Ranger_Jump Kick_2.png b/examples/resource-bar/assets/Ranger_Jump Kick_2.png deleted file mode 100644 index cc10fcd8c726e1bad4e05da77ff3da5bf6d7a332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^5a(Q~35GUiM;^9yMPnjTtw>RWf;G{w-cw))=a*%mXDLqwE(ZIai9*P95qv{ZYZ+oJeG&^Ji= z+gd-h6!A5zfsbBVGcQ;bKmYTM+>=c!PPxwEo3L>Y--3#UXZ%(jN3SXyeq=2v;ZHc; zxN12=PL#vP4gnV3yUCL;v$!8kzVMJo=wsT9kVQ@F9pJzA7Hz;Rc#c=P#gMRycBHWgXGV-?k{Z$3@0E4HipUXO@ GgeCyhoM$iq diff --git a/examples/resource-bar/assets/Ranger_Jump Kick_4.png b/examples/resource-bar/assets/Ranger_Jump Kick_4.png deleted file mode 100644 index 1995ed79c17694fe682a200ad050668a53d2145d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^5!zto1fLcX znSPjO`7YKC2@7|#hIBILJnTQp{{Li|t=Zv(k4;D2mqa$m$=rzX7v;WSxQlhl5mvv$ zn!NRMT4m0jQkpf@`OnGO4<(*)m)Kp^aWIqUJ}MHbcV#<+cSZ8nhD9+wKFQtOU6<^m otd4JJxOAmu-A8*yn+gVoSE|0>c8GDk13H+&)78&qol`;+0FlmF)c^nh diff --git a/examples/resource-bar/assets/Ranger_Kick 1.png b/examples/resource-bar/assets/Ranger_Kick 1.png deleted file mode 100644 index c392e859c9cfb2c9d6028fc41b501768e7e680ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^5xqL-O%E-u3JRa( zu~7PJUnQrcrMDsS(EL4;%*onGAF2drEB-L(b8*_q%F@)`xIp!W&f+lFmh)4uXnxtS zV^*SvgxwjP1+5QF@`VjAtkOFc`SZdR_AQ@|)>j=l{D7U|cU7+0yU3D4pcfcCUHx3v IIVCg!01rrHga7~l diff --git a/examples/resource-bar/assets/Ranger_Kick 2.png b/examples/resource-bar/assets/Ranger_Kick 2.png deleted file mode 100644 index 3ba72e43ed43e2bbbd9caeedf4803a52406f3e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^5GIlJo-~ZbxHpy|(iMf`t4^CZ@b$H3R%KpTGdwp^))=a*%mXDT|~65Pq=pFnEc6ujiEcPtE_cd7~mn? zoxbJIJ=TYnXLJ?rh{iR)d0p~TSB1M_?rw%H4b^k+?F?&pIG=HYP&h+dHIv8eW|p0d zey0~}y>odv<2D2T!!>uMvs1Gy?sX^L)JxtVtjF+U}2zjyh=)(Q48M-GnXVfPgtpmE7!PC{xWt~$(698HbW8?q; diff --git a/examples/resource-bar/assets/Ranger_Over Throw_1.png b/examples/resource-bar/assets/Ranger_Over Throw_1.png deleted file mode 100644 index 58576e01fe331bf2783c014776748cccef61aeef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5))=a*(C<0Sd)SA0zDZI}{c^T; z{V6WSXTE=qIK}OG+bXrwQaXrX%g(sVjN#UcmwL>*$f%^o;H1-V%Tx3~@r8*@6Z#gd z=K1hXucUg>{{}V(p@!XJrVPn?d$aB_{W#mMI&aeYZP`)|(##uP7d&JRa1=an_5ZJ~ qtcOx1WhM~~+h@P&Ub(RT2%r15xb}!$-6231GkCiCxvX!Hh+r)1pMrMo#0}l3T^-clB0d zk1qq~&Fh+8g)f(^Q)o4CSaq$M!{N2e6Sgb+YcprOD=eF7t!VCW*@GeNVDUSLhE$e_ ycB#hj+iVOs7qMSsn;=?ouQ_|$E&0>mA2VF84T(ASkUb0NbOujXKbLh*2~7Z##$P)C diff --git a/examples/resource-bar/assets/Ranger_Pick Up 2.png b/examples/resource-bar/assets/Ranger_Pick Up 2.png deleted file mode 100644 index b8267558f80aa64bdc33cb095a0d98df58dbdc62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Q+(IDCcaw!yCBRbCjIfZ{7r_Gvj)r@ iqFOJ6{&Ob0Vr1BG+T-$hvvnX3FnGH9xvXvRpsyNes{UC$-|e9D zX{H&CC0iS2Oy=m~1w(O4(W kaW%+9JGQfw;V&aY&d2IK!naZ{0$t1C>FVdQ&MBb@0Jh{(&j0`b diff --git a/examples/resource-bar/assets/Ranger_Punch 2.png b/examples/resource-bar/assets/Ranger_Punch 2.png deleted file mode 100644 index d7c787d5d26342082586cb7600106bf0fd3c772e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^5))=a*%mXDL!wrgWIA8jqoB(Y_;H=tuM7_R{u5l> z@##?>Cwae25~!%{6PR#w`Qx4XI|GD_J~Op*pW3v8$MAFONoCAH+BPz^^TOS9)O zu?&GZ4h%ECdq^FSk(4?xXBm*Lky42IEztZq?Rsj=*6e-FkwtwzK=(6vy85}Sb4q9e E09r_8jsO4v diff --git a/examples/resource-bar/assets/Ranger_Run_1.png b/examples/resource-bar/assets/Ranger_Run_1.png deleted file mode 100644 index 9eac15a12984cc610a678d6b13c707b633f64a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkWj zPZ!4!kK=o%-sNpj;Ay#epxnHOHU91?Q;9Qz2D37DM4j0h;whDMruK_?(60i~M6-`J ziy{@aAK+#z{Ck$+!I$Lw*It^4F{#HViG3)rmT~C3?_{9r?=-VbYpu|!tP8Rc?E*{- ztOL0Z+HiY?{_vEU#*-$SF3ylNHHnR>vzXb0Kf=R)!LOHmiz7MDpS`1cjp4tY)-8vh j42p6Udo=_r7hL1(Tpw|LaX~L1(6J1ju6{1-oD!MpZqWrnjkl|>Vz~8!Q>Jq})99?G(&K{9! zc$l+F+F?psO`L+}hYdS9bQ={-7F!A)Ha)TKz%!+uhC|CFWs`R>&3G zrFWSEawGJoTw{*0(V6LT-J0LnL24%Jr8@__7#wF^KEAn}@hX34&ljiMRlgIrrtz`v p(Tc5_ThlOsYftEu4!b{_%lEt;bWS-57rHXqhJX~g0 z$W=~p$aB74(cqaoCO|8J|wDhbM&kMtNsCUMxYMw~Qw67QhL$!?*$>pjb-jvd#f tc79%`EVz5uGp9N3_f}l_H6v_3vs}ddux9-!oIpo2c)I$ztaD0e0s#B8TOj}d diff --git a/examples/resource-bar/assets/Ranger_Strafe 1_2.png b/examples/resource-bar/assets/Ranger_Strafe 1_2.png deleted file mode 100644 index e45760c05aaca90c77b7e929db4427fb69b01732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkV? zPZ!4!kK@S+3lx9!w|QQcQElz=G-O%V7~>pZqWrnjkl|>Vz~8!Q>Jq})99?G(&Zt;bWS-57rHXqhJX~g0 z$W=~p$aB74(cqaoCO|8J|wDhbM&kMtNsCUMxYMw~Qw67QhL$!?*$>pjb-jvd#f tc79%`EVz5uGp9N3_f}l_H6v_3vs}ddux9-!oIpo2c)I$ztaD0e0s#B8TOj}d diff --git a/examples/resource-bar/assets/Ranger_Strafe 1_4.png b/examples/resource-bar/assets/Ranger_Strafe 1_4.png deleted file mode 100644 index e45760c05aaca90c77b7e929db4427fb69b01732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkV? zPZ!4!kK@S+3lx9!w|QQcQElz=G-O%V7~>pZqWrnjkl|>Vz~8!Q>Jq})99?G(&Z7J>>1-nMq zX%Q?>QllR|uyASm<nPB}!^Psu9+XIjPOT=H^=rW&VEF{M4$7J>>1-nMq zX%Q?>QllR|uyASm<nPB}!^Psu9+XIjPOT=H^=rW&VEF{M4$!a@dup+4T=Tt+5I2X sotww-TUb#v!qbMaGB@b8t5lq{&ii?Wg4IDcfKF!cboFyt=akR{0JMQ&KL7v# diff --git a/examples/resource-bar/assets/Ranger_Walk 1_2.png b/examples/resource-bar/assets/Ranger_Walk 1_2.png deleted file mode 100644 index 17572ff23750a932f516e5aae6c5b27fc0eb75e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkWN zPZ!4!kK@S+3k-ksw|QQcQElz=G-O%V7~>pZqWrnjkl|>Vz~8!Q>Jq})99?G(&Z& cS|=G8#9doH7b=Ip0lJdG)78&qol`;+0LY_LUjP6A diff --git a/examples/resource-bar/assets/Ranger_Walk 1_3.png b/examples/resource-bar/assets/Ranger_Walk 1_3.png deleted file mode 100644 index d34d3a6fe65c3f664327574444021c89ec682d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkV= zPZ!4!kK=o%UgT^r;BndA_&@In*S}p;vn^&QhlnVtsl-hR<96iQTb}vyW{{m+Xo!zZ z{~o0Y(Gyw?J{G@YH2D5`_xj7BaU8{Jg%S?AAL#nn7soZpZqWrnjkl|>Vz~8!Q>Jq})99?G(&Z& cS|=G8#9doH7b=Ip0lJdG)78&qol`;+0LY_LUjP6A diff --git a/examples/resource-bar/assets/Ranger_Walk 2_1.png b/examples/resource-bar/assets/Ranger_Walk 2_1.png deleted file mode 100644 index 36b23fd318ecb192d39332aa44882839c7cea81d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Qe1}1p@p%4<6rkXA zPZ!4!kK@S+3lx9!w|QQcQDwczu_!U8%VcsAN1IwutmDMD8f*a~Y|M{pM9!X&(A9ll zBH(Jci_zfMUmbsgV`&_E(FbcLs7dsmW?+knYsgeuBDtFJ#5uJkGaEY`{`d!39Z2Fx zJp1S5?2V5UGZ=OyE@qpM$slHTvXt>9+XIjPOT=H^=rW&VEF{M4$;BdWpV7K(nrts}WyzIp+KH0OjaIiY%%oZ^D`G2a=76yAgm50Xf zUuXO5v}r#hcjEYywMtv6nK`~Dc>V0%$!El^v_UY~;pF$7Pah~;TKCg-rq?tE1=)o& zOpLi#oW6D@Awy}`vxdeO&z|nMA;JG3L5xFmH^UqYo(HR>7!;g78&)Y@Hu>iA$|Z~G q-SJ04EAF?dIjrTE*vtKVEqhi9+XIjPOT=H^=rW&VEF{M4$pZqWrnjkl|>Vz~8!Q>Jq})99?G(&ZpZqWrnjkl|>Vz~8!Q>Jq})99?G(&Z;BejDSZ-d#x<2oz6yGxr310(N#>Q*Sz8x2T$nRe=CCD!3fRfrg zcPYUWx+k1EcGP`m@c8z5=laW{aU3Um9vLv?mb353Qg|C*z>rn;GJQ?=gAS%0v6{QN z4>U8ciCXb!``^{RQ{J^MOOu-RR?wcMV8U;`6|BAuI!ojk_=8v&m=pZqWrnjkl|>Vz~8!Q>Jq})99?G(&Z?$1XZAqnqs~B(0>B&*3TJyk^L2|KlgT78dmYW$% zzQ!U=6;07cXFOD-56s^q$;>~8(cs?&Lx$DQCgw4$EM>k{;}A5lZ@I;P|DdH!@0cdN mVl4@uAjJ1yb8Uzx8-rY9+wZ3m%T0jpW$<+Mb6Mw<&;$Uk{ZVTG diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 878e3f075..10f2be000 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1304,6 +1304,85 @@ "identifier": "https://resources.gdevelop-app.com/assets/Pirate Bomb Pack/Objects/Health Bar/Heart.png", "name": "gdevelop-asset-store" } + }, + { + "alwaysLoaded": false, + "file": "assets/Heart.png", + "kind": "image", + "metadata": "", + "name": "assets\\Heart.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Heart-1.png", + "kind": "image", + "metadata": "", + "name": "assets\\Heart-1.png", + "smoothed": true, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/Heart-1-1.png", + "kind": "image", + "metadata": "", + "name": "assets\\Heart-1-1.png", + "smoothed": true, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/Bomb_No Shadow.png", + "kind": "image", + "metadata": "", + "name": "Bomb_No Shadow.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/32x32 Fantasy Icons Pack v2/Icons/General Items/1ceb65f6eab8e1594f3d784d881fc1eaf87a02d9e331b7ff811acc1bca3e1c2a_Bomb_No Shadow.png", + "name": "Bomb_No Shadow.png" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Bomb_Shadow.png", + "kind": "image", + "metadata": "", + "name": "Bomb_Shadow.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/32x32 Fantasy Icons Pack v2/Icons/General Items/a58e750a7f074351f00ca54fa599fb9c383dcf55c942a27441d0d799228051e1_Bomb_Shadow.png", + "name": "Bomb_Shadow.png" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Plus Key.png", + "kind": "image", + "metadata": "", + "name": "Plus Key.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Dark/fc542dd4d657e2a0bc2a7beaf49ca6135611119f11b7bcd5b5b0f97d273c6634_Plus Key.png", + "name": "Plus Key.png" + } + }, + { + "alwaysLoaded": false, + "file": "assets/Minus Key.png", + "kind": "image", + "metadata": "", + "name": "Minus Key.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Dark/4c2d6e9b511305699472697c840548f3081e21e6a8f678342495570fda6a6edb_Minus Key.png", + "name": "Minus Key.png" + } } ], "resourceFolders": [] @@ -1315,8 +1394,8 @@ { "b": 0, "disableInputWhenNotFocused": true, - "mangledName": "Game2", - "name": "Game2", + "mangledName": "Sprite_32and_32Tiled_32Sprite", + "name": "Sprite and Tiled Sprite", "r": 0, "standardSortMethod": true, "stopSoundsOnStartup": true, @@ -1332,10 +1411,22 @@ "gridColor": 10401023, "gridAlpha": 0.2, "snap": true, - "zoomFactor": 1.8600000000000008, + "zoomFactor": 0.6599999999999997, "windowMask": false }, - "objectsGroups": [], + "objectsGroups": [ + { + "name": "Buttons", + "objects": [ + { + "name": "PlusKey" + }, + { + "name": "MinusKey" + } + ] + } + ], "variables": [], "instances": [ { @@ -1343,12 +1434,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "Shield_Bar", - "persistentUuid": "b581caf8-44ee-423e-b57e-cdd910fb7374", + "name": "Title_Text", + "persistentUuid": "29ae792c-1331-430c-aadf-70fa8d9e36d6", "width": 0, - "x": 192, - "y": 216, - "zOrder": 2, + "x": 208, + "y": 16, + "zOrder": 12, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1358,12 +1449,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "ResourceMouseX_Bar", - "persistentUuid": "17a23f4a-a442-4b52-8380-9f2b6a9c2494", + "name": "Unit_ResourceBar", + "persistentUuid": "0c4d4e97-0b53-4f05-8468-7d8b7a7fa8dd", "width": 0, - "x": 192, - "y": 536, - "zOrder": 3, + "x": 80, + "y": 146, + "zOrder": 13, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1371,14 +1462,14 @@ { "angle": 0, "customSize": true, - "height": 80, + "height": 16, "layer": "", - "name": "Fly", - "persistentUuid": "e0b70af7-7a81-41c3-88ac-88305df91ed2", - "width": 128, - "x": 481.13275146484375, - "y": 293, - "zOrder": 4, + "name": "TiledEmptyUiHeart", + "persistentUuid": "a1be0010-4eb7-4e54-a651-7d77ae646149", + "width": 80, + "x": 513, + "y": 276, + "zOrder": 0, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1386,74 +1477,74 @@ { "angle": 0, "customSize": true, - "height": 128, + "height": 16, "layer": "", - "name": "Moon", - "persistentUuid": "8428ea9d-6d1e-41b0-9f54-1840f3378846", - "width": 129.1327362060547, - "x": 480, - "y": 272, - "zOrder": 0, + "name": "Tiled_ResourceBar", + "persistentUuid": "be98771a-978f-443c-80e8-197098aef457", + "width": 80, + "x": 513, + "y": 252, + "zOrder": 15, "numberProperties": [], "stringProperties": [], "initialVariables": [] }, { "angle": 0, - "customSize": false, - "height": 0, + "customSize": true, + "height": 24, "layer": "", - "name": "Health_Text", - "persistentUuid": "921b2f28-8bee-4ab2-a6cc-1ee823c5215e", - "width": 0, - "x": 48, - "y": 96, - "zOrder": 9, + "name": "HealthBarBox", + "persistentUuid": "fddebf95-4d5f-40b5-a087-80bd8c33b68c", + "width": 265, + "x": 504, + "y": 296, + "zOrder": 0, "numberProperties": [], "stringProperties": [], "initialVariables": [] }, { "angle": 0, - "customSize": false, - "height": 0, + "customSize": true, + "height": 16, "layer": "", - "name": "Shield_Text", - "persistentUuid": "a231209b-a5d8-4280-868d-1e9beb31527b", - "width": 0, - "x": 48, - "y": 208, - "zOrder": 10, + "name": "HealthBarFill", + "persistentUuid": "1e7ce7cc-5104-4c95-95a0-343f3d97e140", + "width": 248, + "x": 513, + "y": 300, + "zOrder": 17, "numberProperties": [], "stringProperties": [], "initialVariables": [] }, { "angle": 0, - "customSize": false, - "height": 0, + "customSize": true, + "height": 62, "layer": "", - "name": "ResourceMouseX_Text", - "persistentUuid": "07fda015-55f8-4959-80fc-f1ee3074d028", - "width": 0, - "x": 32, - "y": 512, - "zOrder": 11, + "name": "NewPanelSprite", + "persistentUuid": "d0461165-f597-4574-b3e8-8e78014d1c61", + "width": 336, + "x": 440, + "y": 496, + "zOrder": 0, "numberProperties": [], "stringProperties": [], "initialVariables": [] }, { "angle": 0, - "customSize": false, - "height": 0, + "customSize": true, + "height": 19, "layer": "", - "name": "Title_Text", - "persistentUuid": "29ae792c-1331-430c-aadf-70fa8d9e36d6", - "width": 0, - "x": 208, - "y": 16, - "zOrder": 12, + "name": "Heart_Tiled", + "persistentUuid": "63560c9a-582e-4a76-9560-e929ab4a1fdf", + "width": 24, + "x": 480, + "y": 518, + "zOrder": 21, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1463,12 +1554,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "Unit_ResourceBar", - "persistentUuid": "0c4d4e97-0b53-4f05-8468-7d8b7a7fa8dd", + "name": "Heart", + "persistentUuid": "19dc3b0f-137e-428c-ae37-9a64934186c6", "width": 0, - "x": 32, - "y": 464, - "zOrder": 13, + "x": 64, + "y": 520, + "zOrder": 19, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1478,12 +1569,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "Health_Bar", - "persistentUuid": "c411b32c-f357-4b8f-9e87-f3fdde7657d5", + "name": "SpriteResourceBar_Text", + "persistentUuid": "fc5e8093-d3c3-4114-9b18-685091e1055e", "width": 0, - "x": 192, - "y": 104, - "zOrder": 1, + "x": 64, + "y": 88, + "zOrder": 22, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1493,42 +1584,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "TiledEmptyUiHeart", - "persistentUuid": "a1be0010-4eb7-4e54-a651-7d77ae646149", + "name": "TiledSpriteResourceBar_Text", + "persistentUuid": "6337ed4e-77e0-4cf5-b4cd-b4770b6396e5", "width": 0, - "x": 40, - "y": 416, - "zOrder": 14, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": true, - "height": 16, - "layer": "", - "name": "Tiled_ResourceBar", - "persistentUuid": "be98771a-978f-443c-80e8-197098aef457", - "width": 16, - "x": 40, - "y": 416, - "zOrder": 15, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": true, - "height": 24, - "layer": "", - "name": "HealthBarBox", - "persistentUuid": "fddebf95-4d5f-40b5-a087-80bd8c33b68c", - "width": 98, - "x": 32, - "y": 360, - "zOrder": 16, + "x": 528, + "y": 80, + "zOrder": 23, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1536,29 +1597,14 @@ { "angle": 0, "customSize": true, - "height": 16, - "layer": "", - "name": "HealthBarFill", - "persistentUuid": "1e7ce7cc-5104-4c95-95a0-343f3d97e140", - "width": 80, - "x": 41, - "y": 364, - "zOrder": 17, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, "height": 62, "layer": "", - "name": "HealthBar", - "persistentUuid": "e57b54cd-d15f-45ae-91e7-56a12aaf0d2f", - "width": 368, - "x": 64, - "y": 288, - "zOrder": 18, + "name": "NewPanelSprite", + "persistentUuid": "4598dbb6-59cf-4253-9998-1c3b796491f3", + "width": 336, + "x": 24, + "y": 498, + "zOrder": 0, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1568,12 +1614,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "Heart", - "persistentUuid": "a45e39e0-8703-466e-9ece-c114c69b92bd", + "name": "Bomb", + "persistentUuid": "70dc048d-f1b7-4ed5-8d6b-f8a54eb65201", "width": 0, - "x": 154, - "y": 309, - "zOrder": 19, + "x": 56, + "y": 280, + "zOrder": 24, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1583,12 +1629,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "Heart", - "persistentUuid": "d575e256-78f3-4b72-8f11-1c0003d651ce", + "name": "PlusKey", + "persistentUuid": "75acefa2-30d2-45f3-8955-bdbcc059a348", "width": 0, - "x": 104, - "y": 309, - "zOrder": 19, + "x": 450, + "y": 98, + "zOrder": 25, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -1598,27 +1644,12 @@ "customSize": false, "height": 0, "layer": "", - "name": "Heart", - "persistentUuid": "a6abf64b-8fa3-4d12-9bad-22314ac4a313", + "name": "MinusKey", + "persistentUuid": "68d80c16-a4fc-4793-aa38-eb458b7c1a28", "width": 0, - "x": 130, - "y": 309, - "zOrder": 19, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": true, - "height": 62, - "layer": "", - "name": "NewPanelSprite", - "persistentUuid": "d0461165-f597-4574-b3e8-8e78014d1c61", - "width": 272, - "x": 168, - "y": 376, - "zOrder": 20, + "x": 342, + "y": 98, + "zOrder": 26, "numberProperties": [], "stringProperties": [], "initialVariables": [] @@ -2695,7 +2726,7 @@ "assetStoreId": "", "bold": true, "italic": false, - "name": "Health_Text", + "name": "SpriteResourceBar_Text", "smoothed": true, "tags": "", "type": "TextObject::Text", @@ -2703,9 +2734,9 @@ "variables": [], "effects": [], "behaviors": [], - "string": "Health", + "string": "Sprite Resource Bar", "font": "", - "characterSize": 30, + "characterSize": 20, "color": { "b": 255, "g": 255, @@ -2716,7 +2747,7 @@ "assetStoreId": "", "bold": true, "italic": false, - "name": "Shield_Text", + "name": "TiledSpriteResourceBar_Text", "smoothed": true, "tags": "", "type": "TextObject::Text", @@ -2724,9 +2755,9 @@ "variables": [], "effects": [], "behaviors": [], - "string": "Shield", + "string": "Tiled Sprite Resource Bar", "font": "", - "characterSize": 30, + "characterSize": 20, "color": { "b": 255, "g": 255, @@ -2766,7 +2797,7 @@ "variables": [], "effects": [], "behaviors": [], - "string": "Extension: Draw Resource Bar", + "string": "Extension: Resource Bar", "font": "", "characterSize": 30, "color": { @@ -3103,27 +3134,217 @@ "variables": [], "effects": [], "behaviors": [] - } - ], - "events": [ + }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Initialize game", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DepartScene" - }, - "parameters": [ - "" + "assetStoreId": "", + "height": 19, + "name": "Heart_Tiled", + "tags": "", + "texture": "assets\\Heart-1-1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 26, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "902b8968115fd8572e4f7f6e83ad67a28c447b24e162ffc028333e716c54eb2f", + "name": "Bomb", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "No Shadow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Bomb_No Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Shadow", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Bomb_Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "996e07c73069934a868dc8212a0d7d959dfdd245af964998aad12cf57d252ac3", + "name": "PlusKey", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Plus Key.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 50, + "y": 50 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "90731de0069b2f3684767c392c6e4c48255a2647bc849497f25b672771290626", + "name": "MinusKey", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Minus Key.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 50, + "y": 50 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" ] } ], @@ -3262,464 +3483,76 @@ "parameters": [] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, + "colorB": 224, + "colorG": 16, + "colorR": 189, "creationTime": 0, - "folded": true, - "name": "Spawn items", + "name": "Draw Resource bars", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tiled resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "RepeatEveryXSeconds::Repeat" - }, - "parameters": [ - "", - "\"SpawnShield\"", - "5", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", + "=", + "10", + "" + ] + } ] - } - ], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "SilverShield", - "Fly.CenterX()", - "CameraBorderTop()", - "" - ] - }, - { - "type": { - "value": "AddForceAL" - }, - "parameters": [ - "SilverShield", - "90", - "75", - "1" - ] - }, - { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "SilverShield", - "\"144;19;254\"" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "RepeatEveryXSeconds::Repeat" - }, - "parameters": [ - "", - "\"SpawnHealth\"", - "12", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "UpgradedPotionBlue", - "Fly.CenterX()", - "CameraBorderBottom()", - "" - ] - }, - { - "type": { - "value": "AddForceAL" - }, - "parameters": [ - "UpgradedPotionBlue", - "270", - "75", - "1" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "RepeatEveryXSeconds::Repeat" - }, - "parameters": [ - "", - "\"SpawnRock\"", - "1", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "MeteorDetailed", - "CameraBorderLeft()", - "Fly.CenterY()", - "" - ] - }, - { - "type": { - "value": "AddForceAL" - }, - "parameters": [ - "MeteorDetailed", - "0", - "300", - "1" - ] - }, - { - "type": { - "value": "ChangeScale" - }, - "parameters": [ - "MeteorDetailed", - "=", - "0.5" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Rotate" - }, - "parameters": [ - "MeteorDetailed", - "30", - "" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "folded": true, - "name": "Collisions", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Fly", - "Shield", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Montre" - }, - "parameters": [ - "Moon", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Fly", - "Shield", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Cache" - }, - "parameters": [ - "Moon" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "CollisionNP" - }, - "parameters": [ - "SilverShield", - "Fly", - "", - "", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::ActivateShield" - }, - "parameters": [ - "Fly", - "Shield", - "" - ] - }, - { - "type": { - "value": "Delete" - }, - "parameters": [ - "SilverShield", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "CollisionNP" - }, - "parameters": [ - "UpgradedPotionBlue", - "Fly", - "", - "", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::Heal" - }, - "parameters": [ - "Fly", - "Health", - "100", - "" - ] - }, - { - "type": { - "value": "Delete" - }, - "parameters": [ - "UpgradedPotionBlue", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "CollisionNP" - }, - "parameters": [ - "MeteorDetailed", - "Fly", - "", - "", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::ShieldHit" - }, - "parameters": [ - "Fly", - "Shield", - "10", - "" - ] - }, - { - "type": { - "value": "Delete" - }, - "parameters": [ - "MeteorDetailed", - "" - ] - }, - { - "type": { - "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" - }, - "parameters": [ - "Fly", - "ShakeObject_PositionAngleScale", - "", - "10", - "10", - "5", - "", - "", - "", - "" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 224, - "colorG": 16, - "colorR": 189, - "creationTime": 0, - "name": "Draw Resource bars", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "This resource shows the horizontal mouse position in scene, but it can be used for anything!", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "MyResource", - "=", - "MouseX()" - ] - } - ] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Shape painter resource bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" }, "parameters": [ - "MiniHealth_Bar", - "DrawResourceBar", - "Fly", - "Health", + "Tiled_ResourceBar", + "TiledResourceBar", + "-", + "1", "" ] } @@ -3727,17 +3560,27 @@ }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Right" + ] + } + ], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawShieldBar" + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" }, "parameters": [ - "Shield_Bar", - "DrawResourceBar222", - "Fly", - "Shield", + "Tiled_ResourceBar", + "TiledResourceBar", + "+", + "1", "" ] } @@ -3749,13 +3592,21 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawResourceBar" + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" }, "parameters": [ - "ResourceMouseX_Bar", - "DrawResourceBar222", - "Variable(MyResource)", - "Variable(MaxResource)", + "Tiled_ResourceBar", + "TiledResourceBar", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", "" ] } @@ -3767,13 +3618,11 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" }, "parameters": [ - "Health_Bar", - "DrawResourceBar222", - "Fly", - "Health", + "HealthBarFill", + "TiledResourceBar", "" ] } @@ -3787,36 +3636,98 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Tiled resource bar", + "name": "Sprite resource bar", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + "value": "DepartScene" }, "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "=", - "10", "" ] - }, + } + ], + "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + "value": "ModVarScene" }, "parameters": [ - "TiledEmptyUiHeart", - "TiledResourceBar", + "Units", "=", - "10", - "" + "5" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Unit_ResourceBar" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetMaxQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "10", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitColor" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "\"74;144;226\"", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitOpacity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "64", + "" + ] + } ] } ] @@ -3837,14 +3748,50 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + "value": "ModVarScene" }, "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "-", - "1", - "" + "Units", + "=", + "max(0,Variable(Units)-1)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "-", + "1", + "" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::DecreaseQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "1", + "" + ] + } ] } ] @@ -3865,14 +3812,50 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + "value": "ModVarScene" }, "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", + "Units", "+", - "1", - "" + "1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::IncreaseQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "1", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "+", + "1", + "" + ] + } ] } ] @@ -3883,40 +3866,97 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + "value": "ResourceBar::ResourceBar_Sprite::DrawResourceBar" }, "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", + "Unit_ResourceBar", + "UnitResourceBar", + "Heart_Unit", + "5", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Buttons", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Hover", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisSurObjet" + }, + "parameters": [ + "Buttons", + "", + "", "" ] - }, + } + ], + "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + "value": "EnableEffect" }, "parameters": [ - "TiledEmptyUiHeart", - "TiledResourceBar", - "" + "Buttons", + "\"Effect\"", + "no" ] } ] }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + "value": "SourisSurObjet" }, "parameters": [ - "HealthBarFill", - "TiledResourceBar", + "Buttons", + "", + "", "" ] } + ], + "actions": [ + { + "type": { + "value": "EnableEffect" + }, + "parameters": [ + "Buttons", + "\"Effect\"", + "yes" + ] + } ] } ], @@ -3927,7 +3967,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Unit resource bar", + "name": "Clicked", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -3936,151 +3976,200 @@ "conditions": [ { "type": { - "value": "DepartScene" + "value": "MouseButtonReleased" }, "parameters": [ - "" + "", + "Left" ] - } - ], - "actions": [ + }, { "type": { - "value": "ModVarScene" + "value": "ScaleWidth" }, "parameters": [ - "Units", + "Buttons", "=", - "5" + "0.9" ] } ], + "actions": [], "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + "value": "SourisSurObjet" }, "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "=", - "10", + "PlusKey", + "", + "", "" ] } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tiled sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] + } ] }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Cache" - }, - "parameters": [ - "Unit_ResourceBar" - ] - }, + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetMaxQuantity" + "value": "SourisSurObjet" }, "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "10", + "MinusKey", + "", + "", "" ] - }, + } + ], + "actions": [], + "events": [ { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitColor" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "\"74;144;226\"", - "" - ] + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] }, { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitOpacity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "64", - "" - ] + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tiled sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] } ] } ] - }, + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Press", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "KeyReleased" + "value": "MouseButtonPressed" }, "parameters": [ "", "Left" ] - } - ], - "actions": [ + }, { "type": { - "value": "ModVarScene" + "value": "BuiltinCommonInstructions::Once" }, - "parameters": [ - "Units", - "=", - "max(0,Variable(Units)-1)" - ] + "parameters": [] } ], + "actions": [], "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "SourisSurObjet" }, "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "-", - "1", + "Buttons", + "", + "", "" ] } - ] - }, - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + ], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::DecreaseQuantity" + "value": "ChangeColor" }, "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "1", - "" + "Buttons", + "\"189;16;224\"" + ] + }, + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Buttons", + "=", + "0.9" ] } ] @@ -4092,79 +4181,33 @@ "conditions": [ { "type": { - "value": "KeyReleased" + "inverted": true, + "value": "MouseButtonPressed" }, "parameters": [ "", - "Right" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "Units", - "+", - "1" - ] - } - ], - "events": [ - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::IncreaseQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "1", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "+", - "1", - "" - ] - } + "Left" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + ], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::DrawResourceBar" + "value": "ChangeColor" }, "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "Heart_Unit", - "5", - "" + "Buttons", + "\"255;255;255\"" + ] + }, + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Buttons", + "=", + "1" ] } ] @@ -4238,8 +4281,8 @@ { "b": 0, "disableInputWhenNotFocused": true, - "mangledName": "Game", - "name": "Game", + "mangledName": "Shape_32Painter_32_40Game_41", + "name": "Shape Painter (Game)", "r": 0, "standardSortMethod": true, "stopSoundsOnStartup": true, @@ -4255,7 +4298,7 @@ "gridColor": 10401023, "gridAlpha": 0.2, "snap": true, - "zoomFactor": 1.1800000000000002, + "zoomFactor": 1.06, "windowMask": false }, "objectsGroups": [], @@ -4381,21 +4424,6 @@ "stringProperties": [], "initialVariables": [] }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Unit_ResourceBar", - "persistentUuid": "0c4d4e97-0b53-4f05-8468-7d8b7a7fa8dd", - "width": 0, - "x": 32, - "y": 464, - "zOrder": 13, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, { "angle": 0, "customSize": false, @@ -4410,36 +4438,6 @@ "numberProperties": [], "stringProperties": [], "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "TiledEmptyUiHeart", - "persistentUuid": "a1be0010-4eb7-4e54-a651-7d77ae646149", - "width": 0, - "x": 40, - "y": 416, - "zOrder": 14, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": true, - "height": 16, - "layer": "", - "name": "Tiled_ResourceBar", - "persistentUuid": "be98771a-978f-443c-80e8-197098aef457", - "width": 16, - "x": 40, - "y": 416, - "zOrder": 15, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] } ], "objects": [ @@ -5584,7 +5582,7 @@ "variables": [], "effects": [], "behaviors": [], - "string": "Extension: Draw Resource Bar", + "string": "Extension: Resource Bar", "font": "", "characterSize": 30, "color": { @@ -6602,455 +6600,81 @@ "comment": "This resource shows the horizontal mouse position in scene, but it can be used for anything!", "comment2": "" }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "MyResource", - "=", - "MouseX()" - ] - } - ] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Shape painter resource bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" - }, - "parameters": [ - "MiniHealth_Bar", - "DrawResourceBar", - "Fly", - "Health", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawShieldBar" - }, - "parameters": [ - "Shield_Bar", - "DrawResourceBar222", - "Fly", - "Shield", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawResourceBar" - }, - "parameters": [ - "ResourceMouseX_Bar", - "DrawResourceBar222", - "Variable(MyResource)", - "Variable(MaxResource)", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" - }, - "parameters": [ - "Health_Bar", - "DrawResourceBar222", - "Fly", - "Health", - "" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Tiled resource bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" - }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "=", - "10", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" - }, - "parameters": [ - "TiledEmptyUiHeart", - "TiledResourceBar", - "=", - "10", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "KeyReleased" - }, - "parameters": [ - "", - "Left" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" - }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "-", - "1", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "KeyReleased" - }, - "parameters": [ - "", - "Right" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" - }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "+", - "1", - "" - ] - } - ] - }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" - }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" - }, - "parameters": [ - "TiledEmptyUiHeart", - "TiledResourceBar", - "" - ] - } + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MyResource", + "=", + "MouseX()" ] } - ], - "parameters": [] + ] }, { "colorB": 228, "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Unit resource bar", + "name": "Shape painter resource bar", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DepartScene" - }, - "parameters": [ - "" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ModVarScene" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" }, "parameters": [ - "Units", - "=", - "5" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" - }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "=", - "10", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Cache" - }, - "parameters": [ - "Unit_ResourceBar" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetMaxQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "10", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitColor" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "\"74;144;226\"", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitOpacity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "64", - "" - ] - } + "MiniHealth_Bar", + "DrawResourceBar", + "Fly", + "Health", + "" ] } ] }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "KeyReleased" - }, - "parameters": [ - "", - "Left" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ModVarScene" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawShieldBar" }, "parameters": [ - "Units", - "=", - "max(0,Variable(Units)-1)" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "-", - "1", - "" - ] - } - ] - }, - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::DecreaseQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "1", - "" - ] - } + "Shield_Bar", + "DrawResourceBar222", + "Fly", + "Shield", + "" ] } ] }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "KeyReleased" - }, - "parameters": [ - "", - "Right" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ModVarScene" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawResourceBar" }, "parameters": [ - "Units", - "+", - "1" - ] - } - ], - "events": [ - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::IncreaseQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "1", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "+", - "1", - "" - ] - } + "ResourceMouseX_Bar", + "DrawResourceBar222", + "Variable(MyResource)", + "Variable(MaxResource)", + "" ] } ] @@ -7061,13 +6685,13 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::DrawResourceBar" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" }, "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "Heart_Unit", - "5", + "Health_Bar", + "DrawResourceBar222", + "Fly", + "Health", "" ] } From 977837f4cc82bbbd4944812ee8f67b7de7291263 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sat, 26 Nov 2022 23:09:18 -0700 Subject: [PATCH 19/24] More cleanup - Removed old extension versions - Removed unused files - Added new images for sprite resource bars --- examples/resource-bar/assets/Arrow.png | Bin 0 -> 3049 bytes examples/resource-bar/assets/Arrow2.png | Bin 0 -> 3056 bytes examples/resource-bar/assets/Key_Filled.png | Bin 0 -> 1372 bytes examples/resource-bar/assets/Key_Outline.png | Bin 0 -> 1007 bytes .../assets/Playing Card_Back Blue 1.png | Bin 0 -> 25862 bytes .../assets/Playing Card_Back Blue 2.png | Bin 0 -> 27646 bytes .../assets/Playing Card_Back Brown 1.png | Bin 0 -> 27300 bytes .../assets/Playing Card_Back Brown 2.png | Bin 0 -> 28338 bytes .../assets/Playing Card_Back Red 1.png | Bin 0 -> 24606 bytes .../assets/Playing Card_Back Red 2.png | Bin 0 -> 25981 bytes .../assets/Playing Card_Clubs 02.png | Bin 0 -> 3650 bytes .../assets/Playing Card_Clubs 03.png | Bin 0 -> 4294 bytes .../assets/Playing Card_Clubs 04.png | Bin 0 -> 4198 bytes .../assets/Playing Card_Clubs 05.png | Bin 0 -> 5059 bytes .../assets/Playing Card_Clubs 06.png | Bin 0 -> 5266 bytes .../assets/Playing Card_Clubs 07.png | Bin 0 -> 5574 bytes .../assets/Playing Card_Clubs 08.png | Bin 0 -> 6176 bytes .../assets/Playing Card_Clubs 09.png | Bin 0 -> 6423 bytes .../assets/Playing Card_Clubs 10.png | Bin 0 -> 6689 bytes .../assets/Playing Card_Clubs A.png | Bin 0 -> 3668 bytes .../assets/Playing Card_Clubs J.png | Bin 0 -> 4645 bytes .../assets/Playing Card_Clubs K.png | Bin 0 -> 6073 bytes .../assets/Playing Card_Clubs Q.png | Bin 0 -> 4798 bytes .../assets/Playing Card_Diamond 02.png | Bin 0 -> 3231 bytes .../assets/Playing Card_Diamond 03.png | Bin 0 -> 3707 bytes .../assets/Playing Card_Diamond 04.png | Bin 0 -> 3639 bytes .../assets/Playing Card_Diamond 05.png | Bin 0 -> 4366 bytes .../assets/Playing Card_Diamond 06.png | Bin 0 -> 4921 bytes .../assets/Playing Card_Diamond 07.png | Bin 0 -> 5057 bytes .../assets/Playing Card_Diamond 08.png | Bin 0 -> 5630 bytes .../assets/Playing Card_Diamond 09.png | Bin 0 -> 5825 bytes .../assets/Playing Card_Diamond 10.png | Bin 0 -> 5960 bytes .../assets/Playing Card_Diamond A.png | Bin 0 -> 3175 bytes .../assets/Playing Card_Diamond J.png | Bin 0 -> 4540 bytes .../assets/Playing Card_Diamond K.png | Bin 0 -> 6132 bytes .../assets/Playing Card_Diamond Q.png | Bin 0 -> 4869 bytes .../assets/Playing Card_Hearts 02.png | Bin 0 -> 3366 bytes .../assets/Playing Card_Hearts 03.png | Bin 0 -> 3991 bytes .../assets/Playing Card_Hearts 04.png | Bin 0 -> 3869 bytes .../assets/Playing Card_Hearts 05.png | Bin 0 -> 4643 bytes .../assets/Playing Card_Hearts 06.png | Bin 0 -> 5063 bytes .../assets/Playing Card_Hearts 07.png | Bin 0 -> 5265 bytes .../assets/Playing Card_Hearts 08.png | Bin 0 -> 5826 bytes .../assets/Playing Card_Hearts 09.png | Bin 0 -> 6094 bytes .../assets/Playing Card_Hearts 10.png | Bin 0 -> 6327 bytes .../assets/Playing Card_Hearts A.png | Bin 0 -> 3479 bytes .../assets/Playing Card_Hearts J.png | Bin 0 -> 4565 bytes .../assets/Playing Card_Hearts K.png | Bin 0 -> 6159 bytes .../assets/Playing Card_Hearts Q.png | Bin 0 -> 4901 bytes .../assets/Playing Card_Joker Black.png | Bin 0 -> 5617 bytes .../assets/Playing Card_Joker Red.png | Bin 0 -> 5623 bytes .../assets/Playing Card_Spades 02.png | Bin 0 -> 3473 bytes .../assets/Playing Card_Spades 03.png | Bin 0 -> 4060 bytes .../assets/Playing Card_Spades 04.png | Bin 0 -> 3785 bytes .../assets/Playing Card_Spades 05.png | Bin 0 -> 4702 bytes .../assets/Playing Card_Spades 06.png | Bin 0 -> 5219 bytes .../assets/Playing Card_Spades 07.png | Bin 0 -> 5428 bytes .../assets/Playing Card_Spades 08.png | Bin 0 -> 5907 bytes .../assets/Playing Card_Spades 09.png | Bin 0 -> 6234 bytes .../assets/Playing Card_Spades 10.png | Bin 0 -> 6614 bytes .../assets/Playing Card_Spades A.png | Bin 0 -> 3576 bytes .../assets/Playing Card_Spades J.png | Bin 0 -> 4530 bytes .../assets/Playing Card_Spades K.png | Bin 0 -> 5933 bytes .../assets/Playing Card_Spades Q.png | Bin 0 -> 4768 bytes examples/resource-bar/game.json | 44974 ++++++++-------- 65 files changed, 22225 insertions(+), 22749 deletions(-) create mode 100644 examples/resource-bar/assets/Arrow.png create mode 100644 examples/resource-bar/assets/Arrow2.png create mode 100644 examples/resource-bar/assets/Key_Filled.png create mode 100644 examples/resource-bar/assets/Key_Outline.png create mode 100644 examples/resource-bar/assets/Playing Card_Back Blue 1.png create mode 100644 examples/resource-bar/assets/Playing Card_Back Blue 2.png create mode 100644 examples/resource-bar/assets/Playing Card_Back Brown 1.png create mode 100644 examples/resource-bar/assets/Playing Card_Back Brown 2.png create mode 100644 examples/resource-bar/assets/Playing Card_Back Red 1.png create mode 100644 examples/resource-bar/assets/Playing Card_Back Red 2.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 02.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 03.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 04.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 05.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 06.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 07.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 08.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 09.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs 10.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs A.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs J.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs K.png create mode 100644 examples/resource-bar/assets/Playing Card_Clubs Q.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 02.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 03.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 04.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 05.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 06.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 07.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 08.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 09.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond 10.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond A.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond J.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond K.png create mode 100644 examples/resource-bar/assets/Playing Card_Diamond Q.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 02.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 03.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 04.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 05.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 06.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 07.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 08.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 09.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts 10.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts A.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts J.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts K.png create mode 100644 examples/resource-bar/assets/Playing Card_Hearts Q.png create mode 100644 examples/resource-bar/assets/Playing Card_Joker Black.png create mode 100644 examples/resource-bar/assets/Playing Card_Joker Red.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 02.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 03.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 04.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 05.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 06.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 07.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 08.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 09.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades 10.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades A.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades J.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades K.png create mode 100644 examples/resource-bar/assets/Playing Card_Spades Q.png diff --git a/examples/resource-bar/assets/Arrow.png b/examples/resource-bar/assets/Arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..aebf650552cb5eb4d3613b533f7235b007e38f23 GIT binary patch literal 3049 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Back Blue 1.png b/examples/resource-bar/assets/Playing Card_Back Blue 1.png new file mode 100644 index 0000000000000000000000000000000000000000..90f2de27a8e381926d2329386747d0d66fce733a GIT binary patch literal 25862 zcmXt91y~nPv_(Pb?iP^lZuk?@-QC^YA=2H_EdtWr-Hn8Fmvnc%@xAZ)sXthj-PzeY z_nv#snQ#R;aYQ&gI0y&`L`exzCGcqu{zbri1phZ?s1$+^C}&|w6&Ucx2gW1}d=Kj& zq3I0Hpa1vooiJ5~2RMl9@-O$Mt!rk4S!P3s!+1Sv*l)>J~JmZuP4+7#7 zgrumDibv*gySs;~>C)}Xa(l|Po}}=nAe8rcL3n7Q2ko$7*I^@Le>Dco2OJ5!{eOhP zaU>z-Nr-zfPLsg?xLb2yKO?rTB`FTO;+lLST<4v4gogNRs$`$FpzD{9e~hTS^L!nwt78 zCheK{>4UVKoZ0zC_Z`tG#YePLfrO-_>rOYtw`$%$h0-bB$mC(o=7G3aSht;SLf{}4 z9-h}3N#V7S|Ds)E?VA_LD6;OhlO#R;cV2{oIg^5t#c!f?!VD=>OI9M~2}U&wj$E04 z>)|lq!tw1{mMv^*K4C>FjF8vWEh&`zNY(YoQj1Y?+@BsZ<3*I+%h{mE;&lr}FBgkB ztf(|IxH9fG2n;nvoP3*kN7OgWgFSyHrcs$$C)NHj<; z%LcCh-cv*-CsFyw>?IjmF$<0IQ@U>Qe(-ee$c@m7obz3oH44G1#kW!z4u`$jF;Zlw zch6dnwr3Y9O%qUjM=(rn>->sUTZq^p5(mADNRRP{0r1d7G1fqTy${DVzL+~lYT`a>luKZ;7tQwEer zcxxt`$qv}<&Q1u;D%rgPl0nom^uKHYK*_VIl^>Cg)5Kh5o!6Lw7u?^&XN zv(6~CV|nRgCPmeuFX@)AG+Ip~n03Nk#JmyY-apZ7e3E+S=f%DcPZKZg@5QZYS`R@m z!O*|wprGY{h7nYD$rEMuL7%8KMu_}vagx^FqTj~Zp&}P8a$HDHm5joAc|1pkbPv4K zcOTi;^+&|%zODQk$jPK_Z6gX+>3OW>gk>sj*3k*P&rX}Ns#a867d9;j&y4Uo)TW

(G|=pE_JVrZ%v;^&6L9%(E*mE=U>L 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Back Blue 2.png b/examples/resource-bar/assets/Playing Card_Back Blue 2.png new file mode 100644 index 0000000000000000000000000000000000000000..76fea3c2f2ad04faed80702ef911b7c59096c8e4 GIT binary patch literal 27646 zcmXtf1z1$u`!!q;kdW?{lI|`Ekw!wgQ@Xp9lI~8WyE~=3kq+tZ?r+cUd;a%%yyJ{# z&g^r}-s@fOT5E@Vk^hW>NPq|h1%)CdDXs)w&A^{f1UT^jhBTEt@B-^7Dy4z|{_{dG z4hHYv+DU3Sg5&2Pf1pJ_q`83)@tr=YJ1N_mI=LD+m_WI@x-yyDSUMUR*qJcdI+&%M z2oOL)kwHm`i>SDzAGNuve4Sgod0z6i^*H_X@gq9+5w>_0Qhi}nn!3>uqhS6nB|$`A zqPkHAP6hnnDm6!W8O1IBlqa*O#Y`7fd9# zRxVQCFN3Ss4_r8}3Z&)7wrVqf1e58)!g^7Z4e6f5jD8u+hfzVZ>7KaIq{6Hbf zlr-JqYP;BAt59P)`VzIg{hGx{LE*pDV2epiEGH(`z1HFV76BSz^E5FjEiDZV7nkN~ z?&X$INJ#hW?Ch?F(FXa?kg#t2@OD=Mz1oYy+U4t4m(4yDk>6jQp0`TlD5gvXn_W-k zZ%D%RHYPRQUFU(Tf;Z;oH}T8ds5PjS%D&Tf+y>F)XAr&m^< z*L=Q6D8BjX{Aw5cJogf^uY$N-DjPHS!rM1GdVI=ko*?(^7rN*nB;?_rF&9T$RQ#N^ zvi;g?TCU9AUW2+8z89XNx{|vV!~JGPp9QV?0M;^x^o!Ehu$-nzVf}cA^PK;*t??$L zy%1~Z-axIo>>wkZxgDqGG@)ZQ-?h4o%9fZ)H{d{hi$^qOJ8w%7@qsGDa@buR2#nenZ~5Mw(ME@_GtS`~`{>W(tvjMITD1 z*~uNHmiz`?i%A&zS3v^>w~&|r(*?na@s zMQZ7$@PwS^Nqw~B#T+U#Qj=`OAq~!a__}M4ouBpVM>)s@S8(lw3khI=h;$aY_9>9V zc2UO?mEDze%|yY!~;YZf3giDpOz@B&CKGsg9!Nv^X-?K=CURhAfOL&Ab8jpk>i z&;zvNW3B1b><1_p1tgQ}K-k0^RO5@A57H%v^X!aRZ6f+2YxN@wo*`!UCP$e#($;O6 z8f}{A=aX(WW?MBTO3bjZaCa?L52F7iDLdfJFJ|D2_}uZSR~~9&*cUYg)Y_SPM3ZI+ z9`V>+(sEDfPAyDl<~_qyaZjV)awOqWB}_Gr9#>A>=8*<^A22%=4|Ck%`|3uZ&3LN{Oa_66p_HJm1|#<^S% z@hag&q>=0N08}qp@Q4t$#<8W}et0S3JjBg{+es zPT4S99+b4d4wqX>d9f47W9;&y#5Mj35 zIZ!Z03ohzGBvvp#{0TVE3GMY`n0_JlOGnfcfO+NFkB3!?(re=5~;f}P4SPyBx>XH;0GZ-4}Try$7nU((f)p$ z=t?h+;dlM#D+A?tB?+?g1cRedtNQ(Ql;B6?%ux9sUfn{6Pf>OomWq&3uZ+J~y7GBD zCdWC#V9rW+Cr?uafvA@(Ja$8EWox z($8f4<4`ZPTy^Jj${ zF05N(eVsi!4rcQ5xxnETA{xBFJkP~VaJGa1fP8XOq7dwr{%LE&E|Dm-n+yR< zb#~&iCC4h*9pTT#<~g_}7;PdSzfH}2M=pfss9-A9ZA*QFgwqO#__RUxRwEEfoxpsa zk1F6cN}J~1BqZRxniC+MpI<0JI%D`CL;0VTMJy3C$q~liWnr9A)nVuL+@H&$As7Fu zY9mf#Iyw6nPB|iU8kHSyr85jnzrBO)@2YwKdfIkn4;Nxr=HlMo*mp^mZ4G3Yjl4bI zO&X5E-#ZP`rrz9ocG|f$A3Z?2#V6SlvG&j0>%kpCzA*AW5(|QJ`=Y2k4&X5SaBH+; zE*5VpAK!%2d3p4M{zrN>c}f8qFvC;f1f`m&U>h|Zug#f`m#xhw2qo!1^bgO5$G0j8 zSdV_8-)j9()FWGxUtLa8Co1Cei4#>1OKNj!c`O|O8SC*J-admv0~git(%XuN^L)89 zx7`famxry!wuZ3MjZo^*deyu?>SfuL7q?=HdC^AZx#ShCn$6TngO%LVG0K|Pi>Lgl zgwIhGyjpl2^}DYLmY^mWzpik4vJ>BLbKeh~>7KPwtjR#wfCW%c;Zj-y)0q@JW!fb6-(k!oT=`fkGnLdzPfx|o za6$wkFg;ltgF>*%&tfm?OW+-ql zpic6(X-#)^`b{11&5Bb;YpF(rNc7H-Fxppfkk=IYCG4ImR&aj-$dMjBTWeSQt2IB9 zl;Si_Su>qs!^Wn2C4VVXo<+EG9|!MsP?4_7~}s_h}n{ita|SWzv$ zoao^NXT}ilE2VO^;ipFtqD*F>4tqTCuvyN1iX1snh;G0H3ky8kd3VN;jp9X#R#e2M zaMRg**hil8*~o7<<9naK$>6eu(oGN|AGK%78knFYN)Uh&DMFjXO5cd>t=Y_CAVb+w z5Xd&M7E!u^NPzsGXE{xro^He^3SIKJb#qGzJz?C{r)>c(nx8BjfBeBQu+TUC1(2)O z$eAuwr8}$U%<1T$r{GREn(on;sK2Ca$;I#|v)h|hc95oLoh-y#D&m!}nDmY19)bop zFQwC`G|D|#iK(Dd|4vQpDV5V)t46Cf11u{cf*F#w&Ob5y<7f5UW>z$$)Yf6*Xgzt0 zbK`*%iA=I<_`_ojkCm^ch_392!P;2zGM{C@qyfL-c9tF8ULrp=I{bs&It?;?eY{&x zKc5OvFmWa!g>`*9wqjh*+QPyFbP1G`)`iJ5sio|Bfg;=(g=zp2y-k5)-*!#u*RysK zrp*4n^*Uxuo}G^3_T?RaI2T!VyNQi^JI>p{68`R_V>4?zY4Y*srrSa)dxL_dgcZ;5 z0qcs?0K--T|2R*LK7x+mF_jmfcx}EsktKO=Wgg(sZl=v&xT=v9^b#HZ%_zwW`VU~6R$N49ld+uLuQ zBRaV5vC6XM&MO^W|7n-WN(a*G96Ya1*O> zH9jsth{;H+7uBy_kYC>UeeJ?qVEA>{>F=WY@U*RX>nhp5*9D(g2bmYzRqcYEeeTUF zu31Ag*#A0sdi-$%UoULAri;&OIgJhhSI~9u+OlbvUBvlhp^MK~mn{`HO-Y9`0hp4F z?mI6JflR<6YiMuKd%xBNG+4uZ*Q6~lV&_l%=?wc1aHwJVKr#H34?}I~*_WYI-PA6bpshop*rLa>*jZo`D6SM}5J5^`lz?=CSUzFH;B7Z ze(rZA71+G3-Y0}zxIz)#+LR@4tJL0mI7S!Y^7fyw>}6ed7fG>WmjE{Am`hk7yuzcaFuF9>%}-yyG%Q{M|HfI5KrP$on^kZ+5| z=k2XNz(9v<7^e%)j1a=xEBa>_KA;8v9^(a!kHy$JfGn+D1Twg2U3DgL!9fgI5i|gp zh(Gj*uxtd!F~Qpt(=DWNq@e(G!Z8HM1;1`T2G;tqksnAUa!>>Q@YZ$e@=ch#R=`ZF z(pyU|*Gu8>^S%heS8{^Itpu2VHYU=;3b*I?6OpY|=S1K{l;;(mj-RKHhNT9uk{(yW z|3jp=+}ki8FT3)3C>I)R8~M*qjfjG(BK~BQc!04a_Njm$|IJps>Qq}345->y_v^5b z7fttY8s1)~^V)*S>Yx_`)oOs!qwxVcr$5HXs z6Tpbs8xsh8QWhlZ(nm?HK{|$aC-o|GhfOa>R8Uclp^`otqNg}xxmyVsts8i^Y)E@8 z50nj4mv8Ores_}Dfr1M)$SmUqRw+2@yJRMy%zF(Fl#sdI!i;KAK7FQEDiwDrJ?hNC zz0n4Je0OrB6I5$YGc%r$>Jft@G|HR@dZL0Il&;>X0Km@xE)9cKIG_BDs&{U186iSR zL|T^?aA#hAUj(K^>huiZfH9IA0WZaXycoEj65C6iBM20Au|3Nei%km-J_dM@gHpMJ zGgl)8#%RH+>6=`}gYsmj7;&;7*~OY(Tu3eawBD$hVrMu;=GU457)_^SS-dd~ydy5gOspE>$F|jv+|2N+-%baMk=~B%A1kmEDnnuUW^2EuaE744df7(<(oHntAjo4h)Z(A8$Py(y(^ocrT4|)@a zqon9R>@NF}!!|BT-p%J)bnNC7h;Jw-Sma`cGOOWT6U ze@8wJjwFqbucQi-%d_G5on>y8o*ce}3xV{syy7(N|Mrf4TwOcH zoK>iQ({<+@!|7AUGoNP>3I;^Z>AKo%{YQy0)>nO_?B{V>Sg@AF^P)FRt)<&m|IBss z)!a(3^cGLRjb z+oYP^ye9XLd*SsHpAnX{?KR(g6RtdZ=1)K z8^Ld2oi@2%(hWK*bb2Ecu&B+8Ii<)4Y`yr7Wt~CmA}k!aKh{&G7=H3EP&MyYzV3Kn zph2y3)sBPoJLUS%j&`QP4-ZXt_iYCA$$NOMs>qbj1W7&Xu5e!zwW6|esOGZTjGq!E zZ)B13T#?L}mG%(0etp6_+!N;qHpSYcGBsp>v`lU?oZYZ_Z;ov%ZOW)SC=fPf3!;2-d zp}B#q)S5j6t=6t`YiODXuAKLirU?G;5_voBobN6+^#Gxz<+o~{*oqGc&KzsEBo<{r z8Il6WJga6w-u<^?HNad!o`asHt3oa}0)SssEd!`J;Xf?p?YGU}S?iS2mKLtN|K4*l z#ZmjBq9LP&Ye~}n;l1&;Jwyp|vxWs)0}yYrOPeFF`o_mU(CwONa00qVxt)jxpt|VZ z1X;&5sIZ6OiHNbN+%h_SaU>fNkW}+i8yO29{5DmRO>fe$; zYpq=h&6@OQQJh`^N${wtQc_z3HwmSCuG6n^Mw@6fg39Yx8jAc*Ur*i+cuZn58+MD0 z>X~{kac=^ z$|yUl<=j+~<^tdDVM0Gw4C~(CGUz|P@^Z4E0;K}_+y1wZsEjudb<4T(-$wQSCT&+X z3!mpaL@~T4W4*5?X#~Nd7xbdv8w~+{#CuYPJzlZGU+&8|9M@$ltm790U<@ktrX$=`K_HT= z5PpO#oEeEJi^HbIQ${Hs&YlziRM6-fZS~a%j4;K1+h39JQZd8<-|GZ?%|64sF*$wo zAJ<9i{jfVwmK^mZgh2-^c{fbUi+oS}ACUg?udg<{HW}dRT#TM}B+CVdO5 zABmjY&VIAz0~FD>gL=>9Wt^|yP??8cc!#UGr_Zkr*EABx`#oPx1oopeHFW%cBxapF zCjHh25L2`!8(mum7F!1n&y(jP1wA{$f6#hFUW~tP#;pLXxh zEx#^#lD)+V8R$+BE?hSL$g(oJ^cLF4?rr!NsrDAR`&WX-AB+a*96jkGZu7~LIZYHD zqa;wlnj7&pj4YGEEx z&|8I;86oT!bW9Wiqx9HQh(mzJ1_VFuLyi-5$}Y6d!%ajga?kTS?e}~G2)tkaV@p8p zvLSh$VhR5vi&&*@tX2h=u}*ez?T5gSuhxz%d8yGPdNlfj>v^PruIj&i60sCeSr4Ja%cKE%i_7l=H_;qg_ zcRiQ>N4{+m!a)tBavY%i(iEE7V7TZh;0W`h1SNNf1Ob{_E0!# za8U2j3CF*vYjj7~6@(}ZcaIKj)s2^x+y2tE{WCoqPOspISO0?iDWMKo%QpzT0|+3( z6sI_y{6|f>qM%+ks-O)2+}s^m!!tE|NON`GDH4#K_qs3q?e)3}a&4JFRxyn1OjQOl z9Lvt`r8t%8y0JmH^zZ1Y*h2zj43b}yUhp3eEGi0m|n#`jh>Jk2)>4^x1NNYlMsi! zOKP@ZYC`umQbZ`SQ8Sf8mwSC<$^di)=qm#c*%&pI?9s`XGI zH2AL$ov0%zsHKj!O6KRrp?>FYpx%Ne^31v5t)6Qt5HWk9ZF9FFpbmZ>G-y)a(}GX`+0Z=8X;lbx zj;Zv(H!j+(+vC9aVr3kcC^)7NZvY?~th_b@j*A?qI^cS9RsQ*!`O=pIt|?7l&+)hyKe!&MlEmiPNYQ-pQZ!re|^U^cP?QB25I5MMOlj5a64AK`*x(rWtRyC@5WY-nqsE5W(ujxh{TLc zqXBdcd3L8XQv_`r5QB23lbXC!zmu-T0vo7J&A2`A$p940WXz56dOruk0G6c@;~Q*FK;Oq0 z@%&sjQTqU(&>?8cv49N&QzMYH}+yz0#c;H+C(x<4dD7IIOxs{-{X>Qrq^u{3B{44lv z9yj`g23PSKYiU~v*R%HxrJ=FKd=SD1)I)B1RxV?MTrhe1t31tR=P?HR-ge3!ZFCP; zTZEQa?1OGvqZgY;1JBXG08h0~^Jvs5-6y&;S#PZ7W|XA$Z`&L9?Z5FH8|{Dml{C$st5@`F2u4qU*MX=SL$Hy)jt>$~%9cR>Cx!5IZq zN2Bs-0HXeFDR=_(B{)qjz@7n)VRE%#D3F{bZ289j7BqpU|67@Ul0!n)nU0E@z~0a> zR+q(R_)YNv0ba-Ue}JWdaf=oxN#+5C4Z|n`5p;BFSvzbV)9&C9$hjaUB=@vIt}1XE z35E530JW?wB@(z<$ZK{%Kn=`44u_D~BUxwAPwmZQ`{pas=Kfm(rfHWCpB$+3HMiOu z^KBefa?Z)$RAPk-6lo`l62Q1(lKrJt%>OS7pw$KNB7QFTPOL$h>T7dtv%J!H7@ehE zJ;(2ST?G>zu{bsPxFRPPDXNt=A|SH%hG$ek)Y2%px}>3xH_MWJ{bPQL$8At}YYSS) z6wA`ssLxbl_yqq%0IbZX?aw<>ya6-%t#El9cX=Z9R3;H%!0Xm&=q<*0plK#*O`zNE zf)2Mh4Fu$szk&)#=b}eb2Je0LSy*G;ck%fW{2H3Wu7$c`1kW97jUWGtha?0xSW{OG z<+x5q4;znsD}6&S)t3SK53BYkJYYVsM%k#1I+EmpQTg2Ccd;qm9@>0F@)n)W*#3f>&4lsGidk{VhJ(D7EM4@fy8FNVJpid5yYzS0cPmH(=3 zPF!ev;=MWf2nEqpfv^io1gpRVCKM6{iZ>zlF%ZOYuC3|UUBQYvCY}T>t9y-Ne#1l& zWd75-=Rur|THo&hYrdDXm<G0qOM}u>r@T4(qe;$; zqH={9I0O&&NBR_9y*7H*2(f)gtWQ1HK|2;jktIvz#8+>h1^3oacG*gq$PgBX{Z zxR)Qh4pIC9m#6hwq^Ce)#L`JOPvgmu$`)9H-B(At)z)ZxoKys0#a zE%ZK4nN8Xkd{!FCg_qGE745 zRnK|fR!LMQO@2>1?fFn;mO4;fFNWKfuN#w7rv}tn_x-rTI_dbZ1!~ZO4`&Rp;FW@N zX=jbUHrIj345zFS=K}G4a{tMc5bn%^c~1F^lBHF z%FTEu61VpOTZJXx$Pq}Dl0bf3JBS17fuVKjHh@mx7P8D0EjXQ{U*75&06AXv;6TRQ znHc}mc0f5F?Y2->hA=Ftrz1l+hgH)>z(Naim4PVQv`1}jX?`SbZvsS*Z8G@^T8DHk zH0pI%T^Ym0iYkca<|_6?TT-+Mdh|9mlHE@s$&X$hFZ!S_1n~;He>=*+{n>crZf5IH zARMwh0JSWCycjbVH_<3p)xqI}>^~jrO3g|X;QNKoNOOgwZfG9J2w2J9KW#BONcXbu z3KvT!&CRgCpNP9i^-xW3>j!}D#nIS?RmH(Q_0PsSG%W9K3$z~_hUR`v@}otM`wRkh z34k`AYrSu}7eIB)AmFA~UM}l(BImZm)GibE+KOW^J#7*PDxDU8cGCq1JU9fPmjJNqR0vTN>xZ|h>kw5`b9o65mku@#g)CB6E3%%_KXI?}0CB)+VW z6pQG(cBk`@jK0->A7}uaZFS<5k3iO?cEv_r?0xPD-34nDXv`tnSYzR2!tZedjf}EQ ztgm3S8RaNvIk0Mi4G2JgNpBKt~z?ddwQndl<=g+kIhC;Bq0l zG`s&(u#IsDkj{qC}5{?~|(<+%yiH#IY=wQlk_!u%r z4C;8B1MUl?;yo2<`4Rk{(toPjR>mP6x-$Ry(7^IbOhM=5i zTXEVrW7*E+uI<#xu>Vo&;?J$5yrT#OX#JgXb!507AbO${z7uD3?&bZ!B`mR;)YSos zHzW};b)ZRSN$AGiqu0eOOfsH?-eAwc9UCy7U92hU%Oe8p(rwObhJz*5E?>uocOd2Q zBcn*(Fa&&fbuZ%N7DjJ*Z})|twy*X;^go$*y$05$Ci<2!RH`$x)4*TIuF=*V-4)}n zGVnr!Iy53-vwbxgaV7}j$}9s^;Y!2V56Dj!L&f(%n#6cXl8JIR8~^l?687DWM0z@Z z@Joq;{oy9}-BFJmRCuZ+@{7{@mK6CB(Gbw<5RU6sUut6H@CW;ZlKmO8l-eV#%LGpG zyA}C2Jybq725?ZHPXuyui*ZE0>&(UFB342Ek!u62@L;#-cYmr{%rTS~y#?<%XB%Gg z@ALsXb9}$f3q^yODf6)Wl15um)efjV^oP>Y_4ySJC@@cDupQuS3)=f00K*eS`;}Xq zNa30ZZFgf36kqDFC131h>){VZ@}5Lo_-Hvt)}@aMGJ3bu0Zw4izAC-<#7q-M5Ex>5 zPhJu|{?lb^qO2hNV1fvs<~*h1`_uj7fdvWcV|j`8yVa@RwGP#WK>c`PX(oj7%nz() zsbv&wBW|kvGBc~Y&dfwCL5OSFjz1abyxCJ=51iChQZz}BILXEhTU^Wt_X_8v19nAT zTMOebNCGv*P}$&-_FPm(*19%O<;PsF3=VuQQ9^6uNoUHuX%!~>5?c7eQBMP+b)w+B zOkCCNphM2CuV+aImI(v0^>Aii@BzqHRarQ>0_m`+(Ft$1PxHhS>sRzJPm6wV?S@fY zuYJmN3n!SM8jHfw;n|2JCb&|lXB{=voFR7rk%o#tWqc@Uj1@em6&PcJgr8anvicr} z*LqY+HZJ2Dz-q^E%m{+G+=uHwby*;`JPOAYHs>LhMVK zwtI`G42Sd^+ZTr)04BhJJ=Hfa$1JmjcdQpe6x^9G#>iK$m}1?UR5@H3Ir6suo;DeT zP)`T?{rUBazgC@ZPz2fX_^*<&RMzo>9Fn0?u}M!~%?u|V&nr(HDqQ{M<(Yi){)|;i zs^lG?Vi!JOQRf-nc6Dr~dk-};GlwBwvAt8!&|bW?H9ZeOPfn>|hIK7+8EMmywud&# zebs?ki#+PeBpgilj1O5Qn;4wV9O%~oAyt;j6-%QhGr9Mv+6V78ZmI;CV(z^cL4s{K zA)Y7%4S2iqD+;@paU1Q;d;h*N6>R-d9Wp<*is*>LhRR4?m|Pyy_F^M7lghg!eR9bd zpwR%|cuHq5-(=X}Z(LfpwEdw;y9@OAuy?xFUivl=^t8xJ2gR_~**hWDBqA%03cSCo z63)!jO^`ebQF56U<&5kcaBf_Drw!r5R5HfHh#eQq&e z7-bn{iuBu{RWv=Qc<ltJtS zGCYP5@o1>yEf23NT4Eo;KC-&cdlKNVC0?Uqy$Y97{P&;Ur)3Db27X#^;nrXH& z?LAoivbA*kZy#!_eE*oy*n~1zir_(@-(r;vOmlFnBfgVin=u}e2KzUmlM=U)S5=!l z!$2_DRFiWpqfJIbj(9B+&Gkp%Z)^J+uI*=vIaZ}GDMD}#>Cjs+AU6$FsyyiNlWhf1 z4nR^$EJwx8YwY7H$XJ4*Kq>{Mb5^aNgZX0yNG<*-=VB1TgMZ2lb_dPZT2|X|hJr+# z&Z3hJ%8Ot9ERgb6Z+2kIc>1nUCC(N?(ty6r#y$|0#Vlyr+vNG=uwQj0uIrmP9O~#= zRBQ>dF_EVdF564!I%u%!m9K~(%Ua3DCSqt0aZ13Q1yBn*uWAojRN9V*Hi|iQ`x6r2 z9sw|bZp_FWA5S7t)YSP5fSRx$Ugl1%Q~|8(4f>#*QxlxCL(~vJW0X`hy2mj+rS6z1 zY-*m|1VGwgBJus9XS|O1X~KJ%5#|chN3FKJ5M6NQQ{tu|kXP_E!psLr&4*Gx@;A5z zw^y609zt0pQM)e}tl`UUI5bE`9vrTe*>;2)Dt}HH<5ZsZbLAHJk_v5h0 z5L(6BUsq`X(=jYB^k+b+=n#QMx(HgZWzQTZUgNcPYXc~TSkJ$2yGmeRZ6%!6LCmC- zlvLc%rb;FKFP7!S7VzA{kM~AFTCOo8X8h?{EqSUekmKV@E73d$xq9(}HfJ+Gy@Yd4 zMHUkJWlw8eaxN}NWTfk`1c0`x%D!r`#HJSZNinr`~^3^fmE1{^Aq@nd)J=?j_@9o6YclXw=X{MpwYYv7&%YJ~aEVsu2O z3aYh@A_z*&5<-@;6{`SR0RiJ5AR3VS1MKF^QDS#+BB&Y{y`JIObRf#HP8Vyq+z|j* ztn%oLb3Yt!>vSxjuUrXG>&}I#WcpK-{w~RGn*NQqI?jIXk4!nLA9z5A2vSwXzz>8{ zclhv5h5}_y2=51w6##Ng@BYMWZP~?;Zc2yTg5P1N6a*#MAjSz3A>Db6`uV^2yXjZ<4*y%xTjn zrQ!1oz5}?dWLX8WaP~m^1A?8e89f{~9kgI7|5R@`3E+Fc(rOp-Cj9QqiW=e;9jQ&7 z6X>5eQ(I9|00RzspEMY(Fl+>V7z$9#o}$O`m|j=QEwCNP zHvo3HaqvhX`GmWDU!GWnsD2R490mqvh;QcSHj(jP zvnSyv^F-io(tmapV~S(-9H(mLbnW>&l?=pUD?HKwsH1S1?2Zn?96k=nLn)qIQKa1h zk>`|po7p=ab&PAuu&+5SM#Wz*hx0xopSf;Eyvs~JpLDr3TT?VEBEIg8FEQOW4lmoF-DXf`>!4p%%3tnIaDf?b`8D z{RFy#`(1W4Sf~)I5QuM}_cSyq&19a$i{*7Xr0xCcY@DQ`q@*((g?r*i zOZ5||{lI-INK1nG?>`_!R8cU6_%|rgmX~gSlA;0tUK%O;Z)jQ@M2-ew0u6*)pB+)lq631U;BxK-g4t1 zPqksI%t(%~SCndclyM_eY{P^39e(hS>Z<{RkW<1sGzkZ51I)LLt=1t@rivn(wyJw= z(1r6-B`EcWhUj=LaB^a$Am8*B=r7}yB3dqmch@{z+5~^t_r+O_iNN$rS^k^!%>M8@ zdT;?Z%P&SV{_y7;w@P0LVVrAhs)t+ndPumh54f6V3{^o+dR~ZtBW<3(+laW)JxX8v zX#yj@>uRu85BWRyqNn}SiiqLy&S(J;j^B+RjL*xjT4fM*Jw}Y3`c2dyWlcr_@fXAk z!mA{xCjWuoWo;^9CZvIt$&gq@Io~}ieL*(g99wuJ#_~7R&7Z8&(xPzYqbhmaWp!z2 zlF8TklzlfvZ7C@VV&CiU&!4FaD$k3;3!w5N9*Dj8~`RuOS7g-;qVC>K^yU@_+iKJ)J4fU+A|X5`ldh zGmC*GC0ojeR*xkONe26umtj21_$Mw;DBzxgl>ONJC@$XRr8~0UAMo?jW1~S0^ke+)NQA^|N$ZZVIwscImpc-%uPapS#8 zmn%poDH)yF8uK$h)S}@ViK>#9Fi}F;UD*)O5O$*xFCRm;xR7!E_U>f?f!dmlCmkpd zI#23CB;(Q>Wh~psSV?Mp9Q+1X9`a{tOuM-uUp2Ua>eAUx*ZCa7+e?YbYO(gneRZ6(0~PX{8* zip;<1ci)lK%e`IyGvf1M+X3gOqbo0-=-n9Bw39I2{5y~!FDmxb84&|1ZL3r~SrCo_ zJt0C!6P30VG8ISfi_*fn-vk%v`Vy;YXk0OU-OF@Yw@6W@Zg3B~XgU}~Y|#+Fq6S6&w<2BPTo|Su&~5>ag48SM zL-IjZ0i;_1VgS#7$hHRlmohELHzijyrna5a4j4~Nb;kDd_TJ5FowZhmH^adIHo$XJ z{^1V+?2iW5p2`~5*5#qWP(VA~mQvyrRUlgq0J%#~XO}!M=Cr*1#HEL$R@qU54K@j^ zn^^XR#Y%^ef#=jtG#di;HJnv(@46fC>If36yT7cy$}jwuCbyNPtNu~n-gNfbe75{5UG#Z^e!94) z`~o=C-x8#0(K5i)Axf`;u8C$j91>*}o&+`c3fm9|_<~v{# zIbOPx*gBnMgP`Y9Ic2rG5;K+qx-d}4Ab~d!@C0TptbSLbWKg}eM2D)4Rk-&+J#8D{ zA6CtG!3`}9#@mH9h1d?7d?C+U64rb)e7Qd|!Cs?3AP)g1#V)Cd!&U~g>?%(0>>zpU z%(RN-g-XyJ-*iJBQYU?6jjx1WJCA!D*mksYjb5V;qSX2IBI95?6I61`DI1VBAUp8* z+A={NfCbPZ;3dVJfpS3gQyhoecFlx?uBs{n2nWE#hj7ohdINX;guJAHWCQ!=8ciikF9KK z_@rQs`Ed7Sg)VxSo`i1CEO!Q!@ypTE(9;H-lco`+$Qr9ADLFL0bRslAAAcZ4J^2Wf zqL3AY|A0PXel@ga3X{fCEDN5C80olha9HtTTE8m@fyXmDlkhCu8 zlBW)SO9I3Ij8_3v5wuGzoWRhR@vBT9a2_$V9-;p#Ft{RDzYPM( z5c<6g(e$K@1KXVVO8-JvGO%O6J>EkzF(B`P>+O+zHHtH`W=Qmeb?3*ZKj8qRlGW)M zANZhCLVP}91E~;Kr>MzagSD7&o6~SnQR*wBFju|SGH_+*x2!-mBN1pubw-{J7AN{3 z^e1JaBj~M`MV3>Tj)JL6<#x3LLM0$<3z-(7iYq*vt}Ma|SZW8q>Iy*mxl6SORwy{W z6$7qJ@DnhM^xhqc_q29eWnzf};xutx(3FwM90&)<*87IqP!LQAenlSrcaxqeoUFHY z0wkxizWkaVYBL$COX2nf|5zZls*)4{x8N2Y)&V#GV8`Jnv}hIUJZ)s#pB4Pw6HusN zt68jzjp1!f{tG6fZ_&|Nx5zOt(ZE&{pyBeF!rrqw&h@?)v|YXnJ6K+Pu{GUmbB%fT zUntpooYeR4|GOcPlMR;&58tL&Ig!rNW)OD$jI(&R|=#-haHR|}7pc{?{7KeRNw8uApuIme#e`t=k9 z7v0h9GM$K&AMXUyOVwMMw=0PGVT;%nQey{~>_vbne$id~<4ATCM@$~d=iN@W-_+bJ zhRRn89cz)6V=`B$JHF&F#Qu-Fw_aj8jM^OcC$rRk;u}V0Ob?$Q7Bxj(KkI2Baa)GC z99o#ahs$U^9_i_D#zOQuqMRfXw3ebLpd4+8L>!&&Q&I6>L=5@%A3`j=q+=2B-<+Qj zMR&S^+Cf>=9h=Eqdd=h9$~l#6Q=2)H-V1pP@0_^!0;Ma27!)mF(it=yx8OQtqfE_} z=o&)l@Md%9=PribnaPv$y2ZYIsjuGn^Yy`Vo|SGO;y{9`r0=>wWMQaj#88)T-ajQ~ z1+sHxAy|l`uD;64m+tpTefT?vg7T&W>>N?WqQB`w9}Fb|NH2{%K-y)b-{@g#YIUqS zS49-;qQ>8oaJ1wnMLvy4)b2cQ2^5%HOLN`yG%&LIL$e7#k*`!`^@{D`TxZ~>ptiX9 zw-p;VpgoeS{{-vIO3zjZkHoJi^PS$e;+{OIB3M2x^tJ9c(X6(13JeiflJcH^a)mOz zc$%3#77@akF_|WvZExB2SxNTw4&gb%=nNgC zYD|PAiWHQmr&3ex)`UvY7jKNDQS9HYGnt}X(aesgoQ_H7f41#~Q(RgWJ!+;*q|`C! z!BzTNk*qO5US14o?X)Hem@QHW0bRXVE=imh|ZBKrVtRt}G>?o&Je(1tfHvL;20$SNWA{RYI?eTl^J;-QQG zmB&BNPam0@k27Y5Jv~3g%l4>z9O{=|w)eQsl>hUd&1uDF#-gsVtgc8!dzg7QR3hTW zD&L81NresrM!QFEDAoS?t$p2Zxx5VtkvF*2fbI7lVc1})fJckIxfJNi*|8O>_&dOT z(eir_-I&G9w~DPqd&Um!YKFrd%Hq;bZ`<&X4#m@?dsj9rwULet;%C5p$_%td>!XS_50JCkZQE=H3B zcLO4QuVf1)c9z1`f%gn&!^L@Wd%6}+DDR|Tp^Xa0`MC|aJ(qvuC1ZSrN|J-4T$NV} zjR()r#u$luyXHS0q-urewnc5#di{8?Nyg|b>ym!(ZVU?zG6fIB@n$q;Bb2DwMVMc? zX1=g$r#-J2cB2!{7@M^ZH$5xciHKMdb0jr=WU8NpH%czhm=&j|pU zcEoT0Eq5t;3FI@6mK`I%Za}T2%bV@WzSYuVWs5JCplVBeL6o$HCgpeZaH%q!`)ifm zN}RRld|Rr7fi)Ug+9xzDRD@yyHB9=D@ZM%^IGGc;sglUQ; zopY<{j!2(F=;%F0b)hANXxBh|?h@&gj zf*Sh=G9h7~G&9jQxAg+dt;D%!*R2b9H%W(kM|k+N;XuzBTCLuBa!Iig;@pl8wx3xg zIa&)!3LBA~>!kL`-D5QI4lv4pOi;8D2Zrj2MwS1EIX$h)qCIWH!ajk`f5f8T`TMKj z%$mj#u~Y3<_yqDbfh8H~cOMcLQ5lcI4)**9rFKy!Bje~ao_f4BCa8es1;nz0&UX1^ zOCMaIt?iMy8nYF3h5tn+x^=1QRAlFYi`8zAOiV|inRer63ckJ72Em-8qI_h&h%%ia zTJ+E=L0sG2M{`B6Z6OT)wi=xr`E-8>4rLgCPI9*+W@EBWSLp{|I>LAcx#q4=MQ?Qh z0a$i19k>Uc^S1n7dlm*gRrlSzJ`LZSCZSch>F)Jy5r;qDtRFX$$zC}lIMzfW#-G>}?B=idh!742+cRjW+*BFZ}9V@q7XyxPx zhBKi*eR2sw#qhj*_;a#nPD|-N=-HtsLW6^BW+_d5igNf#*^GCw(?|NZbMk` zqknY*xZe1`oaYPnMWnS411JEU!LN{E@d^q0gv~ok&2Tla&<|zhCvvG;AYkdG15)cw z{ECP1;r}0ztZ<{aQn;08rw5qAFb7s)g+f7`qSC0Am~RE0u%M5OiUxa^H|xw_9Q_jo z+!Om}5ngb?RK-Ki{Wfghu1SUt(^6*F;4LYkqC+Rt!PXgsn!JF320nA>vn_z+nFE$9sq?4 zJ_G0%qe~f)XO=h{t*9i{R-FJvBQyCDg&bGny`w3ih!V^v`B+= zw<6urjf8Ya3la*F(jn3;s?iDvU1jBn&#U-OSwrIwrT&srSV4ymO-cHbs4BT28u z=9WkL{RD%!tUB-qUtrgyZFK0kFySyue^wT&2#fy}gp_1eR#?yYtre0-=vU66E_uxb zCr)$#GdNf%?xHr%9H3^d`)U;hS^c*S9GQ8kD&_Kg|Ecse&0^P;H-3D~_mYCzHu_w1 zQl}%Wc1*;Omz6ew!NQ?Y?nD1 zDXGz0%7q+UGW%kyZFy$0SXK5!KYE5qk8O$PijbU{Swp>911`T_)3q*>^$+!{EGn~8 z;}o*_hEK|EN}=U54C+n&yc^p|OKdiFz zQ_b}L=N|6R;**&-QmE}2+!(fBW7aL|;^3cg?nHm1_;f2Fe8<3CV7*GuGgW!jn_Ecn zEY;Z%l|*g^kA}47+@)ATA%X-+vpp+=qGiO_s)qLzoRUo3i0~11`LV=H(}EIo({M$- z3r3@Et;#X=UAdnL9E`V};vcW?sWT6a%y9-B`ea2sN^wv1Gd0nse~We`=!()~keSzb za7BhC1o)WIl_CEsgNr}pFj*Y-tDM|K(`JsL3OliX*@8P0=32nrK}%;^6NG=#$-myQi zD~4{Mr;4Ae#JdrWkMOJGdb>p3)}zzB#tSiBzLw^(1KuNdvAGYiB)cCMLdHtWzmT7< z@kzLx-Z8@N()r^X4d-vm=l}WguQ!k60KP&sUFK){I5k(qp!*ICdHcz&JL2BwbW|dM$kV-|2 zf2hfOMCjr^!B-bq2Lnsq&W?hsFGH`l;_U2p4$Zs!Wd%Od;6C6=3>;QC%?o3zD>AGRF`$%xwe$+unCKarcqVS@-L&Wy>`c4}1r`?O zwpL%ubm63|v`+(vM#x`B`Hx-ilyv9J6Y}-7h7hHr2`Eea7c_v(2-jt{1Uf$w$}l&< zJVWBy9An|d)uer(E#<2Z`5zuKll2AztE!|hDGGK6yxHx09u~iF=H!em-|iV?DUlsY zOclVFL0vlPp1-Ks>Qaevj(cZl3P`Pa@?GTAh)uKkEju>mqi6ke#7f@gwaAys}< z8xcHht#Y(k5gIn-$_IF%16Z-rEkEMWThV`YO?-L3y&8W`MCb$a$E;%p$nL}{1sse& zJpd1D7b~7?WT)23DXF4eqho7y(EZmh`tn;*&w{B;vpU|(%^vPXC&W$4%zd#uJ(Wxn zE`M<%*0)Fbj7!VOd&wR9H=kmj3b@F*Dof~DxG`ucsPbZ4lE@eBILg&}L=hYRqVS=n z`LbqDoOhJ!4Dh8tQu6tzTHa^wCXR)$eRKaKF?FW*ZA;#{qg28a3E?xCG_A+bUnAI` z9G}qkR|3b`h3l%WQGH-w_>IvTI-8{Lr|Dyx*m7mcOo}MUd(RC`M>$Y+??LU&dkMM~ zkEZD$Mb%$e?hlgkJ$ktL$?wSE$v?Nof!`2i74nI00$B}&aEZ!-%Tk15*E%wdAN6GV z7lvzghZ+;l?OCS77JiFQjX7y3e2!>r$AVXJhBp|^%&l}S0d8_c@I#`ZSg{Z;cSA$`9|Y;NS6ICoUxu3 z`MqKPqg1i)A=>!!L?7<$L5T6cq@{0px^B=(6HP;vQtU+nkWyVkO2ffea_@-N@YHJj zb^OMPhi4KYZ|qw~^CCgJN_csH^1cPOLh!3u0cl6tJTsndhh8Bu!u#iyr=wAO7-$-y z*ZF=(MGIoxGEa;Wj5k`&Tv}Pr20! z->&&RosfR=WlqbA)q8;K@!)lgWB4#D=Ezjkx8@g+Nu=$7?T|& zb%lXVcU}e<_YtC}^S`!+z(>9Av#~8{toiK1QvBWW+#$*&O|Ahvuj=QL+W-r{Xo#h3 zDMPjErroTFN392)B9%W|7uLY>g`FT@=q>gFYQR!fdXQx>W6!lfJVKpd_jm#w6m)`)7+eO6X(r0tV7MQM-Ee}XdJQ+eoQgWbOYL}v_|{OJ8R)Sswe zWlk~|kA91pBoA#*k3P4{YAl+%mg4?gVxm?X*kRbnBbn+Pg;5207o4?0M`qRv6N z&qvsj&CFjq7YANmb~u45#la#HN_Vk6MhTn1_Xiybueoi>^WtKO#}%vrw5!IZNqIS| zEbS=+O5yCN)L*G4BYjiB_^OI=ZllqekIH|rn(0`hcdie={d+YDe_3)MaFoYw>seHo z8AA-F2RQcC_>G`ODv@j7ipi5f*8(&hcn@CiOpL@N&`&R1tRV0A(^KFe1|nS8_wNrc znj5xkVURyG>t5KB64+lCo3k(%7@zmOr+(mU7&c15Lv>w-)^>$$j%jor*3k7X@}ko% zveRwwyM{Wkp@1a@q-@*a^Xue8R#`n@3e;CtkNP0=E&9D~*? z$m5mc!bbIkwj#FHqO_WT0-?)~OF(_9gZKCUFEMiBn|o@I43H_lmk{|mYib!7U+R8) zo6=E^8#z7!Ehj_^RW5<#X8SHQ5YAO^Bv17ewOdav#$)(Hi6rxKhe3^XX5_pq$h2$> zfB0YeMzF3U@Lza0kZ$?n7-k{rH8Nw)uauN#J+v>Fn=nlIb3GuIRB*t8pqd`vzxo%A z66NpBidLQQR1(0`ErG+JkSOdl;pAce@sJ+H;)PQ1>DhZwEFPU$!!`~C(3&k?+vAbx z1RKmOp7Bq}dyAjn#Q6|=2?U?Md-Gyyp&uUP>kZd$XLDM6RQquiFEYWgA!e+Pcs~`} z_BKanwekx1Jl6J7{T&PxK&A(42=#gU!mBjmCmY)W*>%hnFYKCfCEkoSdx1^>ap(`u zTJH*lMTn--tzt3Z|4O%t``JvRC!D{gT&XvSzsLYU`0iWHM~J$y#Y!%?8l!DdvrcFe z3i#(S126~l_1fMX3p6#@krW-RAv?X(#Fa76BCW;0l(Bu@p1l(|MKucz^2l6j3WMwi ze+|4!NUrs!qYHE5{LT$J)?=VsDYg7BCbWNzk1IYO5tVOo(J-%w))pSj2|6$MmXn1P2* zI;serwqlKum<$oZdBa@WdZ%OOk*Jck_*;A^q6{f2jrFHnbxbE`TElCeu7UW%a|1g4 z2%pQ%eKq7Wju7>aB267r8XZ(RySTpMlOx@~$3ZBZj1;DnKj4!skR_)0k%E!v%3oGgA`IcELEo+r@23qO`XMw?xIJ90QNC9PgM%+fqN zC@qAr>@ivE2`DjNSeW%^OsxdJic!c(&^_BirqOHPyfk?4nV)UT#ID<$oh0bQ9jvKD zjdq%a*-afmM{d8%z|3CYjc^>Q4?C%}d=CwWmj_}iZh})syfBxIWrqC> z37L28%h=|IeoRFjH(F`=?S7svwZX5De;2y^({?fah2mq+fDx3VSpoY;Ac6qydw@RK zVR(`i`u=O{o_@Fj^Oqwnd`YygBy7R*I6~D=mphYdsNCCfbApX3>i!xO*$cQCSa8uk z-2h0UW18YVslu0x;i9yue^l;DIWZoUHa2&Yb!v&{%5OqDhSRtsg4S?jbb6J_Fg!qh z(P((T6g&TG)oR9dmI@l zYyKcc%OCp;rd!c6BkSp8NI+CdO3$ZEV*hXzhd_iLbfO{}UTe^W6&O3Qu(g~68hMDk z4vtUL$trbbFF*{}nouEei${ht`0eLm#*2!B&vu_%pT*VYEGZ5T^ylijO3JML*j%XJ zHXWO%UmdL$+>}HUy}W#VCx*^ocY~&2kcDb(+o*l*La2Io;gM?$)l^Y$H76Fc3xTjR z@zRYov40JS3#J6);AtE?tmgk$b4BFE8mf78FY)I zU+6agFGb89+9kb|WQs8ka~xf{()boUhfT^LUqN_ zh?>-pKXr$Tt48FH#7$yU@)vj{gn#C*$su1@F8j`W z($J~2{^y)i1w`2H0QblD;&M2+=rM`7nFD*mvWe)I!l3|)5;?ANEJiQ)hx;YS>3nV+ zeD($n_1t7-&(-x@7*_!^c;)!srK(5+aBgJ{X8Tx-jghoF;B$P+ZhvMV!2Q zRm*xmNbX2QX>S(5a}ll_KQ$h70YPci#5nb=hV&UZKMLw`9iKl4b(4JxrsIz}4VnB- zm%9k2WgZ&rf!=1+=M@-o;r24FGDj6}?W4lfJ27*TliyNrKJD2HMXlw+&;8C0$UG;Tc2!+5s6R==ucq2VUmGy2KF%gyyW$eW>Bc*1TN+#w0J%t2P# zWY6YxJO5~H!*|8RHX6scfnilv9$iy3?{jGX^vrvJh+)0+!+j1_Cc04%@PPf%><#Bf zyeq)k0r$7*)P8OlWdVv+W2-67vd%`M7&!-jfkNYtdi-hKp|w0#z2P{L^uMH-=u4ZZ z<|emNBA9rr_2gs;yx^2?6?>OK6dW#fKHUQ-%wT8Y{c0hOY`<0C`|QNN|9lD^V%A@d z8IbeFT1!q^3k5%DvLSAM84B1HKQC9omCrN#++BX{>~M^JVY!4k+AO|01yc$`N>3fk zy05kZl2>k0Z_#W|=uAP0Tjb3Q+v^*>p_82_ZA7fkZ&L1_H9eKtj#OZ-ABc|%xqdrp z70(voS6FEvz7c)RWhNCsx^2&x{_`cW?ZSnPL(^h?5+LUK>A~QdA}=WMF)}f4gd_(G z#ef*l0q&2unBm}!29N|IrKl4vIst7(+ssYn{gI&6wR1>Ry$9vD^lpTIcH%$!tgL(edae)eA+L6un3*{6T>YCzMkHVo^ zcrlce5#seZXo~jJKD)@+p)QMub8H*sKVcDx_nT_QKc^t&fpnZC_YYbv<_@pkw3u^r zVGJNM4bDV$_2WLbj@p$tC}h1&lHmG5^Px3k)z1)Z!o>}$5YqeQK5;G$hA5&mnc>+% zhOGm+a$-*q)l67?-1UZG4X+3mg)M{#m_9YV1R^W@Bc|k$_X=s>crHvf^fx_Qg1wYb z@(h^)v^PMA-wIi?~th&hDMUs^9qyAOm8&LcG6KD9ErP5 zWUS9LY5h6FfA@}}c~e0nc>4%Z_=35iFkoI*T&WdM(f~5j{cefvb`}M!o&Gi5h z{NxjvgM-$g^l=DWA7kT-saDAlw zd76g2o}qd@n;Ox}<&;Z#nt(?CEjM1=^iQwKF&IN4a2Q<^tIgqe3o>HPf>+MZb{Ed7 z{3n7X6N_E|R*UVW{+nL(!h?UTwJ{pmz80%f*3FQvn)PuosXV!x&2xHndExt&)}%Gx zr|H<5awNcQ@RFhzW`=F@awe1|nme;L7rRCB$)5gA4v)@hoRUI2Mlaf8lq`LS+paxd z$_P;d9PyR&i%| z^N(zuANZEptLr_z7HQm}Sh_*%POQ{)>lU4-I)gIJM96q~eDf)56rZ2!1`)VIgjSaj zZfTJy;q`anpIp{jiLLi&FAo(_szG9%#{;}{ks^KV$EaS1FgQh|jWVR~sP4JCsq(+5 z$=0wV3QHT{;dvH(-Qlv9jPjN`8Lhu`YO{wZF}CA5!$EevouT;E;vP5(V9YTNW)yJ$ z!C|T`^X^MLTkgZ zUjowzAw8`Y7hv*`QBVD6;!M^MWZ657`R-GdxKvA_7?c!XRnhr^cLgI-ZzDO#Cs6lv zde*>;hR}KV;j&UT1JMg5PlE3id3&&hfx-m&)}jNMF_UQ5Kkua&0(1;m9R}wR4n}JXUzIWUvq77Nkk12G-Rtqm!V%fPWE zb#)B}yaQL}8;GvueaQQ+YFTYMI#di$ z;VRPzO9`B`Z?D#jZyi~gm7OG|EV0wgJ8f6PM*IfY$udd5#cU*l96*2)a1AGX_JYCs2_p=S<86Tx_zw zU>loU@bcFs2U>zUo*VkJC1{H3cIJ}sXBt*10zyl3v+6%TA`19C6_1?lsN*0j8-s|c zFN~>GYQR!b>`PscCIzD~PYMt$c-+)X5o)x{`Ux%i_qZIF%HK|kx_(~K2!rkRYTbyx zr4pgk#>n31lI;!kmoWG2M*e}GrO7T)9%nSp^}n5gF;*1jM*b+LiRe{%rIAaOHB;jZ zk+?!3A7783&q2@Ax!B)n=nxI+XB{9^zX;01w?QJ-b%ViOLT{ZJ2Vm&llcM(&u85ZHG z=bAbGz-7hx9k`(ehB7Oxi3$+?o=yI(x(J!iq+}6QAD&)GHOFYm~sPZ7zO`fMm;`^g641ssyvcr3C0ZVeC#nZS;6 z`b@*EjnfbU4_Gz2JC`AA@jTqdOzREQa9I^H0NX>5rt{9utEW_GD)`ox>X#H=IH5<* z;7AFJu~M_fYB0nm&>IBr_q-xh7?vLxY)C5;DVkHjeL0OQWL~7-?z}X`cxgLF=)FSz zI%|?|&HHZiLAvD;EwaE1_FpWW&D27s)R2tRbCY2e#g9+*SRvg1g%s#Uh|KNDGY3NQqA zk1Zob)p>qEc?AFi#N>DjAcEimGbVaV9wGHAzuey~x5798lJ1+Jut5Q^IRHCS7mF7F*Xt} z$BCW-!IZ`*AUy>1XgYh-&q0D|gj^3bC`DUouUu=t1VLtbXjSrg3lU=$OW6I-|INKv z(y0(Ypb_Cge$&`thUYRApsog$gb<=wE``DIxMDw0VIX}9#T1}T z0PsxymlnXznn?s|p;`5ppq$8^gO=cTP!`n>#i7^wxN6ooMacH8&HaKrHnm)FJ%hE= zutJk`na}%aJy_4VZs@oab4s!X1#`!*D9HYbe8|Y+oPOWROz7KVH`$m47Co%A+txGn*Hx1_=JCLVEX0U}kIzOL2HinPrM) z3N?wT%Msv}y&g`k5?gEp=2E~`-x&XQm0l%O+WNb?Fqvuc2xM*<+u!3OgT3A9(5{Sj?qh)8bi=H}+jw^DL0%3`-x?U#;@j&2$zp-3Y{nqp#NXWHC}bqgn=Qc_n7 z{dSyRmJkuYUea5y_6^{?xg@wL;&9w26$v7|TG)T_U4^vc$Jep(@ys9s?!VXE*B4gj zhsGry9vS{urGNk>O_GgKFQLqx*QpD;M6&=b%5 zYrWU#$m(_F!s6)NweM#M(@Q(2Gl5)*RcbjsVMrN6>$;z?WRGqR^REMOKV_=r{1#^~ zQKQxRjuhOKu;b=dcYTqkpV*nQ^5L)RJ#TUHFf^ow@9(;^Y(%GK_ETtD4T2lhgK>0UtM>^gro&?1wOg|4-E$`9fgTeQ3 zwvyi*!11$he<4MvQ(eIiaUI3f9hGg29bNS7jUZfHTo}!)EgTH=Y>gOg>`hWn`0yYg zNFct53ahxL9ksZ`si@A}z7}guPpeK(bAR0>@Ie}5=ia6Mg({{XD#jdc;6)%IK?u!b zfRy`7EN6=vmOb0dbT7?eq~YQ;%3NyU-&!-<=&AN$ddt_c6Zg})QU01+{@s&je)mi) z^|G(ln7%?JFbPndzOE!#(HA=RE@6=MkXrwZK;xHvEiESQFt1q<6yl18SATuH*Ll@? zm-8^ciPcFD+4#z|xAi)h`Ca#i;3h=7(C+Jh>5r%H-FzfVr$Zr7pah|4mdNxgllo(+ zV&mchnwofDll#B18MP{2)Lt%sB_tRl z!oxq*pgJ=BTeab*K@0g^TwMI>eS7~(^F>;^Dztke6Mxr%G}`gdHHFKLtiQki)z|k) z=bqtT3cIREeId}JbmOz zKiMr5-QayTsG66Vi4W7_aSHfZ0v|5!|D5vOrl4>(SbM<#+hzKM6C|eSI9?(Hb>1ygceip?`C(Op?d4?28`vmP-#K=%vXTx%V;9+_s1aGZ%INRDiMtpimEaYy1pnYuBwm@73xuwt2 zxTYXw&xQ*3FK^ah;`Q%q`?y`)mLVCcdPRyQONau5v42K+tBKn7R=8Gq)|wm7f3uUg z97b4^*nfnmFNl7QRO&Cd8H_$SG^6B=(wkGTJiI zBBeB=R!Sx)*6OLbGWjcNxb;#3yFJpNrL~KnTqPOM0}ctk?6Je*!}9( z*z~Y&%-|gzjv$DJDTou_0~gybc@rP@%v|Xoq*tQ>7aHDf$&MD!9N@3nb`YdkG8LY| z9TnQ)LGVdVl;Weq=EaW@!W9Y231+BH^4H>(*M@r^KYX=H4f-obr-|utIRmRtVD+j$ zaq90K?+0PR!c4`*uN6($UN0fTijm=&mw1mGJA5YmS{k@yp=PUMRzy7@K_7F~sa}S4 zP%;1szU?&}n_QWA3adRRrHvlg%1alB6v@sj&pEpBDWk@BHd7jVnRN#XAfO6VYx9B==6-D;nWp*vPr zkF6}o7&u`bmod=)xI&iPw&$g!XUyokYj<>V)~!_EJ20iP6oOJb|9pfKqB1a1&ff>Ex^eaIxdTO8Gtg(-F$Ca_rNyzhb@mBP)}Jw~X`FvC)3^n+oMRwJ-NZJ*T$*Gq0Jm6Puqs zM}!xnkMR@o$(8D?nPOv~QdwYGPABwyX9t!)XS|UF1(wU(@|EdIZo zM_5gQ_aU=|&IU9)pP)a2HJJHzR)=z}nH|C*GV4MX%Kp!3v8zHEKc3^g>i@Jpgg%}$ z{aJ0`y_nHhe0*%TVvv1~Oy_qRYI!Bqz&qfo-j;6UT~y@eW;4I>AW)T4!Pv34>=g$q zq8}2lKd82Our90V0R5iR+qYZ4U2(IkI=@tbn_F2`>0gYMj$WlYN=UcN_hu*;8$lk8 zRPKs>Hl9Td#S(UzZ*GEeBi2)K*bb(Hi7JWn--nd3{``~17B!Ked*6B=9yw!7Krk)y ztr@B;_5JlUCc)etjd3hownATC;Oz!Fjug00@Tqc|%Ft!9h(q7*sTqk@*k@F$UJs){ z(ZU9bP%gE6Xp4q*Yvkds-bP3{w1^qNl+kX6Qe)D&@wmo~P^}HhD{MN%CepK5v=PK< zTjY9`A()mjg#YiPm8YqfLXFz?@^2+#hyi7`iWyh+we(Ke_b5j8Uo!>omN0ofDlJZt z#nahd-atckMG-{hiVwcn2qr7W^dLFik*|g-(87!k&f4wviSpg zdU6rMKH6Q0rY-Xq|DoSZt@~ck(3$|*DXtuC7Z`$&;IKaD<+aonySC@MCqgbsz>kV8 zZ-ZAtcfV7XSp0{U3jFFt`FG=`W(qBC&+tk2HVQ6Uq_$|=U*hr|(}O`fjd-m;4vk8r z;Bi^KXu0>Xad}-(XO%~7^=Gl5$o0<oH@N{gx)f8S3o22&`>h(i;%-oX$G zrb^jh=4*6zdawA1(so+1o}Ww0U!`t(Gs5SSBftKD2H=Vn7AUXdbx?cCmfYbR^x6y= zIDuL^J+SNT_4A?i?r>I=1S7{*fz@^BBR~yBi*%Mfcba;y_?@3T3PG1W5;oV5sXFev zPmDIQtBYX@)H&e6l#d|&R%f}o**H20k^I<0#T>A%ybHnXe4-E91B!H>jAku-jC%OA zxfoeIi&MW8-~s?0!_x$ieORinuVllN3K+CQ)XBQdYi@X*Z>L#|Z=fK=)a6~Oh-3;(HWX|jnxu%U9{D}(zW``h(^;(~RexRh36buvPTME7ALJ`Nj` z`8nf#FfmJ{L(t9G{0x+OgT*ut*~a@^govzy-$}>B&0@NSA6kX8_d3YF;BaS5<*tIB z7%;8BUaoowOPnMrEJoUk8@jLkS zESP_I_`Xx_79O4C%dVovYH<&Zu~aVwh}AOTG2l?fjGEokmxYy*)iOyhqlGoRMBG?a z$+D*{ks62LU~xg)VIN_%bUSqd)%l_qQ_aCSHium?9fvi!I2kCf3#&>IXz6vUdO#~R ze|M8J!V{Mu7-3(W;T52Q3w56+Rp@+u2LBWzwn z9tK!BS{`X@wkcfi-|MmB6wxw5WK|aYDp)XoBF`}^|6{bd=$%uZ6E}R?Dg|f>kr$*o zy)kX56`ziSHUr{xJdAjcJ}chb(+hr44I>wKQ_f6d*7$;>(F?ATBX0xwCiNBvvJ7ov zu1c}p^_BScRzS}@W{Ap92ve)y64+?%enFWc$44C-PNN$qxw)++1c11}OJG8nmm%m^ z2JAd&fTyZ{HOB_FHoe;sF5fd0Ak?Dej$Oj}?}YNl$>Ik=pKYIH^65Uz5CbR5sgZvx z7z0^M)Yhx^mv8pbIP7SijzY)5m3HuC&<}x;h`_4&FH0&u<)OsB+M0;o{pmk;#`2+WH3^^+ zsySx-g?uFGd*+v+8~mY(T6r*}B(}hFzz=;P*s$p*dhzLz``8emHZN^ZF%MS4%r@nEV*@7>&@)c z|Gbr_lT%O~9BAC|ZwT?ut7WYeiad=hFa!{kO9{;;}%{ zx$|q)ZOi#HJPl6dcM$}=w>q9fcR!?ysfY5p9^WC%@P&AbRuitOD|hc8{?TK<$~mp< zW(Czv5GQp|LVNUpAI%!tjVw6-|9Bo_=j`zyU{;5-Th}$;8TMZ1fleelI-^`p!1bhZ zQG5drTaC!=o)AFbLx#10s}~`^c6wWg8ZYe9n2!+Ta(Y#9ENZfqs%$s_|#~9cOteyKE%d8U}^d2z49x zYpMov8>`zJXdE7|oCZuOi2$HD2y!F58Ea2-jQ>`MP&qO^{FZOwgio7}3h_y%M?aTz7}72j+CQs>v2 zOq<)p0Xnugq?OPivPA90{EK^*7THxb@!WL86qGdo0pw0OFu!{kPPDzgsH`DQ6wk~-D`Y=oX+hO*b6a1h;=nmvkW=!^${&H|(|0bhzrsk=X83z@jn9S_%L zRpn<#uB=$6Iw*eYDM0))v7kOWbNeD9`;FzK_2tUhd19r`d17HoNM7PS_yK4afA^O& z&%nplKkflhQ&7evX=P!aRaJ(GtnIT*XJJ;fxrn@4z$b{$$wVCP#t*uX=biY1X3E*r zf8ad2mjZ|8cPE=J)FTbP;QG~nQxn8}jK~mD5n&C`go;;O#g-X{{S(B;Cq6Krom82!~#NZB&Ro{9nc3O`R3rT zLQc%UAJo$+tsXG8x8vEiDvCfhkxgIpm;R1ITSFS;BB_`_SoCoe`868>>Xmk$K7{uxjhay|Ew7a7NZJv zd>D!dKS4@RF&N!*zZDpU(RXrMGwSYdvmt;FAxN}QUH9GAKiq8)n|GF`r4`c;m<+mm zlfG);v3&li9QPx_x3kywehU?NIbmTMpCkEs5_;ui` z;R2AgFp)ps^wkc|SK3)>O8J#W52(Ywsg*EoBAeZcQn?Nvf>NTlU|qp@BMJ+3$ie_? z02JwofR|yRPF`sXVc2$ELycw&YwmYIpjTH0mAK8mT@Ew}+F3CDu0s!LqXZo<==F&R zE%_+2nZCjQm&A9^(UCIG3qko6=Y4hB*vmeP)7P%DmJ5l4QaUemCKOo35*1M@r2Omx z_^SDU!c4&*vlEuL(gmEL0u+4JNtWTogp2ROn% zHx&H5fT@n33mhg7j<$bKfk1Q*jh6f&w;i-*?(E4Bx8L#Kc8`P+eHU3bDi*E-Vxohb?(PwP)%TO2*(#4mXcd|9prptWl)i+V< z47Em=6H79WZgN7RAIc)GVPQmCpU)T$N(aX4>;JkQv#CR3BQt@1KX<+FK2(283KZ|0 zcnU=8;~t?oos^=PwtDkTln=vRIW3K0uY?U7P$(VmK8~&Q{yKfQ;s+|xZp!rA)f_P@ zd;q~>Wz5FW;g}0kzLe|_y%l-*XZi57R3%jRs~@LbJT%&#dK^D@r?#WMy(V8Be3kWP1wl{6>yLW4VHsz zPgm#!flgp@R6hH+0Yh`-2Khw_;Er7R32Xq=2Tz%be%*hD9P1nFV&J!cB=9efbawW* z;xKCXW~!xy3LEI0IBPg&z=3B6+Kin!{`Y)v1#cHZO$S{w^IwdlhxDVH%sXgc2j4j8 zN(=3qB(0LV7!pv`Jk`$r2j$Cf*t3}U29m&Nc>4l2B`{d+E^oSdNpO6klZ5*)km9y? z*EZI>C#b$xY}!QPlm$@<2h;`?vm{AW8clA%FyJxr+Bfmm15`72iSm^l3Pe+mq z0_<~ejaIugjP&joVo#l9-!ASD>fIj|0p=;?lai3(K>)v`nka)Kke7S$ff%cM;(By5 z8zGBc@I4T%Ykgc09{wG+mlyeKJ*si$h|LYlmDLvLtRG*qS@tRYxyJp1_GeM~=w)OP!h2-pN(zzy|1U=dwf) z=p5i|z$N+Runom4I4@-P^&KQ?C3uQxY=$_3NAn}w$`Wrflao5GK06msye$(gz24qa z1>0wMVc_WR?xMtV#StSPZC&(tnrbhfBO)368;hZy#tZ$+dUw-V*Vp70vX%rHw{3!+ z%p7njabvgNC9I;c_!%{k4^1K>0qld?=VL^k#gt<>I+2*ZlcJ@#;G|$)sfY({ZWzD^ z02pcUx9lIE6qHthHe~4z)j58wQ*{x@d9<_uSPf9wKwHgi`VrrFS;+hHG(KApxt`1N z);T{l$*R+10jXuSm&!4Ev^tMWjDcyfI}>?47u;=GkX;bkqoMhAe;&H&_|AZr0}YM0 zZ={TH`Q?*wYzPoGBSdqELI*LP&QIs39H@BMHsCj{U-4qcffERAa&ro^wsG$7`~)rm zNMh678S9Pqo~FPaBoTVlTs!C7lDz1~l8Z&RbiqX4l$jwcO%nhF0DK&)YjwwN*YI)t zF!9qjH};1?dl#d|0N%JSV7Z`d*0Yq*1?`*D9~&RDsbIsTg${Sxe_fA~qJ{0BR8!C} zetYGM#A5)Djm7939^y^!2H%l_>iqU_cL|&oU~B^`m0tUmkG2e9{0ohY&I<`d)mJ_l zMJd_^sh3Z-Tm%CBl6EY=!13z;nbQ)ay1xT{d| z>CKGVanb4SWP00D`avH$r#n-h@ddjL*%h=kx_)C?ND_b!9+9wgB@H|*Okmgmnt;OQ ziUYjI8}Da0asP~i2@zvP9odbf{-T-@3@!QH)V5a3&A%OFA-H@Wz=msmeK62ubTmVq zOeohso9hRwM>EviGi&pL4B!eFbiqV?AKKQKZ=N?lYnoe|p~hnWd9z(imo3Bpso69G ztG+{!FJ&(e1GL1s+i8g_XBS0PjjpcyLCFke#IhzTz|uUf9}pzB;ekCDEGL!C&J=d; zfIa`~1mV)m>UVFuV)t1;TfbbJq;jHPr84CeAjLyv$ud|#hV(jHLkg|01&b7SnOE9+ zj5-HEK>|0ddwzEQar-@>zQDjFG#>~BAdfm|DEYBgR;UXNZbAU7iBB+fIkPQlJj-O( zFmB*dbk#`K(}uHKi6`1%Mq8JA2zpY=8oll|!rzgiKf=sM1ED zV%Vp@R$V{O0;}HEa8Ye5Pg^M45g2oJ=BIT@!^Tq@CIr)RU^*0eyx=!)*kSr~?DOn` z-^&OEsb_cYx({XRd`V*6XA9t6Bqn%BdKYw5%8$k*5aS^<0JgWZr8~Pj!;IuxCDpZ{ z-oO)ZT4xPfb8Jo#&>77@0RvEN*vCHp{tX;3nBj_A6Uzp^2XrN%7x^8DqYxRMnu{i{ z26lqLxnJ3HYy42Ng&CkXIp|hQE5IeFcXf;Xv7fd~hY%*cmQnb<19Sq=Jy7Arx<24S z3h9b|$Y_Kp*SQ-%i4W|is5t7!w)(Dr<1}Q94jmNnP6!(-P+ox=cUPVqEd;0sO1&<1 zux8-CU_-;j9CvHX|D8I*0w-YpWtolfh$AYfp6D!i4Oleb51&B{O5bl^q8 z{+8d;={A02o19SSjXNR;`0EKwUUnl-I`ui;nN&xw2~V0|Mfjhd#<`kU9VcW8 z=xgnaE{U{8|HX~h|9Jds_|x-T4`r*A&dom7Nh=f?(HLrLyH0Ecw=80MKB-Jv!({#A&1RW{s@)A3`Sm zz4Q7hml6VajZsva512@4I*}kE(!c#r=J(|JM+8?s9##t(6eO%rt zWx#@!Is|3~7r2S__1)1Cc~0HE<9t5BAUg-_7*->WNIa@0wf!um>mPPBptLTRsZMiF z_p`wPF>E_5;BJc^R(_HJlo{$1v2Y zj8X#AJ$15u9WhdehTP_w)$0*OE^5Fz+XdPEGRhh84oiv|n7WH*$Kdt0C1`7CF?M!07>cMb}|R*8p69m>e7QAKK)#ChIz3|SB?Tu?x` zw>?4BRMC00>v3t&19#NXsXBMURIwyInvMWa&8>eu@|7B8Z?ieMk#gYY8+0dxPLD76 zDV0@j(!pQO0jLMT8zifHw3@2Y^W#9-A6*am^Y zzF)wofZh6}n&Z>jT9HVZlW@81zpPU*!B_`mqo*4ajAY=eSb=SQtaf)jx)mut5;2Iq zXIUb$Ut~OX#sZ8?J(g6su&_dQLHuMbUlqn)Ca&$!9OW$mF>8${5h66FcorLlvv>wDK2^1g7{?5!_w}dB1d905GfoXW@8iL0&Ji+gO;79klIlayEQf0-XfA14efdHyd+9Q zMkS^+lA-1rFNujM3K;#@02@daK!&=xL%;Sf!Moy=m{^}32Z!AwoL_l+tGq0a=s820 z3VD8aJtNY&*3uObBoHV)nc#A%7S0RXUL&jCJFgdwFN6%OoG`wb_`o>bb9V<5yb?n1 zlQAN%xkm=6_ysvbJh#UAi<44NA(NBK-4!%d#}?w)QN&w!E~yICgm5SLH1BeKWr0U% zqKN<~S$GOdRI%sjFz5^0pfAMqV+LF|JW|?0vxuQTmv* zZQ{NhiPvCtvh3O%jIvVR82?|?ea+$nTi*gik@J`@@eqiA;DI>-0M_m(et%F^;5e{z z$Tou%(wrgy28PJU6p(Df1JsWi_!2g6Y24pva$Fih7Lx>A4tUl->%@4zsZqp;s+gh_ zl$%=zzVrIV?I~2p*C~M7fbAr8`8OChO=M#43+OTb!rh60wJGG{j{nBYfmPCYp#)lP z4q7Y?Qy-~^E*ed&@h_))K7gyhRQ&=Ve-Lps(t-)gr{xM_35pNGtBao%6Rc`Rc}bFh zRt9*u-TTbTUFA*nHf-3~3jzGSB=mCrrCk%mbMQ$Yx)8XUegL!o3;*A!*rqy`lX8lW z@<~6(b+ZbZlgd2dF6;xL-)^9)kQ1#qE^-Fz@1#OwACLzi1rpHJjh>$5 zH_)HJFr}h4Tu`S2F2i4x)?j==aHAMOlq}x<_z9U{=??dEkG#>6wlp&?q9={=pRvW| zKv7zw_LRaiBzOR4zkci!ta@Lg!sSvj+qK(+X@lm+Dj0hwYjC!ShjXFzeMBJ9K@~=cOV5}D2o{;Emas8Cb2n5z}#*1*=wh@@`gn=pn ziv=cpNY+oknJV~w>b#j_Li&MCbbf=J!?pWvBx9xi@t!4*g2o`zchu zXa8VnBE8*v2vAGj*`te?RJW6KuOexe4tDlVxn;$WU=S%Pf(lGt5JDrS;&l1@Cl7>` zKC9$Jh*x6reBpN2#Rl_ikgEbtF^+%}(wph{{VwL8B>swdC9BiEl>G$L-|LoH8oEB= zGAHAyt0vgU(A?azz|vi>EMQ@PK5~?qb95MoxwWxz@}(o#E}#eLZDa|$9|$mfsEJKr zaliuYB)QfS6O;z%3c}?IYX_SWUv3cJMc_z);Q(VgpNxVEeGFW`=iPe+F6u9W4g}ef zZz~>{JPYpc%g~x$9?`PAntLk$$o;2=$-kZ6#ky)FC|CHh4A(WldWd#DDDvcP1QiH; z1--Fb{fR?d0V_s>U3!?cE|=5>+b0MBqg{2QbftgjcY#3x(0A<69hcuiAlGDg7r?7! zsDlEl*NMngOH0~99W-DDjO=MFY^OcS*#FMcHH&DNx;uNLLV$Tzo0Im}k3f!iE^yvZ zzi+OeI!{=AZkcAxY|)*2SiKe!-y?5*U$9uaI{>)gBTJR(Xbfx zO951d`3Hz67w{;6Vk51recoTtNSV7Dp#!c!)&U*%J%i^mjpt=kIC=b_qJ=hWR9InQ zX)G8Urr;m!AJe()9iQZsPkjBLs;Xot?+9#g{k^>8o0KtdY51*$sSB+#r4Qg?r7zw@E?<*p(b4ZO-9WvD~`*3i&5oCH5FAg)%N}8 zCiUlzLqK1LDA5a%k2bb4j)S|%Yh4P@6E=z;O5ol9 zse}1LYau>}?37NMkNyVvA(b1u@Q7(l=g~62o4(%ctp^7EL84LvO}KDkdS&L1?QLfN zY03OvG^Y(B2O1&fHnlW5=Nri?y5-^My$tn zHI@l2mVK%fb!;EHss8En>qT7c4khUA!ZDR#WCul_gUfFD!AW)dt>T`7E4io%fg>Oe zCQenS-bsxEtorYesqBVCS(!47u73a5MH!V<))4bH)6RCxqh~^(QgZ_USg z(+`%$4eU2Ge52Mi>eS745$nn(Y?cG`JFRno9Z zVmt|22y^PN52k->A}H(d2O=0KNCDyOyPpBd35j9=Jjw-H0qM1$V2oZ-^Kh~si~Vl;yPKCr_?=O8|#Ki?10rB8=+r;=UCv))rg|fY-Do zgG<^;d17)vC;I{nt4}flkYzrSUjw&52)M+kAOYI~Tn_@3S`Vn$c1fpi=WT+p4D}h} z7M}kBHc(l$GYMkNQe{S0;Xkyvyig#a0NI8O4kl$K#VwZU31~VMCPA@xe4GVI9KiEb zFtM3|=?5c%`Ymx39RpX|@ChZ46&HP%2}FTyK^k!CYaA<>EJYqKi6|J-3!_#7fPTrj z1iakhyGN|wkOe>@<&?yTZhhgygOO+XHkpxW_D3(2;V+VTN|cPv*vVS$$H{|uBF!L7c`@+tpNhB5qGGYeZcOLut4x?Z~s8VU9#$OpIBJ)>&UTW zFm(Uqhy<(}2xH4KltTrj9pPs12PhMIwyG$bJ{Q47LZ*SRJ$WiZ;bwSMLE<_Jt?#u z?k;M8J zPwwEJI{z>|qLW@}!Q`Vm-1O zRjMDQu6}!bQ4Hv|q-5HJPn099IXt=TBg8GtRrX#y)Zld4_$9%5*!l@0?|9FIRFp@EuB4%8$>S9Li(G`7wZ{s4=6q=(fnNb4!rWuJqsKi zNU%|V<)wk>aZX$W>rkhNo5TvAEF!FRVf*jvx^wImJKoiEtpnVFK?S;mtPolJ_~dkm zOgYJ^IUcZufX4@BYdgO+q#Y*|C>fe(TOIn=?39z64p^Yb4Zsi$7X+a1an&j`7={{c z5bgTOt){K&CQW9KuYV|?m})Fm8ogTKzQt$}h@btfDi2fTxoU1Tua=hskb5Z>K+~b;sr+Hz6z^kv&zxH7r@Vvj`SJy_L46L!B1Gx_@tzS?0`(22* zaua)Sz{vpVbMOiPNd2RNEV-%~NQDygOb@=tc992r*blVytUh&M)1k0&b?+Rjs%F_a z*I0#8VJM}gev$nF*SN+EW=9}gzcqDY#Xh5gikc~^(gB9Iq>F-gbYH^)e;plmeIV-D z`*sQFNg97en15U4PNkQ&W(uj5A=ZC_=rm&9R zAAqR4v1$md`m<IJj0vR_{9|rKLpize^%*0sXrsKvd zN9($uI+@rr%~nSzq%#TVfTCSg~zA9sguTz zer3eD#zP=wwACcfq051r{MV3T^5lol4`lvGAk^mS@M%Uz^-iE`*_ZW{jdPuyjlc{T zNO6!Dp+8t$s{zeA`IgV8s>!6y{h6&{GX_LOVMB2LMM&?043RiB+Arq^9H4va?e+<_ z|7+ONk*;!C>!^fgSBVE_0Srz?r!@tVCKp8Wk6xZUFUs>{QoZ^G1Xm4hYeKrKVBQ0K4kL6&J?(X{G(au&ShR+)QkAOW>Q|psY_!Jw+ zh}hqp2|PZUoF#=|7;6_cv|@qR4tgK|s@ts8)iXs7NJ(!mt$PB+S?fJE3}S$+%tq{B z#X1*THwKU;AkW7BgQ$&h-tQs>0t{pbD*cru`Q3ajI`{x(1w%XV(hl&YDxaw8Yf>$! zz%#vBJN;@SO;Ry_0|Ax2mT+13K>^bCu<~p+lWcMIsnLZT10Ge{au7psHSD1vxSR8j zv`y3F{pcxq{r2wg`=?#x#){JbArc{5<)2HJ-+(UYTPKFd;2wJwHxn{sjQCstlrQSf=4ka_V{2LZE9BNeaSb^}G% z!5_Q)2h?oquZOhK#QTFX!Sil>Ce&E=xS`f0^M{GY5JF2$t8ikLpH{@JvOssf;j%Xs z@bOvLcI-?aXKx-Kf+S+o6Qu64+5s3xd+l&do_>pvq^EqoV%bmWMM9Z-fgz^YKN3g$HCL%O?z9 zg}y6yB2j7#`;Deyh^>M}=hYezql1A0#vF~bLKXttZg%2I1^)JqG|%q9e-I-?OW;i% zUclusK!(pZBGcaVP;d@h1@JlENUM!5^&7X)P3_S521ay5c6dIsr9mzEAyDPq_N&mHkAGbA^&``yg`4;Hs zbMl1|?LrZ>=i4`lM30Y?nb}sMm4<%{_kQGz4Y^FHcXdiVtr}+8H|1= zR5U+ZiP4aB3zCUcDM>utEHi zOZE0@PsP2ohrh`2V|{miIOXONO%7Vn0-H66B=;RjQ_}P|2%A|`X4{>E2p6+?51-u0 zym;5Yk7VdpuNVVar#1Pv&d$;EiPiR{Pnv{&V}>^X=?sv37oINgLTg7E9c+UA6`#{dN7%SFuv`gA5QA;61ll z9A0+;s#}k+ep6t=p~OcIMar*`1ICA2{QRod9a^X(UT!OdO)#UT8f}?cZoD$wjUIH2 zX;UW!U>{IzAQ2~?EXC#0JCpsJz}z#r){#Qbvk6zD49nU3h4U>FW3)3jYQGODl z_KjX~FED29H#GM0URoEySl*Mree87^z1;F0a!7J-a5*s<*-dl#;s2#ux^nT@(&Jgo zy7^WQ-a08z#}vn|IGH4-;yRsk|C#e&d%fvuw$@GdGJ#7SF~{7rb9L^qX|MUQ$w@l$ zuefAsoj=JDf7&D+tT3Gt2fOyyG8hiKQOj#aK_-=$l1AB9TWVlnb1vhU8bgY}nYZ`m z*l;Q?8H5}{q34{t~wbj;vFh%b?>R}{CDqk{R$-YPCqm!$E zQn8AwXnIt!w{4O-Za=1!2NYCyo4YFlXYZn*!jkAiPyph_@4N_{2vM@^tu=uQDp{l5 zpwryLgRII2+T3j22^CfectUNPHi&koyw;ziE04Soi!;yuJqPd~(L&S8|95e?|0kWPCXmi2e*x1_E+TKJ#MR|)2xF&l5*L5X~#ufNqxIV_1L(OXGJR$X2tW>QqMg9{No!)O$li*I`W;z8~&58gVpRoq#@F)S@Yc6F zroy(-jvc`^k$uibGmGEkG;~pS;g)#dm4zxJeu(&8xmeEicM})lV1YJs>t<|s#?-2( zRAb}fC0wk~N{ch1VKa2&POTPe7aMQWTc{t>yk%hdO6%cQxpA*yaCxy!^6 zEK%ifwh>bLNB%4sl+mdUf6nyo@Ttk%cq9_eRyv>O^q}N zXJY|r`kR)Dhdbga2bb%}xwiEZJMwh#%W(JQN26WT*kA1p2Jhiu;c`ok=ot`e9J!x= zs+3zhvV+%ZU0#1o+vT(3wy(!ftC-8YBc#kFiq}BFj;EWRv*OS=EHNuV6_|F~Hgc@{ zWKcIRIe;sCqwbr7Pz^K=?EUFec4x8yE*^xUf3!M7Z8ROfIj8M>yxXZ@!uP){0DDZ4)^fB|UVVLEOsNWt1z9(R zCpC-V2jAtTpXH_gLoo(+iqvO_upen0xO8luVe=Q_l^<`{ws++{+^{fB+jf-ZN^Ft68q=R4n53fd_F#r8#sd+7){e1`TJ;A_GkUj+sat!9L;T* zl6E9RWQUB({R*aJKnm`|v~8zsU36T0n71wUiWekQ()p4Z0n+>H`0X5GIk0qF;mJNa z3a~NfUjhOol)pJA-1N9nj%ZUeI^o_2VvNx4Mnb_?7ND}TPxBC{v=I%=PPyrS{ z9tEfDxU+iElED$MEy;PfWj)fi;VBg1XsTysvy__9@CYTg8zxQl(TbY1#53~~i}Khp zXg?t&2==tfbJ$y+A~}1U5g8PWWP`o`!X&Ws4?7bDHB(YW1U{E?w9ArxLP_UyG^HQQ zTWbRiYx68kDNoQg$(eA(E2o6U7EF=4AWU7Cl9iIZ93XQx^NC)_J)N=e$`R z**)?i9$t?^0>15rkwo%JUx^BlPM}F7(Z#&RKLBmrm&r~T)(~XlY@Khr<3YJnkCU$< z>*2<+8%dmVv1A6-(SghF$ykFus%+ay|3KeDu<}B)xw9lHsY1ZZ`GVXexZ+c%1F>m> z3En0y`a`{YXhn>S#%X2o+hlnGJDLuos{qMhY3Lq;V6`snB$6YJ_7j^;Q(|12$Bp+5 zX>P%AzV5{b(1iUuI?MouK3&xoBAC6F+Sj=uiHP5j5lB z7l+2z@%9BfLgTVABl+}lR-)* z&)M>Vb{(Hs)ZpkVMn^>D@`SN~e|R?l_gm0&k1i*65|`5*a^^)qz{3HtCUHbr)j2_o z&P(2T{UeWN%H5hg6Qu3Q9I3t%YZ9{yDY%yNpg*&t^O~_z6k3Z%a)X3l0PP9A^wTS` z`ZoYj{_ct%G_F3i*9G7_xuD=-(kU=%;EnUNV;x60?KSe8pCgm-aHr?|Cp~{T?nb%l zNQY|oMa0XZN|Fr>p@nA0e}eET`VQkqn+^=dG!$wQCrs=%e*=7vmDxfcfZ$;t+o>{Fxj(bboP!!EGZmBR4zQaDnvhDEV}w5ESW22=em=|U=Abid(H+ohU{Hg$eo zujqB4(yyvZFdU|!afbojirKu$^>*6C_V$8QfIn>D(uBJ8RFRQDaEOz)?pGSWUta*m zufGx~nHhm!{unGDm_*a5=6zsVvp4&{maZ}?s;+H=q|zZFAR(;}-6`FTbccX+r*zFo zw{%EJN(hL6bhmVjbaxKu=s?F40OHpU!S!=`YTyVc6nNrrOON}QZ+6LrKmB_y#w|iE3u=Kjysmujr~c< z3o#PI-z4o{qG+%b!=`vN^M5TMf!A9Ci@pnDkW)7 zD40eSSniFDji3)Xs=O^tqlQGAPiSdI@fFXScq^FyVE<>jJS@^+NhL0hk8Lc%uM?WO(#DLWmrIcDG_eD4^qzkxPFUt?X^|gltji z{m)H(FEPoO{!JPz3CoV)S3iSvhJX3oR<{_RkCp+-(U96&oGdK>Ls|EMx~^iYwVgGF z%!T7;f0eCpN;Ty-OHM{!r$$vN z8`f7Cw(abRthedk_%@VVsh_C#45h_37xTtLnD#w6)(r^di9}CnD=xS#)``v7uc~i5 zufDPcu%l>v%<~{dzKPkNr#Jdbha)Oy?vC=cpvQEFyVm#2S23+2^7nHMFkn3L*WGdq zoIqhzgL9R>WqniTL<11R!`>&N<7>ACv9frnN4F?n(uCtB(!W3L2{PH=Zp4}R*XTJ- z4y?9%0@V4+(oEm<=BqM;j1kROWUlL6Y7jJd0}6A3g}M1JCcu=8B)7@lS`S&m$7NnH ztW_%@C#<#?XKi;gMv}7Yj#L&wP*pLO!D79$Y(*I z-M($c5F+au`^MDD;MDjZoTVvA*SuhuSQ?j}gE%4}@-18OB*q&@&RJO8Q|1saKh}RZ zCpou>c@-g7wXw*KnBcy7Jd<{=x6+g5J6o;QXWa0SPC6?k>Q4N|$Cuw#mJvQmAt>o7 zL#7)>uv2?pvvWZV7=56-tyccgAuYEy+nY8sHP@4MwfXejeo|giTVu+MWv{OjZ_vCR zr>w@^e3oKTxu!H-+(xmLDQ=)Q11>@5 z-wFRB_+kn;r^3v+(De|6>G5k%8TFhnIEaZim*H>4Y0NX>K8n(a5F4J|?z_f1#Ud8H zaK+7zeakC?*Qt!@DOcO>9k+syEpryM%uLZc3P;lPuBJB=%@BF{=JcabL}Oq76=%qh zkw@D$j3_k)(!CfmXN@bB;*&*4P}?snYk}!{MA$PWh2em=^+A{(NxFFBOH*&8*i7`C zg=C&4Kb;AS%jLEh_Q74$=KL;Y;WDCVJb_O|4rgFS1aWWc9eMMxvfhI=v%ErD?Y_VK z<i{G<&Wz7w3E;fsCO~wEG!RzIn(5{ zN>;S!N5*ZrHP-?cUY)FsRFtI#M;e#2IVZs?53qk}AALbMk~RuAk4Q849a@ym{L|4Z zW47)c4MBq3D5Zp*JZg(D{dCpm?4s{4dPa5s%oU)0Wpl(ctQdZ(IE2g>R9(eu`XoEX z-x@AkJZI&Okn)_sL|)CIN)uYVSXan5crecKRuqEoZQLRwJ6};65pA44ww^Yuo}c@` zvqk(DZ-+jqg^pi9yn-V zzz8-)DAj}(yP~7V@%sexky3bfzWc#UFsiZ{4B!zi#fi|zNTTq*2(B_C7;wn z=WZTg$Hym@`{iaGYxr|Jn!da2BszC}iEcl+;(?=KFGJ=lqBnY8=o!!bk%qaREN|R- z-vfIk%7;RM@-uY$Mh{feF;Djz+p}gxeLn`EEf@)zgWu#|?{XsgSdQ7~o*pN1&1k;x z=$dEou=9y1<%KEBAIbt)yp!nQ`)&A#gDh)t1js*iR~b+}XF%*7i^KeqoN_c>>$JUK``z34>M&I$PgD7;r{qU{lK7bNC1YDiponX5y2w zWIXjTjw<}MR67js-=W$Q%guSGVfqYYAwZ!MiQCQda<8*vD{Bph0vzjAx#=(m^I#JS zx)21V@4r-;Q;xtFj*JswOVi>8K14hV2wPbnjE4))!1~+-5wp5uipzQCEqFPg?rOA1 zIsA9r2v{$PZN8UU=!j7Rtp+4Y=EFx(R6|~+`VYX!x<6LG(r}D1U?E_Nz>YvlY!B?u zm7$5}aM<)CN1xJFbP;e(5e`%@EV^!$c^(tlGqx1gY1+FInlC_(ZTAyV(T4)>Inz+H zEedEPg;E@oucNpIjCC?}CG%QMpOJmcw zU}xC>d$pQ~gocf|WEh-s8PX|L@Pz6c4LZEV1H}+KC%aRy7%*j^u%g*(`p|!+jc*hg8|3eBn z^pmxH$wrHIPTr^)wWXKHhpkbzvlL&x^KJ(6x%%X;A%hOH)xOvIl5x_A*E&9h8b=!Ug6Cn^-H#0dyd zKF0^H;PLs%+So|I_<}i&yUq*JHxI%G$1)ewi$X%rqoLF~1dwjK9_ulzgh3qi=VY|0 zkDD4eU;aeBMJl#MQxQQFTRb~2Gjlu`78RnIAgD?`+F9%UtSsSd8$juJzk-MN#iPX! z$C2_-A3p!#?SQBdvle7#(DUNh0zNR)wLA~YzQ3U2?{nNLGg#7T{Zuil@9R6|*lm;p zxF8QV5@;U=Bo^yKs?_-~tC`fCITx@3F=eg}*Z;0mHM-p(w`{&vOS3*zYQWyDP|9p0 zfk=uwNpdxabARsg zeDa$2Es83i1j&4K8do&9b!qXRgO-oifAyQ6IeEqp0*;}s5B1^)8w5jFq_tjo%~?f zQNJ93S2pzPGye%Gza&HP_|)|O`G6MUF91ahmF`Xud_Yz9zo)x7R3>D8>3ZlD2*`xl zB*(Z%-AQ|nku*Vu>^BW-;L?c?Lmd39Ol2VR0ZL>T1;hjEfMzujJyyZu`no?8@F$jH>dD{D zub&tSFh@Xr=V>{?7fY7~#Q>Kd(j`02%S`<*$z~m+b#jCNA+v zw|$FP(&83mWc8(}xgzYsR%_fqzdL+J3-TdRuDGxt^1{C4cPNlU0I+_Ic!0yoX(-X{ z8S6{=nrF?xtHV44FyAsZ0{nJ0-nd8Xse$l+mM+6I&5f9YkYmHf?bE+3ep zDAf%ASrDDJ?zRcLWji!l4yLT94?g@!L@1x!7*(>g7}t*?aS|Cy2u&3Y2gR7T$}1B{ zusRC+Mn*zL!!Wn*oZ7%uq!N0mPRgupItNbFm&^>#_#6_o zviUN0ZF5KJ&^MN908G2CT?ve_i)b4 zQ!Q03H3aK*@Oire35b%fHCWDK_bT8hVX9mKc-YNY^<{$Q#iIqKzwjZN9r1<>WA62d z>4FL0&#cnejy_&GE`b;IA;9CKQLfHEza;o=FGRj! zYvgN8JdahPwc57;Xk%kvV!5=NT=#b>4v>LV1r-jDkL-Qr&Db_1g~>sB{Pp79@_H&!}#Ga%=~GP75MI4 zEZG7*B{r^n0e5V^qRWx=0!DQ`nCMfv2iE35c4%gcO0*~GCS?hUi;ZIrC@9R{uYfIQ z=&&O~;GRP7W7T3~1E~1J2mliqGv~VFXyIn16vgL^n4H&%kOW(oa7CR?;4AvvX3wJc}8P})lE?5^}9DTg>M{6TmEKDFu|DXc{FN#kXpl$C#jIsv ztdiN5c07x`{vzz`K2)U)=v#hIbh4G)NXBt0zr}qNN!oAdnEMN0bD`!{C%!oO!l9-$ zM9ojy&m=mfbk{pb&!o0uzBa%ZmI0u4yxThRZ_gWQlw$kvirXFgWJectqde>6Ql4%i zEl~b4&hL}9^&4BX*`Rf4v1g;UI8t6wtWxve%1$)!js`hn!qaX~y* zETX|YkwRNxD%`V*ir)%3eHOXB z`!bdlH$F~LNAn#!6Dd%Az3r?b?YS=l56+H=3`zkeS(jB=0%6D?L?1M^tz)JU9?$)W zJi@~d+FF)q{ODkFhshPRl3+1s?zEL~Y+I;p~ED(cCPAY(NSXq~^oBdYc8bAgL~r;2OpVAby`HCbrGCrW(SZsK zdiixC--~Sr+jfgFU^cv6POF^$IQ@9yJ->^BgX=g%24sNFCYoFlvO0-Jc$&KDV zD;unJOZUOzfF9OO&ES_n2+75QC3MfnjsVQ%6;{4V&JbK4;b~EMkIT&Kski$btCA|!{G!Nx6iBrw+yY2$7cZL*7rOEFA4hl!sP;)GV*Ok{# zWs+G)@tYh_*8QkS^W_WJ#~tst0p%AO4oe+PK@S&I!UFDe!NaMP^b*^bC4C+zvmnMjx4O83eZ4iKh|7Rt>&?u^n8Sz6<7>&2d*RQ1r7dpRPx-U?2Yxwz z_+JAdnf4@7@|#rx?4v~}J$+2|wwF~aC2)dguX~A0{%d;=GRE($NgQSqnlXNG{s>P$ zX;}*{P?5wx>`=;r3r+TT{VbVSzQ2$4+vy#tbBN#Zm)PfjC37JV246e8WyBzmK~$R_ zoRL(i_0%lbh5YM4U?OFbNI1VyYpD+)ZWW{ce|9(87T^@Ou-~wzCvnnh#2Mgk*6l8* zuH7-Ykb0}tLVr2^aN31K7Wbrf+iIa?)t6_}8nGs0pGD8E=b0TCQP*d*oIRSe+JtXy z@jS02PHHcwTU%DJFfoWBHB@$g7F+xnTd(lGsWVOci+O);{~SxB%_uiS&N4tWYUCjb zs4HNjy482=6+kyf^@oiODS=%sVwPNqm!(p>qX{l^A#Kn)M4gVP@tNDlg~a* z=Dum)f#xw0tsn~qK>~$cl~^;f0Nw`%3C61Wy-Hx)2Y!vWpBZP=k}X>Ba-%mxr1#UO zZU(Bjao!rX7^9>xfV_ZU3OFnQ{Q*DUsI}_~9FIar~LAqJB9bM+iSu-dt)4KED$OIBiq% zYsj}sL@AD5eMn_s!2Bx3JuMn&Q9~fCv_U%oHJ=a^WcAAd7o^X)@j`p)6TpGiGx7Ex ztc8V9g>NdcHy5ebBcyxAw2TJ@SusX*z=9823v32%Pg>ufc3^ktd{8$pYi^&s6u=FE z`TzU&l=Ao#i;9N&>$h?Pu<)2<`^aj3xWTk`4jmJN0mPNkS^v25kIqc)uo6)X*K!Oh zbZJFR2^omH>Xqm^xUfG-Ld&H+QR(cLpSc zq>piIh(+rL%K)f8f8+$wT^;W?+riQDetwI6x6bcIG$4O>&A43+Bru^!I=B-X}sZ#GfZLW|$MWOD3rBl4oq?~-P}_YV_Qqp|2Niy@UNLHmSEHVvo-g|R|XK-_>LqUmrb$+w{k z+>?{%==qzg-tnbGPgpCHO_;;hq%M~Jopl5|Bt3pu-A;qv5V zEQ2)+PG&G=z1>gfu}ZkP)ddXIdm)}ob8Tcwb~IoH*GQ|p-(a2%wfElR{saaOn74Z> zYXbkL%*kV4hIVDo<#Kic)#fG*??W!imiqKvjKVG}3k`k$AX60cxkq>}IjkA!k*z(8 z7x;_@!a}7@UfII|-eH4>`Hz#Q|tLz=tqrw5*L#G?MKT81jfsU)AZ28jV)kK(D9 z{KDS1?0s5ABV$6|rT=e4pyHpbb~`Wq%y#2;ngzSlMjayXaDn@$X9OUD)&-a2FDeML zZ5MCmGssA)_2ybnaze@(!(bJ4yu8%`dol>*cdG>RuRei!F@QGps1H;+{=v^EJyQ$BZ-Cap5<7Syl+o*<;N}u;JB>3ZK8cpm)@d) z2`jw6E>&LRS=XN!E>ckn<41meTz`SWLCh~-pZ-TRnkueX6LQ3!1lHB<0I&x)E3j@s zMOXLEO9C-BxGzx4@1LUI`N(ll(=6NX+lm@`LpvQny;lJ~S?7eUbg4Q)VuCV!XN?wf z&{T396F3}9I*RhNV7I>%zJ;?CqgtI7LxIo1X@5~=ppuCftp+iy{mC@;S~GhV+_`P- zKr2fS1k~F6pyhURGnn#uyB)gDnUA%D8^##D2es#B2WsU*ey*xAqCcsnJ2gr6JaA8Cqg1}=6 zGB2tsX!yiuNs88qaI?||zy^5G?nMb(Lo80mmeiFsD8Row05;PV{waZDPQY4{>t~|k zu_V!l-M$5;HsG9~2NBz)7Zzyj#5iSX<$aV~41yRj0x}iQ`mxGcbA7kez?KnJH~oQg zV{?Io-R2b{^{e8%>q##-ya1v^s988sJ9qg2+h*UksVK|a?xBlH6Us{evL&_O9yoPl z=n66JfS%rVSZwFbSmZYsd?2U5#Kat1nug8~XMtrBKR^WK%t!8byrrGyyw`G#7G^eP zG?n~Qx5BNy{@>w_(#G86{>?uM(5Ob)+LR8G3wky#@~Lj7=fur(Su#hj7~BTi4d7JK%6=1W|p_57Nnw zD$rBCQy3a*Hzg)V5N`R*e?L3}BMp72oTD&Yh_SAc-m@cN4E9cC6y%X9w3JH@bltTsuevWBASa(&)>E6x#42H0BR=31ppXvr^>gyoxxN)kk35?F ziEKjyAotJIQV7_TL;Q_7-*4AF&y>u3_?ITH8$R$2)kDMJVV?KhO`IVvAV@ZESm-BV zPcQKG#7*Uis%mf`OuU`2YN2l_2ovP6PXt8&;nAE$9Y{h5yio3k<}Pw0FI z(qt~|yGmDA%5X$L&1Gl2YeJY<`3t(J}2jwE2}$+Au0JH3anVk8`mfit4_1v zRVmON;B;#h5~*uR*BhxoLEi|Mx4gbaJHD9yFNDNw>7W9%=>4s9IKR?8K0YlfsD}V^ zgMACSBH^X@3|KyFBN#6%w>I5Fs&VQ!ERn;ca$P={lac)C9E{LFyBeSKsh{-g?wMO) z4FnazNW_2EZd&Ynv-XHE4;@m*6x7}Xp)D8p(vR6rTqB$qH#I?o@sYt%e2udPtic6k zQmxeR1mi{f@Fa$(%8?j_4(|7qKVwed0)o30Jk$WZ_b}pngNz*1DJCw>L*EhuW~VbM zO?IXxJv1_+m!2xQ|M(bQDN^L9ivBspC_FYRw5eA%P{Z_i-s$SRM~a1kivtySoWP%k zjeq+&hl(Bz?a4i$XW}GoUSfG2Fn01RxOxt?kDQ;Vz(^sE{#1}mp-CN59LoxVi$B#) zz(jR;olO-V7ngk@tnK53S*qvCN4`J%JLY~Nbg2on%S}H#P)as}HdeEQNi-&8BUX?) z+LTvbi^x`7--AN^Dnc=8K6Et#r#J+SYsZuThbWU3)%$Mr7>$JAVxX z9zz8Efj#4>K+y(F!6OVZM+onAPIrAr3$`S4^^oTpXv zS*WkOFcA$RR5J5#SbmtLsPyt?R%5Ij8T~H>F{;S_oBH!;ccpW^myO>If1J-%FHm?j zzEvx&9Bxq4Uw~@vhRZW`E(!+fZHOB`Ci|fxrIb+pnvM<4$oU8uJ>?Hx_zOEnzQg5l?SrN9BLHQ z;dnAKvd2{AjYp5aU|)dSLPRE2pM$r>%2_ua69H?YxO8-MF#nxkLO$<Ah$!ovO8A8QM&IZ4kVDnECBto`A%(($;Q`>2{J;0|3~H7lP!imJqs!)^7% zeijm_2~Pj?Orxx`v$m(xUnU!Ev$ zgW=z(cCxP=Vf){AzY)b5Q(fUhVkapbCk!UeV9RHnOUM@aq@Ks0S5c#Y z(jK=!Cy7Fhs+LVhy-V9HN}oP@T(OpGcH)*f?>_HX!W;JXsBzC@aPDmG(!=5bb9|^l zm>3n#y-{C&ss|_txmVgZmKz9Mewqt{`#JJ?>Zf7_n#}#kc1XC0<36IdouYh*gA_*x zMIp)eDz0un$KA5~y!P8@?h6siQ>Vs3NmFI#6uDu!ogP7Z@Ky6`=RGlm{~li4l28+b z5kL3j&&tZudG+d={rKS4#_i&m34WysxkQ$hmd@X}(99ljX3RfjM@B{-PZx60yp6wg zlT%W9DIg?tJ4e9x_|0+|X`px(GbiVPPyOJnN_T%M-%Fa9_3F5z5}fs;t&_1b1JR|W zr5j{|L!ZAG1^%5yPo!rNI?}nX#H3VNn!74y}k6yNp{d(n zHaE>IuW?aZIIoF$y`FKA&+6+Pb!wcms4?Te)BO>yn>aB1XE?Gvxn0yy(&$8ZTCjGB zyjVXQH`!h7_2kqtCBotRLJ%e2rUa z!tD7|^*AEjsDU`3y3;?j;4k%PrNmo``$+ud?>Zz7M4X%DexaC$knM ze2(t*;NA}Q{p-6L`RgM#0~gnKiJMNSV4s%}Yhi&A4A7z%w$^2x*Q0gu& zR&w(eR!PNRYn>?}BlzCwwGe-e8!n%NF#T!*zuUj)cn3UgE8QTaj6g*h-5zS5)KW|N%wu@+OzYZNu z9GRi9G;oY00l?4pvfvbM1FS4M3>0wF-0daBMn0GlYZF$|d%6Z7qSvxK%8@^z)DUpaHmJuuK(|0?yE;}^5@qdN+E_v$&r|geV7bgBbU=Br3;y-iNWPbcS z>k(bLkX(BlO-Emvf{ZRH+(Y~G73!WabRu43tdjnID214?&QlGoq`{$XZVOur!-aoL z|2=n0TAF!x5vg8QgJ{fPzq8FLe@HQ$e~WXBsT52sm;z<0mX;XdVn?~1Hj5Iup<;RX z5-!7VZ__WQo)8Wa^PW21ZnU-WUZ%ycirp@x3vok4guf<|UCcq*{EZP8>qboM?bFJa@hiFW zv=w_)OJ{rZ99)s769l^k&C-4QoNarz6lI?|5O9}OI9ywg(nKo=k@-}PF~VzH--${v zC^0bI@Y53{ObXUU+u33J(+dywqaVo9sn1;93z=_DEoh;2v)iNBBPV|#-4SE=2K(j_ zr!Z4jUe(tRLp3k{6Rx9VP%+rFDsqd>ROtIQ{GX5qhOQZ3%H~$LTzw}jN7+zOzpN1A zds)#QA&KjvrZljEMI>n9VzUN)4TIZ^Xpkd6!+k&r6wi36ePTN4!6#6l$rvyHzF7A~ zYZfI=NZU-kyI((Lvx=jH2*MiHw&B2%it80sx-Q|eoAC+#0Od{0n!z>cN#%H&(7uRm z@tkC~)ob*XrCV(s_S)8|zL%$t+H6016@%jY-urLap9%{++ve-{*h6M}thsgB7zoK# zSa_=q(ydvI!XB>+Tat8i49$&##ODIDLYQD35vA&8NB3G3l(h7;gnV!9OwygE#zA9b z>FX5A#r{+1Qf}|`LV@{-C`Pc)_; zlk@s*q2}+SpuC{M*=O9LxZk0)dKe<{FCd6^FE%bSUU@s%o-RWq(nXg4a6lQ&@jD77 z$6fzle1s#eZT8Xq@mUDX(SS3o6xFWB!mK_Yek8I-{TL~)a7OU+o$7J8yT@$o67!Qp za6r9&4UBLlSiaJE>cewW;xGTiQ7m(LZlaS-pR?|iup+>f9L|~Px`!VmuSP zT11z<^OXjFMz7BQH$7c7?@k-s%H&V$eBzr;-mGyI@*(*9}51P zdUk4l+1R}ipFx{=8#jKO`F17@-Q40G71JV}bqTBa*5)JV%5@hHH4_sZme;s9kwYuj zg*F8+l={tW3K-63%JykHvaH_7I=d0`c|VU(FO;Ms7=>;W-p^`bVM)hy^8ikmaRn_% zF)cD9>rv&)$8-#7*|p_}S+bJb`{hZmUyn}BNIG1}ogi3R;qiHrU3Acoz0{6z+NDFQ zCCgHkg-3C>(ZrOv!xbtt*yx_OckL&ukQlR)_wFJ6Hzy_IK{_lUV{BtA1AVl6O?gPi z;A4Vj56mYHt{)5kO8ajeioHA0uIopvp5TwU2Q?IhO)eVOx>08sG<=oM!zHv8l{8{i zk7XYno(S?QM{OCtMhGV3xkqU06Z!5ol<>Cd9s{t`)j_ko1F2EU`RI zTmkb3up-H(E|9qAUxyc|Aix!(1c*Z)lh;+?u6y|KLFe)Bh1u&5lear&iXJ;6!uP~o zPb+Z!#AGk}>0YOh4iArNFRR(IP#{uY{rl_wrRk7O|Apb$OHnB*{Af3pVB%*% zZU2^o+m`gV_=gmjy-tqRR`k*_i1?7qR4BP@7?u|n+dr>mFdPkFB8=G5sq4OcVW;Q= zD1eCDkqx@`%3-&J>%*Xhr5%~$Xf=2W8d{$Q6JCZDda5gC-bmc7d9_h}`h#tIHnQ1| z^*%TNDRmR5397IS4=A5vVhM&nHkUf_NVIe^Q{vZ zUq^7OieD?*&(Ruvj9P4&CB;Y;j;sI877aa{P2ZcOAus(t?_-m@UA4+!2a^h9^iBUJ z7G884vH6eId)_9k(bN9$nA*LIv6wuqpycbDt*`AXCUg0>NpiXK@}ZzB^Kf4E6!swjSV%;YdN{MK z-Q6$yqxO6>5GzxYjNxe0nRpVE$E;%7c52l4x`g6a=Wzx`hLoQEv z5HBAn$!y#sezNzTZ5Jbz3*9$nRKH`Oog5G<6Z-rMn)odB!m(y{S7g?Z2c!&y(D{jd z4dcuf*LMST6vDcX=EZ3=mZgk1H3$mIs=qtF?JKTDz)0pNhXo=@!x^{Q9HJ;g2uD$6 zeB1M(I>ut_jfK@9;4}mdyDR*(#w(bOifLyL1>G-5uEqlQ;9j)%^#rY%Hlv9(598UL zp^p&pHA>Lpgi7Vks%}{jM&1MjMv%WBut9MbSZ$n}fK|xB#k+j|dv1B_@!pWjit90E zgq)zuJ>S|eQEHBr;CL}*3E zTJ9;NP(acJTzhis+| zl|-4*C^J_d3K*G;*77Nr)))Q#Q;~PQUr1t*yfC`5zk`-Pa?+D+Sv!RI$p(L_W+aFh zcGmsnukpA;U>|)r9{Ed0d*0x~M02XBqTQaeEBQA5xmern*tW14L|` zoN#Y+5VID&+-?lSNayiyG$_vb@|6r8JOVr*C?WNiukVRjEE>N~O|i2(%3ZO?f}{RU zBOiZk!td@ns&f_|8Y_+fI3L=3=kTvohV$Ax@&hQks#ss##DX(&SHFVinYw;)hc-Up zh^nrCTt4<+DJ0nF)7?fTujJj-5Kl`fDypApq?A?NzKl=UFRnv_7R#&<_UF619G^Ea zY(FVjKRiCHEH_7skdct6uKUU_teSFs)=XVWjvCG=A5QF9Bpc&nw9v!vh_Fo7EY9)% z^BUXbjFDBeQos`uy^c22FfF$@AeA+l@-eLe1lG)fb01IRp-NK6_^8am7G9u?Sa8s^ zwsyku_C{}7I}0ag_1l|~@k#z#Rjq$S_l@yjh#^#}e|Zw4`ttMv;LBCkR}mq#PaG4A zTPM2X53}zbV?^*wyfNlRe>)|pnLuE?ywZA=XL*&@p1H8FDhFpeb=qiKLUNRdCkj+){T zESasZq+C{2S+DJ*Wp&|P>53F+XlfDxXg-1|zp*49*~Mnz5zYrd-@_8pfTN_9-O+?5 zeA-68<3go(c|>zo}cy_ zwRS5ErRmQ@!=jp3Z#q^9@K@hj%&owzSuxG!GQZMfBNy$8kNaqMc-Yd?AGc1O!@*gt zS+>C2%h=^DW0PtHACm7}Lo#+J?=>V6((+Q>!tm`DY z?R>ZMuqAhws(K%tUicDg=!S2|%rolPgg5mjlG{%J`#XngX!+i_**(hdJpcex` zgGGMY<2ky;y+%0Szn*+FS!anl5jh}c=3}K z*atM_dvBIzewRDi-~Hf~E&Dj5DHpk(X=CLB&@x<_si3nLwFuRDWR>Lf7FQ?IOvD1? zkC8R$bN4_6m^c8_Q|sAHULbTo>Uaz8t(_;bxt8v%6R{jyJ9z*Im)3XN|0Ryy=QN%8 zZ|3^LP^@h7$pmhH8?YNVCn9S-5qJi7Tve=}S>(!pI94|4VATjypAnx6_O-rAiV$tj zLJZuz2Km8Je`qu3yPl`V7#JS^e%_=XTk6)kZX@WWlLM`H@ceDs(U;OYykkH+I-XPY zoh(nhrHDoJ*HlZ$)korYdX4xDDwO{AZqVn%F z=ZvHBdkdW1-h!QtK7W`jUB~2D+R?{TuG98&&)YxD#XICo>}--$I77C_Z4|~=ls|a$ z)U8)W`FKoQ(|+?;nvoh_2QA>?Dr@Jb;3Vn(QB8_#hnZ#Js`V?sGrE~zRc$+iw-acEzNDM+NWBQdl;lhuHbk~ecgA<2EIzNX^CiF zT$I;Xi3C94Yp=qeDpO)$tlNKTLOWk===>3&+1ngRvP#*^7@isnE{S6S?E6l)F`zCb ze|xqfA?+AH0$mrH*V3{IK>f5UZ**hR{`Se4@0YhXhCJ8WBU{!=P~0*WE*snCW&kAq zorEkMhWIB<7vwmHI{e^#_T%Tsz#{}9LKmkKOh!2I^e~~Lgwl?V;lMza31d?e345Do z4?E~}gaq%u+1d^Tg3(_42Sy90&mR&fn^!ePA_P^Z_-m#)W^aPw&LBKfW+O^TQA>&o ztn|k_N-Tpbue~&2kf&G!Ao6QqoE$+xNJg=bm8r|yH?TwmUAtI&IkB*eg|$mUf%#X< zEII-@sYhS&JI1boHh?X6XR*BA+K^WS3pKx?1|dr}AnxPT>^oCy|G)^5b8PN0_M%Ew zZ58s4f$?-s?loA7M+>`3PRGX{LMx5h;+PRi_16TfH5U(6Q!-`TeQlGvS&v53$y!Hgf(Gaem-PD%5{{5)lpsVgx1Et=y=js%ZdhVV(O8 z3XrZl@v85swcWuftkDdrvc zyN=N1eY&-`H;`X=6Ll?dA>HA*fBp=!_u{f1-P~2{=%XvBH3ZgEr2HK&|~^>`8P-!}$mnAL9o##h^M8cx7iKoxZ12 zCw3(C`H*MQo|5jZBC0GNS#UOYDWo#Y0-=h=ly6T&rszN^`*v!4UBJT_Et=6(7Vxa1<&6t2dO=+InU&l|B3i3E0@v?61S2PlL{ z8p)$mIGXnoDrVdg%zJ$g9`MQ1y2`j>O7sIU!=FKM`RD3j2&n)TA-gD0#rylKDeU$~ zm<#KXw$LyD+$33)HG<%42skCqd5>UvqTp2;EKkHoV7R;< z-k8b&yZaXq;OKPuyMl*T{gry#3X<(3;M@uCBUeQG-T(qNHrbo>x+U`bMI%tROqxQv z3GB43O`r^q_btBGsioF=|3{x+GgAaIF6{ScmiD*s+7D*u3;R`7LWyoi#EpU?7cb67 z3pC|H-0J|m8|P8QbzOP3VQ!nl&v#i?T|%6kqVYOf=9SuW4T6Ti_;gxW%)<{xlaq7{ z^eSidM@u8IR12Xf*X*?fMZHd#O8S+y|GT9IxCe^WXH8}`Cl92*>Ew*@XdsDn4fed* zBiu3v6mk|6FWfx{n*F_a`H+TG^7qc~vsD=ZI^{C1QF}Z$P_lBwyZZyQ=WxY-wL(pj zXH1DMS<$_m<=>WI)YbD9=T_E+P(CZk;$Tp)zIlYQzKO-H)%CaQuO4V;YWkW#VIqu7 z&9tc)c=aq7J3%c0_i}QUX=Yw=Skcpi2Y266+(~4Sr|u$1QSTqtV1`!gEr*10!e+#= zr9+z$E38NHtmxAO0y-}1Px4RXrV@}?CKk8q(;Hec6*ewtc8=o6F@cK4?{WB^!$O8uxyoBR-JTrUmZnRde- zfuw)8YZrv#*7@d14s1bqKwjocQ5cXcgh-0H&3La{HdtPL22EJN=T_Nu@5TqxAMCnL z#c=h!+#ijYAUQg?C7NPX*3qim{tvY{{uPEH=K3)35e{*0Mnus!d#4tm8tmVA%81eS zLc}nMfES`}@ex7$urZKd_~}C0J=pWJr9TWL^#_t24y&E%Gj&c_q{wDuGmT@edLp|| z^o?%$NbjzweL4!7`aK#W0ha|28@=Gp)(ON;n+9kl7JRtp2Sq2s^7Ub1)y)rmZicXD zYU~KO6-d*B8}AMW<_Fi_%$vP0mBNaR5%soIfda3{m_r=cwQSaE4~>euS77dR6xIM6aza`X4E&5Bf+?~nn9 z(+Gy75hrrfWtw*mJs`<$IhB^7whHa4N>M2kdtLi)b{m^U z@Yk5uOJLq1^VJH*NPFAnKt*hTu>%VwxdQf9P|7G#sEX6VFlo@3apdUtw8;0w9icQsOv!mgJJ6L?avHk1#wyJuP>zTUv0*9Q`w=Ea#0C zN7$frJTweUITj`b3>zXmbOl(pD3QBSB|k`!t38!L!F>|tctEPQMm~ zmfP`eL%`W!ULim8QTEVfQ8{!>;<)6!+i-Fw7C_1~pDRT7htf3{4{-2ju|a7#wVjg% z_4P>?D%et57f_+4h54Gd>kN+A(EkhQpW%0ZO?s+ z9XNfj?AaU$?3kp;32v%<;63mvtQ@()R&#Q82B&*&D;{WTe)%pj+$5dJKaTHyn}!}y zaIV*`0i!^sI=OfWeH%pRdsM}HR8Gg3T{ZE=hOa=ae5%t#000a$@KA8kZXT5*Jm|y_ zYp$P#j<5av>JyB90ycw>P|g;7rCDZgWbK@M5bn_|b5wn!<2^?Mf1Birh0;4Trci*m zIxeQCf>%JS$xuyavVfZerq~@q16=S_ryL6u3yPWg5LLR76=XM%K>jYY%~}x-aq}3p z99BX*K7EtrQ2U?bH;;eF%L}XBJH4pBQ#*4m$CAMF?48zrgTJx(nCOE2TCO=>^s(mT z)L2)PL9yA?)?PV4!F}u~X$6|Bq91WN)6E^=@@gAYV(Tf;m~3t4@$iiegYyhBc+x@8 zYu#q>5&$~9F*gb|b6NG3q&JyP$>R~eBTw-K)U>=)*KlmI`AXvZw0NGaW4fiF`R-UH z92D1uRwbB1DGx7b#Io7DZY8dh5aALPDnFl?7&n=oG6644PC z(gHQqAEMB2A6XC$!E3`H5_&ay8?M{EJ%2^aWli3{vb9e7ZEKIxYG#ZkCh5b+WT=Do zfInsScD?ldVdK;5siN%@D-HsCo)?%hRbK6m?9HKJiOtg8_rdv*4#x*xA zfZqcYTP@#X2ht%9qGq7`tI>)OvBvSQ*`}41YM~}r*u(xNPuhV=I#sxuSIWIDQCLH8e!Ic$cLpBOsK1GxkRwK(x}2l&eLl8=v+Ih~-#q2- z_hfOP@b$;+EGce zg(AeUk^@2Z&blgKW?kKl&$PEY$_7snA|EslF&O|5V{6zPwF)T=PmD`Y?~Qy*nfi(b zvhe|S6g7iL;6f7O=6}ice8~qL$d*Mex-55H7KkZm{-80{9h^b`k(uc_csrwPy7{4+ z^GA7JZMh#(@9*p)+s_@OM7TJQBy3i_JjH2!RszFL#ewW?aL}#t{w*Q+cEGsmHf`yiQgEt5KuAKcT)sq95jL)8VRruVT>^Z8YF2#C4t1*_T8bDCC})RV&_C+1$|d58!A>SSEe3pgQHeEAAh z>r@$}IdubFC0N*$?`DF4iXb;#V+8&;u#9XG?qh-IC8I0`L;~EQt8W&VrU?_E{o)bu zp-5G?tL33MWWjQ*fj znJ!E+fhc6RH6rldR+UtC{HZ+x=o6p=1Pw%DfviaM%#A>TUQuFjDB9yU+jqz7k1$i0 zmv&U_6h({4)6We@N#H6$GW_`&b&%U>L=kSiY`uNN&Q=0#j66^eI>tJ75TEZ(7+h2Q z=RHP0C*?5Gg~N*Sqp0?_#gHU1NnUurr+FCPYj8 zLJA++zBBa$K^ZqWyfy79xJYOKM!H3GyL%NSXyOguy!}v^hlvnG|0U_Q4sA@gYiwq( zUq30tjnb|y2mxi$#9QRpzWtCKPh$J#9c;@xHJdzgQptNvDH2nWD)*lXztqks^F7+- z8*iK>$QrBzVi9Akkb}-gp#fu>TEIj&Dl6{F$+t^qN>?}eVzVAp zz*u~rd!W9-2ZfAGxu7lUObf+;nE+-1>=)8NhMO#V*RSJjV4~VV>ZK)pYxX)M2e=As5(cH{ zQkvE|)`}J*+ZT8B9|#Pc+#H`ONPpX%9zFrlAz@Ye3!5jQ7p*Y_nTP=t}dedAwJ({gKR&bxVtgXNA&c0n=Nlp{Jf@w{!nSh^F zWF`h{SES?LnU-?dO~xAIk$jHUT{j zA$a~)wb0cu+6P4Oc!dHNIccAPzSCm z@IVE@RCs4=^}oR~E}D~97?Txe%3)YV;&Xjvp?v)f6XaNEF9^I@pusUg2~<4e<9c`a zGy;2zPz%*k{Il)b*04P`v(5`_z;4=*(eQT{HWAr$xXL zhYqrGb&6uSuT_9m!p++>)b+5_PN#r|A)zddhLG%126p>MMDxtAs)S*3({at)a99NQ z_V?#lF*W3snnwIj@?4sU`XexbjO29W&rH1K$eownZn^L_jD=40cD5e%XU?SyZwobX zb*%g3gm+7IB~P5&nIM7yG1J)ZuZ`b{tIN*bcrnQ(@}ilFNj{Al*^L3P$*1Ktu+caT z_z{3Pa19);zI7-PR;@&y;N28e3*aIWor)dWRe zqG(8tiKWuaqhE>{DZ%o&m$T%W7O%YWc`={^YoVnvRrt1N{@Zt#+?>XU^WF)N3-e$@ zSpWBOF4UvbQ{+xUjST9hd5JXb{w~qK?*lR<`NZ5i8 zkN9?krN;GqSVz0}gNbE=j=rWZ03x6Y_-iH_+DD&OzdQujDLm;Ew@^+SWk)EwA~j@8 z^Al~ng%z5?70oTDZoQooW%`b_Bqp(xp3>v9GK0LY+o%xmic2Y0w)HW){teF9f5KIn z*Yoe7*%P|lzJc17$kPOsD+1(*JD>k@$#Y3MQbvL1@8$;W)$w>fe5K|R8RBHB55y5K zo92Agv#1z$C}{JW6>mA?qGe5B61)W#3b`-{GN1tA4AJZWfgx0!nt_2f@UCisOh9lE zSZNUDa|3@ds-N6c0Yf!@fNKtatyzH`4hFs1et-o=2FD!%hi+g7qXjVM68W9P?gupC zyV)``%piD5oNu<1voEEOPxPO z5?{dXfDWl<=4tZ9e)lH@!ocpd)M5_uZ9uj2`#S*%7#=kL{Igwzg{#FzI5%qCu<~z} zonM67dOBK&(RDo_73$~XFsRj!o{;X29HSEsL5TNko6$^G$PAcG*}2iiLd{Zn>h>pN zk3dqR#SH_iZ`jqdWShMFyNfs-!BNFFD!{QnCH$FygF~fbURNVflaPsdPaAVV z!uw+<&thk=9S1~~J8c{Jne9rTO9J2wX}tWr=pv;RfCL~!+;Ldom$~!?EwoetKX-pv zKt}@yXRKSY3Jcni+NYyvYP@_9(0gZ#)($W*o=|aN#jCfs)!I_U$k#$$nI=3VN>0{@ zPVa^g4VWv7tAVZ!AI8)&ZZJARf~CbCL+1R0upg2Aej1&>z5s#|6t928Svm z{+-DWShO@j*#hwaJEu$ShWZ;)^|&%sjaPG96~FXVBGZ4c&=Y9=C*Yg} zYb`d-E;cP(^Qx5w=t(|5UuyVtH%h?0&96le`uOj;eQ-nHCE%3>a@@#z102Zqje1l& z0wmzFc|wbWa+k@0Kxw?jN0`nzC3(b|Lny*m{*OW=?}o9qGCBRV7VbSrcYQ?zWekLK z`8j`{*C`~oeuQBHKIZI%Q9FC|M3xN@I~v!Jx$7LpdaQsuT>l}{5?I~M30$meu@38# zECY>Kk&?_$AT@L6ewJP^c`pvbnuAD*-FX}Joe$L~^cy-eEOzP`S-7XMV74F}Z}0_- zd=O^N#0MPP`w!4kg)?yKQE;~w%U+5r96B-$c(jda&;13tUJ{$!zbUJH6&(@mN6T%6 zzwLo3Z$iMzCrNm+x0ze9UrsVVCke;8wB(|I;405= z=6Lx~O3@MFq6)EVy{|027MCwyWW)753Tem4k;H?3QM2n0$XUUVk+IjzK2UKzux-`Cr3TH^htpIrujg34LDrd-hyXfo43Q>g%h1 z+KWhctg;0T82LscGr#Q*v`E$0JohC}O&qZZ0 zHW20W?(AuCFp`m*W`pJP=!8z5fij;1=_YV#m3RO2gv`!o zTyI~V5%Jrg-S1R-QJmMl(I~{~83xOBM#y51d#&y)?^m&dS-1E6#|4m|p93nQ zBa;t*A!8W-8zUSqJ{)_5<#~2TM!?g+!yyif2_c3shs@l#l(*JH(1nP3ji13vk)gva z`c>ud1H^-s;p_VK_xZk8Q7Zvj_=Ja>ourVl>jPIqJWt)C3eQi>*FQC1`o|dxN=wHu zlAo9upiU*EC`aTo(4Yw6$LV3DkiYS*`<(XB=a#J-b+d;Q4w28nfDS(d8!W?blO(tF zIpU;1J*@MtUd3hTEt`ZJV~-9ga^VGsZxt>>3wjOL5QhPC_Re)}H@-x4_Lb59LShSw zmW#{#nw*c=${Ej59^8W@wZrb`l$Ue=&M`pshTMMA>pu(AI|dGRM{Vt$lzw76C2EW- z6;(W(F2fAD^m?n6@tJCR`WI$F^)4)H&_#>M^}ba&Q!OrF-?3Ql=U24twb-cPn?=v@ zG?_7rhKI+EkHZDvP?0-R;W;1qKy$)>?*3WswY*$ifSDL0=qrHRIo(&u0Pr$2&1ch7 zCQRIUA@D8PO6M9cCd86e)KC9Y%nI7L#u<>JjnRItJS5*7kUawMCvSwHX<`}gx~PM8?> zhx?0aQz8#V&V(nh2B5FvfE^F+3s7s5zCO3E3TJ+3hagV_E|G&M5Kut4l~Igp{-NF19f}wWF{$_R+`+{VtiW;Zeou+R6jB_$zUkx}4#FM4h0}J_bhn z@GN?se0NhBpWW@nOK8`3VNghT0cnwy=a*Z|c{=qvf3; z92uYq!!}IbhHAj5VZsX>jVi+kL=%Is5dEr_V$wCUjEm>56*t?vH0`Iy&!w9a1+pO4 z21?5dHLvk0TWyAqRo;HKI&Y&ksjps#E!D$LS%RFbfcpyyOz z+Z&mz!9QeEBClRGSl+Va6=hk`h9I_NQ#CH(kJ9 z0im~HQBE6&-!5D4ER|n()eCNHuD?0Wj)!~orX!UyIxZtSq{+>AT>61HHFEQ18ce|9 z8PzCT9l9+0`-MfNOQ5IwPFV^=;a4uIP%U(wmi;^5kK&mS`Nj7%77`~s&x=fMt1}D1 zN7)c{zvm?*@==Uxp>20hmcQmBOp&YB9EhRF=qliedR;SpuHx#%ApHfP?NO*?+RTr5 zN93mbFW3tn`#> zEvn|ztouEk0*(Q+OwXgm`i6^x`C88(a->GV~w4zd*#Z|&! z+XDC2%VWxH&eS#0zB}pbbE&iHry{o1%}r8Y14`$@Ww;Y5nm@rlQ(9L8fimLR?)G09 zh{TDJbNyW@#Ip1O@uVc|03mm_M%t!s${O;jQnJN$!d_4m1GE1^V_PW@N&n2+pumeB z7sr(Md~MBhJ6w(daRbS}KgK@H&W5X+C{yaA_3J<{)y?sQzN$noGC5vQVwW9zzkp2} znGIy^NXS!~jU6Y#8x+(})W}6N0L#IM0q+qEP2NAUh7$!0MMe8FbeQ#6 z#s*1IiZY4lGG~jV1b#lQ7#*er5bBiZ$93`cSCqj9hJ$ua&WHj8BXx&IH?Q z#wQfyFadtT74prDy2=&Eg=8=|V(|H!odw007M!4o{VZq#?pzNqxIxbZPWjWno)0Hf zQb%W6?bYk>_(nWfw4XH@_tC?QE>bC}a6>==yHm13J9vZ^2(quLntA{j@9@?Ms&)N^)cX5Onb({Afz}2wu}-Lf1R&?~ zw;c)IdOF&+czjr@Jag^udNBLgTy8ABEOKwE5A=DF1BA2BSAcmqjdSH_ASBEX}tU z-pxCrpNa3s$R4Zs6p1~Z5HD06ni!cee&^2O11UnVC;F-r?{paYexJCpTow`uGudqf zX+;lI7}Mvkh#`pW|Ey9{`R>I3aq*9U2m`1|6MGx3UHDC?0B11Ktf8)X-rL$ zk}|{ZflKPa(D31x8uKQqcCYdC8vEpEEPE$%VG=1X5u`utfk>ZZiJo~Oo|Wkt?SJ}{ zcD|tt+{@k#Cl5_h_zVXCDnKzqlsaw%Qtz>cks&(H>Ru{YJ>wEWfgw zazBM;iY$In!o6q|I6dG&Ygpk|*j?IRX_3pvE95`L`{WFUN zrHxXJH-t>xxnE;OW?9y{)v7V3z9Q`+&@6cb7i_f0eWYojJ@0s2ZnChltE8!I=z~Kr z{ZdkieN5?&2R@wbqlSEbQMeLTVkPTg z_wi$OX{biOna_=W-~116fn~yyR-s&SC~5=mibw_*+ZfNIuU&5&?XEap{>}T~^|Rx# zqD}=`*@7JjDe3vea)hwve2Y><1b8-vZ{8`Y**r5%C>b8-b6s}7sW(3`R-%cqyX`O$ zJfpm`!u%NqSBH1DmZI@c+&TM$rF3P2YU4lm<+F~qOO}kAnvTDgluW34zZ7D*u^z0c zV@>{t<#pLhs~Ab}q!0{czb2y<73Q&q-Xy(h>Zvxjrp++mF3%BYe#JX9)~ZgYl%o6R za~|zBGY^mc;O|z&>sN}puR{G_ufiFP5qKv8(3c7cn9py&wjw0vwbcZ?+_=VEec8J|oE|`2ot?M;?SOo~<;6 zWkpX6*C7h~AS&$?wb49th!ihO>zL?yq;!1fQ74w++IEnOtPt#1?;(~9P0S(9ljQgI zv%x#uI9{}P?hz@n#>+*X!2C!^U$&hR2SlbAlTVeSrz4|O6g2HAK2G9;eQYg!fVb7) zxj1c$sE#cF$(3!59yYhw3RWCJ@AS^CY@`LOFPo>HA*xKzD46hlN&I`pmyx}6i|zUE zB<}G zM()Aa)LFQPz282;TR`&Zm_j6^=TP0={d_&Keu$4J+wsJl!9X4r^ zbjX&#$u;7sjb{`bQV%&oTtguY5BcoA-9=|vVdC#$*e~1|&!cW>W$&{m9?zcUmsSO_ z`AcUP~-B8GLrMVbb&5;9$ZO^1(Bz@s$i=hA9OMI@^iR2~oe_r>4w}c+})-*}jouH~l{WLpTD)%ks$`ql7L%|N= zi%!HmxHxFhHcfu83z&}w+gYk*z1|1m&^X|e$=aG>aY$ENvh085Av1K@e4){&ZV;VWLEOrjM0zHvdiLVH6{iCmW4eVm9w*+vw@`T ziu5tgVU3>F49(#rAKS;@K*s~-sNE4}o2WPk>r|tmfFPINJsP3?^;6y;4nJ4+U_%2QI-9 zYV2lv9cLD*%puz&abQ`G_{{KpWnuZZab*23NM>=DFaTmiun)i(f0|7mAEsDldmJzC z{&hSi;YBoQOrt#W4u$yy%2UnxL)?i%7EF001MixI&=DiSGg9f1c5Ww9L9JPYtKiL0 zhm;f&)Lop94OKyj7Al}b{p@NBCuG9D^>8@<^<{AF=0xE^Wz^q%ujyMkHUoIYcWU!1 z-&0Mp|3s21oJtrsDjoZA)waG1?44Xa8z{{V67yGY8Q@irtQ(y^v`(MmGC6lw8?id8 zGs(?=evx=SaT*Ee=23Df#n+&Rr|)#wda`-e8f^xR#yc_!S)PHiCuVF+n`!H=(qKH7 zfNfdpiLM~sP#@jP5QU3B8?xu(`ENeH_x5C(eSIj0vU(s>T3?%`=Pw_-BDeMU@T>xU zt<4r56%C^`IWe1lQ!Db&XlH2&2MI{|)USE!T+c&MS$Syxmz+a2PdFjpzFElt+t)F-;ys2Ae% zHB%kTq=^I$8d>iJ_>~vBvI_hEijk%JPxOd|+yi^1t;H+*KW~L)mF~Y=q$FGp6GqSV zpQT1NKKz_h)H^;Opvzghr&@JW_chvYM`5J8T5mOd=1yVzJT$Js5InB8MVW6$3>q%)wiHpX#Pa zVAT!8YjjTj&=-3}UUw$(H4CsOlF@bLXtS!;f09?ekGi%j|I{0{7hR=TLbs6qlFyF2 zWt(vskv;Pckg8v{{s44jI2FeF3AVg1Ut`~=*XP)p_Z^g--V;A!hlYeIA&oxoj;RD= z3vkJ2jb>`k3Rn7v(j8*G`GvP*OG!z(L*>84*fNDfwWIex_(-L`Tp}itug)@#mZdu; z<->%KIDEI=O(2`-y}qfSiBzC?W*dXAehxh(`_{QlxuDt1+PuvgcyDo$wYkG(isA;w)BO_}c zp$H-Dhl!~RlCE#8_u4*p|A4}6!zPM^t^uX-JzIR(F)NoUYN>(DxrtWd%YYPf{7Ctk z*uCk_rfj4l5>OLbg?K(#HD8NYypBY=sSP|V%MOgyZ!T2%jsV&K#Kut~37*ngSc*%`Uss7)nO3Elg zNl0YNPV_|*LRQzzUKx?S_s%AJg>2U*BU^U%mc7Z|+3xSTzyEsaUiZ59{dt~q&U2pg z3B5w2>fYq~lP{tW5b{pZk#tg-RYWaI^8NXT$1|{)tP;RqZ|w~o(c3(3j$wg}E(d2+ zL8(~pNEhRc?t-Jk29t1h&r^YADmd)UPiN_$drhn}*%hh1b=6=A*KpdMJJZLKP7t*_ z;|g^vAxh~N2TblmZQ$SxCu{g=ShUUGfiP!fwto0X0}rfU)*j1K&Grxhg@F}2AJ>^L z_oHHo!51SXbH=6X^p9k=bv5)c5M}?cma#>2c~r{^Li*AY2B@;4CPW`kSAU64x`AJa zD;I%w!m88@MRlP*o~k3_gw*JaEMB1QG)X#5I46o!UC1hR6G?l|#F)dk5v)k*pR+Tx zY%OZ|t8!Uwe1b#oNa@~@Yqf5@!>wAD*`|pYdu7vmilc(g?w%in+)dm}$bca!5?f7| z7>A1o9^;zJS_-iyUrRj^vmwChUtd;GR{H*R?6TbIw1DB({%YL@Y9ksg&?)_^7nofx>&h_H1%HvjjF=q0%dpk zkJZ&K?CwlA=(^`7P1SaB&Do4+@#0^^Hg<%98fv{T_X>>(0o{4khq$xTH<09$l-$YjY2g zrI7n;Nq@r;7&7qf;jRtdQg?bN2SoQ~ZvjdZ*P#|?l;%fKqZRDsmTL*4TOwQy8}~~Wb62_+N!L)iYC)D zDQWJSF_x!mgDQ6UGU!*D`^&pjUY_=)H>t~zk(rf-pH)c2QX;muSkIPvnN}22%sx#B zNsRal)B?=Lbky}Vaqi~}q;~o5GRoLfJj6ZIGUd4EHrFI;KoUKI?=19T*eB*|1PtpN zsOr{h^BhMfq1u=;RkH*xZ=RlB?pErm)Me$q`?h?`b467{Mab0l{$tP7LsBl%JJQm? z62Ai2fF_AhM7&kZOn9Jns_ORo_GO#2u&{7s>d*>WgN3Jz7%yUbtmnSVW$HvCb2ADm z1#i&z5?}nG>xF+e#LY_86d-en`}zi^gWyRJC?x_}FTYR^4K2o z;#A8BbFcrJuXRay<2EX3d%)s%i-&dKy8>ax1G-25xjwG!O&Vw_ATV`=K9rh9xJj@(UX6Z^ymhLgBaJ zHfztOzl1{Mjkj>ktG5WPu=GR{zz^V`hPB%Wmjj%T+_xEWcfhH8;Jg(%5*_o7xiW*4|!LfvS z7Y~PdYpwL82y-VsNdt3l6O_RImf+LG%7C2BbXu-f*TKpCJHf&6m5wzGv8cVlaq4wv zH8<R zOYxsV3{YXb1FCMyA)`*NnrB|Cpuf>@ads1ZQIXYc3=!M402O9tD4Ou|de72@GiN~%%oMHr*_gHW*K_8&8-RFDu$Y2&1j&(Ku)vn3 zn@61?Y?wcs)B~6>FzhK(f$1F~*+WvIJc9#FQQMY@nZ1$n!G0RS16r+1y&G_Fmxk^i z7`?~+R#`@Jmi@sDcA0{c>wJn{&4}An*8k!CFNp2zm;CD7(n?P_8|H0Mx4u>&_L zGE9_xe=%8hjmr)Po{(OU?(JwoR`N|jQ@w)^cb5L?5r-#&0?zhQ|903Kw=uQmuleAl zN^-Eh6<)IP2g3U#<#WH;M@fHh8HzvR(daj7cb9zPhyxlskzXWge?KG~NeW6M0t`ZP zzkd{)Z}g6*)Hja~+{A!QY2>%w9l$QHY9$BAE7{U^s{f{MUsM+zg__XxO~Z#dSNF zu;Lcq*s}+{T9>TW2e@fSBtk(|%6|n&jOXlZv6_XO z;ilms&;;;9k-p?YbF6d&wl)Yx0NzI&=rk~^k|~!O)rEY<-1=+8d%!xDdT2!Nq$bD$ zA|ulBeVnS)T|VYKdIUZ>_?xshhGRIaW2xXFe-3W~Bal;33Vg##;+G5v`wq^{`-vSJJt7M3#Gk0_DJOXUGw=FWu+^{ET*-7tRx)UCV{lZ`JREXTUv7x!hfH(MZj zatio`t%AHqjxw&CaFXvJsrMJ%{E#FL$U?u>w*{YouC8ISK3c}rum8IOPBON^ z19wx?0tPleXs!{gNjiUrt1gPq^@On3w@ph3P4rFLH}9kbmX}Lg(+9l4B@FP%%A(sd zCwM;v)v#q^BFiyS)Z};Na$;Pi?yndM>h(!}^U|Mv4r=vqh2U0f5+i0;9OXsyTPuNp zlK!yhlDXGvs=_NR5@6oL^IUg+R72NvtGR{LJZJIji`d@Zf3{e`DZQ1Gm4w5uV)$bF z20ADH6%`a*Gcqz}->Q=)pE$q%H0rw=O>rWfNzy@S$f$3xE8{8pjY?MF^sBV!4Rk_9s+z zov?>Tnd!rHkuhB+D@sKT~Q|cw`XKF6nDM2+6gb|1wP2V z>aN!rI=ggcSE6~H&lVPz(Xtkt4D6ngwCiR1)p&`oD8oDm;A8-;T0D^6fu$ecpa}*3 zQWLg9l$+OJ+I8UZq_6a-%&vrBup+Oj@MI~kfR$p3KVW?@GI7<7h}-6Ex4IAHc)ijI zH>PjBUuO9rpOr#GAmH8K)-Bv@#?CGwrV;I>d{Nj#T_j=s-cm=Vq`mm$r0u1ngEe3+ zxa`GcU4uisiRLY*F&lTE-Ir!DU9v52IsA)ixO9jb=_{eH~*|y{G2+^_8&%>Ek zfJXQ(VMjjWLARihaRf70a?6keo1-0DEC+=v7Hq%aYYqmT*}oF71Sm3O| zkFr)1ASWv;C^N|*Q1PuQ&VAZeups6kQoc5rY{`{s@uPQD&#EVQ7?fa;0+bbJCr&XS zjpM8zfbM;HuP$LJdAcKWpDl~mXhMt@77#C5{LGBP%im;37XBb!Zc zg{8gmkI!B}p3&kalS@~5dH5RcDW~fVC|JaK6brK|yN|)(U;ATD07e^(EZt(csR4!c z#g4-RBf?@?k_gSarr$J3Q-0z=s!m(4Rw%>)qUpTz>*?hF@HHs9=?rYQOq}WIo@s_a z!eIL9v)1t;<;(2|{{ll8#ApayDmO`yviYwKz#b6J-L0!zU)r)jtGQ&Xx)5wt`%(6( z`8Va=e)kJJ88;LyAu=lBx)8oI=U_;#2CEH^X-p`+3puupnQRX;~%^eP^E9O&p9++@?ZGop&?8- z=PUa+NlZiy#MVEaQ-M^_nfTJ^t$`GPzfQeLk_$YR)^WV86U z`)i;lvg0JVth6GNoj!;nk0cV#!dA@@70lyc7}5sgx|dK%=Pm!P3yHYk=YQU6ah)7m zssX(E^?Z!&-lQQxn3>k%iLx^S`Dl3kr<3~mB_`ne<#P&3ozZtE&rs3v{f+-hT8>D& z>DMPz<>eOzM@DBJfKTDs)LCbs)#A4R-SQLDz3TFhph#xDj1=+ot6YIPC~itn2=(XS z;&;^jOOxiEu>uA)T@6O)a|2?|S7rD0!|p8>mzg!kQWol+bt;#aH%tYV+LGNeW@7&N zJsDY4kh|20)LVERkrneo=J6{uVI{z;o#d@aV~OOjnNWXT?xUj&@*`R`0f2N%89#hw z!ekf|=w$!ks7}XlmC;6rPnA52DVA)KHxyDkRx{9T@4+ug;&<^$k&S=4Vq#>>`Egy{ z=3_M))~WJo+zM+NA0h$j1M-Ehlq^c|s?4$D@DP1~f3Kmd@;cFzCD~+Om@!F9OT%0P zabvP`G*l?k;95VjPusJjF!h>8je9YBOnhQbMy5&CzjN%seJi5^yC-H6WhW(BIk8W} z#dmSc#7u2zV@x+4vy`y&3vxdW4wn10v{;_?k0~fdA+(g+{o{jn%}GL_AG4*r(gBqk z#QDaV);m0cp8uUsrWUnoocOB*ocM~)FU?E;3(DTqY``;QyB1z`dXsPh5}85XOUsA@ zCjGYeT?;+r9I|OyacLHtOv}Ms)W-$&q)E5NVrA7FIA%s+b;3O^qCM>USjqc8v`S63 z2+1d^^=3yY!aTIm58M8WZ=C%V=S$xQf6$FUJ11UVM)OhV?r+?*8K^k+)OlGg&T^T$ zNMGn(1NCXD-a_?{oOolAhBM4wjr2{Kb7@|1b6=M0`IV0-Laj;7ENDhj*28f&fyTrX zv$CbG4u+e1jMAs$Y%ttv8XXXQew!qDD*)ibP}_Jk=;z`6h`1yPY5kjU(Tg6+!y;`V zw`5138{><=A~*_WFBJ7N|5VzNkYq9NBx-ELL?rHAR}&)vGQDJo-P#7g2cWZs#Sy^+ zgC0W2`}|X9M*5Pp55CzqDq6D1s^i6gF-jM%!|_2!5w)+2pdVDDb2GkA?$dPJHAP|X z+x}pHX6)^2MQp8qh>8_%*SvwQ(nw(~s-l8c`sZ@P9q=U^Stgi|be0mj%~U3Vf?VY~ z|2!R>*-pct{@m?Q_qtdJdOYfTu3E;+Qdlseq^x7`sfQ0& z$zm@32rq#j7di!Fk9Rpw(ZV_rnxcpA39xf=(Jybazz8knqT7al1Z%#e4$BgBB-W&p z_==e;-TIQMo1cE$kN?oQ`Espq_YM(Wlb$pF%JA{6pSxYMAhrjcW<7|3w_$L6re7;1 z`Kv*r%s;vJ;*iBK?8+lOF}qkoF})?YjM%P7i!}%5tt}16il~qvDFTMoDSqQv1!^8fv z;+P5SbZeqGz#9<}8xKo6;_c3RZfzLG;~U7q zKmeP757~u^+cx=>2&_iJ*KoFOA2k7LD6U*97?H|F71jD|&d4&4=Muk=MD)7952KNKp8)O|wIxj^BEA>$&^BgQ3VB^XS! z?AntMkWXWii5ZqAXP1~RzsaZYv2@<~YIou*W_giU2l}VHl6uE3Dei6K*#J<)mJDjO zC(jRHh|~{i>QYM+sPh1Uqyn8X=TJrAmXlG#AQVn{Hy-eG>smlC4b<{2tB-r=qGdA!9AU?VS6K_4n z$Y#>h%HjaQe!W~^R5IN}78DXED&5zo1)rU&%4FbfHT<`0qB7bp1R4Xt*ag^Ks3mqZ zWdVZ(0LUMPmsYk{Oqv<|8PVk|oo7x6(URQS;OYe9{E0uXb45E*gnk!r9s9cYz8RLt zLo#G%<-Q@1>x2xcgjNvpt>-8=B)}koc^8Vx$5+lxL$~bx{|!g5j&i?<;@rS_*GEEDHn@{O%s_$(9@=+QNqp)wt-ig$=N zmwb$QV_NwgHn|9n7hK9FvgoW%VEIrq+D4Hqkuf+%=AHX@;56+~FH?cho;Rm_Y*T%T z9l_VAHp#~cvh=kc7BxTcDS)H`ev(FnDTCR@l2?_Y3FvsugQKC0T|Bo>C4JqG!5~#; zV`H&LIQ6JtE2$XJ;n0#ZH4|KN1`83~WtMid8;*|>R8`Ze%{N}$g)Q4aQ>W;64pE_6 zWr05gUE4R0D1*LL#Jmma;wi{Ceg_f#FQTv#tKhPhranRMj5e zMZrPq7Kg%=)9AoKLV&k2YUb`GDn}r*Xt~y2lT3VZ;)ByR4bFsxUm=pjD+XLv256B- z_bRfcl6N=k=);HcIm&TQ`B_S^&gr00sG9*+vmt8>JkYBp=?WIuAAc{eD1k7u z3+m)?H>MjNZi=|aMG|hahX-@^m;0?U;A*JnAUdmH|M9u!qGxiTe^>;@^g~k;3wj%- z5OdktR8XUtnqL(;OTcrf2VTcwqYbn0%6~h?`X~i8HFm{sUmVl`vZ)--Zv&_l9YPhn zEt68l$Ay~>^nGabUG&4=8IA`3)cw3;cSiGq_}Opp;?SWjHX9!U+6lykDky7VLtpZb z+qjny=qLm>X}?)u($QJ60%js5uI}p@&M`x^^^o@y9R{G!R`4;w022Kl6`}0LRQ!)H zNrd~pvwx9E!fk8};MxNmSDzaGwdiqAfB*2ui?nDkF@YtT=26i$#lgBucTMRjDe=^0P(p%KET5uzY`JVoBYPh$g6>~vp3rM;X_h+C54ueq4rM-$dmo% za$Pr94GL~!-MTldtJ~4Iuo4Rc+otG9F)-b`T<&2t@zM5ow#9({mOF9^Wp`UsAgm<5 z%0a`&WT>N+NU+ZGQuPr_we_eJ<)wT5Q%(Fk($Zz+wmFbLPBYT~S}cp1(-OmyVJ+-7 zB+`8NIOpH4IYe;M5K8)x6eZvKJ+po0pED|l1*2)Pre5<3i%k`tu{#@uqe=+n^V#`k z7f{!i5LoZ$M}3DN z;hP$4ZUAP1mGH|{d;ZAAKeBoWiV5(!1E~0Rtc5W7LMySuY4=-C9pltgfPcZ8e+?t# z+6pX+cvcWbsJ9;YL@0&n?Cdrdy8CA`##cw9b{1r}tl@?%BhTWVK#HA+1Peh{Fy9e{ z7bq8yy@!|dDvbU(;&xylEe%~L2+D0N4q>Zd+l$*IB29CMkFTWlCpz&v-1dmOUfAKq z|K}$rF&0<8O$pKgdXqn{s_Uoy(e)prm);RgE`Zd*tm8>$=%(L$CJQ0wBALc>)7+Gn zYb|}h|PBIt%K}-+kSEIfq;J@z3Y3pOBAnnT=M0>X!u@FcH&z0WBS7||Ev&e zHNcfpXdzXc209J<)@6@K%kg)l1i^=dpAI3_*vBNH)!70+g+Yo^yssZcyacQ{DTv;U zZt?e1gg)be3KK||x}Rs>#l1M#Uj(NT;KVrydInzuEcKubh7*uzMLr#{l&I{#IT5J^ zh9AhR)pf>SXp7eh*b?vuqh_kPkqBBqf+}U{>SwWcqGMxYyT+l*zZynCtz&SkWceh9d6ukb0yQ;HEj#5qj<&!aIZ2#a?cAmr~GG&K7-uS6lHvhj< zH}tHn2jwZlT^2dRA`635lK_@Z{f8ox4w1Hb%#P=%K>-8UvA&CUVDCeV7aas9Cf4(R z!r2S<#?=RcN{u(YT_~s$jPs zkjZ?Rz)@QuuLe#Y@hWTisfVf)6FT}Pvim*E3mkg#)(}Mh({{eBcs@TC9dK*zK+Mzo zO+-@74=eM!Gz$v=7OUl94unu0n7RILyH=fa$xE3=YWq)^lV{WE(k_6UPpmz-Sj~4hca%-jd+Z%I2GXxz)93{dXy15vFVK@US zNQ)j+S8#5DyPQeWZwxJ2Eai>!@^a~oJlLyEToh!T_3${C1&!36HOch`9g2bl7igy^ zf`bN+^gyZXAF2#{BE))8{Ek{j+;a5fKqr4u9*3e_o!21n<@ zHg1>n=<)N3gO`_Aab+bcC213-Ma{>T$Y;O3J89lf7b0(gHc|)FX?j5I~wo(o}hBh{+ zPSY3jME)=y-O}}V{{-Xfp8drLmDr!QDJ<6Og3m8?IIaY*f;a`V`cW%ze>n^ZQ5liK IH`-qR15%dt8~^|S literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Back Red 1.png b/examples/resource-bar/assets/Playing Card_Back Red 1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c904df93d92bfa28528832b465741f1f11667f8 GIT binary patch literal 24606 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 02.png b/examples/resource-bar/assets/Playing Card_Clubs 02.png new file mode 100644 index 0000000000000000000000000000000000000000..0be3cf9af8751ac7fc5dba4a7ec9c8ac3955d513 GIT binary patch literal 3650 zcmc&%2|H9_8=kVumZq^4B8;UOOGFacw;4+sTVf0`A;VZpwqzGtP{xu8*@d$2nTe5Y z8p34FQnrySA-?l{f8smW^`7@S=RDVYJ?DPz=f2-J!4hf2%_+{m(w3QY6aH>)D7{_9V_=ow0exMh1W7D-20A>| z!4H}R-BkxmurEY_2AC9?Jl|sXwRxmGUyGW60zl!+I?sRnv0-s(%Mm5Un4BDfGszU= zo0w*%yI)&gMm#QnYDFHO9Ewz=(V6%RsR6t!ktZ!VTo%4rzkmPUuEvey&x6+5^M_u$q6x-qnU|~H)D-_OjMCgEb#L3 zDxO%v8Xyqd2&=Dlemrs@LBm}c;xIdL7;0c4ove5J_Bm?seH@?6)vFU&bw-;h_>(-4j+He2+O~e_8s0u|8ZfDj0;>C+I>))GO2-)j6$PzL2x~o*bA_9R3 zS*fURP}2jYqSpp;G=uVJ>KA*3mI(cRC`1ew8_hk;}(*hL11uRvBu1VS9U< zL)8q3Pno%wSs!^#V%+IkoZtZjw)f zspqD436xBDx98<9*Z1ZQs0!4U&s~S^mE3NFtatCAU@(}0y*truPms5*tcH+W6!S|< zIcx8JnOmR-#BEjYe7Q3Hje|JsIWs>$ZwV6@2f4euGj?_$i?f#v8TbKGiink+9W)l+ z0zk67x~gwv#CDR239TrYZ(UOKRYoc8hek25;-L2Nq47kmM=JPBWDyn&fpkqyiX;iZ z4e#BPb9HsiANB+wNQjC$VKNa2iGIj)=8Er>zMfw9=OqpNV*C{8F&l4MR#tpzsT|46 zz`$T{lPu=<>#J;k_7#giJ2_F5O1^XIxJaw4;efzE^w#1R8(0UqulS`;Lym3M7qq#+_Sm8{e6Eq?T0(w3D?pg1KkseXXUFO?%qcR>gwq=s;OKs z%TSoLnYv{=5Smcy+QTUuhDO-g2^JI-*m2tmr?B?+_97XkVfvv1LV|)i7>r~&NxPz6ya*1 zX*?FBV`9S5cC_!+8I%Q;lY7?x(T<(pgOn^}DfcpYtgEXlCW|yQ#5WbTg}9+6Evcy~ zqLz&qQHv4Z(^y)_bPoEQl#*hA!&Qqn=j7xpZ)^y-VU&Sl;5O$BOeXnG!u?E5P4lTg z^HF7fbDuckR(yPXEK6*Leg>!qEc3z14vvnYwE0AWEw8#op#?!bs;;gsebD?MzXBx> z>TrE8E+fOHa<{+3tE!b$a^9mgQKDy1$hEU^2`nIhzyD)CReSL^*&goK``2A*V2;tq zOK%EH!k-rt6DxOW&cJKIfL_JjDaK0^dS~QoA zlR7)o`PdkN_&~8RHtzW7GpS<*#+h{bldRa|_)5A1pyLm# z#KeSW4$`AOfC}(?SRzjH!-o&a6cwXX(ZJWduHyT@5dgVrYHEP)e_UOy7!w<-TQw#r zDaj;bkqdTxeYW0rnzT~YJ`mzV$+*NLvg*WrLt99}p^m-SA`e0lK>pd@Mgsut0Td9d z0?5?zXT@{QfLkfdv1K7#;V%*q!ukZ>013z+|4H$^t{!w(}Crc)X}A5>Jya%zYO8 zKTLj&0zt=n^Z(=3X3Ec5?N`6U9zAk`DK}FR=GWJs!rKq|LqkK$d9y?2Q?4*N*~E-j zU+p!}s}~m+W9jtU0H4Jb6>(iPckbNTn~f8*w6S3Z8hA+^Dgl!jP(-8Aim%M)d2X2& z@)s5sB9rVD)z#y_WM9FImfHvQ0$QpWwAwK0x`)}#GQ@ljR0rB#9Hx7 zNKNhETU+)t_e9|ZEgxRI0HcPv#{C!jg=}nWTo(IZ8Jn5u0h;jO!2>>i{%F9b(1W>Jf`F#E zx=Jh=r`D`%j8!=o1KuY1Fs`Z!?qqLo(!T$zEa`(@Ch zwaNOyb#s;!Lp|;7uQxA)u8NCC1_cM#dp(?Pdz2h>QG=pm3Ye*p_U5NEXL3#QEuqUS zry$=JupcH&29*K9EIv3mVEG&T_qV&l8%x|(y&EMqBj3M&=lQ758!Mv; z7>eYD@5_Sn3ktemBsB&j*Y5W1{>Hcy%Ig}ZPoHKm7-@Cf78VxQw)#~H#zi)&FSeym zyURa~i(~W0BAc5gil?GCxJWfrJ@9_s;Z{mQYekr}-x!i-{ZbMitsRGLdp=I+FMd6rK`1r*OLNQMom_SB>{0c zuNKO1iuE_~1GyX@{j;lf>5Or|EX;lVV71n7a4l^4WltGJs01famle7OO>|rPDg*?XxSRj1k6AX;BQ&ZFG)LG#qRGERbHNX6% zo86huuT{MmG+XDC)rME>6{u6sdt;WDJy9PM)FrCJ|2+VHz`KjKfkp#~kS1V4qxuq3 zQY;rPTxba0lAhn5nQ@7UiNV$UWbNS8(IWWGlejNjM|yFwGHo<*O*h{Z=) z0q%P~fvS>d$O&S}=kMqnwuL4}1A-S2P&f0hjoIivy&-CG@h(tEC61fi;<*J_VX(o^ z6Ndtkq@Q>AN&dV#f(WV>Cnz7=#MVJ-hw~Nj$VdKZ-wpxit!`8nvRSh5+~76lzjTX< z{agi`YETPN^nRf^E8i(`ejR2*EwWXNb#P*Kt$A~i=h0y31A z4h3c80Fe#}zt=s_-F@~xyJz>D^MC)pa~EfNU7wwWp9KPeup1ia+yG}caKtk~!Fx@H zc|JJNW3>&>OCkT%05c zXW49$RF%#@syrG@xRa!l#51T}`cB2;=7%#shPAJ-c`2VCA0C%7H#dE9+mfd-a{RUM z`CFv;s2dF2yNwUm%Uy%rCSGN|a@E^SH4f~{L@hp&U+n3@W@D41Pe+{?h;cAS{s(zS z8%vuD6~=QCskEkaTBo!ae~RCcgNn3=Kul>Q7_>6+pHePB9w5TDIT6e)&NRHJv=kVm zGvc)YlgJYTu}4cjcSL`>kV2utiKhc@(rU5%l!+WaL4n}!OmdRHd@)EA(tL2*JG`n6 zy9krBuaCwq_O&`Hq~9h&PBTJ&x0ZxTJ~s+j=;5P8KkVx6jx)+9EK^SCAb-DUnn^u> zwz;|4S{-VD*`VlN@E%vdVglYmrq_OCQz(?v0$zikP&2RIznAFAQX5l8X|o7_SI^`8 z%*n^+k4n) zec2lK-I<5**9$&PR(ZX$n57R2^hy!ZR6&^-7_`K5OB)Xw85xo8@A($*A>ZJq)PxLmFm&BJJ-pX>L)0^Ju~;};@uuzB^4F^{;kbTlJ~>~ zx%hXFTOC_=R>sV1ZCN!nHNlT)$?-f?;+cJs`tl{dwiY?NalH3q%ZW#pNo2esSY9uQ z|FK~zLgc^y7>3?m!!sRJyFMtk^9Tgl02)alN zC7N6X@|v5Q%dM^Dou8jKEi}hDirm*(5g9LYX3SSOu8TNSK_ARLlC{pbKYc_1w5X9*AbAWSI%3${M~W>&d*!)S z!xrAYdpF48{wapNF@&+Pv5|LPNFz*XQ3Xlckb^2LEL`8-ZhtOqDe*!2xlzJpBr)Xh zSB;O`vVKTN?Jr~6=n>Xd3OS)HWaAFe`^`0XcZu_&qGtB?J{Nz-o)LYLp1uSruElen zx@>DJ05nen87eUO{N60DR$?@oN8TZ~y85iLva+ev^YP{gwT0dcJXmB4xvi%MwXv}= z1+7Wa6Rpn;PvxCjUG>((G;?!vw}1QgE#%|NmpqcPvhzwWkmBNa2`-idN543owh&mN zQT}=T6v6pnwA`1zzIWwg4>0xh^|3b!DI!vP^xYFGD+^RPC` z2yP)5H92Xcq^fHBcJH33_r%ACnlK@BPd!{JARxeh{pV$et_2ngO5^UNR~j{-4*uxT zBky=U6O&V;A8z*-vDubbS3u=&H_uhUR7f13$HsVoL@EqSjEu^q;P#-A$<@^=7Ovxj zrlxcE?%it~ZH0DFPHU4Q4ue9%!rG>$vdRxH1+DVh+1sDt<#i9P38W7G*RbXs|D=gA zk=)tWrw0lms1ZgFNpnV+WUJGN(6h6%hx|R>!z>R=cEp$&$NhYKl2@&bD?=Xc{&Kd9 z)1V7Te%-EYHER~=D3h$w|LAb<_r+$n?WKXn`$E7`a?PbeOL6Rp7c4EDh^DK05NJv@^Gwl)0?h zZtd>IIDF8@U=&|xWGLQSHs|8zp4s1+g+$&ews6{7=&cRgkwO@!NAB;3*gWhUjg5`f zx^;^?0E;!VwvLmwBsw1LZ=|dE@N;l*&=Oy=rD^8VQ`2Kq8&Klm!d^J^k3G zv}3sN=F{wK7~oQaPk>lSxL3jTtn;G!$x4_hU3ICtnhW2* z*SdQbVJ^iDvQflPbQ1ZMS%f0C&xo%H*s6!Dw=Aa*ERPhICM(A=SX_aYm6g3ODx!3q z)vK(oK95EV?(FQOjr~1X6q2zbLEQQ>FB=%d;!0q@cFhw; zi!%`W4@vd)m*y51XO9lH#w*-T$;!8MBnb>mOvF{V_4Ct-km-wgY4vkQJmY{y$=~6x zjPGKL@a9s=s8cW)f=njkjzz6oLfIaPTGap-g0Vx9U5}pda(7&#P@sc zqtLAdCt!D(lbwuFXBWS|x$@Pssxhqzuegca=hwVU(THDR*pJl7MGmd0nC{c z{M#Yn00mka8y{b8rCU@|!ls`LZ(W_JFtf5^YH~=qzqiJ>xae~Cu1!x2r&QElDZ7rY zE34t3Vze--y1`R zT3=xB66AyVm$wzb?l8BofTe#ZEMx{S0(UC}cj2pHI(giZxw{+0%LWbKn+k?3_4j*t zdU8xreh@f6fBNKX`ho~&)0rq`=gy=s@fILyJ0z1M&rGql0yt~{;CHE(H$N;K1Tdm+ zs^;eg7m>*fj4*f$7+-v_*QjU1v;hPd?POHH3$UN6<04uyK$Ox{!&&LV>$fRaNn-`oal$d5X>* zY+?w+d12ue7x^2njALB8U(Ae_+9Dqu)sn-!Iy*a`7}c#Pb#-<5|Jn9PT~wE}cGij=jnzNxpfX7K)=u;E~r03{=W1XP62A@cYvCm{rmi|BrK$k|NzNe7<% z$;pWd-3ShcyEfQ^n=XXq-!KF)Y41WeIrvowZhh+QO;UewG)|BiV6S#{arp^upKd{s zm#r2v8)Nu7^s5?oZ*Q+vl_$6Kp*Op=>A(HxHAWohlD5KRqa)%oGvN*^U;6vql-)j0 zlcehRm@P6vFA}H%;VpNqPZ(Iw3L}x}0~&^gh7_L9lbcWMhK7e-_L_)9;y-9SOHEY_ z+jggCV6bjvsIRRR789cv5fS;))1xFu(PwOJHZsXXnsM#y|M^46&4oaAVyN;CjV%Lt z`oC=4%t^B1>gsS1s&RCNLWv@g6#BZ<0_K=p!+d>-_VdgZa7#@b%sV{-8%yPBFM|ZM=-m z$Hxbu9~Sl}a?k2Y8U-}v4tU0>+$Q7`MrCGE zQ=!@f&>|l`6biKutl8|=t;YZmAYFGQ{%AZN%kOmMB`c3yI=un{foS{jLkK86v74g` z89@()!faR-g+|ofP`1vA+wBb_(vcclo?5`-Dg2ovzLSSrzQg6TEW4p*_sc1 z)gK;g{#SaKDXZUtw1s_M{a!aTr^ZNn_@xbm2igV(?7mvWFCZ{5KJKpkQTt796K!0D zt#c+?+#{Ws=}tqcqf zYKKns_orYQw-q4vki@*p-h?&$CC{qYyYH?pd~XQuSEtr-MRxjP?@WbXUtQV>+j`3{ z2}vD(_Kd@>*1y$B4@J$A2-=)8+?u<31M>G*4yZkDZqB7)LG6-L-|vrqli$7-E7BE{ z5?hLJR$~>e{>xox9{=j1+j%J|7UzycOk)0(STIRm`7o9T#wIEL0$Q!i=+m@uIvh;7 z&=w}VEww$<4bsLWqM8rUVya_y+>gS`0rQBZ+sq8H}odXQI>FzX_hxaAm_ zNw=#t)Rzmphog*RW)281)Nb{}W PKL?1R?sXlawqw-)eaA`0 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 04.png b/examples/resource-bar/assets/Playing Card_Clubs 04.png new file mode 100644 index 0000000000000000000000000000000000000000..990ce0705f5e233b95c53c09a6c5dc8d3d582383 GIT binary patch literal 4198 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 07.png b/examples/resource-bar/assets/Playing Card_Clubs 07.png new file mode 100644 index 0000000000000000000000000000000000000000..d0105853bdc2fd9257c1a2df0c4fbb2beefdc8dc GIT binary patch literal 5574 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 Uio1^*oVh}j71ZS`WZwk;4^qVFX#fBK literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 08.png b/examples/resource-bar/assets/Playing Card_Clubs 08.png new file mode 100644 index 0000000000000000000000000000000000000000..4b113cf35cdad581baf146add363195cdb755fb7 GIT binary patch literal 6176 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 J)$*2a{|Crl1nd9+ literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 09.png b/examples/resource-bar/assets/Playing Card_Clubs 09.png new file mode 100644 index 0000000000000000000000000000000000000000..30ae1db2b730f30fec600913b3b969874fa7cd38 GIT binary patch literal 6423 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 F{{S%Di;(~T literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 10.png b/examples/resource-bar/assets/Playing Card_Clubs 10.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8e005a5c33666ad46d024fd3fe377b77335be2 GIT binary patch literal 6689 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Clubs K.png b/examples/resource-bar/assets/Playing Card_Clubs K.png new file mode 100644 index 0000000000000000000000000000000000000000..5c17db37cbae39cb181e448d1c568e7b6a9deff2 GIT binary patch literal 6073 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 02.png b/examples/resource-bar/assets/Playing Card_Diamond 02.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c65a0b9a9abdfa8030ad09808eccacd333f489 GIT binary patch literal 3231 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 Z{vVY&ldTH_m?r=L002ovPDHLkV1jk(N1y-z literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 04.png b/examples/resource-bar/assets/Playing Card_Diamond 04.png new file mode 100644 index 0000000000000000000000000000000000000000..210b18a04d180cb281699b1776a163c94b9ad9f2 GIT binary patch literal 3639 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 IM6N<$g1R|AKmY&$ literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 06.png b/examples/resource-bar/assets/Playing Card_Diamond 06.png new file mode 100644 index 0000000000000000000000000000000000000000..6840e3733eadfcb1528cf5670859681d2de8d150 GIT binary patch literal 4921 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 07.png b/examples/resource-bar/assets/Playing Card_Diamond 07.png new file mode 100644 index 0000000000000000000000000000000000000000..49f50e55b9f75884a3b8b7d761517a5ac3a15eff GIT binary patch literal 5057 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 X9JT0v6SyGn00000NkvXXu0mjf<1(D& literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 08.png b/examples/resource-bar/assets/Playing Card_Diamond 08.png new file mode 100644 index 0000000000000000000000000000000000000000..29e69034a893578d86d00f5e855820bde91f6393 GIT binary patch literal 5630 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 Y1sFI8?k{&%9{>OV07*qoM6N<$f?nm#6aWAK literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 09.png b/examples/resource-bar/assets/Playing Card_Diamond 09.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e3fe67978dc1cbdb2240c656f092b0c3dbc0db GIT binary patch literal 5825 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 LNkvXXu0mjfl$$N0 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 10.png b/examples/resource-bar/assets/Playing Card_Diamond 10.png new file mode 100644 index 0000000000000000000000000000000000000000..26cfdaaf7b2908622b928e60c531b931d17eb631 GIT binary patch literal 5960 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond A.png b/examples/resource-bar/assets/Playing Card_Diamond A.png new file mode 100644 index 0000000000000000000000000000000000000000..98dfb51d8f27f0545741eefa21261be94f0d929c GIT binary patch literal 3175 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 N002ovPDHLkV1h5Y4lDow literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond J.png b/examples/resource-bar/assets/Playing Card_Diamond J.png new file mode 100644 index 0000000000000000000000000000000000000000..99dbd1c53385fc16e2ff9be05f2cc2d80da41e23 GIT binary patch literal 4540 zcmahtXEYpK(*#ix(IP}I(R*Jl+Oh=8>Q+fuy~b{|ut>C3BOxKt%OVLDS%eVLQ}ieg zR*BVu)ywMNzR&yT`}KYI%$+$iXU@5E=iW0d$s7!#r{ka_BO{|XG6Y(Xs3&PB(_AOv zrd%sDiBKYRjjU)$E0V?yMdE268`>jC`jh|J?$Uv9&)h8y4l*((RU@E|RahP&KRoC5cyr>srE%y`ExiJTXaYG<*}ad6 zk%_7!9!TDNUDmnuv9&o%TT&%tXT%T}�pxYk;6wq*EDLkQd19q@*TyXSo)8v#Uf@ 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Diamond K.png b/examples/resource-bar/assets/Playing Card_Diamond K.png new file mode 100644 index 0000000000000000000000000000000000000000..38176310a741cb9016c6dd5bb5c9873ed0faa2bf GIT binary patch literal 6132 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%0DFyUBfVf+763 zO+(!i%|;NXPU9al8FB1H&BPN?@K2aYWWy(j)1~;wOg6j|S8j`=s`&4ng|cmTeDS}J z;vf5H+^X?eK~eGF_Xi?tx5SFX$y1aTK8#xOoo;tIElyziVj}NuN_tM&{WXERW@^v6 zPM5Omy2$De5>FjHj=yjc;@A(mT;{Aep~Wi*|LL7-Z6fQp5}5u>R^kavT@<%}YGu>| zhbbNPFyhBkntkS^IN>+`MsWVi+H6;>CiLHLWHg@8!sUcltWIgC?)et~?T^K6k69f# zCr;%3j|oh9TGutf*)Jw-Zp=VEaG2oY6`JjpZMzAtT%*Z0r^Hb{`;x$2Pw4MQgus9Q zoP>dcDKQm&t~+f$vSFJhyPOe6{iX!}*r^D=!4X&}9DN4*XY!p&j3S-aAbEM+Je>WL z?`|bEOtF%D895=2IC>oa&5s~XYVS;w`uXux^cm>*Ns}T2XRmHa_q=wEABktiJ&AL= zWx2|Ukd?^^aRLv{L;d$rQ+%l<-w~L)$P`}ycs=-*&qnUh768fT#dXuQxW|t`Zl8~L z*2LJR7*gFlybCAexau-Zt}Q<`D*X2P>bEmCK;+#`MAmP``OBWEjWr2}PN{O+Nk^}4_+EU%ymUl0e$#Z%b7CHZX2e}yv>DppPQcHpfXGD zh?B#(Mh(W+v1pvvZEOC%2!u(4(=PxQ8kdKYKxO5Qj7S7j>4Cdx)WgR1Ot8gC6X%d?2(R7%k!Vw;9y|ioY&ii(OTEG$G(5~c=k zmWYnnHUd{yJmYXU=-00w1qB7<=j-dpY*JHFQbJKt5gRsaNGc5Q3rPrpBuPIb+V^B; z_c|Lr_<=4$hZzTu@PurQ4gt1lo*mE xNx%r8FHit<0X*24O%T`(6agOsD@7$S{vYDG$|{MMY?uH5002ovPDHLkV1mSnwDkZ0 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts 04.png b/examples/resource-bar/assets/Playing Card_Hearts 04.png new file mode 100644 index 0000000000000000000000000000000000000000..2720d7d147af4fa486093b80c1bf382138af2f4f GIT binary patch literal 3869 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts 05.png b/examples/resource-bar/assets/Playing Card_Hearts 05.png new file mode 100644 index 0000000000000000000000000000000000000000..79ae89b52485ca5573912b10dc30c7fa8423f8e3 GIT binary patch literal 4643 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts 07.png b/examples/resource-bar/assets/Playing Card_Hearts 07.png new file mode 100644 index 0000000000000000000000000000000000000000..88b6e099b876ab757f8f67e1d15ea6cd9ce82f22 GIT binary patch literal 5265 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 X>Ytg6swYL=00000NkvXXu0mjfnzaKo literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts 08.png b/examples/resource-bar/assets/Playing Card_Hearts 08.png new file mode 100644 index 0000000000000000000000000000000000000000..7623d82cbd4a4292145716b2d96bae35de087adf GIT binary patch literal 5826 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 Uj-qQ8z1^@s6x0_U@00004b3#c}2nYxW zde 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts A.png b/examples/resource-bar/assets/Playing Card_Hearts A.png new file mode 100644 index 0000000000000000000000000000000000000000..86009da91836ee5bbd9d7e8fc19611af877dfbc3 GIT binary patch literal 3479 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts J.png b/examples/resource-bar/assets/Playing Card_Hearts J.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5a54c97b4cb33ced050895a3e8f2600536ae7b GIT binary patch literal 4565 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 P!H{UF>%*#4?V|q&%7n+r literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts K.png b/examples/resource-bar/assets/Playing Card_Hearts K.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc672adf345cecb5f9483797a79adf694050bb1 GIT binary patch literal 6159 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 bK0JD{MjMB%W_=1I??EbxnhKS2??e6r?%ymq literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Hearts Q.png b/examples/resource-bar/assets/Playing Card_Hearts Q.png new file mode 100644 index 0000000000000000000000000000000000000000..099f403c09a0ac6b77bf82f7ea34e980319379a4 GIT binary patch literal 4901 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 G{`()1CVub$ literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Joker Black.png b/examples/resource-bar/assets/Playing Card_Joker Black.png new file mode 100644 index 0000000000000000000000000000000000000000..393cdeaccbf982dabfc32aae6dbcbb7b3b622893 GIT binary patch literal 5617 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 QKLoZ%is}kgDC5xo0e>c!wg3PC literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Joker Red.png b/examples/resource-bar/assets/Playing Card_Joker Red.png new file mode 100644 index 0000000000000000000000000000000000000000..327defbeb6763a8613b9f1db1420796b1f41bf2d GIT binary patch literal 5623 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 Bl_CHD literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades 03.png b/examples/resource-bar/assets/Playing Card_Spades 03.png new file mode 100644 index 0000000000000000000000000000000000000000..7cfff0c341da23ab3f9f8d9f7c6456d32e7c8e8c GIT binary patch literal 4060 zcmW+(2{@G9`+jB1mL(zaeYWg0#m~O)`55~$LRp8h4YKdXT0|%^MMBo>WRN978k%f_ zu?>@DFm@x-|Ly-?*Llx%-uImAJm-1t^W687W)3xEVdP~50D$GLk)9>k!@-t*nGSrn z66Lr}=6&y1J7{P+T`O|+Jm5z8}82Iseu)ck;mA_|js7s&+5E>dP z>+Sa_$jv3dL)JeKUbv&i3jnOJyL#HzVW{obvF6s3i-U`yc3j!l^!QU6ELI0Y>xH~z z&a;bYrOl1|tvE`Lb$g`wWiWSYdw6|ySmH(HABvb7c~6L%;*Io)RCvy7nDV-9ANj^i z@otl>y!nIk-p^lUnebhaJ3G#ubp>+Y)K5@jr}gCawKtJt%0(k=Iu95=L&h%U(+cou z@x(1hGp6B2_yKO9f(j*qeOdVXk78#B$3|Q zR$IVe3{oe*SAY^=N#EYl`KlOHL=1`&5IPUqoRA=p$^NxZA{l`F2)MBbhb0WQ;ZsDG zs;aI|(-Ugogcs8EtaR0hm06~Vy$MT5VS<%vmYWtP<8byPK1nn^?>v@%mMhAdKuyb>#w6-chN9V~nX{eu{tdvVc z#fJ}H(yvMR_!`jgptR)MQ_KYNr|1EJvB8IGD6zi>>GH(Z8~^# zbaWgk>iS2W9^k!kgFb3oIA_>PK4`J`OkGSs0Jzucv)oZ2$Ur9GKO(4kGm^=k$s*SM z*~VqN2M2Oxx81(vkG8b56sRAh)~BQ^t$fKyw5|SMnQ5T{781GWb`bYqFq5BhJm+sZ zI6OQYc7Rc=RJr*h14Hm?aj>?w&d+>rQlK*_m>tPnphy!+UTE1!s$r`?Q(mL&t%Q+k z+rI6`{P`UkiJ3)$zCAxZuyAlluePfrybfJJc%4OoCwivwOPnY9c5O>lZS8ibLNmQa zhsHZ>>a=qtOIcYN5I0$E_jz!T-rL)|vt`5R+ly6BPEKZY?i#7CTa@{8y@M+{kZ8Q{ zg7bQY!Sn2F?0eHnYvUNoGX26VF)<64jZID2d3giqsGuM@S2s7> z)0k(klt4V0i*w>yeQ(I*L=TOP4Mvi?;6duIq4Z^z5*H{S=5hT7dJO}MBU##LlTJDLbcE{Dbcq-uW_@UlJ`bythe!?c8l{`E=^h9%DzuDE))Qt4?ljfoK+XIuH^4v~Hhp2l`R@sD{>EEa# z@TrD84GRlnrU-|HhiA*dM{&f%8dy^W(nE}w`- zt3Z!%0YAT8U+@`E$Wdz582d6#7^CtY~b?2=g$nhs*-@ltr zOiVlgf&BepOX}07{Y9}CX+<%=7$hVlz;y;THrEmo6SE5nyzTfBx98e)-FMbj24FOg6nhz0y6O0YylBSA#5BA$)0EcHp_)BH6cG|i@R@7P0KHfhgH70sg0cp-^PQcL$vL;O zzdNZC*49#-Izp%b6%`c|Rel9OeCqgnv%);5Pf^Oy*D6Vehrz)iA$=H323j+-Z^sV< zTU}i}oQtNVrDcB&UGw3FeLjoI6qb;d?w|ATo+qD5*?rKev@WTv9FBL!>SqxuCLc<} z8r{DKa^G^+Gd51ARwK|$o(1ul>gxVYenV9?dP4Eeb=<4}2x_P2{4qjqCz%_yMeM18~7K{BDNc>vtad2<|#(4v% zTNhSByecdNH%FZAdrUpnxS+WC%%k%R>nPgh1U&jN)85{mQtU-1=CR!e$F!0Xp-u3x|t2M{L~udvnv(H4x#5QIxW-`is#c(sV=AX<(JYX%BJWbf<$H z22;6bX-U}M`{3k^>b+zh0B+Ua3zuC%&fmA&j&8~opYOx|8z0!X$W z6BBxzj7c+pdLYaal9ED5wvuU5n!!6ky2RcBSyskd9n7fswl>Ait}g8CY&s5y(-_l1 zvPnBMU%peoTv=JUdvX%`{Qa?Dsvm~8&41Cr(UC9aY+JEN5OK7rJ#zZ%mn(Up>&kBGzck@QV7|9oRYhfYfcw6^x@O3heeTPb z!s6mXE*jqQykIf_4Bla-V>c%%sgsY%ti9>fKzMlg`qq}7i_2TsMTNz?V#~_i-OsG5 z6Gd@xfH)^()G6_0xtf`o8OV46jbizJ+sE5;VB)9#Ir^Fj6fb&)hATN{8rmTtAw@>1 z_uBjhYVWnxyAN}iyivPuRc@kfU_h7oujXiBtc;9IIjj23n>VS}V=&er1&@wGCnhJ4 z+DmXt`#HWgHZ~#<$oGdp$)j$ILX6bglzM+_ax6RnUvXIEpdjp^3B zpd^0m=xECHew~%|U@}wSok7>$mm7&+%0#=4qZ>C=_V@SAVKDDDe;|Oe>rxov_cAX} zyKcHklJtWB?!EN=t?tA&hfcl!qQ+*(3(^-Qd37D@J%hQ&OrPZ z)IPSiH~d`(-s~rebIm1DG_Vodk`SE)n| zca7a1Y6|h?{cjpo8a%QxnRRuy{4ZfMr(1ny8e_U=AQ6XN71oj_ujGeC3uR@l08yYA z$}%pq_AM_j-{&}tJldR${v;;$as&Y$K<)6mF3Jae7<5Gt>4U3}KMLx9Fub@}bW*%X z{&XfwrG=lLzZ)K|T&JX?TA`?QFyVFX_A%9b-C5|m(a_M) zc~*w?f*=TbuXFCRm!-LS8GmJM}BI<1f{(^sJXGbYuNvmj{ z?$K0@OACOcgTY`m$c^P6W&hzCJ(#K+6S(LBgQq<4iS(?lzYaHmxas?`{2-NAex7YZ zY0fr#Uj>so<~dQ3goD~K{ZxhvtOhE7{rYtmG(|N!<5fxuy+H=A#|!vrwstEs10rrG zy2OW@moZ6DI8!R;#S2faH01X5zxoJqD=RCv^k@JW)BK}${`%OvXwuB@bapd z`CWGMd(c)7A>I_W=lU@IS-&5K3RI0Qpn@rH2IFme)Gswi75w;dfy_)-6#N%_j#1P-I}SS z;Ej5uy$tl^@UR~|!P5dccw?hXx^8@FX{k2tCcEcU4XkE6eV+FwSicn8R=*wJsCiQ) z@691<_Qod%;{xme5DXp5VZ2IqJOdMxuDw0ad-U`Nr>1Y4xd7zs%T#;N+Q)EFSMG-` zvv;bYmwKcVDviqs=NmHYekk=wF2hW|jT{-O-R`a+uuihHw4`J4lhmPaamdKc<$N?J zWp;c0p9UKsbv@cZGLKOC{*6vpm=ej`hW!|XyKb%R3a-J;Hi-&S`2S_&pW?HH&oOJ2 zm+uDymxYn%c9#HT)}Kp8)B$sqere6rMt@?}(I=}XBESWZnfOEY&h438Nr2{PDp8Q@ zzB(Lz;xk4KVbW5Hg8(~hZ%xJGn1BfYdI_g1-A~a(a~$BM?i4wJl{j!$AFB63=Rv~% E0du_sDgXcg literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades 04.png b/examples/resource-bar/assets/Playing Card_Spades 04.png new file mode 100644 index 0000000000000000000000000000000000000000..6ccb8ffbfde73aa1bcbfd2a80c2ba98838b2f93c GIT binary patch literal 3785 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades 06.png b/examples/resource-bar/assets/Playing Card_Spades 06.png new file mode 100644 index 0000000000000000000000000000000000000000..6358cbeb92d8647c162abb763233c5d83e71f0b0 GIT binary patch literal 5219 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 XO1D^kgiIgU5QHensmoSMTmJVys;c|x literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades 07.png b/examples/resource-bar/assets/Playing Card_Spades 07.png new file mode 100644 index 0000000000000000000000000000000000000000..de854dab4f69d351587bd3324fc5521ac69fec5e GIT binary patch literal 5428 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades 08.png b/examples/resource-bar/assets/Playing Card_Spades 08.png new file mode 100644 index 0000000000000000000000000000000000000000..86f074578f12f20f482ba8a1b3d253b56ec56317 GIT binary patch literal 5907 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 L0aLGdU>Es6nsZf- literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades 10.png b/examples/resource-bar/assets/Playing Card_Spades 10.png new file mode 100644 index 0000000000000000000000000000000000000000..f122789f34555eccf3845d4ec680ebdfe1ed9c4f GIT binary patch literal 6614 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 `q602$?`p}!^6YZPo4k| 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades K.png b/examples/resource-bar/assets/Playing Card_Spades K.png new file mode 100644 index 0000000000000000000000000000000000000000..c71a5e0e3199aea5ecc2a0a10837adaa2c18f27a GIT binary patch literal 5933 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 NqNVl(R<2?h`9Eb8pyL1l literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Playing Card_Spades Q.png b/examples/resource-bar/assets/Playing Card_Spades Q.png new file mode 100644 index 0000000000000000000000000000000000000000..618c6936c1b68439e3e75bf40098685441cb0125 GIT binary patch literal 4768 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 Ny0Vs1m4a31{{h~JFVO%1 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 10f2be000..8d5c49a46 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -59,1329 +59,1298 @@ "resources": [ { "alwaysLoaded": false, - "file": "assets/Ranger_Carry_1.png", + "file": "assets/Fly_1.png", "kind": "image", "metadata": "", - "name": "Ranger_Carry_1.png", - "smoothed": false, + "name": "Fly_1.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_1.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_1.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Carry_2.png", + "file": "assets/Fly_10.png", "kind": "image", "metadata": "", - "name": "Ranger_Carry_2.png", - "smoothed": false, + "name": "Fly_10.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_2.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_10.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Carry_3.png", + "file": "assets/Fly_2.png", "kind": "image", "metadata": "", - "name": "Ranger_Carry_3.png", - "smoothed": false, + "name": "Fly_2.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_3.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_2.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Carry_4.png", + "file": "assets/Fly_3.png", "kind": "image", "metadata": "", - "name": "Ranger_Carry_4.png", - "smoothed": false, + "name": "Fly_3.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Carry_4.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_3.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Climb_1.png", + "file": "assets/Fly_4.png", "kind": "image", "metadata": "", - "name": "Ranger_Climb_1.png", - "smoothed": false, + "name": "Fly_4.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_1.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_4.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Climb_2.png", + "file": "assets/Fly_5.png", "kind": "image", "metadata": "", - "name": "Ranger_Climb_2.png", - "smoothed": false, + "name": "Fly_5.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_2.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_5.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Climb_3.png", + "file": "assets/Fly_6.png", "kind": "image", "metadata": "", - "name": "Ranger_Climb_3.png", - "smoothed": false, + "name": "Fly_6.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_3.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_6.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Climb_4.png", + "file": "assets/Fly_7.png", "kind": "image", "metadata": "", - "name": "Ranger_Climb_4.png", - "smoothed": false, + "name": "Fly_7.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Climb_4.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_7.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Daze_1.png", + "file": "assets/Fly_8.png", "kind": "image", "metadata": "", - "name": "Ranger_Daze_1.png", - "smoothed": false, + "name": "Fly_8.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_1.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_8.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Daze_2.png", + "file": "assets/Fly_9.png", "kind": "image", "metadata": "", - "name": "Ranger_Daze_2.png", - "smoothed": false, + "name": "Fly_9.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_2.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_9.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Daze_3.png", + "file": "assets/Star_LargeNarrow.png", "kind": "image", "metadata": "", - "name": "Ranger_Daze_3.png", - "smoothed": false, + "name": "Star_LargeNarrow.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_3.png", + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_LargeNarrow.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Daze_4.png", + "file": "assets/Star_LargeWide.png", "kind": "image", "metadata": "", - "name": "Ranger_Daze_4.png", - "smoothed": false, + "name": "Star_LargeWide.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Daze_4.png", + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_LargeWide.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Dead.png", + "file": "assets/Star_Medium.png", "kind": "image", "metadata": "", - "name": "Ranger_Dead.png", - "smoothed": false, + "name": "Star_Medium.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Dead.png", + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_Medium.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Get Up.png", + "file": "assets/Star_Small.png", "kind": "image", "metadata": "", - "name": "Ranger_Get Up.png", - "smoothed": false, + "name": "Star_Small.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Get Up.png", + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_Small.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Headbutt_1.png", + "file": "assets/Silver shield.png", "kind": "image", "metadata": "", - "name": "Ranger_Headbutt_1.png", - "smoothed": false, + "name": "Silver shield.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Headbutt_1.png", + "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter/PNG/Power-ups/Silver shield.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Headbutt_2.png", + "file": "assets/Meteor Detailed_Large.png", "kind": "image", "metadata": "", - "name": "Ranger_Headbutt_2.png", - "smoothed": false, + "name": "Meteor Detailed_Large.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Headbutt_2.png", + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/meteors/Meteor Detailed_Large.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Hurt.png", + "file": "assets/Meteor Detailed_Small.png", "kind": "image", "metadata": "", - "name": "Ranger_Hurt.png", - "smoothed": false, + "name": "Meteor Detailed_Small.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Hurt.png", + "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/meteors/Meteor Detailed_Small.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 1_1.png", + "file": "assets/Upgraded Potion Blue_No Shadow.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 1_1.png", + "name": "Upgraded Potion Blue_No Shadow.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_1.png", + "identifier": "https://resources.gdevelop-app.com/assets/32x32 Fantasy Icons Pack v2/Icons/Healing Items/Upgraded Potion Blue_No Shadow.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 1_2.png", + "file": "assets/Upgraded Potion Blue_Shadow.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 1_2.png", + "name": "Upgraded Potion Blue_Shadow.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_2.png", + "identifier": "https://resources.gdevelop-app.com/assets/32x32 Fantasy Icons Pack v2/Icons/Healing Items/Upgraded Potion Blue_Shadow.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 1_3.png", + "file": "assets/Moon.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 1_3.png", - "smoothed": false, + "name": "Moon.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_3.png", + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Background/Moon.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 1_4.png", + "file": "assets/Emote Heart.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 1_4.png", - "smoothed": false, + "name": "Emote Heart.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 1_4.png", + "identifier": "https://resources.gdevelop-app.com/assets/Emotes/Normal/Emote/Emote Heart.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 2_1.png", + "file": "assets/tiled_Tiled Empty UI Heart.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 2_1.png", + "name": "tiled_Tiled Empty UI Heart.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_1.png", + "identifier": "https://resources.gdevelop-app.com/assets/16x16 Dungeon Tileset/UI/tiled_Tiled Empty UI Heart.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 2_2.png", + "file": "assets/tiled_Tiled Filler UI Heart.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 2_2.png", + "name": "tiled_Tiled Filler UI Heart.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_2.png", + "identifier": "https://resources.gdevelop-app.com/assets/16x16 Dungeon Tileset/UI/tiled_Tiled Filler UI Heart.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 2_3.png", + "file": "assets/Health Bar.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 2_3.png", + "name": "Health Bar.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_3.png", + "identifier": "https://resources.gdevelop-app.com/assets/Pirate Bomb Pack/Objects/Health Bar/Health Bar.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Idle 2_4.png", + "file": "assets/tiled_Health Bar Fill.png", "kind": "image", "metadata": "", - "name": "Ranger_Idle 2_4.png", + "name": "tiled_Health Bar Fill.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Idle 2_4.png", + "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter by Pixel boy/Hud/tiled_Health Bar Fill.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Jump Kick_1.png", + "file": "assets/tiled_Energy Bar Fill.png", "kind": "image", "metadata": "", - "name": "Ranger_Jump Kick_1.png", + "name": "tiled_Energy Bar Fill.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_1.png", + "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter by Pixel boy/Hud/tiled_Energy Bar Fill.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Jump Kick_2.png", + "file": "assets/Health Bar Box.png", "kind": "image", "metadata": "", - "name": "Ranger_Jump Kick_2.png", + "name": "Health Bar Box.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_2.png", + "identifier": "https://resources.gdevelop-app.com/assets/Western FPS 2D/Hud/Bar/Health Bar Box.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Jump Kick_3.png", + "file": "assets/Health Indicator_Black Outline Empty.png", "kind": "image", "metadata": "", - "name": "Ranger_Jump Kick_3.png", + "name": "Health Indicator_Black Outline Empty.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_3.png", + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_Black Outline Empty.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Jump Kick_4.png", + "file": "assets/Health Indicator_Black Outline Heart.png", "kind": "image", "metadata": "", - "name": "Ranger_Jump Kick_4.png", + "name": "Health Indicator_Black Outline Heart.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Jump Kick_4.png", + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_Black Outline Heart.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Kick 1.png", + "file": "assets/Health Indicator_White Outline Empty.png", "kind": "image", "metadata": "", - "name": "Ranger_Kick 1.png", + "name": "Health Indicator_White Outline Empty.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Kick 1.png", + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_White Outline Empty.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Kick 2.png", + "file": "assets/Health Indicator_White Outline Heart.png", "kind": "image", "metadata": "", - "name": "Ranger_Kick 2.png", + "name": "Health Indicator_White Outline Heart.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Kick 2.png", + "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_White Outline Heart.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Knockdown.png", + "file": "assets/Heart.png", "kind": "image", "metadata": "", - "name": "Ranger_Knockdown.png", + "name": "Heart.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Knockdown.png", + "identifier": "https://resources.gdevelop-app.com/assets/Pirate Bomb Pack/Objects/Health Bar/Heart.png", "name": "gdevelop-asset-store" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Over Throw_1.png", + "file": "assets/Heart-1-1.png", + "kind": "image", + "metadata": "", + "name": "assets\\Heart-1-1.png", + "smoothed": true, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/Bomb_No Shadow.png", "kind": "image", "metadata": "", - "name": "Ranger_Over Throw_1.png", + "name": "Bomb_No Shadow.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Over Throw_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/32x32 Fantasy Icons Pack v2/Icons/General Items/1ceb65f6eab8e1594f3d784d881fc1eaf87a02d9e331b7ff811acc1bca3e1c2a_Bomb_No Shadow.png", + "name": "Bomb_No Shadow.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Over Throw_2.png", + "file": "assets/Bomb_Shadow.png", "kind": "image", "metadata": "", - "name": "Ranger_Over Throw_2.png", + "name": "Bomb_Shadow.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Over Throw_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/32x32 Fantasy Icons Pack v2/Icons/General Items/a58e750a7f074351f00ca54fa599fb9c383dcf55c942a27441d0d799228051e1_Bomb_Shadow.png", + "name": "Bomb_Shadow.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Pick Up 2.png", + "file": "assets/Plus Key.png", "kind": "image", "metadata": "", - "name": "Ranger_Pick Up 2.png", - "smoothed": false, + "name": "Plus Key.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Pick Up 2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Dark/fc542dd4d657e2a0bc2a7beaf49ca6135611119f11b7bcd5b5b0f97d273c6634_Plus Key.png", + "name": "Plus Key.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Pick Up.png", + "file": "assets/Minus Key.png", "kind": "image", "metadata": "", - "name": "Ranger_Pick Up.png", - "smoothed": false, + "name": "Minus Key.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Pick Up.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Dark/4c2d6e9b511305699472697c840548f3081e21e6a8f678342495570fda6a6edb_Minus Key.png", + "name": "Minus Key.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Punch 1.png", + "file": "assets/Arrow.png", "kind": "image", "metadata": "", - "name": "Ranger_Punch 1.png", + "name": "Arrow.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Punch 1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Western FPS 2D/Hud/261d2f5da18169c3f3f0cf2940b975a4eb4eef808b2a5d5a6d0533c21117b142_Arrow.png", + "name": "Arrow.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Punch 2.png", + "file": "assets/Key_Filled.png", "kind": "image", "metadata": "", - "name": "Ranger_Punch 2.png", - "smoothed": false, + "name": "Key_Filled.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Punch 2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Rolling Ball Pack/Interface/7bb3db5bbfaf32c67bd19d326370f4cd2f7a3ae8fcb99f38a7c7805cb117d8d4_Key_Filled.png", + "name": "Key_Filled.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Run_1.png", + "file": "assets/Key_Outline.png", "kind": "image", "metadata": "", - "name": "Ranger_Run_1.png", - "smoothed": false, + "name": "Key_Outline.png", + "smoothed": true, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Rolling Ball Pack/Interface/9817de9005c1a3ab785d2d6c8265d4028bb4f7286eb33bdd65fbd43f9e55556f_Key_Outline.png", + "name": "Key_Outline.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Run_2.png", + "file": "assets/Playing Card_Back Blue 1.png", "kind": "image", "metadata": "", - "name": "Ranger_Run_2.png", + "name": "Playing Card_Back Blue 1.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/45d8c10efbc8b88551c4f3bbf86ad7c8fc4605c9a9c6d735eca88b42425e7cd0_Playing Card_Back Blue 1.png", + "name": "Playing Card_Back Blue 1.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Run_3.png", + "file": "assets/Playing Card_Back Blue 2.png", "kind": "image", "metadata": "", - "name": "Ranger_Run_3.png", + "name": "Playing Card_Back Blue 2.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_3.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/702ac50f6b09f2fd9c8bedff300f69243e9b869be8bb167ba8f312d3da23d2d3_Playing Card_Back Blue 2.png", + "name": "Playing Card_Back Blue 2.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Run_4.png", + "file": "assets/Playing Card_Back Brown 1.png", "kind": "image", "metadata": "", - "name": "Ranger_Run_4.png", + "name": "Playing Card_Back Brown 1.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Run_4.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/2cd9e2c953aa53dbf5c6d0e47b4578be7f93b5efc3ea68956794d0b1289f6609_Playing Card_Back Brown 1.png", + "name": "Playing Card_Back Brown 1.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Stab.png", + "file": "assets/Playing Card_Back Brown 2.png", "kind": "image", "metadata": "", - "name": "Ranger_Stab.png", + "name": "Playing Card_Back Brown 2.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Stab.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/65cbd17e62582bacd5f00582d4bb5aeeb6ea4ee640e21818b6eba5081e587304_Playing Card_Back Brown 2.png", + "name": "Playing Card_Back Brown 2.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 1_1.png", + "file": "assets/Playing Card_Back Red 1.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 1_1.png", + "name": "Playing Card_Back Red 1.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/4ff2180e54ad5fe99a9d640f2c60942286941b87c696e2cfadbd6443a8c19b5e_Playing Card_Back Red 1.png", + "name": "Playing Card_Back Red 1.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 1_2.png", + "file": "assets/Playing Card_Back Red 2.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 1_2.png", + "name": "Playing Card_Back Red 2.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/fdac3c95127abee6786eef00b03a15658d0801fc7f1c11fc6d165f5ddbc7761f_Playing Card_Back Red 2.png", + "name": "Playing Card_Back Red 2.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 1_3.png", + "file": "assets/Playing Card_Clubs 02.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 1_3.png", + "name": "Playing Card_Clubs 02.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_3.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/1d01b932a889b44d89f2b96368f7b3fa3366e7ccb6de30bb22430133ca21bb42_Playing Card_Clubs 02.png", + "name": "Playing Card_Clubs 02.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 1_4.png", + "file": "assets/Playing Card_Clubs 03.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 1_4.png", + "name": "Playing Card_Clubs 03.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 1_4.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/a59c3bc065a12015b69cad078fb3a74e2c18cf825be48cf69044010795482f45_Playing Card_Clubs 03.png", + "name": "Playing Card_Clubs 03.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 2_1.png", + "file": "assets/Playing Card_Clubs 04.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 2_1.png", + "name": "Playing Card_Clubs 04.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/6e15b233c29d5f9b92c216d2dcba39a2f83720c3fc732dfa2abddabb332ba85e_Playing Card_Clubs 04.png", + "name": "Playing Card_Clubs 04.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 2_2.png", + "file": "assets/Playing Card_Clubs 05.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 2_2.png", + "name": "Playing Card_Clubs 05.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/37e6767258064bf343185e32a2878ab6f008acb4cdd737311267078e852b2a32_Playing Card_Clubs 05.png", + "name": "Playing Card_Clubs 05.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 2_3.png", + "file": "assets/Playing Card_Clubs 06.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 2_3.png", + "name": "Playing Card_Clubs 06.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_3.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/cfdbccd7c1f67bfbbc04119d2df55fbe0411f82eef9c5779fdcce4e479ad3cde_Playing Card_Clubs 06.png", + "name": "Playing Card_Clubs 06.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Strafe 2_4.png", + "file": "assets/Playing Card_Clubs 07.png", "kind": "image", "metadata": "", - "name": "Ranger_Strafe 2_4.png", + "name": "Playing Card_Clubs 07.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Strafe 2_4.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/c76e0e677e1ddd6dd05848f51c49e0f4c87711c226b7deb94357de22282fd268_Playing Card_Clubs 07.png", + "name": "Playing Card_Clubs 07.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 1_1.png", + "file": "assets/Playing Card_Clubs 08.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 1_1.png", + "name": "Playing Card_Clubs 08.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/245935a2431ddf72509e0f3cd12ec3b0229aa005310eed111818da8265760fbc_Playing Card_Clubs 08.png", + "name": "Playing Card_Clubs 08.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 1_2.png", + "file": "assets/Playing Card_Clubs 09.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 1_2.png", + "name": "Playing Card_Clubs 09.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/352eb13ac79b60b8c650601b6495e0558de553604ce1124d0bdf75d6087d6049_Playing Card_Clubs 09.png", + "name": "Playing Card_Clubs 09.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 1_3.png", + "file": "assets/Playing Card_Clubs 10.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 1_3.png", + "name": "Playing Card_Clubs 10.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_3.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/fb330a065248677911f6b14f8294e03777cb585c19e4aacabb53109c335d3575_Playing Card_Clubs 10.png", + "name": "Playing Card_Clubs 10.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 1_4.png", + "file": "assets/Playing Card_Clubs A.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 1_4.png", + "name": "Playing Card_Clubs A.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 1_4.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/f97a1e91ad3f63787c6175b116d4999c14dc462a2e287494142a8b01f5c43d06_Playing Card_Clubs A.png", + "name": "Playing Card_Clubs A.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 2_1.png", + "file": "assets/Playing Card_Clubs J.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 2_1.png", + "name": "Playing Card_Clubs J.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/6c143342e09e253c9d0446c2e59b27faadf330b15f1657d45a07850bb598a38a_Playing Card_Clubs J.png", + "name": "Playing Card_Clubs J.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 2_2.png", + "file": "assets/Playing Card_Clubs K.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 2_2.png", + "name": "Playing Card_Clubs K.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/600a46d080fa5e086ef3c1a1f8515f8232273845f39ae25996d2db959b7f229c_Playing Card_Clubs K.png", + "name": "Playing Card_Clubs K.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 2_3.png", + "file": "assets/Playing Card_Clubs Q.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 2_3.png", + "name": "Playing Card_Clubs Q.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_3.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/7c7d22520dd102f71744c6689c5b0a47417e4765e18c7789400da1676d538706_Playing Card_Clubs Q.png", + "name": "Playing Card_Clubs Q.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 2_4.png", + "file": "assets/Playing Card_Diamond 02.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 2_4.png", + "name": "Playing Card_Diamond 02.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 2_4.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/d7d5824c27e5521de286fa6a9d294d9c3827ca003367dc9bb0c8e1c4d9ba45b7_Playing Card_Diamond 02.png", + "name": "Playing Card_Diamond 02.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 3_1.png", + "file": "assets/Playing Card_Diamond 03.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 3_1.png", + "name": "Playing Card_Diamond 03.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/03bbe9833d1ff0faefacf07001f57db2bb2c82412b093ec0ce6c1fdc05034c7c_Playing Card_Diamond 03.png", + "name": "Playing Card_Diamond 03.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 3_2.png", + "file": "assets/Playing Card_Diamond 04.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 3_2.png", + "name": "Playing Card_Diamond 04.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/b2a86bc52b75ab9fbaabd7041f7900e749eeeeaf46d90ebbac0abb4b9843df42_Playing Card_Diamond 04.png", + "name": "Playing Card_Diamond 04.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 3_3.png", + "file": "assets/Playing Card_Diamond 05.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 3_3.png", + "name": "Playing Card_Diamond 05.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_3.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/673ac4ebb82a45d89b321a744a96fc9703f4cd6e69d2d0bd442372dfcece2c75_Playing Card_Diamond 05.png", + "name": "Playing Card_Diamond 05.png" } }, { "alwaysLoaded": false, - "file": "assets/Ranger_Walk 3_4.png", + "file": "assets/Playing Card_Diamond 06.png", "kind": "image", "metadata": "", - "name": "Ranger_Walk 3_4.png", + "name": "Playing Card_Diamond 06.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Brawler Series/NES/Ranger_Walk 3_4.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/0b0eb2394c93d49b4f978cfdf88a7dcfb796f16207d898acf9e3a8decd9bfc87_Playing Card_Diamond 06.png", + "name": "Playing Card_Diamond 06.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_1.png", + "file": "assets/Playing Card_Diamond 07.png", "kind": "image", "metadata": "", - "name": "Fly_1.png", - "smoothed": true, + "name": "Playing Card_Diamond 07.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_1.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/942705e1185fb80c12ddbcd095f168495e938c44509f7832fcdbe186e66a914a_Playing Card_Diamond 07.png", + "name": "Playing Card_Diamond 07.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_10.png", + "file": "assets/Playing Card_Diamond 08.png", "kind": "image", "metadata": "", - "name": "Fly_10.png", - "smoothed": true, + "name": "Playing Card_Diamond 08.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_10.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/71811d6f57968e799c534df2df62762203ec073b9375d4026f8f4a1c04380421_Playing Card_Diamond 08.png", + "name": "Playing Card_Diamond 08.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_2.png", + "file": "assets/Playing Card_Diamond 09.png", "kind": "image", "metadata": "", - "name": "Fly_2.png", - "smoothed": true, + "name": "Playing Card_Diamond 09.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_2.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/82a1fca7de0ad3af5222008612f09081958a06aa5af07ef9d7000b293fd40162_Playing Card_Diamond 09.png", + "name": "Playing Card_Diamond 09.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_3.png", + "file": "assets/Playing Card_Diamond 10.png", "kind": "image", "metadata": "", - "name": "Fly_3.png", - "smoothed": true, + "name": "Playing Card_Diamond 10.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_3.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/3ca86ef6e65fef7170ca7d3792ab14f1f52f7094cfac978210e51b42d560aaa8_Playing Card_Diamond 10.png", + "name": "Playing Card_Diamond 10.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_4.png", + "file": "assets/Playing Card_Diamond A.png", "kind": "image", "metadata": "", - "name": "Fly_4.png", - "smoothed": true, + "name": "Playing Card_Diamond A.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_4.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/1907fdccf9cf1727959f8e554657c39fc7897cf6342a6577906096f333cc993a_Playing Card_Diamond A.png", + "name": "Playing Card_Diamond A.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_5.png", + "file": "assets/Playing Card_Diamond J.png", "kind": "image", "metadata": "", - "name": "Fly_5.png", - "smoothed": true, + "name": "Playing Card_Diamond J.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_5.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/b2db6ddff7ce5fa38afaf11255a080ace2d9b8fa6983c7734f7ba432bb91022c_Playing Card_Diamond J.png", + "name": "Playing Card_Diamond J.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_6.png", + "file": "assets/Playing Card_Diamond K.png", "kind": "image", "metadata": "", - "name": "Fly_6.png", - "smoothed": true, + "name": "Playing Card_Diamond K.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_6.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/8cf19bd2048868217422ac1702a810e64ac5a1241c815dd43a6d86bc20228e06_Playing Card_Diamond K.png", + "name": "Playing Card_Diamond K.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_7.png", + "file": "assets/Playing Card_Diamond Q.png", "kind": "image", "metadata": "", - "name": "Fly_7.png", - "smoothed": true, + "name": "Playing Card_Diamond Q.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_7.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/62666ce404454229888659d2aa76ece6e40d69a0aed746b291341939580fde62_Playing Card_Diamond Q.png", + "name": "Playing Card_Diamond Q.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_8.png", + "file": "assets/Playing Card_Hearts 02.png", "kind": "image", "metadata": "", - "name": "Fly_8.png", - "smoothed": true, + "name": "Playing Card_Hearts 02.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_8.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/6759af6b5226a83322915bfed1b6cecd8efcad620b96ba0d63bbe9689c8db42c_Playing Card_Hearts 02.png", + "name": "Playing Card_Hearts 02.png" } }, { "alwaysLoaded": false, - "file": "assets/Fly_9.png", + "file": "assets/Playing Card_Hearts 03.png", "kind": "image", "metadata": "", - "name": "Fly_9.png", - "smoothed": true, + "name": "Playing Card_Hearts 03.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Enemy/Fly_9.png", - "name": "gdevelop-asset-store" - } - }, - { - "alwaysLoaded": false, - "file": "assets/Star_LargeNarrow.png", - "kind": "image", - "metadata": "", - "name": "Star_LargeNarrow.png", - "smoothed": true, - "userAdded": false, - "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_LargeNarrow.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/ec5f7db10e42a1d9e6c7d246193f7db5e507bc1b1ec561dc9f0aa60ecd04616b_Playing Card_Hearts 03.png", + "name": "Playing Card_Hearts 03.png" } }, { "alwaysLoaded": false, - "file": "assets/Star_LargeWide.png", + "file": "assets/Playing Card_Hearts 04.png", "kind": "image", "metadata": "", - "name": "Star_LargeWide.png", - "smoothed": true, + "name": "Playing Card_Hearts 04.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_LargeWide.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/e356db36b32f4a7e7e7969504caeda79b8f9ee552b3518151c437ba663684273_Playing Card_Hearts 04.png", + "name": "Playing Card_Hearts 04.png" } }, { "alwaysLoaded": false, - "file": "assets/Star_Medium.png", + "file": "assets/Playing Card_Hearts 05.png", "kind": "image", "metadata": "", - "name": "Star_Medium.png", - "smoothed": true, + "name": "Playing Card_Hearts 05.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_Medium.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/a337b7ec298507602bfd253623e4678e456ab6af70a39c938e6d07e642265a78_Playing Card_Hearts 05.png", + "name": "Playing Card_Hearts 05.png" } }, { "alwaysLoaded": false, - "file": "assets/Star_Small.png", + "file": "assets/Playing Card_Hearts 06.png", "kind": "image", "metadata": "", - "name": "Star_Small.png", - "smoothed": true, + "name": "Playing Card_Hearts 06.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/stars/Star_Small.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/6d06b53368b61e1d3237a9e555e041886db74e4b7cfd7b713b523256dc0a8274_Playing Card_Hearts 06.png", + "name": "Playing Card_Hearts 06.png" } }, { "alwaysLoaded": false, - "file": "assets/Blue laser (01).png", + "file": "assets/Playing Card_Hearts 07.png", "kind": "image", "metadata": "", - "name": "Blue laser (01).png", - "smoothed": true, + "name": "Playing Card_Hearts 07.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter/PNG/Lasers/Blue laser (01).png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/8cde3a832de612c2680c0ffa3b4bd094ace4d6073a1be2034370a0298677f626_Playing Card_Hearts 07.png", + "name": "Playing Card_Hearts 07.png" } }, { "alwaysLoaded": false, - "file": "assets/Silver shield.png", + "file": "assets/Playing Card_Hearts 08.png", "kind": "image", "metadata": "", - "name": "Silver shield.png", - "smoothed": true, + "name": "Playing Card_Hearts 08.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter/PNG/Power-ups/Silver shield.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/5607ed43a0667f9d88a28dd37d879588206da0b0e17865e592fab5c856a3a642_Playing Card_Hearts 08.png", + "name": "Playing Card_Hearts 08.png" } }, { "alwaysLoaded": false, - "file": "assets/Meteor Detailed_Large.png", + "file": "assets/Playing Card_Hearts 09.png", "kind": "image", "metadata": "", - "name": "Meteor Detailed_Large.png", - "smoothed": true, + "name": "Playing Card_Hearts 09.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/meteors/Meteor Detailed_Large.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/a4a2b7ad1e25c76b520368fd96cb44f33024218b5bc5d499ac997ebbfdb56cd5_Playing Card_Hearts 09.png", + "name": "Playing Card_Hearts 09.png" } }, { "alwaysLoaded": false, - "file": "assets/Meteor Detailed_Small.png", + "file": "assets/Playing Card_Hearts 10.png", "kind": "image", "metadata": "", - "name": "Meteor Detailed_Small.png", - "smoothed": true, + "name": "Playing Card_Hearts 10.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Simple Space/meteors/Meteor Detailed_Small.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/ffcff1a17db2fe8890a788bd3069ff71621e036ace4aad2c73f4af0d6771e4f0_Playing Card_Hearts 10.png", + "name": "Playing Card_Hearts 10.png" } }, { "alwaysLoaded": false, - "file": "assets/Upgraded Potion Blue_No Shadow.png", + "file": "assets/Playing Card_Hearts A.png", "kind": "image", "metadata": "", - "name": "Upgraded Potion Blue_No Shadow.png", + "name": "Playing Card_Hearts A.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/32x32 Fantasy Icons Pack v2/Icons/Healing Items/Upgraded Potion Blue_No Shadow.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/1266821f3f5a138d1b387d4eb18b61bd802e74af9fd248acdd4c8308a5b6bf74_Playing Card_Hearts A.png", + "name": "Playing Card_Hearts A.png" } }, { "alwaysLoaded": false, - "file": "assets/Upgraded Potion Blue_Shadow.png", + "file": "assets/Playing Card_Hearts J.png", "kind": "image", "metadata": "", - "name": "Upgraded Potion Blue_Shadow.png", + "name": "Playing Card_Hearts J.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/32x32 Fantasy Icons Pack v2/Icons/Healing Items/Upgraded Potion Blue_Shadow.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/5e4cfddc34a3bdc59e72c802faf36c574258b974fd41451525e0177a4e850ffc_Playing Card_Hearts J.png", + "name": "Playing Card_Hearts J.png" } }, { "alwaysLoaded": false, - "file": "assets/Moon.png", + "file": "assets/Playing Card_Hearts K.png", "kind": "image", "metadata": "", - "name": "Moon.png", - "smoothed": true, + "name": "Playing Card_Hearts K.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Background/Moon.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/6463be18b9a44c4224fe12d34d8afc6f99e6dc39e6fac033e04f7295b331bc08_Playing Card_Hearts K.png", + "name": "Playing Card_Hearts K.png" } }, { "alwaysLoaded": false, - "file": "assets/Emote Heart.png", + "file": "assets/Playing Card_Hearts Q.png", "kind": "image", "metadata": "", - "name": "Emote Heart.png", - "smoothed": true, + "name": "Playing Card_Hearts Q.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Emotes/Normal/Emote/Emote Heart.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/0de8c8afc90d4084ad528060b7b01d22ec4bf68e6fe13d44c02e859445b89836_Playing Card_Hearts Q.png", + "name": "Playing Card_Hearts Q.png" } }, { "alwaysLoaded": false, - "file": "assets/tiled_Tiled Empty UI Heart.png", + "file": "assets/Playing Card_Joker Black.png", "kind": "image", "metadata": "", - "name": "tiled_Tiled Empty UI Heart.png", + "name": "Playing Card_Joker Black.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/16x16 Dungeon Tileset/UI/tiled_Tiled Empty UI Heart.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/ed5a7db38327142a6d26f1122ee0180f671d99fb72cad242a0fce2b7ca972eaa_Playing Card_Joker Black.png", + "name": "Playing Card_Joker Black.png" } }, { "alwaysLoaded": false, - "file": "assets/tiled_Tiled Filler UI Heart.png", + "file": "assets/Playing Card_Joker Red.png", "kind": "image", "metadata": "", - "name": "tiled_Tiled Filler UI Heart.png", + "name": "Playing Card_Joker Red.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/16x16 Dungeon Tileset/UI/tiled_Tiled Filler UI Heart.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/c694c06b970aa68c106844440df67c138b851141c43a8f2e717604c1c0807682_Playing Card_Joker Red.png", + "name": "Playing Card_Joker Red.png" } }, { "alwaysLoaded": false, - "file": "assets/Health Bar.png", + "file": "assets/Playing Card_Spades 02.png", "kind": "image", "metadata": "", - "name": "Health Bar.png", + "name": "Playing Card_Spades 02.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Pirate Bomb Pack/Objects/Health Bar/Health Bar.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/c93fce6db7fb23b3a6e2736c364ec796c708db24a204de1daf4a670a7220d0b0_Playing Card_Spades 02.png", + "name": "Playing Card_Spades 02.png" } }, { "alwaysLoaded": false, - "file": "assets/tiled_Health Bar Fill.png", + "file": "assets/Playing Card_Spades 03.png", "kind": "image", "metadata": "", - "name": "tiled_Health Bar Fill.png", + "name": "Playing Card_Spades 03.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter by Pixel boy/Hud/tiled_Health Bar Fill.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/c1c38935c1e8cc0a9442858f317dc370dfad0aa142354ecb33b7dc2c017f91c3_Playing Card_Spades 03.png", + "name": "Playing Card_Spades 03.png" } }, { "alwaysLoaded": false, - "file": "assets/tiled_Energy Bar Fill.png", + "file": "assets/Playing Card_Spades 04.png", "kind": "image", "metadata": "", - "name": "tiled_Energy Bar Fill.png", + "name": "Playing Card_Spades 04.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Space Shooter by Pixel boy/Hud/tiled_Energy Bar Fill.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/fa91978a59d726ac490a26f610523115f58e84e1c2ff7379698dbd454b4e108c_Playing Card_Spades 04.png", + "name": "Playing Card_Spades 04.png" } }, { "alwaysLoaded": false, - "file": "assets/Health Bar Box.png", + "file": "assets/Playing Card_Spades 05.png", "kind": "image", "metadata": "", - "name": "Health Bar Box.png", + "name": "Playing Card_Spades 05.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Western FPS 2D/Hud/Bar/Health Bar Box.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/2386553aae77dacdc3bdb5cb36d2418cb534779ea5ae5c50536c3b593f9ac173_Playing Card_Spades 05.png", + "name": "Playing Card_Spades 05.png" } }, { "alwaysLoaded": false, - "file": "assets/Health Indicator_Black Outline Empty.png", + "file": "assets/Playing Card_Spades 06.png", "kind": "image", "metadata": "", - "name": "Health Indicator_Black Outline Empty.png", + "name": "Playing Card_Spades 06.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_Black Outline Empty.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/d524989c528da32a21b024f0a930d8b01a2900672d911216ce4fffbcea3187f5_Playing Card_Spades 06.png", + "name": "Playing Card_Spades 06.png" } }, { "alwaysLoaded": false, - "file": "assets/Health Indicator_Black Outline Heart.png", + "file": "assets/Playing Card_Spades 07.png", "kind": "image", "metadata": "", - "name": "Health Indicator_Black Outline Heart.png", + "name": "Playing Card_Spades 07.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_Black Outline Heart.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/f070b7efd25a8d1f303904f95611daf1cc24f0205c25fca92c8b93e787b21ee1_Playing Card_Spades 07.png", + "name": "Playing Card_Spades 07.png" } }, { "alwaysLoaded": false, - "file": "assets/Health Indicator_White Outline Empty.png", + "file": "assets/Playing Card_Spades 08.png", "kind": "image", "metadata": "", - "name": "Health Indicator_White Outline Empty.png", + "name": "Playing Card_Spades 08.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_White Outline Empty.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/18f2fc0be76a66e7c5ed5774371850f90e62173c23f328b44fd5d912a0f466aa_Playing Card_Spades 08.png", + "name": "Playing Card_Spades 08.png" } }, { "alwaysLoaded": false, - "file": "assets/Health Indicator_White Outline Heart.png", + "file": "assets/Playing Card_Spades 09.png", "kind": "image", "metadata": "", - "name": "Health Indicator_White Outline Heart.png", + "name": "Playing Card_Spades 09.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/GrafxKid Pack/Mini FX, Items & UI/Mini UI/Health Indicator_White Outline Heart.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/3634469f717dae7070b4c5abd88412879706f44fa13fd0f2ad239f129302eaa3_Playing Card_Spades 09.png", + "name": "Playing Card_Spades 09.png" } }, { "alwaysLoaded": false, - "file": "assets/Heart.png", + "file": "assets/Playing Card_Spades 10.png", "kind": "image", "metadata": "", - "name": "Heart.png", + "name": "Playing Card_Spades 10.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://resources.gdevelop-app.com/assets/Pirate Bomb Pack/Objects/Health Bar/Heart.png", - "name": "gdevelop-asset-store" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/10cdac8fed60ae31c662be905c8c32321670af7eca3ac24e59905a1b8b6fc1f4_Playing Card_Spades 10.png", + "name": "Playing Card_Spades 10.png" } }, { "alwaysLoaded": false, - "file": "assets/Heart.png", - "kind": "image", - "metadata": "", - "name": "assets\\Heart.png", - "smoothed": true, - "userAdded": true - }, - { - "alwaysLoaded": false, - "file": "assets/Heart-1.png", - "kind": "image", - "metadata": "", - "name": "assets\\Heart-1.png", - "smoothed": true, - "userAdded": false - }, - { - "alwaysLoaded": false, - "file": "assets/Heart-1-1.png", - "kind": "image", - "metadata": "", - "name": "assets\\Heart-1-1.png", - "smoothed": true, - "userAdded": false - }, - { - "alwaysLoaded": false, - "file": "assets/Bomb_No Shadow.png", + "file": "assets/Playing Card_Spades A.png", "kind": "image", "metadata": "", - "name": "Bomb_No Shadow.png", + "name": "Playing Card_Spades A.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://asset-resources.gdevelop.io/public-resources/32x32 Fantasy Icons Pack v2/Icons/General Items/1ceb65f6eab8e1594f3d784d881fc1eaf87a02d9e331b7ff811acc1bca3e1c2a_Bomb_No Shadow.png", - "name": "Bomb_No Shadow.png" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/d6c8fa7a19720e25768ac3cdddc4790cbd56ff04e861f5cc06157491289efb52_Playing Card_Spades A.png", + "name": "Playing Card_Spades A.png" } }, { "alwaysLoaded": false, - "file": "assets/Bomb_Shadow.png", + "file": "assets/Playing Card_Spades J.png", "kind": "image", "metadata": "", - "name": "Bomb_Shadow.png", + "name": "Playing Card_Spades J.png", "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://asset-resources.gdevelop.io/public-resources/32x32 Fantasy Icons Pack v2/Icons/General Items/a58e750a7f074351f00ca54fa599fb9c383dcf55c942a27441d0d799228051e1_Bomb_Shadow.png", - "name": "Bomb_Shadow.png" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/136684a4f36434065d973b1ece901950de48a869b9fc16e07df140cdd702bc92_Playing Card_Spades J.png", + "name": "Playing Card_Spades J.png" } }, { "alwaysLoaded": false, - "file": "assets/Plus Key.png", + "file": "assets/Playing Card_Spades K.png", "kind": "image", "metadata": "", - "name": "Plus Key.png", - "smoothed": true, + "name": "Playing Card_Spades K.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Dark/fc542dd4d657e2a0bc2a7beaf49ca6135611119f11b7bcd5b5b0f97d273c6634_Plus Key.png", - "name": "Plus Key.png" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/80dea9fc24669c302a3d28f41c35765295c1d16098b99d123257ead12cdddd9a_Playing Card_Spades K.png", + "name": "Playing Card_Spades K.png" } }, { "alwaysLoaded": false, - "file": "assets/Minus Key.png", + "file": "assets/Playing Card_Spades Q.png", "kind": "image", "metadata": "", - "name": "Minus Key.png", - "smoothed": true, + "name": "Playing Card_Spades Q.png", + "smoothed": false, "userAdded": false, "origin": { - "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Dark/4c2d6e9b511305699472697c840548f3081e21e6a8f678342495570fda6a6edb_Minus Key.png", - "name": "Minus Key.png" + "identifier": "https://asset-resources.gdevelop.io/public-resources/Sylly/Large/88c238e3e05549f19877a9a2788496d7fa198ebb3270dd5099373cbd8ed1b71c_Playing Card_Spades Q.png", + "name": "Playing Card_Spades Q.png" } } ], @@ -1411,7 +1380,7 @@ "gridColor": 10401023, "gridAlpha": 0.2, "snap": true, - "zoomFactor": 0.6599999999999997, + "zoomFactor": 1.04, "windowMask": false }, "objectsGroups": [ @@ -1452,8 +1421,8 @@ "name": "Unit_ResourceBar", "persistentUuid": "0c4d4e97-0b53-4f05-8468-7d8b7a7fa8dd", "width": 0, - "x": 80, - "y": 146, + "x": 128, + "y": 224, "zOrder": 13, "numberProperties": [], "stringProperties": [], @@ -1526,9 +1495,9 @@ "layer": "", "name": "NewPanelSprite", "persistentUuid": "d0461165-f597-4574-b3e8-8e78014d1c61", - "width": 336, - "x": 440, - "y": 496, + "width": 288, + "x": 464, + "y": 490, "zOrder": 0, "numberProperties": [], "stringProperties": [], @@ -1542,8 +1511,8 @@ "name": "Heart_Tiled", "persistentUuid": "63560c9a-582e-4a76-9560-e929ab4a1fdf", "width": 24, - "x": 480, - "y": 518, + "x": 504, + "y": 512, "zOrder": 21, "numberProperties": [], "stringProperties": [], @@ -1557,8 +1526,8 @@ "name": "Heart", "persistentUuid": "19dc3b0f-137e-428c-ae37-9a64934186c6", "width": 0, - "x": 64, - "y": 520, + "x": 152, + "y": 512, "zOrder": 19, "numberProperties": [], "stringProperties": [], @@ -1601,9 +1570,9 @@ "layer": "", "name": "NewPanelSprite", "persistentUuid": "4598dbb6-59cf-4253-9998-1c3b796491f3", - "width": 336, - "x": 24, - "y": 498, + "width": 280, + "x": 112, + "y": 490, "zOrder": 0, "numberProperties": [], "stringProperties": [], @@ -1617,7 +1586,7 @@ "name": "Bomb", "persistentUuid": "70dc048d-f1b7-4ed5-8d6b-f8a54eb65201", "width": 0, - "x": 56, + "x": 128, "y": 280, "zOrder": 24, "numberProperties": [], @@ -1653,6 +1622,111 @@ "numberProperties": [], "stringProperties": [], "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Arrow", + "persistentUuid": "7d2f81fb-834d-4237-8dbb-9fa7cceb316c", + "width": 0, + "x": 139, + "y": 331, + "zOrder": 28, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 58, + "layer": "", + "name": "PlayingCard", + "persistentUuid": "398851ad-3ee9-42b2-a8f9-44c10a9a25b6", + "width": 43.28985595703125, + "x": 132.71014404296875, + "y": 398, + "zOrder": 29, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ChangeAnimation_Text", + "persistentUuid": "9f9d682b-8f01-4be1-8309-47306157a1b4", + "width": 0, + "x": 32, + "y": 416, + "zOrder": 31, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "PartialOpacity_Text", + "persistentUuid": "6b1134a9-2476-4e8d-a028-928ceb707c67", + "width": 0, + "x": 40, + "y": 344, + "zOrder": 32, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "HideSprite_Text", + "persistentUuid": "9ddf0239-b395-4c47-97be-1c1c609e58d9", + "width": 0, + "x": 37, + "y": 502, + "zOrder": 33, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "TintColor_Text", + "persistentUuid": "18cc456d-0b24-48da-9237-60dce916d4ae", + "width": 0, + "x": 40, + "y": 224, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "NoMaximum_Text", + "persistentUuid": "8b35a177-ffc1-455f-a122-c2b3ffde519f", + "width": 0, + "x": 32, + "y": 288, + "zOrder": 35, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] } ], "objects": [ @@ -2747,7 +2821,7 @@ "assetStoreId": "", "bold": true, "italic": false, - "name": "TiledSpriteResourceBar_Text", + "name": "ChangeAnimation_Text", "smoothed": true, "tags": "", "type": "TextObject::Text", @@ -2755,9 +2829,9 @@ "variables": [], "effects": [], "behaviors": [], - "string": "Tiled Sprite Resource Bar", + "string": " Change\nAnimation", "font": "", - "characterSize": 20, + "characterSize": 15, "color": { "b": 255, "g": 255, @@ -2768,7 +2842,7 @@ "assetStoreId": "", "bold": true, "italic": false, - "name": "ResourceMouseX_Text", + "name": "HideSprite_Text", "smoothed": true, "tags": "", "type": "TextObject::Text", @@ -2776,9 +2850,9 @@ "variables": [], "effects": [], "behaviors": [], - "string": "Resource \n(Mouse X)", + "string": " Zero\nOpacity", "font": "", - "characterSize": 30, + "characterSize": 15, "color": { "b": 255, "g": 255, @@ -2789,7 +2863,7 @@ "assetStoreId": "", "bold": true, "italic": false, - "name": "Title_Text", + "name": "PartialOpacity_Text", "smoothed": true, "tags": "", "type": "TextObject::Text", @@ -2797,9 +2871,9 @@ "variables": [], "effects": [], "behaviors": [], - "string": "Extension: Resource Bar", + "string": " Partial\nOpacity", "font": "", - "characterSize": 30, + "characterSize": 15, "color": { "b": 255, "g": 255, @@ -2808,15 +2882,120 @@ }, { "assetStoreId": "", - "name": "ResourceBarNew", + "bold": true, + "italic": false, + "name": "TintColor_Text", + "smoothed": true, "tags": "", - "type": "PrimitiveDrawing::Drawer", + "type": "TextObject::Text", + "underlined": false, "variables": [], "effects": [], - "behaviors": [ - { - "name": "DrawResourceBar", - "type": "DrawResourceBar::DrawResourceBar", + "behaviors": [], + "string": " Tint\nColor", + "font": "", + "characterSize": 15, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "NoMaximum_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": " No\nMaximum", + "font": "", + "characterSize": 15, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "TiledSpriteResourceBar_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Tiled Sprite Resource Bar", + "font": "", + "characterSize": 20, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "ResourceMouseX_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Resource \n(Mouse X)", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Title_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Extension: Resource Bar", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "name": "ResourceBarNew", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", "ValueMin": 0, "ValueMax": 1, "TickSpacing": 0, @@ -3324,1378 +3503,748 @@ ] } ] - } - ], - "events": [ + }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Initialize game", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "assetStoreId": "34375c20ea59e09d2ee67954a88f957e3e54b1b6b11709c90358582201efd2fa", + "name": "Arrow", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DepartScene" - }, - "parameters": [ - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Opacity" - }, - "parameters": [ - "Moon", - "=", - "128" - ] - }, - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "MaxResource", - "=", - "CameraBorderRight()" - ] - } - ], - "events": [ + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ChangeColor" + "hasCustomCollisionMask": false, + "image": "Arrow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "\"144;19;254\"" - ] - }, - { - "type": { - "value": "SetCenter" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "=", - "Fly.CenterX()", - "=", - "Fly.CenterY()-10" - ] - }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "fc2056e93d67c0f9c0bbc0b5fd35264bce619b4ea8d1896ba95cc8e91da5df7e", + "name": "Key", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Filled", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "Sticker::Sticker::Stick" + "hasCustomCollisionMask": false, + "image": "Key_Filled.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "Sticker", - "Fly", - "" - ] - }, - { - "type": { - "value": "Cache" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon" - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Outline", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "MiniHealth_Bar", - "Fly.X()", - "Fly.Y()", - "\"\"" - ] - }, - { - "type": { - "value": "MettreXY" - }, - "parameters": [ - "MiniHealth_Bar", - "=", - "Fly.CenterX() - MiniHealth_Bar.DrawResourceBar::BarLength()/2", - "=", - "Fly.BoundingBoxTop()" - ] - }, - { - "type": { - "value": "Sticker::Sticker::Stick" + "hasCustomCollisionMask": false, + "image": "Key_Outline.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "MiniHealth_Bar", - "Sticker", - "Fly", - "" - ] - } - ] - }, - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DebuggerTools::EnableDebugDraw" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "", - "", - "", - "" - ] + "customCollisionMask": [] } ] } ] } - ], - "parameters": [] + ] }, { - "colorB": 224, - "colorG": 16, - "colorR": 189, - "creationTime": 0, - "name": "Draw Resource bars", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "assetStoreId": "aa070e1502e7340c6d3e71f79a2ae05f56f9ad9f7cbb9d6cc587118ed28504aa", + "name": "PlayingCard", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Tiled resource bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "name": "Hearts A", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + "hasCustomCollisionMask": false, + "image": "Playing Card_Hearts A.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "=", - "10", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "TiledEmptyUiHeart", - "TiledResourceBar", - "=", - "10", - "" - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Back Blue 1", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "KeyReleased" + "hasCustomCollisionMask": false, + "image": "Playing Card_Back Blue 1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "Left" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "-", - "1", - "" - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Clubs 02", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "KeyReleased" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 02.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "Right" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "+", - "1", - "" - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Back Blue 2", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + "hasCustomCollisionMask": false, + "image": "Playing Card_Back Blue 2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "TiledEmptyUiHeart", - "TiledResourceBar", - "" - ] + "customCollisionMask": [] } ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + } + ] + }, + { + "name": "Back Brown 1", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + "hasCustomCollisionMask": false, + "image": "Playing Card_Back Brown 1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "HealthBarFill", - "TiledResourceBar", - "" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [] + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Sprite resource bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "name": "Back Brown 2", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "DepartScene" + "hasCustomCollisionMask": false, + "image": "Playing Card_Back Brown 2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } - ], - "actions": [ + ] + } + ] + }, + { + "name": "Back Red 1", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ModVarScene" + "hasCustomCollisionMask": false, + "image": "Playing Card_Back Red 1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Units", - "=", - "5" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" - }, - "parameters": [ - "Tiled_ResourceBar", - "TiledResourceBar", - "=", - "10", - "" - ] - } - ] - }, + ] + } + ] + }, + { + "name": "Back Red 2", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Cache" - }, - "parameters": [ - "Unit_ResourceBar" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetMaxQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "10", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitColor" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "\"74;144;226\"", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitOpacity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "64", - "" - ] - } - ] + "hasCustomCollisionMask": false, + "image": "Playing Card_Back Red 2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Clubs 03", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "KeyReleased" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 03.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "Left" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } - ], - "actions": [ + ] + } + ] + }, + { + "name": "Clubs 04", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ModVarScene" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 04.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Units", - "=", - "max(0,Variable(Units)-1)" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "-", - "1", - "" - ] - } - ] - }, - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::DecreaseQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "1", - "" - ] - } - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Clubs 05", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "KeyReleased" - }, - "parameters": [ - "", - "Right" - ] - } - ], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ModVarScene" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 05.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Units", - "+", - "1" - ] - } - ], - "events": [ - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::IncreaseQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "1", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" - }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "+", - "1", - "" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::DrawResourceBar" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Unit_ResourceBar", - "UnitResourceBar", - "Heart_Unit", - "5", - "" - ] + "customCollisionMask": [] } ] } - ], - "parameters": [] - } - ], - "parameters": [] - }, - { - "colorB": 224, - "colorG": 16, - "colorR": 189, - "creationTime": 0, - "name": "Buttons", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + ] + }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Hover", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "name": "Clubs 06", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "inverted": true, - "value": "SourisSurObjet" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 06.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Buttons", - "", - "", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "EnableEffect" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Buttons", - "\"Effect\"", - "no" - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Clubs 07", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "SourisSurObjet" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 07.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Buttons", - "", - "", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "EnableEffect" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Buttons", - "\"Effect\"", - "yes" - ] + "customCollisionMask": [] } ] } - ], - "parameters": [] + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Clicked", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "name": "Clubs 08", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "MouseButtonReleased" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 08.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "Left" - ] - }, - { - "type": { - "value": "ScaleWidth" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Buttons", - "=", - "0.9" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "SourisSurObjet" - }, - "parameters": [ - "PlusKey", - "", - "", - "" - ] - } - ], - "actions": [], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Sprite", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Tiled sprite", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [] - } - ], - "parameters": [] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "SourisSurObjet" - }, - "parameters": [ - "MinusKey", - "", - "", - "" - ] - } - ], - "actions": [], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Sprite", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Tiled sprite", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [] - } - ], - "parameters": [] - } - ] + "customCollisionMask": [] } ] } - ], - "parameters": [] + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Press", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "name": "Clubs 09", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "MouseButtonPressed" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 09.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "Left" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "SourisSurObjet" - }, - "parameters": [ - "Buttons", - "", - "", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "Buttons", - "\"189;16;224\"" - ] - }, - { - "type": { - "value": "ChangeScale" - }, - "parameters": [ - "Buttons", - "=", - "0.9" - ] - } - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Clubs 10", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "inverted": true, - "value": "MouseButtonPressed" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs 10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "Left" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeColor" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Buttons", - "\"255;255;255\"" - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Clubs A", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ChangeScale" + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs A.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Buttons", - "=", - "1" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [] - } - ], - "parameters": [] - } - ], - "layers": [ - { - "ambientLightColorB": 32, - "ambientLightColorG": 0, - "ambientLightColorR": 0, - "followBaseLayerCamera": false, - "isLightingLayer": false, - "name": "", - "visibility": true, - "cameras": [ + ] + }, { - "defaultSize": true, - "defaultViewport": true, - "height": 0, - "viewportBottom": 1, - "viewportLeft": 0, - "viewportRight": 1, - "viewportTop": 0, - "width": 0 - } - ], - "effects": [] - } - ], - "behaviorsSharedData": [ - { - "name": "DrawResourceBar", - "type": "DrawResourceBarOLD::DrawResourceBarOLD" - }, - { - "name": "DrawResourceBar222", - "type": "ResourceBar::ResourceBar_ShapePainter" - }, - { - "name": "Health", - "type": "Health::Health" - }, - { - "name": "ShakeObject_PositionAngleScale", - "type": "ShakeObject::ShakeObject_PositionAngleScale" - }, - { - "name": "Shield", - "type": "Health::Shield" - }, - { - "name": "Sticker", - "type": "Sticker::Sticker" - }, - { - "name": "TiledResourceBar", - "type": "ResourceBar::ResourceBar_TiledSprite" - }, - { - "name": "UnitResourceBar", - "type": "ResourceBar::ResourceBar_Sprite" - } - ] - }, - { - "b": 0, - "disableInputWhenNotFocused": true, - "mangledName": "Shape_32Painter_32_40Game_41", - "name": "Shape Painter (Game)", - "r": 0, - "standardSortMethod": true, - "stopSoundsOnStartup": true, - "title": "", - "v": 0, - "uiSettings": { - "grid": true, - "gridType": "rectangular", - "gridWidth": 8, - "gridHeight": 8, - "gridOffsetX": 0, - "gridOffsetY": 0, - "gridColor": 10401023, - "gridAlpha": 0.2, - "snap": true, - "zoomFactor": 1.06, - "windowMask": false - }, - "objectsGroups": [], - "variables": [], - "instances": [ - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Shield_Bar", - "persistentUuid": "b581caf8-44ee-423e-b57e-cdd910fb7374", - "width": 0, - "x": 192, - "y": 216, - "zOrder": 2, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "ResourceMouseX_Bar", - "persistentUuid": "17a23f4a-a442-4b52-8380-9f2b6a9c2494", - "width": 0, - "x": 192, - "y": 536, - "zOrder": 3, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": true, - "height": 80, - "layer": "", - "name": "Fly", - "persistentUuid": "e0b70af7-7a81-41c3-88ac-88305df91ed2", - "width": 128, - "x": 481.13275146484375, - "y": 293, - "zOrder": 4, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": true, - "height": 128, - "layer": "", - "name": "Moon", - "persistentUuid": "8428ea9d-6d1e-41b0-9f54-1840f3378846", - "width": 129.1327362060547, - "x": 480, - "y": 272, - "zOrder": 0, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Health_Text", - "persistentUuid": "921b2f28-8bee-4ab2-a6cc-1ee823c5215e", - "width": 0, - "x": 48, - "y": 96, - "zOrder": 9, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Shield_Text", - "persistentUuid": "a231209b-a5d8-4280-868d-1e9beb31527b", - "width": 0, - "x": 48, - "y": 208, - "zOrder": 10, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "ResourceMouseX_Text", - "persistentUuid": "07fda015-55f8-4959-80fc-f1ee3074d028", - "width": 0, - "x": 32, - "y": 512, - "zOrder": 11, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Title_Text", - "persistentUuid": "29ae792c-1331-430c-aadf-70fa8d9e36d6", - "width": 0, - "x": 208, - "y": 16, - "zOrder": 12, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Health_Bar", - "persistentUuid": "c411b32c-f357-4b8f-9e87-f3fdde7657d5", - "width": 0, - "x": 192, - "y": 104, - "zOrder": 1, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - } - ], - "objects": [ - { - "assetStoreId": "", - "name": "Health_Bar", - "tags": "", - "type": "PrimitiveDrawing::Drawer", - "variables": [], - "effects": [], - "behaviors": [ + "name": "Clubs J", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs J.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, { - "name": "DrawResourceBar222", - "type": "ResourceBar::ResourceBar_ShapePainter", - "ValueMin": 0, - "ValueMax": 1, - "TickSpacing": 0, - "BarLength": 200, - "BarThickness": 16, - "InactiveBarColor": "11;255;0", - "InactiveBarOpacity": 96, - "ActiveBarColor": " 11;255;0", - "ActiveBarOpacity": 255, - "RoundedBar": true, - "Value": 0, - "ThumbOffset": 0, - "NeedRedraw": true - } - ], - "fillOpacity": 255, - "outlineSize": 1, - "outlineOpacity": 255, - "fillColor": { - "b": 255, - "g": 255, - "r": 255 - }, - "outlineColor": { - "b": 0, - "g": 0, - "r": 0 - }, - "absoluteCoordinates": false, - "clearBetweenFrames": true - }, - { - "assetStoreId": "", - "name": "MiniHealth_Bar", - "tags": "", - "type": "PrimitiveDrawing::Drawer", - "variables": [], - "effects": [], - "behaviors": [ + "name": "Clubs K", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs K.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, { - "name": "DrawResourceBar", - "type": "ResourceBar::ResourceBar_ShapePainter", - "ValueMin": 0, - "ValueMax": 1, - "TickSpacing": 0, - "BarLength": 50, - "BarThickness": 4, - "InactiveBarColor": "11;255;0", - "InactiveBarOpacity": 96, - "ActiveBarColor": " 11;255;0", - "ActiveBarOpacity": 255, - "Value": 0, - "ThumbOffset": 0, - "NeedRedraw": true + "name": "Clubs Q", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Clubs Q.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] }, { - "name": "Sticker", - "type": "Sticker::Sticker", - "OnlyFollowPosition": true - } - ], - "fillOpacity": 255, - "outlineSize": 1, - "outlineOpacity": 255, - "fillColor": { - "b": 255, - "g": 255, - "r": 255 - }, - "outlineColor": { - "b": 0, - "g": 0, - "r": 0 - }, - "absoluteCoordinates": false, - "clearBetweenFrames": true - }, - { - "assetStoreId": "", - "name": "Shield_Bar", - "tags": "", - "type": "PrimitiveDrawing::Drawer", - "variables": [], - "effects": [], - "behaviors": [ + "name": "Diamond 02", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 02.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, { - "name": "DrawResourceBar222", - "type": "ResourceBar::ResourceBar_ShapePainter", - "ValueMin": 0, - "ValueMax": 1, - "TickSpacing": 0, - "ThumbShape": "circle", - "ThumbWidth": 20, - "ThumbHeight": 20, - "ThumbColor": " 24;119;211", - "ThumbOpacity": 255, - "BarLength": 200, - "BarThickness": 16, - "InactiveBarColor": "144;19;254", - "InactiveBarOpacity": 96, - "ActiveBarColor": " 144;19;254", - "ActiveBarOpacity": 255, - "HaloRadius": 24, - "HaloOpacityHover": 32, - "HaloOpacityClick": 64, - "RoundedBar": true, - "Enabled": true, - "IsBeingDragged": false, - "Value": 0, - "ThumbOffset": 0, - "NeedRedraw": true, - "IsHovered": false, - "MouseX": 0, - "MouseY": 0, - "CurrentHaloRadius": 0, - "HaloGrowSpeed": 0.2, - "TargetHaloRadius": 0.19999992847442627 - } - ], - "fillOpacity": 255, - "outlineSize": 1, - "outlineOpacity": 255, - "fillColor": { - "b": 255, - "g": 255, - "r": 255 - }, - "outlineColor": { - "b": 0, - "g": 0, - "r": 0 - }, - "absoluteCoordinates": false, - "clearBetweenFrames": true - }, - { - "assetStoreId": "", - "name": "ResourceMouseX_Bar", - "tags": "", - "type": "PrimitiveDrawing::Drawer", - "variables": [], - "effects": [], - "behaviors": [ - { - "name": "DrawResourceBar222", - "type": "ResourceBar::ResourceBar_ShapePainter", - "ValueMin": 0, - "ValueMax": 1, - "TickSpacing": 0, - "ThumbShape": "circle", - "ThumbWidth": 20, - "ThumbHeight": 20, - "ThumbColor": "248;231;28", - "ThumbOpacity": 255, - "BarLength": 200, - "BarThickness": 16, - "InactiveBarColor": "248;231;28", - "InactiveBarOpacity": 96, - "ActiveBarColor": "248;231;28", - "ActiveBarOpacity": 255, - "HaloRadius": 24, - "HaloOpacityHover": 32, - "HaloOpacityClick": 64, - "RoundedBar": false, - "Enabled": true, - "IsBeingDragged": false, - "Value": 0, - "ThumbOffset": 0, - "NeedRedraw": true, - "IsHovered": false, - "MouseX": 0, - "MouseY": 0, - "CurrentHaloRadius": 0, - "HaloGrowSpeed": 0.2, - "TargetHaloRadius": 0.19999992847442627 - } - ], - "fillOpacity": 255, - "outlineSize": 1, - "outlineOpacity": 255, - "fillColor": { - "b": 255, - "g": 255, - "r": 255 - }, - "outlineColor": { - "b": 0, - "g": 0, - "r": 0 - }, - "absoluteCoordinates": false, - "clearBetweenFrames": true - }, - { - "assetStoreId": "48a2d179a1921276abe3f99ce3cf195fa7c310bc511fa215d9647c3fb9027921", - "name": "Fly", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [ - { - "name": "Health", - "type": "Health::Health", - "Health": 100, - "DamageCooldown": 0, - "MaxHealth": 100, - "IsJustDamaged": false, - "HealthRegenRate": 0, - "HealthRegenDelay": 0, - "AllowOverHealing": false, - "HitAtLeastOnce": false - }, - { - "name": "ShakeObject_PositionAngleScale", - "type": "ShakeObject::ShakeObject_PositionAngleScale" - }, - { - "name": "Shield", - "type": "Health::Shield", - "RequireHealth": "Health", - "MaxShieldPoints": 30, - "ShieldDuration": 5, - "ShieldPoints": 0, - "ShieldRegenRate": 0, - "ShieldBlocksExcessDamage": false, - "ShieldRegenDelay": 0, - "RegenShieldWhenZeroPoints": false, - "IsShieldJustDamaged": false - } - ], - "animations": [ - { - "name": "", + "name": "Diamond 03", "useMultipleDirections": false, "directions": [ { "looping": true, - "timeBetweenFrames": 0.05000000074505806, + "timeBetweenFrames": 0.02500000037252903, "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Fly_1.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 03.png", "points": [], "originPoint": { "name": "origine", @@ -4703,35 +4252,28 @@ "y": 0 }, "centerPoint": { - "automatic": false, + "automatic": true, "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 + "x": 0, + "y": 0 }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Diamond 04", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Fly_2.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 04.png", "points": [], "originPoint": { "name": "origine", @@ -4739,35 +4281,28 @@ "y": 0 }, "centerPoint": { - "automatic": false, + "automatic": true, "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 + "x": 0, + "y": 0 }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Diamond 05", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Fly_3.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 05.png", "points": [], "originPoint": { "name": "origine", @@ -4775,35 +4310,28 @@ "y": 0 }, "centerPoint": { - "automatic": false, + "automatic": true, "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 + "x": 0, + "y": 0 }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Diamond 06", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Fly_4.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 06.png", "points": [], "originPoint": { "name": "origine", @@ -4811,35 +4339,28 @@ "y": 0 }, "centerPoint": { - "automatic": false, + "automatic": true, "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 + "x": 0, + "y": 0 }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Diamond 07", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Fly_5.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 07.png", "points": [], "originPoint": { "name": "origine", @@ -4847,71 +4368,28 @@ "y": 0 }, "centerPoint": { - "automatic": false, + "automatic": true, "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 - }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, - { - "hasCustomCollisionMask": true, - "image": "Fly_6.png", - "points": [], - "originPoint": { - "name": "origine", "x": 0, "y": 0 }, - "centerPoint": { - "automatic": false, - "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 - }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Diamond 08", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Fly_7.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 08.png", "points": [], "originPoint": { "name": "origine", @@ -4919,71 +4397,28 @@ "y": 0 }, "centerPoint": { - "automatic": false, + "automatic": true, "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 - }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, - { - "hasCustomCollisionMask": true, - "image": "Fly_8.png", - "points": [], - "originPoint": { - "name": "origine", "x": 0, "y": 0 }, - "centerPoint": { - "automatic": false, - "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 - }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Diamond 09", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Fly_9.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Diamond 09.png", "points": [], "originPoint": { "name": "origine", @@ -4991,86 +4426,19 @@ "y": 0 }, "centerPoint": { - "automatic": false, + "automatic": true, "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 - }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] - }, - { - "hasCustomCollisionMask": true, - "image": "Fly_10.png", - "points": [], - "originPoint": { - "name": "origine", "x": 0, "y": 0 }, - "centerPoint": { - "automatic": false, - "name": "centre", - "x": 57.500244140625, - "y": 48.2830924987793 - }, - "customCollisionMask": [ - [ - { - "x": 35, - "y": 25 - }, - { - "x": 80, - "y": 25 - }, - { - "x": 80, - "y": 70 - }, - { - "x": 35, - "y": 70 - } - ] - ] + "customCollisionMask": [] } ] } ] - } - ] - }, - { - "assetStoreId": "574655a4565bd983af8f5dd98e0fd8cda3bd67cf929c00d3db317e898322e06b", - "name": "Star", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "LargeNarrow", + "name": "Diamond 10", "useMultipleDirections": false, "directions": [ { @@ -5079,7 +4447,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Star_LargeNarrow.png", + "image": "Playing Card_Diamond 10.png", "points": [], "originPoint": { "name": "origine", @@ -5099,7 +4467,7 @@ ] }, { - "name": "LargeWide", + "name": "Diamond A", "useMultipleDirections": false, "directions": [ { @@ -5108,7 +4476,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Star_LargeWide.png", + "image": "Playing Card_Diamond A.png", "points": [], "originPoint": { "name": "origine", @@ -5128,7 +4496,7 @@ ] }, { - "name": "Medium", + "name": "Diamond J", "useMultipleDirections": false, "directions": [ { @@ -5137,7 +4505,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Star_Medium.png", + "image": "Playing Card_Diamond J.png", "points": [], "originPoint": { "name": "origine", @@ -5157,7 +4525,7 @@ ] }, { - "name": "Small", + "name": "Diamond K", "useMultipleDirections": false, "directions": [ { @@ -5166,7 +4534,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Star_Small.png", + "image": "Playing Card_Diamond K.png", "points": [], "originPoint": { "name": "origine", @@ -5184,21 +4552,9 @@ ] } ] - } - ] - }, - { - "assetStoreId": "8d92592738465177b86ec18299ef6e6394ae24eeb7a7d6dfdcbbdb55fab902aa", - "name": "BlueLaser01", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "", + "name": "Diamond Q", "useMultipleDirections": false, "directions": [ { @@ -5207,7 +4563,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Blue laser (01).png", + "image": "Playing Card_Diamond Q.png", "points": [], "originPoint": { "name": "origine", @@ -5225,34 +4581,38 @@ ] } ] - } - ] - }, - { - "assetStoreId": "794ab341df538c9b3bdad418dfdcccc7be5d90f3d0b5929d6d528a542c6ed3ae", - "name": "SilverShield", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [ + }, { - "effectType": "Outline", - "name": "Effect", - "doubleParameters": { - "padding": 2, - "thickness": 2 - }, - "stringParameters": { - "color": "255;255;255" - }, - "booleanParameters": {} - } - ], - "behaviors": [], - "animations": [ + "name": "Hearts 02", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Hearts 02.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, { - "name": "", + "name": "Hearts 03", "useMultipleDirections": false, "directions": [ { @@ -5261,12 +4621,12 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Silver shield.png", + "image": "Playing Card_Hearts 03.png", "points": [], "originPoint": { "name": "origine", - "x": 14.592423439025879, - "y": 15.103429794311523 + "x": 0, + "y": 0 }, "centerPoint": { "automatic": true, @@ -5279,21 +4639,9 @@ ] } ] - } - ] - }, - { - "assetStoreId": "d2bc2d266f5bb666ef68023abc14f51bc8fe8b5222af931efa378ac10c50f98a", - "name": "MeteorDetailed", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "Large", + "name": "Hearts 04", "useMultipleDirections": false, "directions": [ { @@ -5301,13 +4649,13 @@ "timeBetweenFrames": 0.02500000037252903, "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Meteor Detailed_Large.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Hearts 04.png", "points": [], "originPoint": { "name": "origine", - "x": 65.07723999023438, - "y": 63.82252502441406 + "x": 0, + "y": 0 }, "centerPoint": { "automatic": true, @@ -5315,33 +4663,14 @@ "x": 0, "y": 0 }, - "customCollisionMask": [ - [ - { - "x": 20, - "y": 20 - }, - { - "x": 110, - "y": 20 - }, - { - "x": 110, - "y": 110 - }, - { - "x": 20, - "y": 110 - } - ] - ] + "customCollisionMask": [] } ] } ] }, { - "name": "Small", + "name": "Hearts 05", "useMultipleDirections": false, "directions": [ { @@ -5349,13 +4678,13 @@ "timeBetweenFrames": 0.02500000037252903, "sprites": [ { - "hasCustomCollisionMask": true, - "image": "Meteor Detailed_Small.png", + "hasCustomCollisionMask": false, + "image": "Playing Card_Hearts 05.png", "points": [], "originPoint": { "name": "origine", - "x": 65.07723999023438, - "y": 63.82252502441406 + "x": 0, + "y": 0 }, "centerPoint": { "automatic": true, @@ -5363,45 +4692,14 @@ "x": 0, "y": 0 }, - "customCollisionMask": [ - [ - { - "x": 20, - "y": 20 - }, - { - "x": 110, - "y": 20 - }, - { - "x": 110, - "y": 110 - }, - { - "x": 20, - "y": 110 - } - ] - ] + "customCollisionMask": [] } ] } ] - } - ] - }, - { - "assetStoreId": "a1e62f5a19d1fe476e2ad0b8977768d020cc1dc55423427f79a486664cebb631", - "name": "UpgradedPotionBlue", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "No Shadow", + "name": "Hearts 06", "useMultipleDirections": false, "directions": [ { @@ -5410,12 +4708,12 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Upgraded Potion Blue_No Shadow.png", + "image": "Playing Card_Hearts 06.png", "points": [], "originPoint": { "name": "origine", - "x": 15.793042182922363, - "y": 15.89681625366211 + "x": 0, + "y": 0 }, "centerPoint": { "automatic": true, @@ -5430,7 +4728,7 @@ ] }, { - "name": "Shadow", + "name": "Hearts 07", "useMultipleDirections": false, "directions": [ { @@ -5439,12 +4737,12 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Upgraded Potion Blue_Shadow.png", + "image": "Playing Card_Hearts 07.png", "points": [], "originPoint": { "name": "origine", - "x": 15.793042182922363, - "y": 15.89681625366211 + "x": 0, + "y": 0 }, "centerPoint": { "automatic": true, @@ -5457,27 +4755,38 @@ ] } ] - } - ] - }, - { - "assetStoreId": "c2ce913ddbcd055c4e49a1c01b63aff1a3d59e4e1c1845db4c38aedda3712d3a", - "name": "Moon", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [ + }, { - "name": "Sticker", - "type": "Sticker::Sticker", - "OnlyFollowPosition": false - } - ], - "animations": [ + "name": "Hearts 08", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Hearts 08.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, { - "name": "", + "name": "Hearts 09", "useMultipleDirections": false, "directions": [ { @@ -5486,7 +4795,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Moon.png", + "image": "Playing Card_Hearts 09.png", "points": [], "originPoint": { "name": "origine", @@ -5504,162 +4813,9 @@ ] } ] - } - ] - }, - { - "assetStoreId": "", - "bold": true, - "italic": false, - "name": "Health_Text", - "smoothed": true, - "tags": "", - "type": "TextObject::Text", - "underlined": false, - "variables": [], - "effects": [], - "behaviors": [], - "string": "Health", - "font": "", - "characterSize": 30, - "color": { - "b": 255, - "g": 255, - "r": 255 - } - }, - { - "assetStoreId": "", - "bold": true, - "italic": false, - "name": "Shield_Text", - "smoothed": true, - "tags": "", - "type": "TextObject::Text", - "underlined": false, - "variables": [], - "effects": [], - "behaviors": [], - "string": "Shield", - "font": "", - "characterSize": 30, - "color": { - "b": 255, - "g": 255, - "r": 255 - } - }, - { - "assetStoreId": "", - "bold": true, - "italic": false, - "name": "ResourceMouseX_Text", - "smoothed": true, - "tags": "", - "type": "TextObject::Text", - "underlined": false, - "variables": [], - "effects": [], - "behaviors": [], - "string": "Resource \n(Mouse X)", - "font": "", - "characterSize": 30, - "color": { - "b": 255, - "g": 255, - "r": 255 - } - }, - { - "assetStoreId": "", - "bold": true, - "italic": false, - "name": "Title_Text", - "smoothed": true, - "tags": "", - "type": "TextObject::Text", - "underlined": false, - "variables": [], - "effects": [], - "behaviors": [], - "string": "Extension: Resource Bar", - "font": "", - "characterSize": 30, - "color": { - "b": 255, - "g": 255, - "r": 255 - } - }, - { - "assetStoreId": "", - "name": "ResourceBarNew", - "tags": "", - "type": "PrimitiveDrawing::Drawer", - "variables": [], - "effects": [], - "behaviors": [ - { - "name": "DrawResourceBar", - "type": "DrawResourceBar::DrawResourceBar", - "ValueMin": 0, - "ValueMax": 1, - "TickSpacing": 0, - "BarLength": 200, - "BarThickness": 4, - "InactiveBarColor": "11;255;0", - "InactiveBarOpacity": 96, - "ActiveBarColor": "11;255;0", - "ActiveBarOpacity": 255, - "RoundedBar": false, - "Value": 0, - "ThumbOffset": 0, - "NeedRedraw": true - } - ], - "fillOpacity": 255, - "outlineSize": 1, - "outlineOpacity": 255, - "fillColor": { - "b": 255, - "g": 255, - "r": 255 - }, - "outlineColor": { - "b": 0, - "g": 0, - "r": 0 - }, - "absoluteCoordinates": false, - "clearBetweenFrames": true - }, - { - "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", - "name": "Unit_ResourceBar", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [ - { - "name": "UnitResourceBar", - "type": "ResourceBar::ResourceBar_Sprite", - "StartingUnits": 3, - "CurrentUnits": 3, - "MaxUnits": 3, - "UnitSpacing": 0, - "NextUnitToCreate": 0, - "HideEmptyUnits": false, - "EmptyUnitOpacity": 64, - "EmptyUnitAnimation": 0, - "EmptyColorTint": "255;255;255", - "ActiveUnitOpacity": 255 - } - ], - "animations": [ + }, { - "name": "", + "name": "Hearts 10", "useMultipleDirections": false, "directions": [ { @@ -5668,7 +4824,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Emote Heart.png", + "image": "Playing Card_Hearts 10.png", "points": [], "originPoint": { "name": "origine", @@ -5686,21 +4842,9 @@ ] } ] - } - ] - }, - { - "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", - "name": "Heart_Unit", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "", + "name": "Hearts J", "useMultipleDirections": false, "directions": [ { @@ -5709,7 +4853,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Emote Heart.png", + "image": "Playing Card_Hearts J.png", "points": [], "originPoint": { "name": "origine", @@ -5727,62 +4871,9 @@ ] } ] - } - ] - }, - { - "assetStoreId": "752e405ef67d9f9d1bd36f9763f1b6fc05633d64700982c0f3118a25a32e39b2", - "height": 16, - "name": "TiledEmptyUiHeart", - "tags": "", - "texture": "tiled_Tiled Empty UI Heart.png", - "type": "TiledSpriteObject::TiledSprite", - "width": 16, - "variables": [], - "effects": [], - "behaviors": [ - { - "name": "TiledResourceBar", - "type": "ResourceBar::ResourceBar_TiledSprite", - "StartingQuantity": 0, - "CurrentQuantity": 0, - "UnitWidth": 16, - "MaxQuantity": 0 - } - ] - }, - { - "assetStoreId": "abf51d082db5a117d9ee2e65299660f6787d47664e4571bad6db3075b3393c5f", - "height": 16, - "name": "Tiled_ResourceBar", - "tags": "", - "texture": "tiled_Tiled Filler UI Heart.png", - "type": "TiledSpriteObject::TiledSprite", - "width": 16, - "variables": [], - "effects": [], - "behaviors": [ - { - "name": "TiledResourceBar", - "type": "ResourceBar::ResourceBar_TiledSprite", - "StartingQuantity": 6, - "CurrentQuantity": 0, - "UnitWidth": 16 - } - ] - }, - { - "assetStoreId": "45107bbfbc2b5cbc83e3785f802b99664a23d59e74414e332c9afafac63e1ca3", - "name": "HealthBar", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "", + "name": "Hearts K", "useMultipleDirections": false, "directions": [ { @@ -5791,7 +4882,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Health Bar.png", + "image": "Playing Card_Hearts K.png", "points": [], "originPoint": { "name": "origine", @@ -5809,62 +4900,9 @@ ] } ] - } - ] - }, - { - "assetStoreId": "1f3dba67c868b7320572a6591d1d0418f23b7c132df0963cf77286a9149971d9", - "height": 128, - "name": "HealthBarFill", - "tags": "", - "texture": "tiled_Health Bar Fill.png", - "type": "TiledSpriteObject::TiledSprite", - "width": 128, - "variables": [], - "effects": [], - "behaviors": [] - }, - { - "assetStoreId": "3bd9517a10ad3d98341eea33f0c139f08a1b04f26500e85ac49bb7f9e157a303", - "height": 128, - "name": "EnergyBarFill", - "tags": "", - "texture": "tiled_Energy Bar Fill.png", - "type": "TiledSpriteObject::TiledSprite", - "width": 128, - "variables": [], - "effects": [], - "behaviors": [] - }, - { - "assetStoreId": "138ee716846635e3e0e5ab7b63752d1a36754f1ac874c70e1b5fa372d5a05474", - "bottomMargin": 6, - "height": 15, - "leftMargin": 11, - "name": "HealthBarBox", - "rightMargin": 9, - "tags": "", - "texture": "Health Bar Box.png", - "tiled": true, - "topMargin": 6, - "type": "PanelSpriteObject::PanelSprite", - "width": 96, - "variables": [], - "effects": [], - "behaviors": [] - }, - { - "assetStoreId": "7c1048053bc2d851157c4e0868c4ac0338f4ca93170d28990a7f64eaed2a1723", - "name": "HealthIndicator", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "Black Outline Empty", + "name": "Hearts Q", "useMultipleDirections": false, "directions": [ { @@ -5873,7 +4911,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Health Indicator_Black Outline Empty.png", + "image": "Playing Card_Hearts Q.png", "points": [], "originPoint": { "name": "origine", @@ -5893,7 +4931,7 @@ ] }, { - "name": "Black Outline Heart", + "name": "Joker Black", "useMultipleDirections": false, "directions": [ { @@ -5902,7 +4940,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Health Indicator_Black Outline Heart.png", + "image": "Playing Card_Joker Black.png", "points": [], "originPoint": { "name": "origine", @@ -5922,7 +4960,7 @@ ] }, { - "name": "White Outline Empty", + "name": "Joker Red", "useMultipleDirections": false, "directions": [ { @@ -5931,7 +4969,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Health Indicator_White Outline Empty.png", + "image": "Playing Card_Joker Red.png", "points": [], "originPoint": { "name": "origine", @@ -5951,7 +4989,7 @@ ] }, { - "name": "White Outline Heart", + "name": "Spades 02", "useMultipleDirections": false, "directions": [ { @@ -5960,7 +4998,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Health Indicator_White Outline Heart.png", + "image": "Playing Card_Spades 02.png", "points": [], "originPoint": { "name": "origine", @@ -5978,21 +5016,9 @@ ] } ] - } - ] - }, - { - "assetStoreId": "0714257da345b4ec7de558ac0e42290362b85a79c97160c0e09636cd2fc31e3c", - "name": "Heart", - "tags": "", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + }, { - "name": "", + "name": "Spades 03", "useMultipleDirections": false, "directions": [ { @@ -6001,7 +5027,7 @@ "sprites": [ { "hasCustomCollisionMask": false, - "image": "Heart.png", + "image": "Playing Card_Spades 03.png", "points": [], "originPoint": { "name": "origine", @@ -6019,278 +5045,347 @@ ] } ] - } - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Initialize game", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DepartScene" - }, - "parameters": [ - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Opacity" - }, - "parameters": [ - "Moon", - "=", - "128" - ] - }, + "name": "Spades 04", + "useMultipleDirections": false, + "directions": [ { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "MaxResource", - "=", - "CameraBorderRight()" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades 04.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] } - ], - "events": [ + ] + }, + { + "name": "Spades 05", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "ChangeColor" + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades 05.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "\"144;19;254\"" - ] - }, - { - "type": { - "value": "SetCenter" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "=", - "Fly.CenterX()", - "=", - "Fly.CenterY()-10" - ] - }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Spades 06", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "Sticker::Sticker::Stick" + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades 06.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon", - "Sticker", - "Fly", - "" - ] - }, - { - "type": { - "value": "Cache" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Moon" - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Spades 07", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "MiniHealth_Bar", - "Fly.X()", - "Fly.Y()", - "\"\"" - ] - }, + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "MettreXY" + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades 07.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "MiniHealth_Bar", - "=", - "Fly.CenterX() - MiniHealth_Bar.DrawResourceBar::BarLength()/2", - "=", - "Fly.BoundingBoxTop()" - ] - }, - { - "type": { - "value": "Sticker::Sticker::Stick" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "MiniHealth_Bar", - "Sticker", - "Fly", - "" - ] + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "Spades 08", + "useMultipleDirections": false, + "directions": [ { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "DebuggerTools::EnableDebugDraw" + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades 08.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "", - "", - "", - "", - "" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "folded": true, - "name": "Spawn items", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "name": "Spades 09", + "useMultipleDirections": false, + "directions": [ { - "type": { - "value": "RepeatEveryXSeconds::Repeat" - }, - "parameters": [ - "", - "\"SpawnShield\"", - "5", - "" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades 09.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] } - ], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "SilverShield", - "Fly.CenterX()", - "CameraBorderTop()", - "" - ] - }, + ] + }, + { + "name": "Spades 10", + "useMultipleDirections": false, + "directions": [ { - "type": { - "value": "AddForceAL" - }, - "parameters": [ - "SilverShield", - "90", - "75", - "1" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades 10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] - }, + } + ] + }, + { + "name": "Spades A", + "useMultipleDirections": false, + "directions": [ { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "SilverShield", - "\"144;19;254\"" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades A.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] } ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "name": "Spades J", + "useMultipleDirections": false, + "directions": [ { - "type": { - "value": "RepeatEveryXSeconds::Repeat" - }, - "parameters": [ - "", - "\"SpawnHealth\"", - "12", - "" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades J.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] } - ], - "actions": [ + ] + }, + { + "name": "Spades K", + "useMultipleDirections": false, + "directions": [ { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "UpgradedPotionBlue", - "Fly.CenterX()", - "CameraBorderBottom()", - "" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades K.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] - }, + } + ] + }, + { + "name": "Spades Q", + "useMultipleDirections": false, + "directions": [ { - "type": { - "value": "AddForceAL" - }, - "parameters": [ - "UpgradedPotionBlue", - "270", - "75", - "1" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Playing Card_Spades Q.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] } ] - }, + } + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "RepeatEveryXSeconds::Repeat" + "value": "DepartScene" }, "parameters": [ - "", - "\"SpawnRock\"", - "1", "" ] } @@ -6298,51 +5393,130 @@ "actions": [ { "type": { - "value": "Create" + "value": "Opacity" }, "parameters": [ - "", - "MeteorDetailed", - "CameraBorderLeft()", - "Fly.CenterY()", - "" + "Moon", + "=", + "128" ] }, { "type": { - "value": "AddForceAL" + "value": "ModVarScene" }, "parameters": [ - "MeteorDetailed", - "0", - "300", - "1" - ] - }, - { - "type": { - "value": "ChangeScale" - }, - "parameters": [ - "MeteorDetailed", + "MaxResource", "=", - "0.5" + "CameraBorderRight()" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + ], + "events": [ { - "type": { - "value": "Rotate" - }, - "parameters": [ - "MeteorDetailed", - "30", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Moon", + "\"144;19;254\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Moon", + "=", + "Fly.CenterX()", + "=", + "Fly.CenterY()-10" + ] + }, + { + "type": { + "value": "Sticker::Sticker::Stick" + }, + "parameters": [ + "Moon", + "Sticker", + "Fly", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Moon" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MiniHealth_Bar", + "Fly.X()", + "Fly.Y()", + "\"\"" + ] + }, + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "MiniHealth_Bar", + "=", + "Fly.CenterX() - MiniHealth_Bar.DrawResourceBar::BarLength()/2", + "=", + "Fly.BoundingBoxTop()" + ] + }, + { + "type": { + "value": "Sticker::Sticker::Stick" + }, + "parameters": [ + "MiniHealth_Bar", + "Sticker", + "Fly", + "" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::EnableDebugDraw" + }, + "parameters": [ + "", + "", + "", + "", + "" + ] + } ] } ] @@ -6351,311 +5525,104 @@ "parameters": [] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, + "colorB": 224, + "colorG": 16, + "colorR": 189, "creationTime": 0, - "folded": true, - "name": "Collisions", + "name": "Draw Resource bars", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tiled resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Fly", - "Shield", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", + "=", + "10", + "" + ] + } ] }, { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Montre" - }, - "parameters": [ - "Moon", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Fly", - "Shield", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "-", + "1", + "" + ] + } ] }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Cache" - }, - "parameters": [ - "Moon" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "CollisionNP" - }, - "parameters": [ - "SilverShield", - "Fly", - "", - "", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::ActivateShield" - }, - "parameters": [ - "Fly", - "Shield", - "" - ] - }, - { - "type": { - "value": "Delete" - }, - "parameters": [ - "SilverShield", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "CollisionNP" - }, - "parameters": [ - "UpgradedPotionBlue", - "Fly", - "", - "", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::Heal" - }, - "parameters": [ - "Fly", - "Health", - "100", - "" - ] - }, - { - "type": { - "value": "Delete" - }, - "parameters": [ - "UpgradedPotionBlue", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "CollisionNP" - }, - "parameters": [ - "MeteorDetailed", - "Fly", - "", - "", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::ShieldHit" - }, - "parameters": [ - "Fly", - "Shield", - "10", - "" - ] - }, - { - "type": { - "value": "Delete" - }, - "parameters": [ - "MeteorDetailed", - "" - ] - }, - { - "type": { - "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" - }, - "parameters": [ - "Fly", - "ShakeObject_PositionAngleScale", - "", - "10", - "10", - "5", - "", - "", - "", - "" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 224, - "colorG": 16, - "colorR": 189, - "creationTime": 0, - "name": "Draw Resource bars", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "This resource shows the horizontal mouse position in scene, but it can be used for anything!", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "MyResource", - "=", - "MouseX()" - ] - } - ] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Shape painter resource bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" + "value": "KeyReleased" }, "parameters": [ - "MiniHealth_Bar", - "DrawResourceBar", - "Fly", - "Health", - "" + "", + "Right" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + ], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawShieldBar" + "value": "ResourceBar::ResourceBar_TiledSprite::SetQuantityOp" }, "parameters": [ - "Shield_Bar", - "DrawResourceBar222", - "Fly", - "Shield", + "Tiled_ResourceBar", + "TiledResourceBar", + "+", + "1", "" ] } @@ -6667,13 +5634,21 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawResourceBar" + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" }, "parameters": [ - "ResourceMouseX_Bar", - "DrawResourceBar222", - "Variable(MyResource)", - "Variable(MaxResource)", + "Tiled_ResourceBar", + "TiledResourceBar", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" + }, + "parameters": [ + "TiledEmptyUiHeart", + "TiledResourceBar", "" ] } @@ -6685,13 +5660,11 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" + "value": "ResourceBar::ResourceBar_TiledSprite::DrawResourceBar" }, "parameters": [ - "Health_Bar", - "DrawResourceBar222", - "Fly", - "Health", + "HealthBarFill", + "TiledResourceBar", "" ] } @@ -6699,927 +5672,524 @@ } ], "parameters": [] - } - ], - "parameters": [] - } - ], - "layers": [ - { - "ambientLightColorB": 32, - "ambientLightColorG": 0, - "ambientLightColorR": 0, - "followBaseLayerCamera": false, - "isLightingLayer": false, - "name": "", - "visibility": true, - "cameras": [ - { - "defaultSize": true, - "defaultViewport": true, - "height": 0, - "viewportBottom": 1, - "viewportLeft": 0, - "viewportRight": 1, - "viewportTop": 0, - "width": 0 - } - ], - "effects": [] - } - ], - "behaviorsSharedData": [ - { - "name": "DrawResourceBar", - "type": "DrawResourceBarOLD::DrawResourceBarOLD" - }, - { - "name": "DrawResourceBar222", - "type": "ResourceBar::ResourceBar_ShapePainter" - }, - { - "name": "Health", - "type": "Health::Health" - }, - { - "name": "ShakeObject_PositionAngleScale", - "type": "ShakeObject::ShakeObject_PositionAngleScale" - }, - { - "name": "Shield", - "type": "Health::Shield" - }, - { - "name": "Sticker", - "type": "Sticker::Sticker" - }, - { - "name": "TiledResourceBar", - "type": "ResourceBar::ResourceBar_TiledSprite" - }, - { - "name": "UnitResourceBar", - "type": "ResourceBar::ResourceBar_Sprite" - } - ] - } - ], - "externalEvents": [], - "eventsFunctionsExtensions": [ - { - "author": "@4ian", - "category": "Game mechanic", - "extensionNamespace": "", - "fullName": "Fire bullets", - "helpPath": "https://gdevelop.io/game-example/fire-bullet", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWJ1bGxldCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNCwyMkgxMFYyMUgxNFYyMk0xMywxMFY3SDExVjEwTDEwLDExLjVWMjBIMTRWMTEuNUwxMywxME0xMiwyQzEyLDIgMTEsMyAxMSw1VjZIMTNWNUMxMyw1IDEzLDMgMTIsMloiIC8+PC9zdmc+", - "name": "FireBullet", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/bullet.svg", - "shortDescription": "Fire bullets, manage ammo, reloading, and overheating.", - "version": "0.3.0", - "description": "Fire bullets, manage ammo, reloading, and overheating.\n\nFiring bullets:\n- Cooldown: Time between shots (seconds)\n- Bullet Quantity: Number of bullets created each time Fire Bullet action is used. \n- Angle Variance: Each bullet trajectory will be adjusted by a random value within this range (degrees)\n- Firing Arc: Range of angles (in degrees) that bullets will shoot. Bullets are evenly spread within this range.\n- Rotate bullet: Change the angle of each bullet to match the direction it is travelling (enabled by default)\n\n Ammo:\n- Starting ammo\n- Max ammo\n- Shots per reload. Use 0 to disable reloading\n- Reload duration\n- Automatic reloading is enabled by default, but it can also be done manually.\n\nOverheat:\n- Heat increase per shot. Object is Overheated when Heat reaches 1.\n- Cooling rate per second\n- When overheated, the object cannot fire any bullets\n\nStatistics:\n- Total bullets created\n- Total shots taken\n- Total reloads completed\n\nBullets:\n- Each bullet is assigned several variables that can be used for advanced object picking\n- __FireBullet.BulletID = Unique number for every bullet created\n- __FireBullet.BatchID = Unique number for all bullets created in the same frame\n- __FireBullet.BatchOrderID = Unique number for each bullet in the same batch. Can be used to identify the position in the firing arc.", - "origin": { - "identifier": "FireBullet", - "name": "gdevelop-extension-store" - }, - "tags": [ - "fire", - "bullet", - "spawn", - "firerate", - "reload", - "weapon", - "ranged", - "ammo", - "overheat" - ], - "authorIds": [ - "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", - "xpwUwByyImTDcHEqDUqfyg0oRBt1", - "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ - { - "description": "Fire bullets, manage ammo, reloading, and overheating.", - "fullName": "Fire bullets", - "name": "FireBullet", - "objectType": "", - "eventsFunctions": [ + }, { - "fullName": "", - "functionType": "Action", - "name": "onCreated", - "sentence": "", + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Sprite resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__FireBullet.FiringCooldown\"" - ] - }, + "conditions": [ { "type": { - "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + "value": "DepartScene" }, "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyStartingAmmo()" + "" ] - }, + } + ], + "actions": [ { "type": { - "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + "value": "ModVarScene" }, "parameters": [ - "Object", - "Behavior", + "Units", "=", - "Object.Behavior::PropertyShotsPerReload()" + "5" ] } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "doStepPreEvents", - "sentence": "", - "events": [ - { - "colorB": 224, - "colorG": 16, - "colorR": 189, - "creationTime": 0, - "name": "Take a shot (if triggered)", - "source": "", - "type": "BuiltinCommonInstructions::Group", + ], "events": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Creators can use the \"FireBullet\" action multiple times in a frame and it will be counted as a single \"shot\".", - "comment2": "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetMaxQuantityOp" + }, + "parameters": [ + "Tiled_ResourceBar", + "TiledResourceBar", + "=", + "10", + "" + ] + } + ] }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "FireBullet::FireBullet::PropertyHasJustFired" + "value": "Cache" }, "parameters": [ - "Object", - "Behavior" + "Unit_ResourceBar" ] - } - ], - "actions": [], - "events": [ + }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Reset firing cooldown", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__FireBullet.FiringCooldown\"" - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetMaxQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "10", + "" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update ammo", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Subtract 1 from ammo (if not unlimited ammo)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::PropertyUnlimitedAmmo" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "-", - "1" - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitColor" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "\"74;144;226\"", + "" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update reloading counter", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyShotsPerReload" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" - }, - "parameters": [ - "Object", - "Behavior", - "-", - "1" - ] - } - ] - } - ], - "parameters": [] - }, + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetEmptyUnitOpacity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "64", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "=", + "max(0,Variable(Units)-1)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Automatically reload gun when needed", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyAutomaticReloading" - }, - "parameters": [ - "Object", - "Behavior" - ] - }, - { - "type": { - "value": "FireBullet::FireBullet::IsReloadNeeded" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsReloadInProgress" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::ReloadAmmo" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ] - } - ], - "parameters": [] - }, + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "-", + "1", + "" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update Overheat", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Increase heat (if needed)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyHeatIncreasePerShot" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyHeatLevel" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "Object.Behavior::PropertyHeatIncreasePerShot()" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Check if this caused overheat", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyOverheatDuration" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - }, - { - "type": { - "value": "FireBullet::FireBullet::IsOverheated" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__FireBullet.OverheatDuration\"" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update statistics", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyTotalShotsFired" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "1" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Reset firing detection", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyHasJustFired" - }, - "parameters": [ - "Object", - "Behavior", - "=" - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "ResourceBar::ResourceBar_Sprite::DecreaseQuantity" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "1", + "" + ] } ] } - ], - "parameters": [] + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Reload gun when needed", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "KeyReleased" }, - "comment": "Detect when reload is completed", - "comment2": "" - }, + "parameters": [ + "", + "Right" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Units", + "+", + "1" + ] + } + ], + "events": [ { + "disabled": true, "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "FireBullet::FireBullet::IsReloadInProgress" + "value": "ResourceBar::ResourceBar_Sprite::IncreaseQuantity" }, "parameters": [ - "Object", - "Behavior", + "Unit_ResourceBar", + "UnitResourceBar", + "1", "" ] - }, - { - "type": { - "value": "CompareObjectTimer" - }, - "parameters": [ - "Object", - "\"__FireBullet.ReloadingTimer\"", - ">=", - "Object.Behavior::PropertyReloadDuration()" - ] } - ], + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], "actions": [ { "type": { - "value": "FireBullet::FireBullet::SetPropertyTotalReloadsCompleted" + "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" }, "parameters": [ - "Object", - "Behavior", + "Unit_ResourceBar", + "UnitResourceBar", "+", - "1" - ] - }, - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyReloadInProgress" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::IsUnlimitedAmmo" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyShotsPerReload()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Only reload the amount of ammo available", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsUnlimitedAmmo" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyShotsPerReload(), Object.Behavior::PropertyAmmoQuantity())" - ] - } + "1", + "" ] } ] } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::DrawResourceBar" + }, + "parameters": [ + "Unit_ResourceBar", + "UnitResourceBar", + "Heart_Unit", + "5", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Buttons", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Hover", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisSurObjet" + }, + "parameters": [ + "Buttons", + "", + "", + "" + ] + } ], - "parameters": [] + "actions": [ + { + "type": { + "value": "EnableEffect" + }, + "parameters": [ + "Buttons", + "\"Effect\"", + "no" + ] + } + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Reduce heat level (based on cooling rate)", - "source": "", - "type": "BuiltinCommonInstructions::Group", + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisSurObjet" + }, + "parameters": [ + "Buttons", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EnableEffect" + }, + "parameters": [ + "Buttons", + "\"Effect\"", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Clicked", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "ScaleWidth" + }, + "parameters": [ + "Buttons", + "=", + "0.9" + ] + } + ], + "actions": [], "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" + "value": "SourisSurObjet" }, "parameters": [ - "Object.Behavior::HeatLevel()", - ">", - "0" + "PlusKey", + "", + "", + "" ] } ], "actions": [], "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "FireBullet::FireBullet::PropertyExponentialCoolingRate" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] } ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyHeatLevel" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "max(0, Object.Behavior::PropertyHeatLevel() - TimeDelta() * Object.Behavior::PropertyExponentialCoolingRate() * Object.Behavior::PropertyHeatLevel())" - ] - } - ] + "parameters": [] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tiled sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "FireBullet::FireBullet::PropertyLinearCoolingRate" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] } ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyHeatLevel" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "max(0, Object.Behavior::PropertyHeatLevel() - TimeDelta() * Object.Behavior::PropertyLinearCoolingRate())" - ] - } - ] + "parameters": [] } ] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Fire bullets toward a position.", - "fullName": "Fire bullets toward a position", - "functionType": "Action", - "name": "FireTowardPosition", - "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward position _PARAM5_;_PARAM6_ with speed _PARAM7_ px/s", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Calculate the trajectory angle and use the \"Fire bullets\" action", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "FireBullet::FireBullet::Fire" + "value": "SourisSurObjet" }, "parameters": [ - "Object", - "Behavior", - "GetArgumentAsNumber(\"XPosition\")", - "GetArgumentAsNumber(\"YPosition\")", - "Bullet", - "Object.AngleToPosition(GetArgumentAsNumber(\"TargetXPosition\"),GetArgumentAsNumber(\"TargetYPosition\"))", - "GetArgumentAsNumber(\"Speed\")", + "MinusKey", + "", + "", "" ] } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tiled sprite", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] + } ] } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "X position, where to create the bullet", - "name": "XPosition", - "type": "expression" - }, - { - "description": "Y position, where to create the bullet", - "name": "YPosition", - "type": "expression" - }, - { - "description": "The bullet object", - "name": "Bullet", - "type": "objectList" - }, - { - "description": "Target X position", - "name": "TargetXPosition", - "type": "expression" - }, - { - "description": "Target Y position", - "name": "TargetYPosition", - "type": "expression" - }, - { - "description": "Speed of the bullet, in pixels per second", - "name": "Speed", - "type": "expression" + ] } ], - "objectGroups": [] + "parameters": [] }, { - "description": "Fire bullets in the direction of a given angle.", - "fullName": "Fire bullets toward an angle", - "functionType": "Action", - "name": "Fire", - "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward angle _PARAM5_ and speed _PARAM6_ px/s", + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Press", + "source": "", + "type": "BuiltinCommonInstructions::Group", "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Check if ready to shoot", - "source": "", - "type": "BuiltinCommonInstructions::Group", + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonPressed" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "FireBullet::FireBullet::IsReadyToShoot" + "value": "SourisSurObjet" }, "parameters": [ - "Object", - "Behavior", + "Buttons", + "", + "", "" ] } @@ -7627,1616 +6197,1877 @@ "actions": [ { "type": { - "value": "FireBullet::FireBullet::SetPropertyHasJustFired" + "value": "ChangeColor" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Buttons", + "\"189;16;224\"" ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Single bullet", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "Object.Behavior::PropertyBulletQuantity()", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::FireSingleBullet" - }, - "parameters": [ - "Object", - "Behavior", - "GetArgumentAsNumber(\"XPosition\")", - "GetArgumentAsNumber(\"YPosition\")", - "Bullet", - "GetArgumentAsNumber(\"Angle\")", - "GetArgumentAsNumber(\"Speed\")", - "" - ] - } - ] - } - ], - "parameters": [] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Multiple bullets", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "Object.Behavior::PropertyBulletQuantity()", - ">", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__FireBullet.CurrentBulletAngle", - "=", - "GetArgumentAsNumber(\"Angle\") - Object.Behavior::PropertyFiringArc()/2" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__FireBullet.BatchOrderID", - "=", - "0" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Repeat", - "repeatExpression": "Object.Behavior::PropertyBulletQuantity()", - "conditions": [], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::FireSingleBullet" - }, - "parameters": [ - "Object", - "Behavior", - "GetArgumentAsNumber(\"XPosition\")", - "GetArgumentAsNumber(\"YPosition\")", - "Bullet", - "Object.Variable(__FireBullet.CurrentBulletAngle) + RandomInRange(-Object.Behavior::PropertyAngleVariance(),Object.Behavior::PropertyAngleVariance())", - "GetArgumentAsNumber(\"Speed\")", - "" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move temp variable to the next angle a bullet will be sent", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__FireBullet.CurrentBulletAngle", - "+", - "Object.Behavior::PropertyFiringArc() / (Object.Behavior::PropertyBulletQuantity() - 1)" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__FireBullet.BatchOrderID", - "+", - "1" - ] - } - ] - } - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Buttons", + "=", + "0.9" + ] } ] } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "X position, where to create the bullet", - "name": "XPosition", - "type": "expression" - }, - { - "description": "Y position, where to create the bullet", - "name": "YPosition", - "type": "expression" - }, - { - "description": "The bullet object", - "name": "Bullet", - "type": "objectList" - }, - { - "description": "Angle of the bullet, in degrees", - "name": "Angle", - "type": "expression" + ] }, { - "description": "Speed of the bullet, in pixels per second", - "name": "Speed", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Fire a single bullet. This is only meant to be used inside the \"Fire bullet\" action.", - "fullName": "Fire a single bullet", - "functionType": "Action", - "group": "Firing", - "name": "FireSingleBullet", - "private": true, - "sentence": "Fire a single bullet _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, with angle _PARAM5_ and speed _PARAM6_ px/s", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Fire a single bullet", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "inverted": true, + "value": "MouseButtonPressed" }, - "comment": "Create bullet", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "Bullet", - "GetArgumentAsNumber(\"XPosition\")", - "GetArgumentAsNumber(\"YPosition\")", - "\"\"" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move bullet", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "AddForceAL" - }, - "parameters": [ - "Bullet", - "GetArgumentAsNumber(\"Angle\") + RandomInRange(-Object.Behavior::PropertyAngleVariance(), Object.Behavior::PropertyAngleVariance())", - "GetArgumentAsNumber(\"Speed\")", - "1" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Add identifier variables (to enable advanced picking by users)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Bullet", - "__FireBullet.BulletID", - "=", - "Object.Behavior::PropertyTotalBulletsCreated()" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Bullet", - "__FireBullet.BatchID", - "=", - "Object.Behavior::PropertyTotalShotsFired()" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Bullet", - "__FireBullet.BatchOrderID", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Rotate newly created bullet, if needed", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyRotateBullet" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Bullet", - "=", - "GetArgumentAsNumber(\"Angle\")" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Update statistics", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyTotalBulletsCreated" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "1" - ] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "X position, where to create the bullet", - "name": "XPosition", - "type": "expression" - }, - { - "description": "Y position, where to create the bullet", - "name": "YPosition", - "type": "expression" - }, - { - "description": "The bullet object", - "name": "Bullet", - "type": "objectList" - }, - { - "description": "Angle of the bullet, in degrees", - "name": "Angle", - "type": "expression" - }, - { - "description": "Speed of the bullet, in pixels per second", - "name": "Speed", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Reload ammo.", - "fullName": "Reload ammo", - "functionType": "Action", - "name": "ReloadAmmo", - "sentence": "Reload ammo on _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsOutOfAmmo" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyReloadInProgress" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Buttons", + "\"255;255;255\"" + ] }, { "type": { - "value": "ResetObjectTimer" + "value": "ChangeScale" }, "parameters": [ - "Object", - "\"__FireBullet.ReloadingTimer\"" + "Buttons", + "=", + "1" ] } ] } ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, + "parameters": [] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 32, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "", + "visibility": true, + "cameras": [ { - "description": "Check if the object has just fired something.", - "fullName": "Has just fired", - "functionType": "Condition", - "group": "Firing", - "name": "HasJustFired", - "sentence": "_PARAM0_ has just fired", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyHasJustFired" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD" + }, + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield" + }, + { + "name": "Sticker", + "type": "Sticker::Sticker" + }, + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite" + }, + { + "name": "UnitResourceBar", + "type": "ResourceBar::ResourceBar_Sprite" + } + ] + }, + { + "b": 0, + "disableInputWhenNotFocused": true, + "mangledName": "Shape_32Painter_32_40Game_41", + "name": "Shape Painter (Game)", + "r": 0, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 0, + "uiSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 8, + "gridHeight": 8, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.2, + "snap": true, + "zoomFactor": 1.06, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Shield_Bar", + "persistentUuid": "b581caf8-44ee-423e-b57e-cdd910fb7374", + "width": 0, + "x": 192, + "y": 216, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ResourceMouseX_Bar", + "persistentUuid": "17a23f4a-a442-4b52-8380-9f2b6a9c2494", + "width": 0, + "x": 192, + "y": 536, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 80, + "layer": "", + "name": "Fly", + "persistentUuid": "e0b70af7-7a81-41c3-88ac-88305df91ed2", + "width": 128, + "x": 481.13275146484375, + "y": 293, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "name": "Moon", + "persistentUuid": "8428ea9d-6d1e-41b0-9f54-1840f3378846", + "width": 129.1327362060547, + "x": 480, + "y": 272, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Health_Text", + "persistentUuid": "921b2f28-8bee-4ab2-a6cc-1ee823c5215e", + "width": 0, + "x": 48, + "y": 96, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Shield_Text", + "persistentUuid": "a231209b-a5d8-4280-868d-1e9beb31527b", + "width": 0, + "x": 48, + "y": 208, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "ResourceMouseX_Text", + "persistentUuid": "07fda015-55f8-4959-80fc-f1ee3074d028", + "width": 0, + "x": 32, + "y": 512, + "zOrder": 11, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Title_Text", + "persistentUuid": "29ae792c-1331-430c-aadf-70fa8d9e36d6", + "width": 0, + "x": 208, + "y": 16, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Health_Bar", + "persistentUuid": "c411b32c-f357-4b8f-9e87-f3fdde7657d5", + "width": 0, + "x": 192, + "y": 104, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "assetStoreId": "", + "name": "Health_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ { - "description": "Check if bullet rotates to match trajectory.", - "fullName": "Is bullet rotation enabled", - "functionType": "Condition", - "group": "Firing", - "name": "BulletRotationEnabled", - "sentence": "Bullet rotation enabled on _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyRotateBullet" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "BarLength": 200, + "BarThickness": 16, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 11;255;0", + "ActiveBarOpacity": 255, + "RoundedBar": true, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "MiniHealth_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ { - "description": "Change the firing arc (in degrees) where bullets will be shot. Bullets will be evenly spaced out inside the firing arc.", - "fullName": "Set firing arc", - "functionType": "Action", - "group": "Multi-Fire", - "name": "SetFiringArc", - "sentence": "Set firing arc of _PARAM0_ to _PARAM2_ degrees", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyFiringArc" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Firing arc (degrees) Range: 0 to 360", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] + "name": "DrawResourceBar", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "BarLength": 50, + "BarThickness": 4, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 11;255;0", + "ActiveBarOpacity": 255, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true }, { - "description": "Change the angle variance (in degrees) applied to each bullet.", - "fullName": "Set angle variance", - "functionType": "Action", - "group": "Firing", - "name": "SetAngleVariance", - "sentence": "Set angle variance of _PARAM0_ to _PARAM2_ degrees", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyAngleVariance" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Angle variance (degrees) Range: 0 to 180", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, + "name": "Sticker", + "type": "Sticker::Sticker", + "OnlyFollowPosition": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "Shield_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ { - "description": "Change the number of bullets shot every time the \"fire bullet\" action is used.", - "fullName": "Set number of bullets per shot", - "functionType": "Action", - "group": "Multi-Fire", - "name": "SetBulletQuantity", - "sentence": "Set number of bullets per shot of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyBulletQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Bullets", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "circle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": " 24;119;211", + "ThumbOpacity": 255, + "BarLength": 200, + "BarThickness": 16, + "InactiveBarColor": "144;19;254", + "InactiveBarOpacity": 96, + "ActiveBarColor": " 144;19;254", + "ActiveBarOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedBar": true, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0.19999992847442627 + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "name": "ResourceMouseX_Bar", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "ThumbShape": "circle", + "ThumbWidth": 20, + "ThumbHeight": 20, + "ThumbColor": "248;231;28", + "ThumbOpacity": 255, + "BarLength": 200, + "BarThickness": 16, + "InactiveBarColor": "248;231;28", + "InactiveBarOpacity": 96, + "ActiveBarColor": "248;231;28", + "ActiveBarOpacity": 255, + "HaloRadius": 24, + "HaloOpacityHover": 32, + "HaloOpacityClick": 64, + "RoundedBar": false, + "Enabled": true, + "IsBeingDragged": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true, + "IsHovered": false, + "MouseX": 0, + "MouseY": 0, + "CurrentHaloRadius": 0, + "HaloGrowSpeed": 0.2, + "TargetHaloRadius": 0.19999992847442627 + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "48a2d179a1921276abe3f99ce3cf195fa7c310bc511fa215d9647c3fb9027921", + "name": "Fly", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Health", + "type": "Health::Health", + "Health": 100, + "DamageCooldown": 0, + "MaxHealth": 100, + "IsJustDamaged": false, + "HealthRegenRate": 0, + "HealthRegenDelay": 0, + "AllowOverHealing": false, + "HitAtLeastOnce": false }, { - "description": "Enable bullet rotation.", - "fullName": "Enable (or disable) bullet rotation", - "functionType": "Action", - "group": "Firing", - "name": "SetRotateBullet", - "sentence": "Enable bullet rotation on _PARAM0_: _PARAM2_", - "events": [ + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield", + "RequireHealth": "Health", + "MaxShieldPoints": 30, + "ShieldDuration": 5, + "ShieldPoints": 0, + "ShieldRegenRate": 0, + "ShieldBlocksExcessDamage": false, + "ShieldRegenDelay": 0, + "RegenShieldWhenZeroPoints": false, + "IsShieldJustDamaged": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.05000000074505806, + "sprites": [ { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" + "hasCustomCollisionMask": true, + "image": "Fly_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "\"RotateBullet\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyRotateBullet" + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 }, - "parameters": [ - "Object", - "Behavior", - "no" + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { - "type": { - "value": "GetArgumentAsBoolean" + "hasCustomCollisionMask": true, + "image": "Fly_2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "\"RotateBullet\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyRotateBullet" + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "defaultValue": "yes", - "description": "Rotate bullet to match trajetory", - "name": "RotateBullet", - "optional": true, - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Enable unlimited ammo.", - "fullName": "Enable (or disable) unlimited ammo", - "functionType": "Action", - "group": "Ammo", - "name": "SetUnlimitedAmmo", - "sentence": "Enable unlimited ammo on _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" + "hasCustomCollisionMask": true, + "image": "Fly_3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "\"UnlimitedAmmo\"" + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] ] - } - ], - "actions": [ + }, { - "type": { - "value": "FireBullet::FireBullet::SetPropertyUnlimitedAmmo" + "hasCustomCollisionMask": true, + "image": "Fly_4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "no" + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { - "type": { - "value": "GetArgumentAsBoolean" + "hasCustomCollisionMask": true, + "image": "Fly_5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "\"UnlimitedAmmo\"" + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] ] - } - ], - "actions": [ + }, { - "type": { - "value": "FireBullet::FireBullet::SetPropertyUnlimitedAmmo" + "hasCustomCollisionMask": true, + "image": "Fly_6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "yes" + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "defaultValue": "yes", - "description": "Unlimited ammo", - "name": "UnlimitedAmmo", - "optional": true, - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Change the firing cooldown, which changes the rate of fire.", - "fullName": "Set firing cooldown", - "functionType": "Action", - "group": "Firing", - "name": "SetCooldown", - "sentence": "Set the fire rate of _PARAM0_ to _PARAM2_ seconds", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "FireBullet::FireBullet::SetPropertyFireCooldown" + "hasCustomCollisionMask": true, + "image": "Fly_7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"NewCooldown\")" + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fly_10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 57.500244140625, + "y": 48.2830924987793 + }, + "customCollisionMask": [ + [ + { + "x": 35, + "y": 25 + }, + { + "x": 80, + "y": 25 + }, + { + "x": 80, + "y": 70 + }, + { + "x": 35, + "y": 70 + } + ] ] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, + ] + } + ] + }, + { + "assetStoreId": "574655a4565bd983af8f5dd98e0fd8cda3bd67cf929c00d3db317e898322e06b", + "name": "Star", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "LargeNarrow", + "useMultipleDirections": false, + "directions": [ { - "description": "Cooldown in seconds", - "name": "NewCooldown", - "type": "expression" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_LargeNarrow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] } - ], - "objectGroups": [] + ] }, { - "description": "Change the duration to reload ammo.", - "fullName": "Set reload duration", - "functionType": "Action", - "group": "Reload", - "name": "SetReloadDuration", - "sentence": "Set the reload duration of _PARAM0_ to _PARAM2_ seconds", - "events": [ + "name": "LargeWide", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyReloadDuration" + "hasCustomCollisionMask": false, + "image": "Star_LargeWide.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, + ] + }, + { + "name": "Medium", + "useMultipleDirections": false, + "directions": [ { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Reload duration (seconds)", - "name": "Value", - "type": "expression" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Star_Medium.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] } - ], - "objectGroups": [] + ] }, { - "description": "Change the duration after becoming overheated.", - "fullName": "Set overheat duration", - "functionType": "Action", - "group": "Overheat", - "name": "SetOverheatDuration", - "sentence": "Set the overheat duration of _PARAM0_ to _PARAM2_ seconds", - "events": [ + "name": "Small", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyOverheatDuration" + "hasCustomCollisionMask": false, + "image": "Star_Small.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Overheat duration (seconds)", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, + ] + } + ] + }, + { + "assetStoreId": "794ab341df538c9b3bdad418dfdcccc7be5d90f3d0b5929d6d528a542c6ed3ae", + "name": "SilverShield", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ { - "description": "Change the quantity of ammo.", - "fullName": "Set ammo quantity", - "functionType": "Action", - "group": "Ammo", - "name": "SetAmmoQuantity", - "sentence": "Set the ammo quantity of _PARAM0_ to _PARAM2_", - "events": [ + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + "hasCustomCollisionMask": false, + "image": "Silver shield.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 14.592423439025879, + "y": 15.103429794311523 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Ammo", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, + ] + } + ] + }, + { + "assetStoreId": "d2bc2d266f5bb666ef68023abc14f51bc8fe8b5222af931efa378ac10c50f98a", + "name": "MeteorDetailed", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ { - "description": "Change the heat increase per shot.", - "fullName": "Set heat increase per shot", - "functionType": "Action", - "group": "Overheat", - "name": "SetHeatPerShot", - "sentence": "Set the heat increase of _PARAM0_ to _PARAM2_ per shot", - "events": [ + "name": "Large", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyHeatIncreasePerShot" + "hasCustomCollisionMask": true, + "image": "Meteor Detailed_Large.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 65.07723999023438, + "y": 63.82252502441406 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 20, + "y": 20 + }, + { + "x": 110, + "y": 20 + }, + { + "x": 110, + "y": 110 + }, + { + "x": 20, + "y": 110 + } + ] ] } ] } - ], - "parameters": [ + ] + }, + { + "name": "Small", + "useMultipleDirections": false, + "directions": [ { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Heat increase per shot (Range: 0 to 1)", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change the max ammo.", - "fullName": "Set max ammo", - "functionType": "Action", - "group": "Ammo", - "name": "SetMaxAmmo", - "sentence": "Set the max ammo of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyMaxAmmo" + "hasCustomCollisionMask": true, + "image": "Meteor Detailed_Small.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 65.07723999023438, + "y": 63.82252502441406 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 20, + "y": 20 + }, + { + "x": 110, + "y": 20 + }, + { + "x": 110, + "y": 110 + }, + { + "x": 20, + "y": 110 + } + ] ] } ] - }, + } + ] + } + ] + }, + { + "assetStoreId": "a1e62f5a19d1fe476e2ad0b8977768d020cc1dc55423427f79a486664cebb631", + "name": "UpgradedPotionBlue", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "No Shadow", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::PropertyMaxAmmo" + "hasCustomCollisionMask": false, + "image": "Upgraded Potion Blue_No Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.793042182922363, + "y": 15.89681625366211 }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::MaxAmmo(),Object.Behavior::AmmoQuantity())" - ] + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Max ammo", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] + ] }, { - "description": "Reset total shots fired.", - "fullName": "Reset total shots fired", - "functionType": "Action", - "group": "Stats", - "name": "ResetTotalShotsFired", - "sentence": "Reset total shots fired by _PARAM0_", - "events": [ + "name": "Shadow", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyTotalShotsFired" + "hasCustomCollisionMask": false, + "image": "Upgraded Potion Blue_Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.793042182922363, + "y": 15.89681625366211 }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, + ] + } + ] + }, + { + "assetStoreId": "c2ce913ddbcd055c4e49a1c01b63aff1a3d59e4e1c1845db4c38aedda3712d3a", + "name": "Moon", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ { - "description": "Reset total bullets created.", - "fullName": "Reset total bullets created", - "functionType": "Action", - "group": "Stats", - "name": "ResetTotalBulletsCreated", - "sentence": "Reset total bullets created by _PARAM0_", - "events": [ + "name": "Sticker", + "type": "Sticker::Sticker", + "OnlyFollowPosition": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyTotalBulletsCreated" + "hasCustomCollisionMask": false, + "image": "Moon.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, + ] + } + ] + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Health_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Health", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Shield_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Shield", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "ResourceMouseX_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Resource \n(Mouse X)", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "bold": true, + "italic": false, + "name": "Title_Text", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Extension: Resource Bar", + "font": "", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + { + "assetStoreId": "", + "name": "ResourceBarNew", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBar::DrawResourceBar", + "ValueMin": 0, + "ValueMax": 1, + "TickSpacing": 0, + "BarLength": 200, + "BarThickness": 4, + "InactiveBarColor": "11;255;0", + "InactiveBarOpacity": 96, + "ActiveBarColor": "11;255;0", + "ActiveBarOpacity": 255, + "RoundedBar": false, + "Value": 0, + "ThumbOffset": 0, + "NeedRedraw": true + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", + "name": "Unit_ResourceBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "UnitResourceBar", + "type": "ResourceBar::ResourceBar_Sprite", + "StartingUnits": 3, + "CurrentUnits": 3, + "MaxUnits": 3, + "UnitSpacing": 0, + "NextUnitToCreate": 0, + "HideEmptyUnits": false, + "EmptyUnitOpacity": 64, + "EmptyUnitAnimation": 0, + "EmptyColorTint": "255;255;255", + "ActiveUnitOpacity": 255 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Emote Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] } - ], - "objectGroups": [] - }, + ] + } + ] + }, + { + "assetStoreId": "8d524a624fbc72a1fd6c3975369a7cd55b8a52035887ef664bcd93bf8e273881", + "name": "Heart_Unit", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ { - "description": "Reset total reloads completed.", - "fullName": "Reset total reloads completed", - "functionType": "Action", - "group": "Stats", - "name": "ResetTotalReloadsCompleted", - "sentence": "Reset total reloads completed by _PARAM0_", - "events": [ + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyTotalReloadsCompleted" + "hasCustomCollisionMask": false, + "image": "Emote Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, + ] + } + ] + }, + { + "assetStoreId": "752e405ef67d9f9d1bd36f9763f1b6fc05633d64700982c0f3118a25a32e39b2", + "height": 16, + "name": "TiledEmptyUiHeart", + "tags": "", + "texture": "tiled_Tiled Empty UI Heart.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [ { - "description": "Change the number of shots per reload.", - "fullName": "Set shots per reload", - "functionType": "Action", - "group": "Reload", - "name": "SetShotsPerReload", - "sentence": "Set the shots per reload of _PARAM0_ to _PARAM2_", - "events": [ + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite", + "StartingQuantity": 0, + "CurrentQuantity": 0, + "UnitWidth": 16, + "MaxQuantity": 0 + } + ] + }, + { + "assetStoreId": "abf51d082db5a117d9ee2e65299660f6787d47664e4571bad6db3075b3393c5f", + "height": 16, + "name": "Tiled_ResourceBar", + "tags": "", + "texture": "tiled_Tiled Filler UI Heart.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite", + "StartingQuantity": 6, + "CurrentQuantity": 0, + "UnitWidth": 16 + } + ] + }, + { + "assetStoreId": "45107bbfbc2b5cbc83e3785f802b99664a23d59e74414e332c9afafac63e1ca3", + "name": "HealthBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyShotsPerReload" + "hasCustomCollisionMask": false, + "image": "Health Bar.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] - }, + } + ] + } + ] + }, + { + "assetStoreId": "1f3dba67c868b7320572a6591d1d0418f23b7c132df0963cf77286a9149971d9", + "height": 128, + "name": "HealthBarFill", + "tags": "", + "texture": "tiled_Health Bar Fill.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "3bd9517a10ad3d98341eea33f0c139f08a1b04f26500e85ac49bb7f9e157a303", + "height": 128, + "name": "EnergyBarFill", + "tags": "", + "texture": "tiled_Energy Bar Fill.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "138ee716846635e3e0e5ab7b63752d1a36754f1ac874c70e1b5fa372d5a05474", + "bottomMargin": 6, + "height": 15, + "leftMargin": 11, + "name": "HealthBarBox", + "rightMargin": 9, + "tags": "", + "texture": "Health Bar Box.png", + "tiled": true, + "topMargin": 6, + "type": "PanelSpriteObject::PanelSprite", + "width": 96, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "7c1048053bc2d851157c4e0868c4ac0338f4ca93170d28990a7f64eaed2a1723", + "name": "HealthIndicator", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Black Outline Empty", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::PropertyShotsBeforeNextReload" + "hasCustomCollisionMask": false, + "image": "Health Indicator_Black Outline Empty.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::PropertyShotsPerReload()" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyShotsPerReload()" - ] + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Shots per reload", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] + ] }, { - "description": "Enable (or disable) automatic reloading.", - "fullName": "Enable (or disable) automatic reloading", - "functionType": "Action", - "group": "Reload", - "name": "SetAutomaticReload", - "sentence": "Enable automatic reloading on _PARAM0_: _PARAM2_", - "events": [ + "name": "Black Outline Heart", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyAutomaticReloading" + "hasCustomCollisionMask": false, + "image": "Health Indicator_Black Outline Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] - }, + } + ] + }, + { + "name": "White Outline Empty", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "GetArgumentAsBoolean" + "hasCustomCollisionMask": false, + "image": "Health Indicator_White Outline Empty.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "\"Value\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "FireBullet::FireBullet::SetPropertyAutomaticReloading" + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "defaultValue": "yes", - "description": "Enable automatic reloading", - "name": "Value", - "optional": true, - "type": "yesorno" - } - ], - "objectGroups": [] + ] }, { - "description": "Change the linear rate of cooling.", - "fullName": "Set linear cooling rate", - "functionType": "Action", - "group": "Overheat", - "name": "SetLinearCoolingRate", - "sentence": "Set the linear cooling rate of _PARAM0_ to _PARAM2_ per second", - "events": [ + "name": "White Outline Heart", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyLinearCoolingRate" + "hasCustomCollisionMask": false, + "image": "Health Indicator_White Outline Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Heat cooling rate (per second)", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, + ] + } + ] + }, + { + "assetStoreId": "0714257da345b4ec7de558ac0e42290362b85a79c97160c0e09636cd2fc31e3c", + "name": "Heart", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ { - "description": "Change the exponential rate of cooling.", - "fullName": "Set exponential cooling rate", - "functionType": "Action", - "group": "Overheat", - "name": "SetExponentialCoolingRate", - "sentence": "Set the exponential cooling rate of _PARAM0_ to _PARAM2_", - "events": [ + "name": "", + "useMultipleDirections": false, + "directions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ { - "type": { - "value": "FireBullet::FireBullet::SetPropertyExponentialCoolingRate" + "hasCustomCollisionMask": false, + "image": "Heart.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] } ] } - ], - "parameters": [ + ] + } + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "description": "Object", - "name": "Object", - "type": "object" - }, + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "Opacity" + }, + "parameters": [ + "Moon", + "=", + "128" + ] }, { - "description": "Exponential cooling rate", - "name": "Value", - "supplementaryInformation": "[\"Exponential\",\"Linear\"]", - "type": "expression" + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MaxResource", + "=", + "CameraBorderRight()" + ] } ], - "objectGroups": [] - }, - { - "description": "Increase ammo quantity.", - "fullName": "Increase ammo", - "functionType": "Action", - "name": "IncreaseAmmo", - "sentence": "Increase ammo of _PARAM0_ by _PARAM2_ shots", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -9244,615 +8075,556 @@ "actions": [ { "type": { - "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + "value": "ChangeColor" }, "parameters": [ - "Object", - "Behavior", - "+", - "GetArgumentAsNumber(\"AmmoGained\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "If Max Ammo is set, do not exceed the value", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "Moon", + "\"144;19;254\"" + ] + }, { "type": { - "value": "FireBullet::FireBullet::PropertyMaxAmmo" + "value": "SetCenter" }, "parameters": [ - "Object", - "Behavior", - ">", - "0" + "Moon", + "=", + "Fly.CenterX()", + "=", + "Fly.CenterY()-10" ] - } - ], - "actions": [ + }, { "type": { - "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + "value": "Sticker::Sticker::Stick" }, "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::MaxAmmo(),Object.Behavior::AmmoQuantity())" + "Moon", + "Sticker", + "Fly", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Moon" ] } ] }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "FireBullet::FireBullet::IsReloadNeeded" + "value": "Create" }, "parameters": [ - "Object", - "Behavior", - "" + "", + "MiniHealth_Bar", + "Fly.X()", + "Fly.Y()", + "\"\"" ] }, { "type": { - "value": "FireBullet::FireBullet::PropertyAutomaticReloading" + "value": "MettreXY" }, "parameters": [ - "Object", - "Behavior" + "MiniHealth_Bar", + "=", + "Fly.CenterX() - MiniHealth_Bar.DrawResourceBar::BarLength()/2", + "=", + "Fly.BoundingBoxTop()" ] - } - ], - "actions": [ + }, { "type": { - "value": "FireBullet::FireBullet::ReloadAmmo" + "value": "Sticker::Sticker::Stick" }, "parameters": [ - "Object", - "Behavior", + "MiniHealth_Bar", + "Sticker", + "Fly", "" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - }, - { - "description": "Ammo gained", - "name": "AmmoGained", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Number of bullets to shoot at once (evenly spaced inside the Firing Arc).", - "fullName": "Bullet quantity", - "functionType": "Expression", - "group": "Multi-Fire", - "name": "BulletQuantity", - "sentence": "", - "events": [ - { + "disabled": true, "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "DebuggerTools::EnableDebugDraw" }, "parameters": [ - "Object.Behavior::PropertyBulletQuantity()" + "", + "", + "", + "", + "" ] } ] } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Spawn items", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnShield\"", + "5", + "" + ] + } ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + "actions": [ { - "description": "Object", - "name": "Object", - "type": "object" + "type": { + "value": "Create" + }, + "parameters": [ + "", + "SilverShield", + "Fly.CenterX()", + "CameraBorderTop()", + "" + ] }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "SilverShield", + "90", + "75", + "1" + ] + }, + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "SilverShield", + "\"144;19;254\"" + ] } - ], - "objectGroups": [] + ] }, { - "description": "Angle variance, in degrees.", - "fullName": "Angle variance", - "functionType": "Expression", - "group": "Firing", - "name": "AngleVariance", - "sentence": "", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyAngleVariance()" - ] - } + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnHealth\"", + "12", + "" ] } ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + "actions": [ { - "description": "Object", - "name": "Object", - "type": "object" + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UpgradedPotionBlue", + "Fly.CenterX()", + "CameraBorderBottom()", + "" + ] }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Firing arc, in degrees.", - "fullName": "Firing arc", - "functionType": "Expression", - "group": "Multi-Fire", - "name": "FiringArc", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyFiringArc()" - ] - } + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "UpgradedPotionBlue", + "270", + "75", + "1" ] } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] + ] }, { - "description": "Heat level (Range: 0 to 1).", - "fullName": "Heat level", - "functionType": "Expression", - "group": "Overheat", - "name": "HeatLevel", - "sentence": "", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "min(1,Object.Behavior::PropertyHeatLevel())" - ] - } + "type": { + "value": "RepeatEveryXSeconds::Repeat" + }, + "parameters": [ + "", + "\"SpawnRock\"", + "1", + "" ] } ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + "actions": [ { - "description": "Object", - "name": "Object", - "type": "object" + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MeteorDetailed", + "CameraBorderLeft()", + "Fly.CenterY()", + "" + ] }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "MeteorDetailed", + "0", + "300", + "1" + ] + }, + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "MeteorDetailed", + "=", + "0.5" + ] } - ], - "objectGroups": [] + ] }, { - "description": "Firing cooldown, in seconds.", - "fullName": "Firing cooldown", - "functionType": "Expression", - "group": "Firing", - "name": "Cooldown", - "sentence": "", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyFireCooldown()" - ] - } + "type": { + "value": "Rotate" + }, + "parameters": [ + "MeteorDetailed", + "30", + "" ] } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Collisions", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "description": "Object", - "name": "Object", - "type": "object" + "type": { + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] } ], - "objectGroups": [] - }, - { - "description": "Reload duration, in seconds.", - "fullName": "Reload duration", - "functionType": "Expression", - "group": "Ammo", - "name": "ReloadDuration", - "sentence": "", - "events": [ + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyReloadDuration()" - ] - } + "type": { + "value": "Montre" + }, + "parameters": [ + "Moon", + "" ] } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "description": "Object", - "name": "Object", - "type": "object" + "type": { + "inverted": true, + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Fly", + "Shield", + "" + ] }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] } ], - "objectGroups": [] + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Moon" + ] + } + ] }, { - "description": "Overheat duration, in seconds.", - "fullName": "Overheat duration", - "functionType": "Expression", - "group": "Overheat", - "name": "OverheatDuration", - "sentence": "", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyOverheatDuration()" - ] - } + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "SilverShield", + "Fly", + "", + "", + "" ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] } ], - "objectGroups": [] - }, - { - "description": "Heat increase per shot.", - "fullName": "Heat increase per shot", - "functionType": "Expression", - "group": "Overheat", - "name": "HeatIncreasePerShot", - "sentence": "", - "events": [ + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyHeatIncreasePerShot()" - ] - } + "type": { + "value": "Health::Shield::ActivateShield" + }, + "parameters": [ + "Fly", + "Shield", + "" ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "Delete" + }, + "parameters": [ + "SilverShield", + "" + ] } - ], - "objectGroups": [] + ] }, { - "description": "Linear cooling rate, per second.", - "fullName": "Linear cooling rate", - "functionType": "Expression", - "group": "Overheat", - "name": "LinearCoolingRate", - "sentence": "", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyLinearCoolingRate()" - ] - } + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "UpgradedPotionBlue", + "Fly", + "", + "", + "" ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] } ], - "objectGroups": [] - }, - { - "description": "Exponential cooling rate, per second.", - "fullName": "Exponential cooling rate", - "functionType": "Expression", - "group": "Overheat", - "name": "ExponentialCoolingRate", - "sentence": "", - "events": [ + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyExponentialCoolingRate()" - ] - } + "type": { + "value": "Health::Health::Heal" + }, + "parameters": [ + "Fly", + "Health", + "100", + "" ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "Delete" + }, + "parameters": [ + "UpgradedPotionBlue", + "" + ] } - ], - "objectGroups": [] + ] }, { - "description": "Max ammo.", - "fullName": "Max ammo", - "functionType": "Expression", - "group": "Ammo", - "name": "MaxAmmo", - "sentence": "", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyMaxAmmo()" - ] - } + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "MeteorDetailed", + "Fly", + "", + "", + "" ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] } ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + "actions": [ { - "description": "Object", - "name": "Object", - "type": "object" + "type": { + "value": "Health::Shield::ShieldHit" + }, + "parameters": [ + "Fly", + "Shield", + "10", + "" + ] }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Total shots fired (multi-bullet shots are considered one shot).", - "fullName": "Shots fired", - "functionType": "Expression", - "group": "Stats", - "name": "TotalShotsFired", - "sentence": "", - "events": [ + "type": { + "value": "Delete" + }, + "parameters": [ + "MeteorDetailed", + "" + ] + }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyTotalShotsFired()" - ] - } + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Fly", + "ShakeObject_PositionAngleScale", + "", + "10", + "10", + "5", + "", + "", + "", + "" ] } - ], - "expressionType": { - "type": "expression" + ] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Draw Resource bars", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, + "comment": "This resource shows the horizontal mouse position in scene, but it can be used for anything!", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "MyResource", + "=", + "MouseX()" + ] } - ], - "objectGroups": [] + ] }, { - "description": "Total bullets created.", - "fullName": "Bullets created", - "functionType": "Expression", - "group": "Stats", - "name": "TotalBulletsCreated", - "sentence": "", + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shape painter resource bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -9860,203 +8632,187 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" }, "parameters": [ - "Object.Behavior::PropertyTotalBulletsCreated()" + "MiniHealth_Bar", + "DrawResourceBar", + "Fly", + "Health", + "" ] } ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Reloads completed.", - "fullName": "Reloads completed", - "functionType": "Expression", - "group": "Stats", - "name": "TotalReloadsCompleted", - "sentence": "", - "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawShieldBar" }, "parameters": [ - "Object.Behavior::PropertyTotalReloadsCompleted()" + "Shield_Bar", + "DrawResourceBar222", + "Fly", + "Shield", + "" ] } ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Ammo quantity.", - "fullName": "Ammo quantity", - "functionType": "Expression", - "group": "Ammo", - "name": "AmmoQuantity", - "sentence": "", - "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawResourceBar" }, "parameters": [ - "Object.Behavior::PropertyAmmoQuantity()" + "ResourceMouseX_Bar", + "DrawResourceBar222", + "Variable(MyResource)", + "Variable(MaxResource)", + "" ] } ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Shots remaining before the next reload is required.", - "fullName": "Shots before next reload", - "functionType": "Expression", - "group": "Reload", - "name": "ShotsBeforeNextReload", - "sentence": "", - "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResourceBar::ResourceBar_ShapePainter::DrawHealthBar" }, "parameters": [ - "Object.Behavior::PropertyShotsBeforeNextReload()" + "Health_Bar", + "DrawResourceBar222", + "Fly", + "Health", + "" ] } ] } ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Shots per reload.", - "fullName": "Shots per reload", - "functionType": "Expression", - "group": "Reload", - "name": "ShotsPerReload", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyShotsPerReload()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, + "parameters": [] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 32, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "", + "visibility": true, + "cameras": [ { - "description": "Seconds remaining before the cooldown will permit a bullet to be fired.", - "fullName": "Time remaining before a bullet may be fired", - "functionType": "Expression", - "group": "Firing", - "name": "CooldownTimeLeft", + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "DrawResourceBar", + "type": "DrawResourceBarOLD::DrawResourceBarOLD" + }, + { + "name": "DrawResourceBar222", + "type": "ResourceBar::ResourceBar_ShapePainter" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Shield", + "type": "Health::Shield" + }, + { + "name": "Sticker", + "type": "Sticker::Sticker" + }, + { + "name": "TiledResourceBar", + "type": "ResourceBar::ResourceBar_TiledSprite" + }, + { + "name": "UnitResourceBar", + "type": "ResourceBar::ResourceBar_Sprite" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "@4ian", + "category": "Game mechanic", + "extensionNamespace": "", + "fullName": "Fire bullets", + "helpPath": "https://gdevelop.io/game-example/fire-bullet", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWJ1bGxldCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNCwyMkgxMFYyMUgxNFYyMk0xMywxMFY3SDExVjEwTDEwLDExLjVWMjBIMTRWMTEuNUwxMywxME0xMiwyQzEyLDIgMTEsMyAxMSw1VjZIMTNWNUMxMyw1IDEzLDMgMTIsMloiIC8+PC9zdmc+", + "name": "FireBullet", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/bullet.svg", + "shortDescription": "Fire bullets, manage ammo, reloading, and overheating.", + "version": "0.3.0", + "description": "Fire bullets, manage ammo, reloading, and overheating.\n\nFiring bullets:\n- Cooldown: Time between shots (seconds)\n- Bullet Quantity: Number of bullets created each time Fire Bullet action is used. \n- Angle Variance: Each bullet trajectory will be adjusted by a random value within this range (degrees)\n- Firing Arc: Range of angles (in degrees) that bullets will shoot. Bullets are evenly spread within this range.\n- Rotate bullet: Change the angle of each bullet to match the direction it is travelling (enabled by default)\n\n Ammo:\n- Starting ammo\n- Max ammo\n- Shots per reload. Use 0 to disable reloading\n- Reload duration\n- Automatic reloading is enabled by default, but it can also be done manually.\n\nOverheat:\n- Heat increase per shot. Object is Overheated when Heat reaches 1.\n- Cooling rate per second\n- When overheated, the object cannot fire any bullets\n\nStatistics:\n- Total bullets created\n- Total shots taken\n- Total reloads completed\n\nBullets:\n- Each bullet is assigned several variables that can be used for advanced object picking\n- __FireBullet.BulletID = Unique number for every bullet created\n- __FireBullet.BatchID = Unique number for all bullets created in the same frame\n- __FireBullet.BatchOrderID = Unique number for each bullet in the same batch. Can be used to identify the position in the firing arc.", + "origin": { + "identifier": "FireBullet", + "name": "gdevelop-extension-store" + }, + "tags": [ + "fire", + "bullet", + "spawn", + "firerate", + "reload", + "weapon", + "ranged", + "ammo", + "overheat" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Fire bullets, manage ammo, reloading, and overheating.", + "fullName": "Fire bullets", + "name": "FireBullet", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", "sentence": "", "events": [ { @@ -10065,71 +8821,38 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResetObjectTimer" }, "parameters": [ - "max(0,Object.Behavior::Cooldown() - Object.ObjectTimerElapsedTime(\"__FireBullet.FiringCooldown\"))" + "Object", + "\"__FireBullet.FiringCooldown\"" ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Seconds remaining before the overheat penalty ends.", - "fullName": "Time remaining before overheat penalty ends", - "functionType": "Expression", - "group": "Overheat", - "name": "OverheatTimeLeft", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { "type": { - "value": "CompareObjectTimer" + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" }, "parameters": [ "Object", - "\"__FireBullet.OverheatDuration\"", - ">", - "0" + "Behavior", + "=", + "Object.Behavior::PropertyStartingAmmo()" ] - } - ], - "actions": [ + }, { "type": { - "value": "SetReturnNumber" + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" }, "parameters": [ - "max(0, Object.Behavior::PropertyOverheatDuration() - Object.ObjectTimerElapsedTime(\"__FireBullet.OverheatDuration\"))" + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyShotsPerReload()" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -10146,168 +8869,83 @@ "objectGroups": [] }, { - "description": "Check if object is currently performing an ammo reload.", - "fullName": "Is ammo reloading in progress", - "functionType": "Condition", - "group": "Reload", - "name": "IsReloadInProgress", - "sentence": "_PARAM0_ is reloading ammo", + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Take a shot (if triggered)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnBoolean" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyReloadInProgress" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if object is ready to shoot.", - "fullName": "Is ready to shoot", - "functionType": "Condition", - "group": "Firing", - "name": "IsReadyToShoot", - "sentence": "_PARAM0_ is ready to shoot", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Check if ready to shoot", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Verify that the gun has ammo", - "comment2": "" - }, + "comment": "Creators can use the \"FireBullet\" action multiple times in a frame and it will be counted as a single \"shot\".", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsOutOfAmmo" + "value": "FireBullet::FireBullet::PropertyHasJustFired" }, "parameters": [ "Object", - "Behavior", - "" + "Behavior" ] } ], "actions": [], "events": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Verify that the gun does not need to be reloaded and is not currently reloading", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsReloadNeeded" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset firing cooldown", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsReloadInProgress" - }, - "parameters": [ - "Object", - "Behavior", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.FiringCooldown\"" + ] + } ] } ], - "actions": [], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update ammo", + "source": "", + "type": "BuiltinCommonInstructions::Group", "events": [ { "type": "BuiltinCommonInstructions::Comment", @@ -10319,7 +8957,7 @@ "textG": 0, "textR": 0 }, - "comment": "Verify gun is not shooting sooner than the proper rate of fire", + "comment": "Subtract 1 from ammo (if not unlimited ammo)", "comment2": "" }, { @@ -10328,126 +8966,532 @@ { "type": { "inverted": true, - "value": "FireBullet::FireBullet::IsFiringCooldownActive" + "value": "FireBullet::FireBullet::PropertyUnlimitedAmmo" }, "parameters": [ "Object", - "Behavior", - "" + "Behavior" ] } ], - "actions": [], - "events": [ + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" }, - "comment": "Verify the gun is not overheated", - "comment2": "" - }, + "parameters": [ + "Object", + "Behavior", + "-", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update reloading counter", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsOverheated" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } + "type": { + "value": "FireBullet::FireBullet::PropertyShotsPerReload" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "1" ] } ] } - ] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if automatic reloading is enabled.", - "fullName": "Is automatic reloading enabled", - "functionType": "Condition", - "group": "Reload", - "name": "IsAutomaticReloadingEnabled", - "sentence": "Automatic reloading is enabled on_PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Automatically reload gun when needed", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::ReloadAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update Overheat", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase heat (if needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyHeatIncreasePerShot" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyHeatIncreasePerShot()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Check if this caused overheat", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyOverheatDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::IsOverheated" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.OverheatDuration\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update statistics", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalShotsFired" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset firing detection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHasJustFired" + }, + "parameters": [ + "Object", + "Behavior", + "=" + ] + } + ] + } + ], + "parameters": [] + } ] } - ] + ], + "parameters": [] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyAutomaticReloading" - }, - "parameters": [ - "Object", - "Behavior" + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reload gun when needed", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect when reload is completed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.ReloadingTimer\"", + ">=", + "Object.Behavior::PropertyReloadDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalReloadsCompleted" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyShotsPerReload()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only reload the amount of ammo available", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyShotsPerReload(), Object.Behavior::PropertyAmmoQuantity())" + ] + } + ] + } ] } ], - "actions": [ + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reduce heat level (based on cooling rate)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::HeatLevel()", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyExponentialCoolingRate" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyHeatLevel() - TimeDelta() * Object.Behavior::PropertyExponentialCoolingRate() * Object.Behavior::PropertyHeatLevel())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyLinearCoolingRate" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyHeatLevel() - TimeDelta() * Object.Behavior::PropertyLinearCoolingRate())" + ] + } + ] + } ] } - ] + ], + "parameters": [] } ], "parameters": [ @@ -10466,50 +9510,44 @@ "objectGroups": [] }, { - "description": "Check if ammo is unlimited.", - "fullName": "Is ammo unlimited", - "functionType": "Condition", - "group": "Ammo", - "name": "IsUnlimitedAmmo", - "sentence": "_PARAM0_ has unlimited ammo", + "description": "Fire bullets toward a position.", + "fullName": "Fire bullets toward a position", + "functionType": "Action", + "name": "FireTowardPosition", + "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward position _PARAM5_;_PARAM6_ with speed _PARAM7_ px/s", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate the trajectory angle and use the \"Fire bullets\" action", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "FireBullet::FireBullet::PropertyUnlimitedAmmo" - }, - "parameters": [ - "Object", - "Behavior" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::Fire" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "Bullet", + "Object.AngleToPosition(GetArgumentAsNumber(\"TargetXPosition\"),GetArgumentAsNumber(\"TargetYPosition\"))", + "GetArgumentAsNumber(\"Speed\")", + "" + ] + } ] } ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] + "parameters": [] } ], "parameters": [ @@ -10523,238 +9561,249 @@ "name": "Behavior", "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if object has no ammo available.", - "fullName": "Is out of ammo", - "functionType": "Condition", - "group": "Ammo", - "name": "IsOutOfAmmo", - "sentence": "_PARAM0_ is out of ammo", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "FireBullet::FireBullet::IsUnlimitedAmmo" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "FireBullet::FireBullet::PropertyAmmoQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if object needs to reload ammo.", - "fullName": "Is a reload needed", - "functionType": "Condition", - "group": "Reload", - "name": "IsReloadNeeded", - "sentence": "_PARAM0_ needs to reload ammo", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Shots per reload must not be \"0\"", - "comment2": "" + "description": "The bullet object", + "name": "Bullet", + "type": "objectList" }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "FireBullet::FireBullet::PropertyShotsPerReload" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - }, - { - "type": { - "value": "FireBullet::FireBullet::PropertyShotsBeforeNextReload" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ + "description": "Target X position", + "name": "TargetXPosition", + "type": "expression" + }, { - "description": "Object", - "name": "Object", - "type": "object" + "description": "Target Y position", + "name": "TargetYPosition", + "type": "expression" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "FireBullet::FireBullet", - "type": "behavior" + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Check if object is overheated.", - "fullName": "Is overheated", - "functionType": "Condition", - "group": "Overheat", - "name": "IsOverheated", - "sentence": "_PARAM0_ is overheated", + "description": "Fire bullets in the direction of a given angle.", + "fullName": "Fire bullets toward an angle", + "functionType": "Action", + "name": "Fire", + "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward angle _PARAM5_ and speed _PARAM6_ px/s", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check if ready to shoot", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "FireBullet::FireBullet::PropertyHeatLevel" + "value": "FireBullet::FireBullet::IsReadyToShoot" }, "parameters": [ "Object", "Behavior", - ">=", - "1" + "" ] - }, + } + ], + "actions": [ { "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" + "value": "FireBullet::FireBullet::SetPropertyHasJustFired" }, "parameters": [ - "Object.Behavior::OverheatTimeLeft()", - ">", - "0" + "Object", + "Behavior", + "yes" ] } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Single bullet", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyBulletQuantity()", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::FireSingleBullet" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "Bullet", + "GetArgumentAsNumber(\"Angle\")", + "GetArgumentAsNumber(\"Speed\")", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Multiple bullets", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyBulletQuantity()", + ">", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.CurrentBulletAngle", + "=", + "GetArgumentAsNumber(\"Angle\") - Object.Behavior::PropertyFiringArc()/2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.BatchOrderID", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.Behavior::PropertyBulletQuantity()", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::FireSingleBullet" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "Bullet", + "Object.Variable(__FireBullet.CurrentBulletAngle) + RandomInRange(-Object.Behavior::PropertyAngleVariance(),Object.Behavior::PropertyAngleVariance())", + "GetArgumentAsNumber(\"Speed\")", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move temp variable to the next angle a bullet will be sent", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.CurrentBulletAngle", + "+", + "Object.Behavior::PropertyFiringArc() / (Object.Behavior::PropertyBulletQuantity() - 1)" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FireBullet.BatchOrderID", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } ] } ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] + "parameters": [] } ], "parameters": [ @@ -10768,53 +9817,321 @@ "name": "Behavior", "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectList" + }, + { + "description": "Angle of the bullet, in degrees", + "name": "Angle", + "type": "expression" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Check if firing cooldown is active.", - "fullName": "Is firing cooldown active", - "functionType": "Condition", + "description": "Fire a single bullet. This is only meant to be used inside the \"Fire bullet\" action.", + "fullName": "Fire a single bullet", + "functionType": "Action", "group": "Firing", - "name": "IsFiringCooldownActive", - "sentence": "Firing cooldown is active on _PARAM0_", + "name": "FireSingleBullet", + "private": true, + "sentence": "Fire a single bullet _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, with angle _PARAM5_ and speed _PARAM6_ px/s", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Fire a single bullet", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnBoolean" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "False" + "comment": "Create bullet", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Bullet", + "GetArgumentAsNumber(\"XPosition\")", + "GetArgumentAsNumber(\"YPosition\")", + "\"\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move bullet", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "Bullet", + "GetArgumentAsNumber(\"Angle\") + RandomInRange(-Object.Behavior::PropertyAngleVariance(), Object.Behavior::PropertyAngleVariance())", + "GetArgumentAsNumber(\"Speed\")", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add identifier variables (to enable advanced picking by users)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Bullet", + "__FireBullet.BulletID", + "=", + "Object.Behavior::PropertyTotalBulletsCreated()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Bullet", + "__FireBullet.BatchID", + "=", + "Object.Behavior::PropertyTotalShotsFired()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Bullet", + "__FireBullet.BatchOrderID", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Rotate newly created bullet, if needed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Bullet", + "=", + "GetArgumentAsNumber(\"Angle\")" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update statistics", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyTotalBulletsCreated" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } ] } - ] + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectList" + }, + { + "description": "Angle of the bullet, in degrees", + "name": "Angle", + "type": "expression" }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Reload ammo.", + "fullName": "Reload ammo", + "functionType": "Action", + "name": "ReloadAmmo", + "sentence": "Reload ammo on _PARAM0_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" + "inverted": true, + "value": "FireBullet::FireBullet::IsOutOfAmmo" }, "parameters": [ - "Object.Behavior::CooldownTimeLeft()", - ">", - "0" + "Object", + "Behavior", + "" ] } ], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "FireBullet::FireBullet::SetPropertyReloadInProgress" }, "parameters": [ - "True" + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.ReloadingTimer\"" ] } ] @@ -10834,364 +10151,486 @@ } ], "objectGroups": [] - } - ], - "propertyDescriptors": [ + }, { - "value": "0.1", - "type": "Number", - "label": "Firing cooldown (seconds)", - "description": "Object cannot shoot while firing cooldown is active", - "group": "Shooting configuration", - "extraInformation": [], - "hidden": false, - "name": "FireCooldown" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "HasJustFired" + "description": "Check if the object has just fired something.", + "fullName": "Has just fired", + "functionType": "Condition", + "group": "Firing", + "name": "HasJustFired", + "sentence": "_PARAM0_ has just fired", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyHasJustFired" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "value": "45", - "type": "Number", - "label": "Firing arc (degrees)", - "description": "Multi-Fire bullets will be evenly spaced inside the Firing Arc", - "group": "Multi-Fire", - "extraInformation": [], - "hidden": false, - "name": "FiringArc" + "description": "Check if bullet rotates to match trajectory.", + "fullName": "Is bullet rotation enabled", + "functionType": "Condition", + "group": "Firing", + "name": "BulletRotationEnabled", + "sentence": "Bullet rotation enabled on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "value": "1", - "type": "Number", - "label": "Number of bullets created at once (Multi-Fire)", - "description": "Multi-Fire bullets will be evenly spaced inside the Firing Arc", + "description": "Change the firing arc (in degrees) where bullets will be shot. Bullets will be evenly spaced out inside the firing arc.", + "fullName": "Set firing arc", + "functionType": "Action", "group": "Multi-Fire", - "extraInformation": [], - "hidden": false, - "name": "BulletQuantity" - }, - { - "value": "0", - "type": "Number", - "label": "Angle variance (degrees)", - "description": "Used to simulate imperfect aim (Range: 0 to 180 degrees)", - "group": "Shooting configuration", - "extraInformation": [], - "hidden": false, - "name": "AngleVariance" - }, - { - "value": "true", - "type": "Boolean", - "label": "Rotate bullet to match trajectory", - "description": "", - "group": "Shooting configuration", - "extraInformation": [], - "hidden": false, - "name": "RotateBullet" + "name": "SetFiringArc", + "sentence": "Set firing arc of _PARAM0_ to _PARAM2_ degrees", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyFiringArc" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Firing arc (degrees) Range: 0 to 360", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "0", - "type": "Number", - "label": "Ammo quantity (current)", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "AmmoQuantity" + "description": "Change the angle variance (in degrees) applied to each bullet.", + "fullName": "Set angle variance", + "functionType": "Action", + "group": "Firing", + "name": "SetAngleVariance", + "sentence": "Set angle variance of _PARAM0_ to _PARAM2_ degrees", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAngleVariance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Angle variance (degrees) Range: 0 to 180", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "0", - "type": "Number", - "label": "Shots per reload ", - "description": "Use 0 to disable reloading", - "group": "Reload", - "extraInformation": [], - "hidden": false, - "name": "ShotsPerReload" - }, - { - "value": "1", - "type": "Number", - "label": "Reloading duration (seconds)", - "description": "Object cannot shoot while reloading is in progress", - "group": "Reload", - "extraInformation": [], - "hidden": false, - "name": "ReloadDuration" - }, - { - "value": "0", - "type": "Number", - "label": "Max ammo ", - "description": "Use \"0\" to disable restrictions on ammo capacity", - "group": "Ammo", - "extraInformation": [], - "hidden": false, - "name": "MaxAmmo" - }, - { - "value": "0", - "type": "Number", - "label": "Shots before next reload", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ShotsBeforeNextReload" - }, - { - "value": "0", - "type": "Number", - "label": "Total shots fired", - "description": "Regardless of how many bullets are created, only 1 shot will be counted per frame", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "TotalShotsFired" - }, - { - "value": "0", - "type": "Number", - "label": "Total bullets created", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "TotalBulletsCreated" - }, - { - "value": "0", - "type": "Number", - "label": "Starting ammo", - "description": "", - "group": "Ammo", - "extraInformation": [], - "hidden": false, - "name": "StartingAmmo" - }, - { - "value": "0", - "type": "Number", - "label": "Total reloads completed", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "TotalReloadsCompleted" - }, - { - "value": "true", - "type": "Boolean", - "label": "Unlimited ammo", - "description": "", - "group": "Ammo", - "extraInformation": [], - "hidden": false, - "name": "UnlimitedAmmo" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ReloadInProgress" - }, - { - "value": "0", - "type": "Number", - "label": "Heat increase per shot (Range: 0 to 1)", - "description": " Object is overheated when Heat reaches 1", - "group": "Overheat", - "extraInformation": [], - "hidden": false, - "name": "HeatIncreasePerShot" - }, - { - "value": "0", - "type": "Number", - "label": "Heat level (Range: 0 to 1)", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "HeatLevel" - }, - { - "value": "true", - "type": "Boolean", - "label": "Reload automatically", - "description": "", - "group": "Reload", - "extraInformation": [], - "hidden": false, - "name": "AutomaticReloading" - }, - { - "value": "0", - "type": "Number", - "label": "Overheat duration (seconds) ", - "description": "Object cannot shoot while overheat duration is active", - "group": "Overheat", - "extraInformation": [], - "hidden": false, - "name": "OverheatDuration" - }, - { - "value": "0.1", - "type": "Number", - "label": "Linear cooling rate (per second)", - "description": "", - "group": "Overheat", - "extraInformation": [], - "hidden": false, - "name": "LinearCoolingRate" - }, - { - "value": "0.3", - "type": "Number", - "label": "Exponential cooling rate (per second)", - "description": "Exponential cooling happens faster when heat is high and slower when heat is low", - "group": "Overheat", - "extraInformation": [ - "Linear", - "Exponential" - ], - "hidden": false, - "name": "ExponentialCoolingRate" - } - ], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", - "category": "Input", - "extensionNamespace": "", - "fullName": "Resource bar", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", - "name": "ResourceBar", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", - "shortDescription": "Display a bar that represents a resource in the game (health, shield, mana, ammo, etc)", - "version": "0.0.1", - "description": "The resource bar can be displayed using these objects:\n\n- Shape painter\n- Tiled sprite\n- Sprite\n", - "origin": { - "identifier": "DraggableSliderControl", - "name": "gdevelop-extension-store" - }, - "tags": [ - "resource", - "bar", - "shape painter", - "health", - "mana", - "shield", - "hearts", - "lives", - "ammo" - ], - "authorIds": [ - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ - { - "description": "Draws a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", - "fullName": "Resource bar (shape painter)", - "name": "ResourceBar_ShapePainter", - "objectType": "PrimitiveDrawing::Drawer", - "eventsFunctions": [ - { - "fullName": "", + "description": "Change the number of bullets shot every time the \"fire bullet\" action is used.", + "fullName": "Set number of bullets per shot", "functionType": "Action", - "name": "onCreated", - "sentence": "", + "group": "Multi-Fire", + "name": "SetBulletQuantity", + "sentence": "Set number of bullets per shot of _PARAM0_ to _PARAM2_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure object doesn't get redrawn every frame", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "PrimitiveDrawing::ClearBetweenFrames" + "value": "FireBullet::FireBullet::SetPropertyBulletQuantity" }, "parameters": [ "Object", - "no" + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Use correct min value (instead of always starting at 0)", - "comment2": "" + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Bullets", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Enable bullet rotation.", + "fullName": "Enable (or disable) bullet rotation", + "functionType": "Action", + "group": "Firing", + "name": "SetRotateBullet", + "sentence": "Enable bullet rotation on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"RotateBullet\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"RotateBullet\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyRotateBullet" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Rotate bullet to match trajetory", + "name": "RotateBullet", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable unlimited ammo.", + "fullName": "Enable (or disable) unlimited ammo", + "functionType": "Action", + "group": "Ammo", + "name": "SetUnlimitedAmmo", + "sentence": "Enable unlimited ammo on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"UnlimitedAmmo\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"UnlimitedAmmo\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Unlimited ammo", + "name": "UnlimitedAmmo", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the firing cooldown, which changes the rate of fire.", + "fullName": "Set firing cooldown", + "functionType": "Action", + "group": "Firing", + "name": "SetCooldown", + "sentence": "Set the fire rate of _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyFireCooldown" }, "parameters": [ "Object", "Behavior", "=", - "Object.Behavior::PropertyValueMin()" + "GetArgumentAsNumber(\"NewCooldown\")" ] } ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" }, + { + "description": "Cooldown in seconds", + "name": "NewCooldown", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration to reload ammo.", + "fullName": "Set reload duration", + "functionType": "Action", + "group": "Reload", + "name": "SetReloadDuration", + "sentence": "Set the reload duration of _PARAM0_ to _PARAM2_ seconds", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::UpdateHitbox" + "value": "FireBullet::FireBullet::SetPropertyReloadDuration" }, "parameters": [ "Object", "Behavior", - "" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -11201,322 +10640,89 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" + }, + { + "description": "Reload duration (seconds)", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "fullName": "", + "description": "Change the duration after becoming overheated.", + "fullName": "Set overheat duration", "functionType": "Action", - "name": "doStepPostEvents", - "sentence": "", + "group": "Overheat", + "name": "SetOverheatDuration", + "sentence": "Set the overheat duration of _PARAM0_ to _PARAM2_ seconds", "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Draw resource bar (if needed)", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::PropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior" - ] - }, - { - "type": { - "value": "Visible" - }, - "parameters": [ - "Object" - ] - }, - { - "type": { - "value": "LayerVisible" - }, - "parameters": [ - "", - "Object.Layer()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Drawer::ClearShapes" - }, - "parameters": [ - "Object" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Inactive Bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set inactive Bar parameters", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyInactiveBarColor()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyInactiveBarOpacity()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::OutlineOpacity" - }, - "parameters": [ - "Object", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw inactive Bar", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyValueOffset()", - "0", - "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness()" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Active Bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set active Bar parameters", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyActiveBarColor()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyActiveBarOpacity()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw active Bar", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "0", - "0", - "Object.Behavior::PropertyValueOffset()", - "Object.Behavior::PropertyBarThickness()" - ] - } - ] - } - ], - "parameters": [] - } + "type": { + "value": "FireBullet::FireBullet::SetPropertyOverheatDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } - ], - "parameters": [] + ] } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" + }, + { + "description": "Overheat duration (seconds)", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Draw a resource bar that shows current and max values.", - "fullName": "Draw a resource bar (shape painter)", + "description": "Change the quantity of ammo.", + "fullName": "Set ammo quantity", "functionType": "Action", - "name": "DrawResourceBar", - "sentence": "Draw a resource bar using _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "group": "Ammo", + "name": "SetAmmoQuantity", + "sentence": "Set the ammo quantity of _PARAM0_ to _PARAM2_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), Object.Behavior::PropertyEasingSpeed())", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" }, "parameters": [ "Object", "Behavior", - "GetArgumentAsNumber(\"MaxValue\")", - "" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -11526,73 +10732,43 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" }, { - "description": "Current value", - "name": "CurrentValue", - "type": "expression" - }, - { - "description": "Max value", - "name": "MaxValue", - "supplementaryInformation": "Health::Health", + "description": "Ammo", + "name": "Value", "type": "expression" } ], "objectGroups": [] }, { - "description": "Draw a resource bar based on the health points of an object.", - "fullName": "Draw a health bar", + "description": "Change the heat increase per shot.", + "fullName": "Set heat increase per shot", "functionType": "Action", - "name": "DrawHealthBar", - "sentence": "Draw a resource bar using _PARAM0_ based on the health points of _PARAM2_", + "group": "Overheat", + "name": "SetHeatPerShot", + "sentence": "Set the heat increase of _PARAM0_ to _PARAM2_ per shot", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), Object.Behavior::PropertyEasingSpeed())", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + "value": "FireBullet::FireBullet::SetPropertyHeatIncreasePerShot" }, "parameters": [ "Object", "Behavior", - "ObjectWithHealth.HealthBehavior::MaxHealth()", - "" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -11602,73 +10778,72 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" }, { - "description": "Object with health", - "name": "ObjectWithHealth", - "type": "objectList" - }, - { - "description": "Health behavior", - "name": "HealthBehavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" + "description": "Heat increase per shot (Range: 0 to 1)", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Draw a resource bar based on the shield points of an object.", - "fullName": "Draw a shield bar", + "description": "Change the max ammo.", + "fullName": "Set max ammo", "functionType": "Action", - "name": "DrawShieldBar", - "sentence": "Draw a resource bar using _PARAM0_ based on the shield points of _PARAM2_", + "group": "Ammo", + "name": "SetMaxAmmo", + "sentence": "Set the max ammo of _PARAM0_ to _PARAM2_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + "value": "FireBullet::FireBullet::SetPropertyMaxAmmo" }, "parameters": [ "Object", "Behavior", - "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), Object.Behavior::PropertyEasingSpeed())", - "" + "=", + "GetArgumentAsNumber(\"Value\")" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + "value": "FireBullet::FireBullet::PropertyMaxAmmo" }, "parameters": [ "Object", "Behavior", - "ObjectWithShield.ShieldBehavior::MaxShield()", - "" + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::MaxAmmo(),Object.Behavior::AmmoQuantity())" ] } ] @@ -11678,73 +10853,43 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" }, { - "description": "Object with shield", - "name": "ObjectWithShield", - "type": "objectList" - }, - { - "description": "Shield behavior", - "name": "ShieldBehavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" + "description": "Max ammo", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Draw a resource bar based on the ammo of an object.", - "fullName": "Draw an ammo bar", + "description": "Reset total shots fired.", + "fullName": "Reset total shots fired", "functionType": "Action", - "name": "DrawAmmoBar", - "sentence": "Draw a resource bar using _PARAM0_ based on the ammo of _PARAM2_", + "group": "Stats", + "name": "ResetTotalShotsFired", + "sentence": "Reset total shots fired by _PARAM0_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithFireBullet.FireBulletBehavior::AmmoQuantity(), Object.Behavior::PropertyEasingSpeed())", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + "value": "FireBullet::FireBullet::SetPropertyTotalShotsFired" }, "parameters": [ "Object", "Behavior", - "ObjectWithFireBullet.FireBulletBehavior::MaxAmmo()", - "" + "=", + "0" ] } ] @@ -11754,23 +10899,11 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", - "type": "behavior" - }, - { - "description": "Object with fire bullet", - "name": "ObjectWithFireBullet", - "type": "objectList" - }, - { - "description": "Fire bullet behavior", - "name": "FireBulletBehavior", "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } @@ -11778,12 +10911,12 @@ "objectGroups": [] }, { - "description": "Value of the resource.", - "fullName": "Resource value", - "functionType": "Expression", - "group": "Resource value", - "name": "Value", - "sentence": "", + "description": "Reset total bullets created.", + "fullName": "Reset total bullets created", + "functionType": "Action", + "group": "Stats", + "name": "ResetTotalBulletsCreated", + "sentence": "Reset total bullets created by _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -11791,96 +10924,95 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "FireBullet::FireBullet::SetPropertyTotalBulletsCreated" }, "parameters": [ - "Object.Behavior::PropertyValue()" + "Object", + "Behavior", + "=", + "0" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Change the value of the resource.", - "fullName": "Resource value", + "description": "Reset total reloads completed.", + "fullName": "Reset total reloads completed", "functionType": "Action", - "group": "Resource value", - "name": "SetValue", - "sentence": "Change the value of _PARAM0_: _PARAM2_", + "group": "Stats", + "name": "ResetTotalReloadsCompleted", + "sentence": "Reset total reloads completed by _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "0" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + "value": "FireBullet::FireBullet::SetPropertyTotalReloadsCompleted" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "0" ] } ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the number of shots per reload.", + "fullName": "Set shots per reload", + "functionType": "Action", + "group": "Reload", + "name": "SetShotsPerReload", + "sentence": "Set the shots per reload of _PARAM0_ to _PARAM2_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + "value": "FireBullet::FireBullet::SetPropertyShotsPerReload" }, "parameters": [ "Object", "Behavior", "=", - "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -11890,90 +11022,91 @@ "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::PropertyValue" + "value": "FireBullet::FireBullet::PropertyShotsBeforeNextReload" }, "parameters": [ "Object", "Behavior", - "<", - "Object.Behavior::PropertyValueMin()" + ">", + "Object.Behavior::PropertyShotsPerReload()" ] } ], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + "value": "FireBullet::FireBullet::SetPropertyShotsBeforeNextReload" }, "parameters": [ "Object", "Behavior", "=", - "Object.Behavior::PropertyValueMin()" + "Object.Behavior::PropertyShotsPerReload()" ] } ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" }, + { + "description": "Shots per reload", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automatic reloading.", + "fullName": "Enable (or disable) automatic reloading", + "functionType": "Action", + "group": "Reload", + "name": "SetAutomaticReload", + "sentence": "Enable automatic reloading on _PARAM0_: _PARAM2_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::PropertyValueMax()" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + "value": "FireBullet::FireBullet::SetPropertyAutomaticReloading" }, "parameters": [ "Object", "Behavior", - "=", - "Object.Behavior::PropertyValueMax()" + "=" ] } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set the proper offset", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueOffset" + "value": "GetArgumentAsBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + "\"Value\"" ] - }, + } + ], + "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + "value": "FireBullet::FireBullet::SetPropertyAutomaticReloading" }, "parameters": [ "Object", @@ -11988,30 +11121,31 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" }, { - "description": "Slider value", + "defaultValue": "yes", + "description": "Enable automatic reloading", "name": "Value", - "type": "expression" + "optional": true, + "type": "yesorno" } ], "objectGroups": [] }, { - "description": "Minimum value of the resource.", - "fullName": "Resource minimum value", - "functionType": "Expression", - "group": "Resource value", - "name": "ValueMin", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "description": "Change the linear rate of cooling.", + "fullName": "Set linear cooling rate", + "functionType": "Action", + "group": "Overheat", + "name": "SetLinearCoolingRate", + "sentence": "Set the linear cooling rate of _PARAM0_ to _PARAM2_ per second", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12019,41 +11153,45 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "FireBullet::FireBullet::SetPropertyLinearCoolingRate" }, "parameters": [ - "Object.Behavior::PropertyValueMin()" + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" + }, + { + "description": "Heat cooling rate (per second)", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the minimum value of the resource.", - "fullName": "Resource minimum value", + "description": "Change the exponential rate of cooling.", + "fullName": "Set exponential cooling rate", "functionType": "Action", - "group": "Resource value", - "name": "SetValueMin", - "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "group": "Overheat", + "name": "SetExponentialCoolingRate", + "sentence": "Set the exponential cooling rate of _PARAM0_ to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12061,24 +11199,13 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueMin" + "value": "FireBullet::FireBullet::SetPropertyExponentialCoolingRate" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"ValueMin\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -12088,30 +11215,29 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" }, { - "description": "Minimum value", - "name": "ValueMin", + "description": "Exponential cooling rate", + "name": "Value", + "supplementaryInformation": "[\"Exponential\",\"Linear\"]", "type": "expression" } ], "objectGroups": [] }, { - "description": "Maximum value of the resource.", - "fullName": "Resource maximum value", - "functionType": "Expression", - "group": "Resource value", - "name": "ValueMax", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "description": "Increase ammo quantity.", + "fullName": "Increase ammo", + "functionType": "Action", + "name": "IncreaseAmmo", + "sentence": "Increase ammo of _PARAM0_ by _PARAM2_ shots", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12119,83 +11245,123 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" }, "parameters": [ - "Object.Behavior::PropertyValueMax()" + "Object", + "Behavior", + "+", + "GetArgumentAsNumber(\"AmmoGained\")" ] } ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + }, { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Ammo is set, do not exceed the value", + "comment2": "" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Thickness of the resource bar.", - "fullName": "Resource bar thickness", - "functionType": "Expression", - "group": "Resource bar configuration", - "name": "BarThickness", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyMaxAmmo" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetPropertyAmmoQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::MaxAmmo(),Object.Behavior::AmmoQuantity())" + ] + } + ] + }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::PropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "FireBullet::FireBullet::ReloadAmmo" }, "parameters": [ - "Object.Behavior::PropertyBarThickness()" + "Object", + "Behavior", + "" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" + }, + { + "description": "Ammo gained", + "name": "AmmoGained", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Length of the resource bar.", - "fullName": "Resource bar length", + "description": "Number of bullets to shoot at once (evenly spaced inside the Firing Arc).", + "fullName": "Bullet quantity", "functionType": "Expression", - "group": "Resource bar configuration", - "name": "BarLength", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "group": "Multi-Fire", + "name": "BulletQuantity", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12206,7 +11372,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyBarLength()" + "Object.Behavior::PropertyBulletQuantity()" ] } ] @@ -12219,25 +11385,24 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Change the maximum value of the resource.", - "fullName": "Resource maximum value", - "functionType": "Action", - "group": "Resource value", - "name": "SetValueMax", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "description": "Angle variance, in degrees.", + "fullName": "Angle variance", + "functionType": "Expression", + "group": "Firing", + "name": "AngleVariance", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12245,57 +11410,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueMax" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMax\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "Object.Behavior::PropertyAngleVariance()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Maximum value", - "name": "ValueMax", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Tick spacing of the resource bar.", - "fullName": "Tick spacing", + "description": "Firing arc, in degrees.", + "fullName": "Firing arc", "functionType": "Expression", - "group": "Resource bar configuration", - "name": "TickSpacing", - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "group": "Multi-Fire", + "name": "FiringArc", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12306,7 +11454,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyTickSpacing()" + "Object.Behavior::PropertyFiringArc()" ] } ] @@ -12319,30 +11467,24 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Tick spacing", - "name": "TickSpacing", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the tick spacing of the resource bar.", - "fullName": "Tick spacing", - "functionType": "Action", - "group": "Resource bar configuration", - "name": "SetTickSpacing", - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "description": "Heat level (Range: 0 to 1).", + "fullName": "Heat level", + "functionType": "Expression", + "group": "Overheat", + "name": "HeatLevel", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12350,57 +11492,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"TickSpacing\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "min(1,Object.Behavior::PropertyHeatLevel())" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Tick spacing", - "name": "TickSpacing", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change length of the resource bar.", - "fullName": "Bar length", - "functionType": "Action", - "group": "Resource bar configuration", - "name": "SetBarLength", - "sentence": "Change length of _PARAM0_ to _PARAM2_ px", + "description": "Firing cooldown, in seconds.", + "fullName": "Firing cooldown", + "functionType": "Expression", + "group": "Firing", + "name": "Cooldown", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12408,83 +11533,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyBarLength" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyValue()", - "" + "Object.Behavior::PropertyFireCooldown()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Bar width", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change thickness of the resource bar.", - "fullName": "Bar thickness", - "functionType": "Action", - "group": "Resource bar configuration", - "name": "SetBarThickness", - "sentence": "Change thickness of _PARAM0_ to _PARAM2_ px", + "description": "Reload duration, in seconds.", + "fullName": "Reload duration", + "functionType": "Expression", + "group": "Ammo", + "name": "ReloadDuration", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12492,56 +11574,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyBarThickness" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyReloadDuration()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Bar thickness", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change opacity of the inactive portion of a resource bar.", - "fullName": "Inactive opacity", - "functionType": "Action", - "group": "Resource bar configuration", - "name": "SetInactiveBarOpacity", - "sentence": "Change opacity of inactive part of _PARAM0_ to _PARAM2_", + "description": "Overheat duration, in seconds.", + "fullName": "Overheat duration", + "functionType": "Expression", + "group": "Overheat", + "name": "OverheatDuration", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12549,56 +11615,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyInactiveBarOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyOverheatDuration()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Inactive bar opacity", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change opacity of the active portion of a resource bar.", - "fullName": "Active bar opacity", - "functionType": "Action", - "group": "Resource bar configuration", - "name": "SetActiveBarOpacity", - "sentence": "Change opacity of active part of _PARAM0_ to _PARAM2_", + "description": "Heat increase per shot.", + "fullName": "Heat increase per shot", + "functionType": "Expression", + "group": "Overheat", + "name": "HeatIncreasePerShot", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12606,56 +11656,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyActiveBarOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyHeatIncreasePerShot()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Active bar opacity", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the color of the active area of bar.", - "fullName": "Active bar color ", - "functionType": "Action", - "group": "Resource bar configuration", - "name": "SetActiveBarColor", - "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", + "description": "Linear cooling rate, per second.", + "fullName": "Linear cooling rate", + "functionType": "Expression", + "group": "Overheat", + "name": "LinearCoolingRate", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12663,56 +11697,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyActiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Color\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyLinearCoolingRate()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Active bar color", - "name": "Color", - "type": "color" } ], "objectGroups": [] }, { - "description": "Change the color of the inactive area of bar.", - "fullName": "Inactive bar color", - "functionType": "Action", - "group": "Resource bar configuration", - "name": "SetInactiveBarColor", - "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", + "description": "Exponential cooling rate, per second.", + "fullName": "Exponential cooling rate", + "functionType": "Expression", + "group": "Overheat", + "name": "ExponentialCoolingRate", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12720,57 +11738,40 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyInactiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Color\")" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyExponentialCoolingRate()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Inactive bar color", - "name": "Color", - "type": "color" } ], "objectGroups": [] }, { - "description": "Update the hitbox.", - "fullName": "Update hitbox", - "functionType": "Action", - "group": "Private", - "name": "UpdateHitbox", - "private": true, - "sentence": "Update the hitbox of _PARAM0_", + "description": "Max ammo.", + "fullName": "Max ammo", + "functionType": "Expression", + "group": "Ammo", + "name": "MaxAmmo", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12778,202 +11779,121 @@ "actions": [ { "type": { - "value": "PrimitiveDrawing::SetRotationCenter" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyBarLength() / 2", - "Object.Behavior::PropertyBarThickness() / 2" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::SetRectangularCollisionMask" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "0", - "0", - "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness()" + "Object.Behavior::PropertyMaxAmmo()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "0", - "type": "Number", - "label": "Minimum value", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMin" - }, - { - "value": "1", - "type": "Number", - "label": "Maximum value", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMax" }, { - "value": "0", - "type": "Number", - "label": "Tick spacing", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "TickSpacing" - }, - { - "value": "200", - "type": "Number", - "label": "Bar length", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "BarLength" - }, - { - "value": "16", - "type": "Number", - "label": "Bar thickness", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "BarThickness" - }, - { - "value": "11;255;0", - "type": "Color", - "label": "Inactive Bar color", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "InactiveBarColor" - }, - { - "value": "96", - "type": "Number", - "label": "Inactive Bar opacity", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "InactiveBarOpacity" - }, - { - "value": " 11;255;0", - "type": "Color", - "label": "Active Bar color", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "ActiveBarColor" - }, - { - "value": "255", - "type": "Number", - "label": "Active Bar opacity", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "ActiveBarOpacity" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "Value" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "Distance from the object origin to where the active and inactive bar touch", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ValueOffset" - }, - { - "value": "true", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "NeedRedraw" + "description": "Total shots fired (multi-bullet shots are considered one shot).", + "fullName": "Shots fired", + "functionType": "Expression", + "group": "Stats", + "name": "TotalShotsFired", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTotalShotsFired()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "value": "easeOutCirc", - "type": "Choice", - "label": "Easing", - "description": "Easing used to change the displayed value of the resource bar. (Note: Changes to the Value property are always instant)", - "group": "", - "extraInformation": [ - "easeOutCirc" + "description": "Total bullets created.", + "fullName": "Bullets created", + "functionType": "Expression", + "group": "Stats", + "name": "TotalBulletsCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTotalBulletsCreated()" + ] + } + ] + } ], - "hidden": false, - "name": "Easing" + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "value": "0.05", - "type": "Number", - "label": "Easing speed (Range: 0 to 1)", - "description": "Higher values mean faster movement. Value of \"1\" means instant change.", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "EasingSpeed" - } - ], - "sharedPropertyDescriptors": [] - }, - { - "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image for the resource bar and the unit objects.", - "fullName": "Resource bar (sprite)", - "name": "ResourceBar_Sprite", - "objectType": "", - "eventsFunctions": [ - { - "fullName": "", - "functionType": "Action", - "name": "onCreated", + "description": "Reloads completed.", + "fullName": "Reloads completed", + "functionType": "Expression", + "group": "Stats", + "name": "TotalReloadsCompleted", "sentence": "", "events": [ { @@ -12982,18 +11902,18 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyStartingQuantity()" + "Object.Behavior::PropertyTotalReloadsCompleted()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -13003,415 +11923,79 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Draw a resource bar made from sprite objects.", - "fullName": "Draw a resource bar (sprite)", - "functionType": "Action", - "name": "DrawResourceBar", - "sentence": "Draw a resource bar located at _PARAM0_ that is made from _PARAM2_", + "description": "Ammo quantity.", + "fullName": "Ammo quantity", + "functionType": "Expression", + "group": "Ammo", + "name": "AmmoQuantity", + "sentence": "", "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Create unit objects", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "infiniteLoopWarning": true, - "type": "BuiltinCommonInstructions::While", - "whileConditions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::PropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "max(Object.Behavior::PropertyCurrentQuantity(),Object.Behavior::PropertyMaxQuantity())" - ] - } - ], - "conditions": [], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Create" - }, - "parameters": [ - "", - "UnitObject", - "Object.X() + Object.Width() * (Object.Behavior::PropertyNextUnitToCreate())", - "Object.Y()", - "Object.Layer()" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "UnitObject", - "__ResourceBar.UnitID", - "=", - "Object.Behavior::PropertyNextUnitToCreate()" - ] - }, - { - "type": { - "value": "LinkedObjects::LinkObjects" - }, - "parameters": [ - "", - "Object", - "UnitObject" - ] - }, - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "1" - ] - } - ] - } + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyAmmoQuantity()" ] } - ], - "parameters": [] + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update state of units", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Shots remaining before the next reload is required.", + "fullName": "Shots before next reload", + "functionType": "Expression", + "group": "Reload", + "name": "ShotsBeforeNextReload", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "LinkedObjects::PickObjectsLinkedTo" - }, - "parameters": [ - "", - "UnitObject", - "Object", - "" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::ForEach", - "object": "UnitObject", - "conditions": [], - "actions": [], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Delete units higher than max unit value", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "Object.Behavior::PropertyMaxQuantity()", - "!=", - "0" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "UnitObject.Variable(__ResourceBar.UnitID)", - ">", - "Object.Behavior::PropertyMaxQuantity()" - ] - } - ], - "actions": [ - { - "type": { - "value": "Delete" - }, - "parameters": [ - "UnitObject", - "" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update non-empty units", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "UnitObject.Variable(__ResourceBar.UnitID)", - "<", - "Object.Behavior::PropertyCurrentQuantity()" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "UnitObject", - "Object.Behavior::PropertyActiveUnitColorTint()" - ] - }, - { - "type": { - "value": "Opacity" - }, - "parameters": [ - "UnitObject", - "=", - "Object.Behavior::PropertyActiveUnitOpacity()" - ] - }, - { - "type": { - "value": "ChangeAnimation" - }, - "parameters": [ - "UnitObject", - "=", - "Object.Behavior::PropertyActiveUnitAnimationNumber()" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Update empty units", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "UnitObject.Variable(__ResourceBar.UnitID)", - ">=", - "Object.Behavior::PropertyCurrentQuantity()" - ] - } - ], - "actions": [], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Color tint", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Only apply color if it has changed from default value", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "Object.Behavior::PropertyEmptyUnitColorTint()", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "UnitObject", - "Object.Behavior::PropertyEmptyUnitColorTint()" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Opacity", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Opacity" - }, - "parameters": [ - "UnitObject", - "=", - "Object.Behavior::PropertyEmptyUnitOpacity()" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Animation", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ChangeAnimation" - }, - "parameters": [ - "UnitObject", - "=", - "Object.Behavior::PropertyEmptyUnitAnimationNumber()" - ] - } - ] - } - ], - "parameters": [] - } - ] - } - ], - "parameters": [] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Update counter", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyNextUnitToCreate" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "PickedInstancesCount(UnitObject)" - ] - } - ] - } + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShotsBeforeNextReload()" ] } - ], - "parameters": [] + ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -13421,24 +12005,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Object used to display each unit", - "name": "UnitObject", - "supplementaryInformation": "Sprite", - "type": "objectList" } ], "objectGroups": [] }, { - "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", - "fullName": "Color tint of empty units", - "functionType": "Action", - "name": "SetEmptyUnitColor", - "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", + "description": "Shots per reload.", + "fullName": "Shots per reload", + "functionType": "Expression", + "group": "Reload", + "name": "ShotsPerReload", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13446,18 +12025,18 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitColorTint" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "GetArgumentAsString(\"ColorTint\")", - "" + "Object.Behavior::PropertyShotsPerReload()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -13467,24 +12046,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Color tint", - "longDescription": "Use \"white\" to remove all color tint", - "name": "ColorTint", - "type": "color" } ], "objectGroups": [] }, { - "description": "Apply color tint to active units.", - "fullName": "Color tint of active units", - "functionType": "Action", - "name": "SetActiveUnitColor", - "sentence": "Apply color tint _PARAM2_ to active units of _PARAM0_", + "description": "Seconds remaining before the cooldown will permit a bullet to be fired.", + "fullName": "Time remaining before a bullet may be fired", + "functionType": "Expression", + "group": "Firing", + "name": "CooldownTimeLeft", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13492,18 +12066,18 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyActiveUnitColorTint" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "GetArgumentAsString(\"ColorTint\")", - "" + "max(0,Object.Behavior::Cooldown() - Object.ObjectTimerElapsedTime(\"__FireBullet.FiringCooldown\"))" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -13513,43 +12087,50 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Color tint", - "longDescription": "Use \"white\" to remove all color tint", - "name": "ColorTint", - "type": "color" } ], "objectGroups": [] }, { - "description": "Change the opacity of empty units. Empty units exist between the current and maximum value.", - "fullName": "Opacity of empty units", - "functionType": "Action", - "name": "SetEmptyUnitOpacity", - "sentence": "Change the opacity of empty units of _PARAM0_ to _PARAM2_", + "description": "Seconds remaining before the overheat penalty ends.", + "fullName": "Time remaining before overheat penalty ends", + "functionType": "Expression", + "group": "Overheat", + "name": "OverheatTimeLeft", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitOpacity" + "value": "CompareObjectTimer" }, "parameters": [ "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Opacity\")" + "\"__FireBullet.OverheatDuration\"", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, Object.Behavior::PropertyOverheatDuration() - Object.ObjectTimerElapsedTime(\"__FireBullet.OverheatDuration\"))" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -13559,24 +12140,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Opacity of empty units", - "longDescription": "Range: 0 to 255", - "name": "Opacity", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the opacity of active units. ", - "fullName": "Opacity of active units", - "functionType": "Action", - "name": "SetActiveUnitOpacity", - "sentence": "Change the opacity of active units of _PARAM0_ to _PARAM2_", + "description": "Check if object is currently performing an ammo reload.", + "fullName": "Is ammo reloading in progress", + "functionType": "Condition", + "group": "Reload", + "name": "IsReloadInProgress", + "sentence": "_PARAM0_ is reloading ammo", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13584,13 +12160,34 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyActiveUnitOpacity" + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyReloadInProgress" }, "parameters": [ "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Opacity\")" + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" ] } ] @@ -13605,24 +12202,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Opacity of active units", - "longDescription": "Range: 0 to 255", - "name": "Opacity", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the animation of empty units. Empty units exist between the current and maximum value.", - "fullName": "Animation of empty units", - "functionType": "Action", - "name": "SetEmptyUnitAnimation", - "sentence": "Change the animation of empty units of _PARAM0_ to _PARAM2_", + "description": "Check if object is ready to shoot.", + "fullName": "Is ready to shoot", + "functionType": "Condition", + "group": "Firing", + "name": "IsReadyToShoot", + "sentence": "_PARAM0_ is ready to shoot", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13630,16 +12222,171 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitAnimationNumber" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"AnimationNumber\")" + "False" ] } ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check if ready to shoot", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify that the gun has ammo", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOutOfAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify that the gun does not need to be reloaded and is not currently reloading", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify gun is not shooting sooner than the proper rate of fire", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsFiringCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Verify the gun is not overheated", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOverheated" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] } ], "parameters": [ @@ -13651,23 +12398,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Animation number", - "name": "AnimationNumber", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change maximum units that can be displayed.", - "fullName": "Maximum units", - "functionType": "Action", - "name": "SetMaxQuantity", - "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", + "description": "Check if automatic reloading is enabled.", + "fullName": "Is automatic reloading enabled", + "functionType": "Condition", + "group": "Reload", + "name": "IsAutomaticReloadingEnabled", + "sentence": "Automatic reloading is enabled on_PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13675,13 +12418,34 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyMaxQuantity" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyAutomaticReloading" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" ] } ] @@ -13696,25 +12460,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Maximum units", - "name": "Value", - "supplementaryInformation": "Sprite", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the current quantity of units.", - "fullName": "Unit quantity", - "functionType": "ActionWithOperator", - "getterName": "CurrentQuantity", - "name": "SetCurrentQuantity", - "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", + "description": "Check if ammo is unlimited.", + "fullName": "Is ammo unlimited", + "functionType": "Condition", + "group": "Ammo", + "name": "IsUnlimitedAmmo", + "sentence": "_PARAM0_ has unlimited ammo", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13722,13 +12480,34 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyUnlimitedAmmo" }, "parameters": [ "Object", - "Behavior", - "=", - "min(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyMaxQuantity())" + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" ] } ] @@ -13743,24 +12522,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Current units", - "name": "Value", - "supplementaryInformation": "Sprite", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Increase the current quantity of units.", - "fullName": "Increase quantity", - "functionType": "Action", - "name": "IncreaseQuantity", - "sentence": "Increase the quantity of _PARAM0_ by _PARAM2_", + "description": "Check if object has no ammo available.", + "fullName": "Is out of ammo", + "functionType": "Condition", + "group": "Ammo", + "name": "IsOutOfAmmo", + "sentence": "_PARAM0_ is out of ammo", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13768,13 +12542,47 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::PropertyAmmoQuantity" }, "parameters": [ "Object", "Behavior", "=", - "min(Object.Behavior::PropertyMaxQuantity(), Object.Behavior::PropertyCurrentQuantity() + GetArgumentAsNumber(\"Value\"))" + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" ] } ] @@ -13789,24 +12597,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" - }, - { - "description": "Value", - "name": "Value", - "supplementaryInformation": "Sprite", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Decrease the current quantity of units.", - "fullName": "Decrease quantity", - "functionType": "Action", - "name": "DecreaseQuantity", - "sentence": "Decrease the quantity of _PARAM0_ by _PARAM2_", + "description": "Check if object needs to reload ammo.", + "fullName": "Is a reload needed", + "functionType": "Condition", + "group": "Reload", + "name": "IsReloadNeeded", + "sentence": "_PARAM0_ needs to reload ammo", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13814,64 +12617,65 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "max(0,Object.Behavior::PropertyCurrentQuantity() - GetArgumentAsNumber(\"Value\"))" + "False" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", - "type": "behavior" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shots per reload must not be \"0\"", + "comment2": "" }, - { - "description": "Value", - "name": "Value", - "supplementaryInformation": "Sprite", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "quantity", - "fullName": "Current quantity", - "functionType": "ExpressionAndCondition", - "name": "CurrentQuantity", - "sentence": "quantity", - "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyShotsPerReload" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::PropertyShotsBeforeNextReload" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "SetReturnBoolean" }, "parameters": [ - "Object.Behavior::PropertyCurrentQuantity()" + "True" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -13881,18 +12685,19 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], "objectGroups": [] }, { - "description": "max quantity", - "fullName": "Max quantity", - "functionType": "ExpressionAndCondition", - "name": "MaxQuantity", - "sentence": "max quantity", + "description": "Check if object is overheated.", + "fullName": "Is overheated", + "functionType": "Condition", + "group": "Overheat", + "name": "IsOverheated", + "sentence": "_PARAM0_ is overheated", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13900,28 +12705,132 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "SetReturnBoolean" }, "parameters": [ - "Object.Behavior::PropertyMaxQuantity()" + "False" ] } ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "FireBullet::FireBullet::PropertyHeatLevel" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "1" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::OverheatTimeLeft()", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if firing cooldown is active.", + "fullName": "Is firing cooldown active", + "functionType": "Condition", + "group": "Firing", + "name": "IsFiringCooldownActive", + "sentence": "Firing cooldown is active on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CooldownTimeLeft()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], @@ -13930,113 +12839,283 @@ ], "propertyDescriptors": [ { - "value": "0", + "value": "0.1", "type": "Number", - "label": "Starting quantity", - "description": "", - "group": "", + "label": "Firing cooldown (seconds)", + "description": "Object cannot shoot while firing cooldown is active", + "group": "Shooting configuration", "extraInformation": [], "hidden": false, - "name": "StartingQuantity" + "name": "FireCooldown" }, { "value": "", - "type": "Number", - "label": "Quantity", + "type": "Boolean", + "label": "", "description": "", "group": "", "extraInformation": [], "hidden": true, - "name": "CurrentQuantity" + "name": "HasJustFired" }, { - "value": "10", + "value": "45", "type": "Number", - "label": "Maximum quantity (Use \"0\" for unlimited)", + "label": "Firing arc (degrees)", + "description": "Multi-Fire bullets will be evenly spaced inside the Firing Arc", + "group": "Multi-Fire", + "extraInformation": [], + "hidden": false, + "name": "FiringArc" + }, + { + "value": "1", + "type": "Number", + "label": "Number of bullets created at once (Multi-Fire)", + "description": "Multi-Fire bullets will be evenly spaced inside the Firing Arc", + "group": "Multi-Fire", + "extraInformation": [], + "hidden": false, + "name": "BulletQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "Angle variance (degrees)", + "description": "Used to simulate imperfect aim (Range: 0 to 180 degrees)", + "group": "Shooting configuration", + "extraInformation": [], + "hidden": false, + "name": "AngleVariance" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rotate bullet to match trajectory", "description": "", - "group": "", + "group": "Shooting configuration", "extraInformation": [], "hidden": false, - "name": "MaxQuantity" + "name": "RotateBullet" }, { "value": "0", "type": "Number", - "label": "", + "label": "Ammo quantity (current)", "description": "", "group": "", "extraInformation": [], "hidden": true, - "name": "NextUnitToCreate" + "name": "AmmoQuantity" }, { - "value": "", - "type": "Color", - "label": "Empty color tint", - "description": "", - "group": "", + "value": "0", + "type": "Number", + "label": "Shots per reload ", + "description": "Use 0 to disable reloading", + "group": "Reload", "extraInformation": [], "hidden": false, - "name": "EmptyUnitColorTint" + "name": "ShotsPerReload" }, { - "value": "64", + "value": "1", "type": "Number", - "label": "Opacity of empty units (Range: 0 to 255)", - "description": "Empty units exist between the current and maximum value.", - "group": "", + "label": "Reloading duration (seconds)", + "description": "Object cannot shoot while reloading is in progress", + "group": "Reload", "extraInformation": [], "hidden": false, - "name": "EmptyUnitOpacity" + "name": "ReloadDuration" }, { "value": "0", "type": "Number", - "label": "Animation number for empty units", - "description": "", - "group": "", + "label": "Max ammo ", + "description": "Use \"0\" to disable restrictions on ammo capacity", + "group": "Ammo", "extraInformation": [], "hidden": false, - "name": "EmptyUnitAnimationNumber" + "name": "MaxAmmo" }, { - "value": "255", + "value": "0", "type": "Number", - "label": "Opacity of active units", + "label": "Shots before next reload", "description": "", "group": "", "extraInformation": [], - "hidden": false, - "name": "ActiveUnitOpacity" + "hidden": true, + "name": "ShotsBeforeNextReload" }, { - "value": "255;255;255", - "type": "Color", - "label": "Color tint of active units", + "value": "0", + "type": "Number", + "label": "Total shots fired", + "description": "Regardless of how many bullets are created, only 1 shot will be counted per frame", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TotalShotsFired" + }, + { + "value": "0", + "type": "Number", + "label": "Total bullets created", "description": "", "group": "", "extraInformation": [], + "hidden": true, + "name": "TotalBulletsCreated" + }, + { + "value": "0", + "type": "Number", + "label": "Starting ammo", + "description": "", + "group": "Ammo", + "extraInformation": [], "hidden": false, - "name": "ActiveUnitColorTint" + "name": "StartingAmmo" }, { "value": "0", "type": "Number", - "label": "Animation number for active units", + "label": "Total reloads completed", "description": "", "group": "", "extraInformation": [], + "hidden": true, + "name": "TotalReloadsCompleted" + }, + { + "value": "true", + "type": "Boolean", + "label": "Unlimited ammo", + "description": "", + "group": "Ammo", + "extraInformation": [], "hidden": false, - "name": "ActiveUnitAnimationNumber" - } - ], + "name": "UnlimitedAmmo" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ReloadInProgress" + }, + { + "value": "0", + "type": "Number", + "label": "Heat increase per shot (Range: 0 to 1)", + "description": " Object is overheated when Heat reaches 1", + "group": "Overheat", + "extraInformation": [], + "hidden": false, + "name": "HeatIncreasePerShot" + }, + { + "value": "0", + "type": "Number", + "label": "Heat level (Range: 0 to 1)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HeatLevel" + }, + { + "value": "true", + "type": "Boolean", + "label": "Reload automatically", + "description": "", + "group": "Reload", + "extraInformation": [], + "hidden": false, + "name": "AutomaticReloading" + }, + { + "value": "0", + "type": "Number", + "label": "Overheat duration (seconds) ", + "description": "Object cannot shoot while overheat duration is active", + "group": "Overheat", + "extraInformation": [], + "hidden": false, + "name": "OverheatDuration" + }, + { + "value": "0.1", + "type": "Number", + "label": "Linear cooling rate (per second)", + "description": "", + "group": "Overheat", + "extraInformation": [], + "hidden": false, + "name": "LinearCoolingRate" + }, + { + "value": "0.3", + "type": "Number", + "label": "Exponential cooling rate (per second)", + "description": "Exponential cooling happens faster when heat is high and slower when heat is low", + "group": "Overheat", + "extraInformation": [ + "Linear", + "Exponential" + ], + "hidden": false, + "name": "ExponentialCoolingRate" + } + ], "sharedPropertyDescriptors": [] - }, + } + ], + "eventsBasedObjects": [] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", + "category": "Input", + "extensionNamespace": "", + "fullName": "Resource bar", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", + "name": "ResourceBar", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", + "shortDescription": "Display a bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "version": "0.0.1", + "description": "The resource bar can be displayed using these objects:\n\n- Shape painter\n- Tiled sprite\n- Sprite\n", + "origin": { + "identifier": "DraggableSliderControl", + "name": "gdevelop-extension-store" + }, + "tags": [ + "resource", + "bar", + "shape painter", + "health", + "mana", + "shield", + "hearts", + "lives", + "ammo" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ { - "description": "Use a tiled sprite to display repeated objects to represent a resource in the game (hearts, lives, ammo, etc). ", - "fullName": "Resource bar (tiled sprite)", - "name": "ResourceBar_TiledSprite", - "objectType": "TiledSpriteObject::TiledSprite", + "description": "Draws a solid bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "fullName": "Resource bar (shape painter)", + "name": "ResourceBar_ShapePainter", + "objectType": "PrimitiveDrawing::Drawer", "eventsFunctions": [ { "fullName": "", @@ -14044,100 +13123,76 @@ "name": "onCreated", "sentence": "", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get redrawn every frame", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + "value": "PrimitiveDrawing::ClearBetweenFrames" }, "parameters": [ "Object", - "Behavior", - "=", - "Object.Behavior::PropertyStartingQuantity()" + "no" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Display a tiled resource bar.", - "fullName": "Draw a resource bar (tiled sprite)", - "functionType": "Action", - "name": "DrawResourceBar", - "sentence": "Display resource bar using _PARAM0_", - "events": [ + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use correct min value (instead of always starting at 0)", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "TiledSpriteObject::Width" + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" }, "parameters": [ "Object", + "Behavior", "=", - "Object.Behavior::PropertyUnitWidth() * Object.Behavior::PropertyCurrentQuantity()" + "Object.Behavior::PropertyValueMin()" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", - "type": "object" }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Change the quantity of a tiled resource bar.", - "fullName": "Quantity", - "functionType": "Action", - "name": "SetQuantity", - "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", - "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_ShapePainter::UpdateHitbox" }, "parameters": [ "Object", "Behavior", - "=", - "max(0,GetArgumentAsNumber(\"Value\"))" + "" ] } ] @@ -14147,111 +13202,322 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" - }, - { - "description": "Value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the quantity of a tiled resource bar.", - "fullName": "Quantity", - "functionType": "ActionWithOperator", - "getterName": "Quantity", - "name": "SetQuantityOp", - "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "If max quantity has NOT been set, do not enforce it.", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Draw resource bar (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::PropertyMaxQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive Bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set inactive Bar parameters", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveBarColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveBarOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive Bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyValueOffset()", + "0", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active Bar", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active Bar parameters", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveBarColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveBarOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active Bar", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "0", + "Object.Behavior::PropertyValueOffset()", + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "parameters": [] + } ] } ], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "max(0,GetArgumentAsNumber(\"Value\"))" - ] - } - ] + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Draw a resource bar that shows current and max values.", + "fullName": "Draw a resource bar (shape painter)", + "functionType": "Action", + "name": "DrawResourceBar", + "sentence": "Draw a resource bar using _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, "textR": 0 }, - "comment": "If max quantity has been set, make sure quantity does not exceed it.", + "comment": "Set values", "comment2": "" }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::PropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ "Object", "Behavior", - "!=", - "0" + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), Object.Behavior::PropertyEasingSpeed())", + "" ] - } - ], - "actions": [ + }, { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" }, "parameters": [ "Object", "Behavior", - "=", - "clamp(GetArgumentAsNumber(\"Value\"), 0, Object.Behavior::PropertyMaxQuantity())" + "GetArgumentAsNumber(\"MaxValue\")", + "" ] } ] @@ -14261,43 +13527,73 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Value", - "name": "Value", + "description": "Current value", + "name": "CurrentValue", + "type": "expression" + }, + { + "description": "Max value", + "name": "MaxValue", + "supplementaryInformation": "Health::Health", "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the maximum quantity of a tiled resource bar.", - "fullName": "Maximum quantity", + "description": "Draw a resource bar based on the health points of an object.", + "fullName": "Draw a health bar", "functionType": "Action", - "name": "SetMaxQuantity", - "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", + "name": "DrawHealthBar", + "sentence": "Draw a resource bar using _PARAM0_ based on the health points of _PARAM2_", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ "Object", "Behavior", - "=", - "max(0,GetArgumentAsNumber(\"Value\"))" + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), Object.Behavior::PropertyEasingSpeed())", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithHealth.HealthBehavior::MaxHealth()", + "" ] } ] @@ -14307,44 +13603,73 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Value", - "name": "Value", - "type": "expression" + "description": "Object with health", + "name": "ObjectWithHealth", + "type": "objectList" + }, + { + "description": "Health behavior", + "name": "HealthBehavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" } ], "objectGroups": [] }, { - "description": "Change the maximum quantity of a tiled resource bar.", - "fullName": "Maximum quantity", - "functionType": "ActionWithOperator", - "getterName": "MaxQuantity", - "name": "SetMaxQuantityOp", - "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", + "description": "Draw a resource bar based on the shield points of an object.", + "fullName": "Draw a shield bar", + "functionType": "Action", + "name": "DrawShieldBar", + "sentence": "Draw a resource bar using _PARAM0_ based on the shield points of _PARAM2_", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyMaxQuantity" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ "Object", "Behavior", - "=", - "max(0,GetArgumentAsNumber(\"Value\"))" + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), Object.Behavior::PropertyEasingSpeed())", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithShield.ShieldBehavior::MaxShield()", + "" ] } ] @@ -14354,70 +13679,112 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" }, { - "description": "Value", - "name": "Value", - "type": "expression" + "description": "Object with shield", + "name": "ObjectWithShield", + "type": "objectList" + }, + { + "description": "Shield behavior", + "name": "ShieldBehavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" } ], "objectGroups": [] }, { - "description": "the quantity", - "fullName": "Quantity", - "functionType": "ExpressionAndCondition", - "name": "Quantity", - "sentence": "the quantity", + "description": "Draw a resource bar based on the ammo of an object.", + "fullName": "Draw an ammo bar", + "functionType": "Action", + "name": "DrawAmmoBar", + "sentence": "Draw a resource bar using _PARAM0_ based on the ammo of _PARAM2_", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set values", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" }, "parameters": [ - "Object.Behavior::PropertyCurrentQuantity()" + "Object", + "Behavior", + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::Value(), ObjectWithFireBullet.FireBulletBehavior::AmmoQuantity(), Object.Behavior::PropertyEasingSpeed())", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "ObjectWithFireBullet.FireBulletBehavior::MaxAmmo()", + "" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Object with fire bullet", + "name": "ObjectWithFireBullet", + "type": "objectList" + }, + { + "description": "Fire bullet behavior", + "name": "FireBulletBehavior", + "supplementaryInformation": "FireBullet::FireBullet", "type": "behavior" } ], "objectGroups": [] }, { - "description": "the max quantity", - "fullName": "Max quantity", - "functionType": "ExpressionAndCondition", - "name": "MaxQuantity", - "sentence": "the max quantity", + "description": "Value of the resource.", + "fullName": "Resource value", + "functionType": "Expression", + "group": "Resource value", + "name": "Value", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -14428,7 +13795,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyMaxQuantity()" + "Object.Behavior::PropertyValue()" ] } ] @@ -14441,1236 +13808,1167 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", "type": "behavior" } ], "objectGroups": [] - } - ], - "propertyDescriptors": [ + }, { - "value": "0", - "type": "Number", - "label": "Starting quantity", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "StartingQuantity" - }, - { - "value": "", - "type": "Number", - "label": "Quantity", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "CurrentQuantity" - }, - { - "value": "16", - "type": "Number", - "label": "Unit width (pixels)", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "UnitWidth" - }, - { - "value": "0", - "type": "Number", - "label": "Maximum quantity", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "MaxQuantity" - } - ], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "@Bouh, D8H", - "category": "General", - "extensionNamespace": "", - "fullName": "Extended variables support", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXZhcmlhYmxlLWJveCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOSAzSDVDMy45IDMgMyAzLjkgMyA1VjE5QzMgMjAuMSAzLjkgMjEgNSAyMUgxOUMyMC4xIDIxIDIxIDIwLjEgMjEgMTlWNUMyMSAzLjkgMjAuMSAzIDE5IDNNNy40IDE4QzUuOSAxNi41IDUgMTQuMyA1IDEyUzUuOSA3LjUgNy40IDZMOSA2LjdDNy43IDcuOSA3IDkuOSA3IDEyUzcuNyAxNi4xIDkgMTcuM0w3LjQgMThNMTIuNyAxNUwxMS45IDEzTDEwLjUgMTVIOUwxMS4zIDExLjlMMTAgOUgxMS4zTDEyLjEgMTFMMTMuNSA5SDE1TDEyLjggMTJMMTQuMSAxNUgxMi43TTE2LjYgMThMMTUgMTcuM0MxNi4zIDE2IDE3IDE0LjEgMTcgMTJTMTYuMyA3LjkgMTUgNi43TDE2LjYgNkMxOC4xIDcuNSAxOSA5LjcgMTkgMTJTMTguMSAxNi41IDE2LjYgMThaIiAvPjwvc3ZnPg==", - "name": "ExtendedVariables", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/variable-box.svg", - "shortDescription": "Add conditions, actions and expressions to check for the existence of a variable, copy variables, delete existing ones from memory, and create dynamic variables.", - "version": "1.0.0", - "description": "This extension provides: \n- Conditions to check if a global/scene/object variable exists.\n- Actions to copy object variables, global and scene variables.\n- Actions to delete an existing global/scene variable from memory.\n- Actions to create a global/scene variable using a text expression, rather than a variable name input.\n- Expressions to get the value or text from a global/scene variable using a text expression, rather than a variable name.\n\nText expressions allows to enter the name of the variable with an expression like `\"MyVar\"+ ToString(Variable(Health))`", - "origin": { - "identifier": "ExtendedVariables", - "name": "gdevelop-extension-store" - }, - "tags": [ - "variable", - "scene", - "global", - "object", - "remove", - "expression", - "copy", - "structure", - "array", - "boolean", - "duplication" - ], - "authorIds": [ - "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" - ], - "dependencies": [], - "eventsFunctions": [ - { - "description": "Check if a global variable exists.", - "fullName": "Global variable exists", - "functionType": "Condition", - "group": "Deprecated", - "name": "C_global_variable_exist", - "private": true, - "sentence": "If the global variable _PARAM1_ exist", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Change the value of the resource.", + "fullName": "Resource value", + "functionType": "Action", + "group": "Resource value", + "name": "SetValue", + "sentence": "Change the value of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { - "type": { - "value": "ExtendedVariables::GlobalVariableExist" - }, - "parameters": [ - "", - "GetArgumentAsString(\"GlobalVariableName\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" + ] + } ] - } - ], - "actions": [ + }, { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyValueMin()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } ] - } - ] - } - ], - "parameters": [ - { - "description": "Name of the global variable", - "name": "GlobalVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Check if the global variable exists.", - "fullName": "Global variable exists", - "functionType": "Condition", - "group": "Global variables", - "name": "GlobalVariableExist", - "sentence": "If the global variable _PARAM1_ exist", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\neventsFunctionContext.returnValue = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the global variable", - "name": "GlobalVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Check if a scene variable exists.", - "fullName": "Scene variable exists", - "functionType": "Condition", - "group": "Deprecated", - "name": "C_scene_variable_exist", - "private": true, - "sentence": "If the scene variable _PARAM1_ exist", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::PropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyValueMax()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMax()" + ] + } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { - "type": { - "value": "ExtendedVariables::SceneVariableExist" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "", - "GetArgumentAsString(\"SceneVariableName\")", - "" + "comment": "Set the proper offset", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } ] } ], - "actions": [ + "parameters": [ { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Check if the scene variable exists.", - "fullName": "Scene variable exists", - "functionType": "Condition", - "group": "Scene variables", - "name": "SceneVariableExist", - "sentence": "If the scene variable _PARAM1_ exist", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\neventsFunctionContext.returnValue = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Check if an object variable exists.", - "fullName": "Object variable exists", - "functionType": "Condition", - "group": "Deprecated", - "name": "C_object_variable_exist", - "private": true, - "sentence": "Object _PARAM1_ has object variable _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Slider value", + "name": "Value", + "type": "expression" } - ] + ], + "objectGroups": [] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "description": "Minimum value of the resource.", + "fullName": "Resource minimum value", + "functionType": "Expression", + "group": "Resource value", + "name": "ValueMin", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::ObjectVariableExist" - }, - "parameters": [ - "", - "ObjectToCheck", - "GetArgumentAsString(\"ObjectVariableName\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMin()" + ] + } ] } ], - "actions": [ + "expressionType": { + "type": "expression" + }, + "parameters": [ { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "ObjectToCheck", - "type": "objectList" - }, - { - "description": "Name of object variable", - "name": "ObjectVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Check if an object variable exists.", - "fullName": "Object variable exists", - "functionType": "Condition", - "group": "Object variables", - "name": "ObjectVariableExist", - "sentence": "Object _PARAM1_ has object variable _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "let returnValue = true;\r\nif (!objects.length) {\r\n returnValue = false;\r\n} else {\r\n const objectVariableName = eventsFunctionContext.getArgument(\"ObjectVariableName\");\r\n for (let i = 0; i < objects.length; i++) {\r\n if (!objects[i].hasVariable(objectVariableName)) {\r\n // If any object does NOT have the variable, return false.\r\n returnValue = false;\r\n break;\r\n }\r\n }\r\n}\r\n\r\neventsFunctionContext.returnValue = returnValue;", - "parameterObjects": "ObjectToCheck", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "ObjectToCheck", - "type": "objectList" + ], + "objectGroups": [] }, { - "description": "Name of object variable", - "name": "ObjectVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Delete a global variable, removing it from memory.", - "fullName": "Delete global variable", - "functionType": "Action", - "group": "Deprecated", - "name": "A_Delete_global_variable", - "private": true, - "sentence": "Delete global variable _PARAM1_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Change the minimum value of the resource.", + "fullName": "Resource minimum value", + "functionType": "Action", + "group": "Resource value", + "name": "SetValueMin", + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::DeleteGlobalVariable" - }, - "parameters": [ - "", - "GetArgumentAsString(\"GlobalVariableName\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueMin" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMin\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } ] } - ] - } - ], - "parameters": [ - { - "description": "Name of the global variable to delete", - "name": "GlobalVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Delete the global variable, removing it from memory.", - "fullName": "Delete global variable", - "functionType": "Action", - "group": "Global variables", - "name": "DeleteGlobalVariable", - "sentence": "Delete the global variable _PARAM1_ from memory", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "runtimeScene.getGame().getVariables().remove(eventsFunctionContext.getArgument(\"GlobalVariableName\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the global variable to delete", - "name": "GlobalVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the text of a scene variable.", - "fullName": "String of a scene variable", - "functionType": "Action", - "group": "Deprecated", - "name": "A_Modify_scene_variable_string", - "private": true, - "sentence": "Change the text of scene variable _PARAM1_ to _PARAM2_", - "events": [ + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Minimum value", + "name": "ValueMin", + "type": "expression" + } + ], + "objectGroups": [] + }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Maximum value of the resource.", + "fullName": "Resource maximum value", + "functionType": "Expression", + "group": "Resource value", + "name": "ValueMax", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::ModifySceneVariableString" - }, - "parameters": [ - "", - "GetArgumentAsString(\"SceneVariableName\")", - "GetArgumentAsNumber(\"SceneVariableValue\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } ] } - ] - } - ], - "parameters": [ - { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "description": "Value", - "name": "SceneVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the text of a scene variable.", - "fullName": "String of a scene variable", - "functionType": "Action", - "group": "Scene variables", - "name": "ModifySceneVariableString", - "sentence": "Change the text of scene variable _PARAM1_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const variable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\nvariable.setString(eventsFunctionContext.getArgument(\"SceneVariableValue\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" + "description": "Thickness of the resource bar.", + "fullName": "Resource bar thickness", + "functionType": "Expression", + "group": "Resource bar configuration", + "name": "BarThickness", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "description": "Value", - "name": "SceneVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the text of a global variable.", - "fullName": "String of a global variable", - "functionType": "Action", - "group": "Global variables", - "name": "ModifyGlobalVariableString", - "sentence": "Change the text of global variable _PARAM1_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const variable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\nvariable.setString(eventsFunctionContext.getArgument(\"GlobalVariableValue\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the global variable", - "name": "GlobalVariableName", - "type": "string" - }, - { - "description": "Value", - "name": "GlobalVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the value of a global variable.", - "fullName": "Value of a global variable", - "functionType": "Action", - "group": "Deprecated", - "name": "A_Modify_global_variable", - "private": true, - "sentence": "Change the global variable _PARAM1_ with value: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Length of the resource bar.", + "fullName": "Resource bar length", + "functionType": "Expression", + "group": "Resource bar configuration", + "name": "BarLength", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::ModifyGlobalVariable" - }, - "parameters": [ - "", - "GetArgumentAsString(\"SceneVariableName\")", - "GetArgumentAsNumber(\"SceneVariableValue\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBarLength()" + ] + } ] } - ] - } - ], - "parameters": [ - { - "description": "Name of the global variable", - "name": "SceneVariableName", - "type": "string" + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "description": "Value", - "name": "SceneVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the text of a global variable.", - "fullName": "String of a global variable", - "functionType": "Action", - "group": "Deprecated", - "name": "A_Modify_global_variable_string", - "private": true, - "sentence": "Change the text of global variable _PARAM1_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Change the maximum value of the resource.", + "fullName": "Resource maximum value", + "functionType": "Action", + "group": "Resource value", + "name": "SetValueMax", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::ModifyGlobalVariableString" - }, - "parameters": [ - "", - "GetArgumentAsString(\"SceneVariableName\")", - "GetArgumentAsNumber(\"SceneVariableValue\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyValueMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ValueMax\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } ] } - ] - } - ], - "parameters": [ - { - "description": "Name of the global variable", - "name": "SceneVariableName", - "type": "string" - }, - { - "description": "Value", - "name": "SceneVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the value of a global variable.", - "fullName": "Value of a global variable", - "functionType": "Action", - "group": "Global variables", - "name": "ModifyGlobalVariable", - "sentence": "Change the global variable _PARAM1_ with value: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const variable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\nvariable.setNumber(eventsFunctionContext.getArgument(\"GlobalVariableValue\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the global variable", - "name": "GlobalVariableName", - "type": "string" + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Maximum value", + "name": "ValueMax", + "type": "expression" + } + ], + "objectGroups": [] }, { - "description": "Value", - "name": "GlobalVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the value of a scene variable.", - "fullName": "Value of a scene variable", - "functionType": "Action", - "group": "Deprecated", - "name": "A_Modify_scene_variable", - "private": true, - "sentence": "Change the scene variable _PARAM1_ with value: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Tick spacing of the resource bar.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Resource bar configuration", + "name": "TickSpacing", + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::ModifySceneVariable" - }, - "parameters": [ - "", - "GetArgumentAsString(\"SceneVariableName\")", - "GetArgumentAsNumber(\"SceneVariableValue\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTickSpacing()" + ] + } ] } - ] - } - ], - "parameters": [ - { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" - }, - { - "description": "Value", - "name": "SceneVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Modify the value of a scene variable.", - "fullName": "Value of a scene variable", - "functionType": "Action", - "group": "Scene variables", - "name": "ModifySceneVariable", - "sentence": "Change the scene variable _PARAM1_ with value: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const variable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\nvariable.setNumber(eventsFunctionContext.getArgument(\"SceneVariableValue\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Tick spacing", + "name": "TickSpacing", + "type": "expression" + } + ], + "objectGroups": [] }, { - "description": "Value", - "name": "SceneVariableValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Delete scene variable, the variable will be deleted from the memory.", - "fullName": "Delete scene variable", - "functionType": "Action", - "group": "Deprecated", - "name": "A_Delete_scene_variable", - "private": true, - "sentence": "Delete the scene variable _PARAM1_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Change the tick spacing of the resource bar.", + "fullName": "Tick spacing", + "functionType": "Action", + "group": "Resource bar configuration", + "name": "SetTickSpacing", + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::DeleteSceneVariable" - }, - "parameters": [ - "", - "GetArgumentAsString(\"SceneVariableName\")", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"TickSpacing\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::Value()", + "" + ] + } ] } - ] - } - ], - "parameters": [ - { - "description": "Name of the scene variable to delete", - "name": "SceneVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Delete the scene variable, the variable will be deleted from the memory.", - "fullName": "Delete scene variable", - "functionType": "Action", - "group": "Scene variables", - "name": "DeleteSceneVariable", - "sentence": "Delete the scene variable _PARAM1_ from memory", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "runtimeScene.getVariables().remove(eventsFunctionContext.getArgument(\"SceneVariableName\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Name of the scene variable to delete", - "name": "SceneVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Copy an object variable from one object to another.", - "fullName": "Copy an object variable", - "functionType": "Action", - "group": "Deprecated", - "name": "A_CopyObjectVariable", - "private": true, - "sentence": "Copy the variable _PARAM1_ of _PARAM2_ to the variable _PARAM3_ of _PARAM4_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + ], + "parameters": [ { - "type": { - "value": "ExtendedVariables::CopyObjectVariable" - }, - "parameters": [ - "", - "SourceObject", - "GetArgumentAsString(\"SourceVariableName\")", - "TargetObject", - "GetArgumentAsString(\"TargetVariableName\")", - "no", - "" - ] + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Tick spacing", + "name": "TickSpacing", + "type": "expression" } - ] - } - ], - "parameters": [ - { - "description": "Source object", - "name": "SourceObject", - "type": "objectList" - }, - { - "description": "Variable to copy", - "name": "SourceVariableName", - "type": "string" - }, - { - "description": "Destination object", - "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", - "name": "TargetObject", - "type": "objectList" - }, - { - "description": "Destination variable", - "name": "TargetVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Copy the object variable from one object to another.", - "fullName": "Copy an object variable", - "functionType": "Action", - "group": "Object variables", - "name": "CopyObjectVariable", - "sentence": "Copy the variable _PARAM2_ of _PARAM1_ to the variable _PARAM4_ of _PARAM3_ (clear destination first: _PARAM5_)", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const sourceObject = eventsFunctionContext.getObjects(\"SourceObject\")[0];\nconst targetObject = eventsFunctionContext.getObjects(\"TargetObject\")[0];\nconst sourceVariableName = eventsFunctionContext.getArgument(\"SourceVariableName\");\nconst targetVariableName = eventsFunctionContext.getArgument(\"TargetVariableName\");\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\nconst sourceVariables = sourceObject.getVariables();\nconst targetVariables = targetObject.getVariables();\n\nif (sourceVariables.has(sourceVariableName))\n{\n gdjs.Variable.copy\n (\n sourceVariables.get(sourceVariableName),\n targetVariables.get(targetVariableName),\n isExactCopy\n );\n}", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Source object", - "name": "SourceObject", - "type": "objectList" - }, - { - "description": "Variable to copy", - "name": "SourceVariableName", - "type": "string" + ], + "objectGroups": [] }, { - "description": "Destination object", - "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", - "name": "TargetObject", - "type": "objectList" + "description": "Change length of the resource bar.", + "fullName": "Bar length", + "functionType": "Action", + "group": "Resource bar configuration", + "name": "SetBarLength", + "sentence": "Change length of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyBarLength" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Bar width", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "description": "Destination variable", - "name": "TargetVariableName", - "type": "string" + "description": "Change thickness of the resource bar.", + "fullName": "Bar thickness", + "functionType": "Action", + "group": "Resource bar configuration", + "name": "SetBarThickness", + "sentence": "Change thickness of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyBarThickness" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Bar thickness", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "defaultValue": "yes", - "description": "Clear destination first", - "name": "isExactCopy", - "optional": true, - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Copy all object variables from one object to another.", - "fullName": "Copy all object variables", - "functionType": "Action", - "group": "Deprecated", - "name": "A_CopyAllObjectVariables", - "private": true, - "sentence": "Copy all variables from _PARAM1_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "description": "Change opacity of the inactive portion of a resource bar.", + "fullName": "Inactive opacity", + "functionType": "Action", + "group": "Resource bar configuration", + "name": "SetInactiveBarOpacity", + "sentence": "Change opacity of inactive part of _PARAM0_ to _PARAM2_", + "events": [ { - "type": { - "value": "ExtendedVariables::CopyAllObjectVariables" - }, - "parameters": [ - "", - "SourceObject", - "TargetObject", - "no", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyInactiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } ] } - ] - } - ], - "parameters": [ - { - "description": "Source object", - "name": "SourceObject", - "type": "objectList" + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Inactive bar opacity", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "description": "Destination object", - "name": "TargetObject", - "type": "objectList" - } - ], - "objectGroups": [] - }, - { - "description": "Copy all object variables from one object to another.", - "fullName": "Copy all object variables", - "functionType": "Action", - "group": "Object variables", - "name": "CopyAllObjectVariables", - "sentence": "Copy all variables from object _PARAM1_ to object _PARAM2_ (clear destination first: _PARAM3_)", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "// This JS event use private scope from the API, this can be borken at anytime.\n\nconst sourceObject = eventsFunctionContext.getObjects(\"SourceObject\")[0];\nconst targetObject = eventsFunctionContext.getObjects(\"TargetObject\")[0];\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\nconst targetVariables = targetObject.getVariables();\nconst sourceVariables = sourceObject.getVariables()._variables.items;\nfor (const variableName in sourceVariables)\n{\n if (sourceVariables.hasOwnProperty(variableName))\n {\n gdjs.Variable.copy(sourceVariables[variableName], targetVariables.get(variableName), isExactCopy);\n }\n}", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Source object", - "name": "SourceObject", - "type": "objectList" + "description": "Change opacity of the active portion of a resource bar.", + "fullName": "Active bar opacity", + "functionType": "Action", + "group": "Resource bar configuration", + "name": "SetActiveBarOpacity", + "sentence": "Change opacity of active part of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyActiveBarOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Active bar opacity", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "description": "Destination object", - "name": "TargetObject", - "type": "objectList" + "description": "Change the color of the active area of bar.", + "fullName": "Active bar color ", + "functionType": "Action", + "group": "Resource bar configuration", + "name": "SetActiveBarColor", + "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyActiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Active bar color", + "name": "Color", + "type": "color" + } + ], + "objectGroups": [] }, { - "defaultValue": "yes", - "description": "Clear destination first", - "name": "isExactCopy", - "optional": true, - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Delete an object variable, removing it from memory.", - "fullName": "Delete object variable", - "functionType": "Action", - "group": "Object variables", - "name": "DeleteObjectVariable", - "sentence": "Delete for the object _PARAM1_ the object variable _PARAM2_ from the memory", - "events": [ + "description": "Change the color of the inactive area of bar.", + "fullName": "Inactive bar color", + "functionType": "Action", + "group": "Resource bar configuration", + "name": "SetInactiveBarColor", + "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyInactiveBarColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_ShapePainter::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + }, + { + "description": "Inactive bar color", + "name": "Color", + "type": "color" + } + ], + "objectGroups": [] + }, { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const object = eventsFunctionContext.getObjects(\"Object\")[0];\r\nconst objectVariables = object.getVariables();\r\n\r\nobjectVariables.remove(eventsFunctionContext.getArgument(\"VariableName\"));", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true + "description": "Update the hitbox.", + "fullName": "Update hitbox", + "functionType": "Action", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::SetRotationCenter" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyBarLength() / 2", + "Object.Behavior::PropertyBarThickness() / 2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::SetRectangularCollisionMask" + }, + "parameters": [ + "Object", + "0", + "0", + "Object.Behavior::PropertyBarLength()", + "Object.Behavior::PropertyBarThickness()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_ShapePainter", + "type": "behavior" + } + ], + "objectGroups": [] } ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "objectList" - }, + "propertyDescriptors": [ { - "description": "Name of object variable", - "name": "VariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Return the text of a global variable.", - "fullName": "Text of a global variable", - "functionType": "StringExpression", - "group": "Global variables", - "name": "GlobalVariableString", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\nconst variableExist = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = globalVariables.get(eventsFunctionContext.getArgument(\"GlobalVariableName\")).getAsString();\r\n}", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "expressionType": { - "type": "string" - }, - "parameters": [ - { - "description": "Name of the global variable", - "name": "GlobalVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Return the text of a scene variable.", - "fullName": "Text of a scene variable", - "functionType": "StringExpression", - "group": "Scene variables", - "name": "VariableString", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\nconst variableExist = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = sceneVariables.get(eventsFunctionContext.getArgument(\"SceneVariableName\")).getAsString();\r\n}", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "expressionType": { - "type": "string" - }, - "parameters": [ - { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Return the value of a global variable.", - "fullName": "Value of a global variable", - "functionType": "Expression", - "group": "Global variables", - "name": "GlobalVariable", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\nconst variableExist = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = globalVariables.get(eventsFunctionContext.getArgument(\"GlobalVariableName\")).getAsNumber();\r\n}", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Name of the global variable", - "name": "GlobalVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Return the value of a scene variable.", - "fullName": "Value of a scene variable", - "functionType": "Expression", - "group": "Scene variables", - "name": "Variable", - "sentence": "", - "events": [ + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\nconst variableExist = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = sceneVariables.get(eventsFunctionContext.getArgument(\"SceneVariableName\")).getAsNumber();\r\n}", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, { - "description": "Name of the scene variable", - "name": "SceneVariableName", - "type": "string" - } - ], - "objectGroups": [] - }, - { - "description": "Copy the global variable to scene. This copy everything from the types to the values.", - "fullName": "Copy a global variable to scene", - "functionType": "Action", - "group": "Convert", - "name": "CopyGlobalVariableToScene", - "sentence": "Copy the global variable:_PARAM1_ to a scene variable:_PARAM2_ (clear destination first: _PARAM3_)", - "events": [ + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const globalVariable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"globalVariableName\"));\nconst sceneVariable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"sceneVariableName\"));\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\ngdjs.Variable.copy(globalVariable, sceneVariable, isExactCopy);\n", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ + "value": "200", + "type": "Number", + "label": "Bar length", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarLength" + }, { - "description": "Global variable to copy", - "name": "globalVariableName", - "type": "string" + "value": "16", + "type": "Number", + "label": "Bar thickness", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "BarThickness" }, { - "description": "Scene variable destination", - "name": "sceneVariableName", - "type": "string" + "value": "11;255;0", + "type": "Color", + "label": "Inactive Bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarColor" }, { - "defaultValue": "yes", - "description": "Clear destination first", - "name": "isExactCopy", - "optional": true, - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Copy the scene variable to global. This copy everything from the types to the values.", - "fullName": "Copy a scene variable to global ", - "functionType": "Action", - "group": "Copy variables", - "name": "CopySceneVariableToGlobal", - "sentence": "Copy the scene variable:_PARAM1_ to a global variable:_PARAM2_ (clear destination first: _PARAM3_)", - "events": [ + "value": "96", + "type": "Number", + "label": "Inactive Bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "InactiveBarOpacity" + }, { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const sceneVariable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"sceneVariableName\"));\nconst globalVariable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"globalVariableName\"));\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\ngdjs.Variable.copy(sceneVariable, globalVariable, isExactCopy);", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ + "value": " 11;255;0", + "type": "Color", + "label": "Active Bar color", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarColor" + }, { - "description": "Scene variable to copy", - "name": "sceneVariableName", - "type": "string" + "value": "255", + "type": "Number", + "label": "Active Bar opacity", + "description": "", + "group": "Bar", + "extraInformation": [], + "hidden": false, + "name": "ActiveBarOpacity" }, { - "description": "Global variable destination", - "name": "globalVariableName", - "type": "string" + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Value" }, { - "defaultValue": "yes", - "description": "Clear destination first", - "name": "isExactCopy", - "optional": true, - "type": "yesorno" - } - ], - "objectGroups": [] - } - ], - "eventsBasedBehaviors": [], - "eventsBasedObjects": [] - }, - { - "author": "D8H", - "category": "", - "extensionNamespace": "", - "fullName": "Stick objects to others", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXN0aWNrZXItb3V0bGluZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik01LjUgMkMzLjYgMiAyIDMuNiAyIDUuNVYxOC41QzIgMjAuNCAzLjYgMjIgNS41IDIySDE2TDIyIDE2VjUuNUMyMiAzLjYgMjAuNCAyIDE4LjUgMkg1LjVNNS44IDRIMTguM0MxOS4zIDQgMjAuMSA0LjggMjAuMSA1LjhWMTVIMTguNkMxNi43IDE1IDE1LjEgMTYuNiAxNS4xIDE4LjVWMjBINS44QzQuOCAyMCA0IDE5LjIgNCAxOC4yVjUuOEM0IDQuOCA0LjggNCA1LjggNCIgLz48L3N2Zz4=", - "name": "Sticker", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/sticker-outline.svg", - "shortDescription": "Behavior to stick objects to other objects - so that they follow the position and rotation of the object they are stuck to.", - "version": "0.3.4", - "description": "This extension can be useful for:\n* Stick an accessory to a moving object,\n* Animate a skeleton.", - "origin": { - "identifier": "Sticker", - "name": "gdevelop-extension-store" - }, - "tags": [ - "sticker", - "stick", - "follow", - "skeleton", - "joint" - ], - "authorIds": [ - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" - ], - "dependencies": [], - "eventsFunctions": [ - { - "description": "Check if the object is stuck to another object.", - "fullName": "Is stuck to another object", - "functionType": "Condition", - "name": "IsStuck", - "sentence": "_PARAM1_ is stuck to _PARAM3_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const stickerBehaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\n/** @type {Hashtable} */\nconst stickerObjectsLists = eventsFunctionContext.getObjectsLists(\"Object\");\n/** @type {Hashtable} */\nconst basisObjectsLists = eventsFunctionContext.getObjectsLists(\"BasisObject\");\n\neventsFunctionContext.returnValue = gdjs.evtTools.object.twoListsTest(\n (stickerObject, basisObject, stickerBehaviorName) => {\n const behavior = stickerObject.getBehavior(stickerBehaviorName);\n return behavior.basisObject === basisObject;\n },\n stickerObjectsLists,\n basisObjectsLists,\n false,\n stickerBehaviorName\n);", - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ + "value": "0", + "type": "Number", + "label": "", + "description": "Distance from the object origin to where the active and inactive bar touch", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ValueOffset" + }, { - "description": "Sticker", - "name": "Object", - "type": "objectList" + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" }, { - "description": "Sticker behavior", - "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", - "type": "behavior" + "value": "easeOutCirc", + "type": "Choice", + "label": "Easing", + "description": "Easing used to change the displayed value of the resource bar. (Note: Changes to the Value property are always instant)", + "group": "", + "extraInformation": [ + "easeOutCirc" + ], + "hidden": false, + "name": "Easing" }, { - "description": "Basis", - "name": "BasisObject", - "type": "objectList" + "value": "0.05", + "type": "Number", + "label": "Easing speed (Range: 0 to 1)", + "description": "Higher values mean faster movement. Value of \"1\" means instant change.", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EasingSpeed" } ], - "objectGroups": [] - } - ], - "eventsBasedBehaviors": [ + "sharedPropertyDescriptors": [] + }, { - "description": "Stick the object to another. Use the action to stick the object, or unstick it later.", - "fullName": "Sticker", - "name": "Sticker", + "description": "Displays a line of objects that represent a resource in the game (hearts, lives, ammo, etc). \nUse the same image for the resource bar and the unit objects.", + "fullName": "Resource bar (sprite)", + "name": "ResourceBar_Sprite", "objectType": "", "eventsFunctions": [ { @@ -15680,11 +14978,21 @@ "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\n// Set up the scene sticker objects list - if not done already.\nif (!runtimeScene.__allStickers)\n runtimeScene.__allStickers = new Set();\n\n// Set up the behavior extra methods - if not done already.\nconst prototype = Object.getPrototypeOf(behavior);\nif (!prototype.updateRelativeCoordinates) {\n // Unstick from deleted objects.\n gdjs.registerObjectDeletedFromSceneCallback(function (runtimeScene, deletedObject) {\n if (!runtimeScene.__allStickers) return;\n\n for (const sticker of runtimeScene.__allStickers) {\n if (sticker.basisObject === deletedObject) {\n sticker.basisObject = null;\n }\n }\n });\n\n /**\n * Update the coordinates in the basisObject basis.\n * \n * It uses the basisObject coordinates from the previous frame.\n * This way, the sticker can move relatively to it and still\n * follow basisObject.\n * \n * @param {gdjs.RuntimeObject} basisObject\n */\n prototype.updateRelativeCoordinates = function (basisObject) {\n const object = this.owner;\n\n // Update relative coordinates\n this.relativeX = object.getX() - this.basisOldX;\n this.relativeY = object.getY() - this.basisOldY;\n if (!this._getOnlyFollowPosition()) {\n this.relativeAngle = object.getAngle() - this.basisOldAngle;\n this.relativeWidth = object.getWidth() / this.basisOldWidth;\n this.relativeHeight = object.getHeight() / this.basisOldHeight;\n const deltaX = object.getCenterXInScene() - this.basisOldCenterXInScene;\n const deltaY = object.getCenterYInScene() - this.basisOldCenterYInScene;\n const angle = this.basisOldAngle * Math.PI / 180;\n this.relativeRotatedX = (deltaX * Math.cos(angle) + deltaY * Math.sin(angle)) / this.basisOldWidth;\n this.relativeRotatedY = (-deltaX * Math.sin(angle) + deltaY * Math.cos(angle)) / this.basisOldHeight;\n\n // Save initial values to avoid calculus and rounding errors\n this.basisOriginalWidth = basisObject.getWidth();\n this.basisOriginalHeight = basisObject.getHeight();\n this.basisOriginalAngle = basisObject.getAngle();\n }\n }\n\n /**\n * Copy the coordinates to use it the next frame.\n * @param basisObject {gdjs.RuntimeObject}\n */\n prototype.updateOldCoordinates = function (basisObject) {\n const object = this.owner;\n\n this.ownerOldX = object.getX();\n this.ownerOldY = object.getY();\n\n this.basisOldX = basisObject.getX();\n this.basisOldY = basisObject.getY();\n\n if (!this._getOnlyFollowPosition()) {\n this.ownerOldAngle = object.getAngle();\n this.ownerOldWidth = object.getWidth();\n this.ownerOldHeight = object.getHeight();\n\n this.basisOldAngle = basisObject.getAngle();\n this.basisOldWidth = basisObject.getWidth();\n this.basisOldHeight = basisObject.getHeight();\n this.basisOldCenterXInScene = basisObject.getCenterXInScene();\n this.basisOldCenterYInScene = basisObject.getCenterYInScene();\n }\n }\n /**\n * Follow the basisObject (called in doStepPostEvents).\n * \n * This method is also called by children to ensure\n * parents are updated first.\n */\n prototype.followBasisObject = function () {\n if (this.followingDoneThisFrame) {\n return;\n }\n this.followingDoneThisFrame = true;\n /** @type {gdjs.RuntimeObject} */\n const basisObject = this.basisObject;\n if (basisObject) {\n // If the behavior on the basis object has a different name,\n // the objects will still follow their basis objects\n // but frame delays could happen.\n if (basisObject.hasBehavior(behaviorName)) {\n const basisBehavior = basisObject.getBehavior(behaviorName);\n if (basisBehavior.type === this.type) {\n // Follow parents 1st to avoid frame delays\n basisBehavior.followBasisObject();\n }\n }\n\n const object = this.owner;\n\n if (this._getOnlyFollowPosition()) {\n if (object.getX() !== this.ownerOldX\n || object.getY() !== this.ownerOldY) {\n this.updateRelativeCoordinates(basisObject);\n }\n\n if (this.basisOldX !== basisObject.getX() ||\n this.basisOldY !== basisObject.getY()) {\n object.setPosition(\n basisObject.getX() + this.relativeX,\n basisObject.getY() + this.relativeY);\n }\n } else {\n if (object.getX() !== this.ownerOldX\n || object.getY() !== this.ownerOldY\n || object.getAngle() !== this.ownerOldAngle\n || object.getWidth() !== this.ownerOldWidth\n || object.getHeight() !== this.ownerOldHeight) {\n this.updateRelativeCoordinates(basisObject);\n }\n\n // Follow basisObject\n if (basisObject.getAngle() === this.basisOriginalAngle && this.basisOriginalAngle === 0) {\n if (basisObject.getWidth() === this.basisOriginalWidth ||\n basisObject.getHeight() === this.basisOriginalHeight) {\n if (this.basisOldX !== basisObject.getX() ||\n this.basisOldY !== basisObject.getY()) {\n object.setPosition(\n basisObject.getX() + this.relativeX,\n basisObject.getY() + this.relativeY);\n }\n } else {\n object.setPosition(\n basisObject.getX() + this.relativeRotatedX * basisObject.getWidth(),\n basisObject.getY() + this.relativeRotatedY * basisObject.getHeight());\n }\n } else {\n object.setAngle(basisObject.getAngle() + this.relativeAngle);\n\n const deltaX = this.relativeRotatedX * basisObject.getWidth();\n const deltaY = this.relativeRotatedY * basisObject.getHeight();\n const angle = -basisObject.getAngle() * Math.PI / 180;\n object.setX(basisObject.getCenterXInScene() + object.getX() - object.getCenterXInScene() + deltaX * Math.cos(angle) + deltaY * Math.sin(angle));\n object.setY(basisObject.getCenterYInScene() + object.getY() - object.getCenterYInScene() - deltaX * Math.sin(angle) + deltaY * Math.cos(angle));\n }\n // Unproportional dimensions changes won't work as expected\n // if the object angle is not null but nothing more can be done\n // because there is no full affine transformation on objects.\n if (basisObject.getWidth() !== this.basisOriginalWidth) {\n object.setWidth(this.relativeWidth * basisObject.getWidth());\n }\n if (basisObject.getHeight() !== this.basisOriginalHeight) {\n object.setHeight(this.relativeHeight * basisObject.getHeight());\n }\n }\n\n this.updateOldCoordinates(basisObject);\n }\n }\n}\n\n// Register this object as a sticker.\nruntimeScene.__allStickers.add(behavior);\n", - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyStartingQuantity()" + ] + } + ] } ], "parameters": [ @@ -15696,579 +15004,551 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" } ], "objectGroups": [] }, { - "fullName": "", + "description": "Draw a resource bar made from sprite objects.", + "fullName": "Draw a resource bar (sprite)", "functionType": "Action", - "name": "doStepPreEvents", - "sentence": "", + "name": "DrawResourceBar", + "sentence": "Draw a resource bar located at _PARAM0_ that is made from _PARAM2_", "events": [ { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.followingDoneThisFrame = false;", - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create unit objects", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::PropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "max(Object.Behavior::PropertyCurrentQuantity(),Object.Behavior::PropertyMaxQuantity())" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "UnitObject", + "Object.X() + Object.Width() * (Object.Behavior::PropertyNextUnitToCreate())", + "Object.Y()", + "Object.Layer()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "UnitObject", + "__ResourceBar.UnitID", + "=", + "Object.Behavior::PropertyNextUnitToCreate()" + ] + }, + { + "type": { + "value": "LinkedObjects::LinkObjects" + }, + "parameters": [ + "", + "Object", + "UnitObject" + ] + }, + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ], + "parameters": [] }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "doStepPostEvents", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.followBasisObject();", - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Stick on another object.", - "fullName": "Stick", - "functionType": "Action", - "name": "Stick", - "sentence": "Stick _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const object = objects[0];\nconst behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst basisObjects = eventsFunctionContext.getObjects(\"BasisObject\");\n\nif (basisObjects.length === 0) return;\nconst basisObject = basisObjects[0];\n\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.basisObject = basisObject;\nbehavior.updateOldCoordinates(basisObject);\nbehavior.updateRelativeCoordinates(basisObject);\n", - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", - "type": "behavior" - }, - { - "description": "Object to stick to", - "name": "BasisObject", - "type": "objectList" - } - ], - "objectGroups": [] - }, - { - "description": "Unstick from the object it was stuck to.", - "fullName": "Unstick", - "functionType": "Action", - "name": "Unstick", - "sentence": "Unstick _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const object = objects[0];\nconst behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.basisObject = null;", - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "onDestroy", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nif (runtimeScene.__allStickers)\n runtimeScene.__allStickers.delete(behavior);\n", - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "", - "type": "Boolean", - "label": "Only follow the position", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "OnlyFollowPosition" - } - ], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "Tristan Rhodes (https://victrisgames.itch.io/)", - "category": "", - "extensionNamespace": "", - "fullName": "Shake Object (position, angle, scale)", - "helpPath": "https://victrisgames.itch.io/gdevelop-camera-shake-example", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWFycm93LWFsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMywxMUgxOEwxNi41LDkuNUwxNy45Miw4LjA4TDIxLjg0LDEyTDE3LjkyLDE1LjkyTDE2LjUsMTQuNUwxOCwxM0gxM1YxOEwxNC41LDE2LjVMMTUuOTIsMTcuOTJMMTIsMjEuODRMOC4wOCwxNy45Mkw5LjUsMTYuNUwxMSwxOFYxM0g2TDcuNSwxNC41TDYuMDgsMTUuOTJMMi4xNiwxMkw2LjA4LDguMDhMNy41LDkuNUw2LDExSDExVjZMOS41LDcuNUw4LjA4LDYuMDhMMTIsMi4xNkwxNS45Miw2LjA4TDE0LjUsNy41TDEzLDZWMTFaIiAvPjwvc3ZnPg==", - "name": "ShakeObject", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/arrow-all.svg", - "shortDescription": "Shake an object, using one or more ways to shake (position, angle, scale).", - "version": "1.5.5", - "description": "Select one or more methods of shaking:\n- Position: Shake the X and/or Y position of the object \n- Angle: Shake the angle (rotation) of the object \n- Scale: Shake the scale of the object (must be a sprite)\n\nControl how the object shakes:\n- Amplitude: How far the object moves during each shake\n- Duration: Amount of time to shake the object\n- Time between shakes: Amount of time between each movement of the object\n- Keep shaking until stopped (boolean)\n\nTips:\n- For a single-shake effect, set the \"Time between shakes\" to be equal to \"Duration\" (great for a hit or impact)\n- To make the single-shake move in the opposite direction, use negative numbers \n- To repeat a single-shake effect in a loop, add a condition \"Object is not shaking\" \n- Use a long \"Time between shakes\" to simulate a slow moving object (like a ship rocking back and forth)\n- Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. \n- Use \"Shake until stopped\" to simulate engine vibration, earthquake, or pulsing", - "origin": { - "identifier": "ShakeObject", - "name": "gdevelop-extension-store" - }, - "tags": [ - "shaking", - "object", - "effect", - "shake", - "scale", - "position", - "rotate", - "angle" - ], - "authorIds": [ - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ - { - "description": "Shake an object, using one or more ways to shake (position, angle).\nThis behavior can be used on any type of object.", - "fullName": "Shake object (position, angle)", - "name": "ShakeObject_PositionAngle", - "objectType": "", - "eventsFunctions": [ - { - "description": "Shake an object, using one or more ways to shake (position, angle).", - "fullName": "Shake object (position, angle)", - "functionType": "Action", - "name": "ShakeObject_PositionAngle", - "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_. Wait _PARAM6_ seconds between shakes. Keep shaking until stopped: _PARAM7_", - "events": [ { "colorB": 228, "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Shake Object", + "name": "Update state of units", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Start/Reset duration timer", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResetObjectTimer" + "value": "LinkedObjects::PickObjectsLinkedTo" }, "parameters": [ + "", + "UnitObject", "Object", - "\"__ShakeObject_DurationTimer\"" + "" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "GetArgumentAsNumber(\"Duration\")" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "=", - "GetArgumentAsNumber(\"PowerX\")" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "=", - "GetArgumentAsNumber(\"PowerY\")" - ] - }, + ], + "actions": [], + "events": [ { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "=", - "GetArgumentAsNumber(\"PowerAngle\")" + "type": "BuiltinCommonInstructions::ForEach", + "object": "UnitObject", + "conditions": [], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Delete units higher than max unit value", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()", + "!=", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyMaxQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "UnitObject", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update non-empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + "<", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "Object.Behavior::PropertyActiveUnitColorTint()" + ] + }, + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyActiveUnitOpacity()" + ] + }, + { + "type": { + "value": "ChangeAnimation" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyActiveUnitAnimationNumber()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update empty units", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">=", + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Color tint", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only apply color if it has changed from default value", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Object.Behavior::PropertyEmptyUnitColorTint()", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "Object.Behavior::PropertyEmptyUnitColorTint()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Opacity", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyEmptyUnitOpacity()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Animation", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeAnimation" + }, + "parameters": [ + "UnitObject", + "=", + "Object.Behavior::PropertyEmptyUnitAnimationNumber()" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } ] }, { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_TimeBetweenShakes", - "=", - "GetArgumentAsNumber(\"TimeBetweenShakes\")" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update counter", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyNextUnitToCreate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "PickedInstancesCount(UnitObject)" + ] + } ] } ] - }, + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Object used to display each unit", + "name": "UnitObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", + "fullName": "Color tint of empty units", + "functionType": "Action", + "name": "SetEmptyUnitColor", + "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitColorTint" }, - "comment": "Determine if the shake should keep going until stopped", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetObjectVariableAsBoolean" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeForever", - "False" - ] - } + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"ColorTint\")", + "" ] - }, + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Color tint", + "longDescription": "Use \"white\" to remove all color tint", + "name": "ColorTint", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Apply color tint to active units.", + "fullName": "Color tint of active units", + "functionType": "Action", + "name": "SetActiveUnitColor", + "sentence": "Apply color tint _PARAM2_ to active units of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"ShakeForever\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetObjectVariableAsBoolean" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeForever", - "True" - ] - } + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyActiveUnitColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "GetArgumentAsString(\"ColorTint\")", + "" ] - }, + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Color tint", + "longDescription": "Use \"white\" to remove all color tint", + "name": "ColorTint", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the opacity of empty units. Empty units exist between the current and maximum value.", + "fullName": "Opacity of empty units", + "functionType": "Action", + "name": "SetEmptyUnitOpacity", + "sentence": "Change the opacity of empty units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitOpacity" }, - "comment": "Add default values if none were provided", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "0.5" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_TimeBetweenShakes", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_TimeBetweenShakes", - "=", - "0.08" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "If duration is less than a single shake, increase duration to make 1 full shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "<", - "Object.Variable(__ShakeObject_TimeBetweenShakes)" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "Object.Variable(__ShakeObject_TimeBetweenShakes)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Detect initial shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "1" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Initiate the onScenePostEvents function", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "1" - ] - } + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Opacity\")" ] } - ], - "parameters": [] + ] } ], "parameters": [ @@ -16280,9932 +15560,4346 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", "type": "behavior" }, { - "description": "Duration of shake (in seconds) (Default: 0.5) ", - "name": "Duration", + "description": "Opacity of empty units", + "longDescription": "Range: 0 to 255", + "name": "Opacity", "type": "expression" - }, + } + ], + "objectGroups": [] + }, + { + "description": "Change the opacity of active units. ", + "fullName": "Opacity of active units", + "functionType": "Action", + "name": "SetActiveUnitOpacity", + "sentence": "Change the opacity of active units of _PARAM0_ to _PARAM2_", + "events": [ { - "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", - "name": "PowerX", - "type": "expression" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyActiveUnitOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Opacity\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, { - "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", - "name": "PowerY", - "type": "expression" + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" }, { - "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", - "name": "PowerAngle", + "description": "Opacity of active units", + "longDescription": "Range: 0 to 255", + "name": "Opacity", "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the animation of empty units. Empty units exist between the current and maximum value.", + "fullName": "Animation of empty units", + "functionType": "Action", + "name": "SetEmptyUnitAnimation", + "sentence": "Change the animation of empty units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyEmptyUnitAnimationNumber" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"AnimationNumber\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, { - "description": "Amount of time between shakes (in seconds) (Default: 0.08)", - "name": "TimeBetweenShakes", - "type": "expression" + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" }, { - "description": "Keep shaking until stopped", - "longDescription": "Duration value will be ignored", - "name": "ShakeForever", - "type": "yesorno" + "description": "Animation number", + "name": "AnimationNumber", + "type": "expression" } ], "objectGroups": [] }, { - "fullName": "", + "description": "Change maximum units that can be displayed.", + "fullName": "Maximum units", "functionType": "Action", - "name": "doStepPostEvents", - "sentence": "", + "name": "SetMaxQuantity", + "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Shake Object", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Start shaking", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "1" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Keep object shaking forever (if desired)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ObjectVariableAsBoolean" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeForever", - "True" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "100" - ] - }, - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_DurationTimer\"" - ] - } - ] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Calculate movement of the shake", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Run once before every shake movement", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "1" - ] - }, - { - "type": { - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"", - "Object.Variable(__ShakeObject_TimeBetweenShakes)" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeCounter", - "+", - "1" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Correct for drift and reset drift tracking variables", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move to correct any drift from previous shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledX)" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledY)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_AngleTravelled)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset drift detection variables", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "=", - "0" - ] - } - ] - } - ], - "parameters": [] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate Position Shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "1" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementX", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementY", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "After initial shake pick a random direction", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "0" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementX", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementY", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" - ] - } - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate Rotation (angle) shake ", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "!=", - "0" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Every \"even\" shake, rotate clockwise", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementAngle", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Every \"odd\" shake, rotate counter-clockwise", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementAngle", - "=", - "-1 *(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save that initial shake has been processed", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "0" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Move object", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate the fraction of shake that occured during this frame", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PercentTimeElapsedThisFrame", - "=", - "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Increase change for the first half of the shake (move away from original values)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"", - "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change position", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change angle", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Variable(__ShakeObject_PowerAngle)", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Decrease change the second half of the shake (return to original position)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"", - "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change position", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change angle", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Variable(__ShakeObject_PowerAngle)", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - } - ] - } - ], - "parameters": [] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Stop shaking", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_DurationTimer\"", - "Object.Variable(__ShakeObject_Duration)" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "-1" - ] - } - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeCounter", - "=", - "0" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Correct for drift and reset drift tracking variables", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move to correct any drift from previous shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledX)" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledY)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_AngleTravelled)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset drift detection variables", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "=", - "0" - ] - } - ] - } - ], - "parameters": [] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Stop any shaking of object that was initiated by the Shake Object extension.", - "fullName": "Stop shaking the object", - "functionType": "Action", - "name": "StopShaking", - "sentence": "Stop shaking _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ShakeObject::ShakeObject_PositionAngle::IsShaking" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "-1" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if an object is shaking.", - "fullName": "Check if an object is shaking", - "functionType": "Condition", - "name": "IsShaking", - "sentence": "_PARAM0_ is shaking", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [], - "sharedPropertyDescriptors": [] - }, - { - "description": "Shake an object, using one or more ways to shake (position, angle, scale)\nThis behavior can only be used on sprite objects.", - "fullName": "Shake object (position, angle, scale)", - "name": "ShakeObject_PositionAngleScale", - "objectType": "Sprite", - "eventsFunctions": [ - { - "description": "Shake an object, using one or more ways to shake (position, angle, scale).", - "fullName": "Shake object (position, angle, scale)", - "functionType": "Action", - "name": "ShakeObject_PositionAngleScale", - "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_, and scale amplitude _PARAM6_. Wait _PARAM7_ seconds between shakes. Keep shaking until stopped: _PARAM8_", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Shake Object", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Start/Reset duration timer", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_DurationTimer\"" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "GetArgumentAsNumber(\"Duration\")" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "=", - "GetArgumentAsNumber(\"PowerX\")" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "=", - "GetArgumentAsNumber(\"PowerY\")" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "=", - "GetArgumentAsNumber(\"PowerAngle\")" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerScale", - "=", - "GetArgumentAsNumber(\"PowerScale\")" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_TimeBetweenShakes", - "=", - "GetArgumentAsNumber(\"TimeBetweenShakes\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Determine if the shake should keep going until stopped", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetObjectVariableAsBoolean" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeForever", - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"ShakeForever\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetObjectVariableAsBoolean" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeForever", - "True" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Add default values if none were provided", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "0.5" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_TimeBetweenShakes", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_TimeBetweenShakes", - "=", - "0.08" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "If duration is less than a single shake, increase duration to make 1 full shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "<", - "Object.Variable(__ShakeObject_TimeBetweenShakes)" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "Object.Variable(__ShakeObject_TimeBetweenShakes)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Detect initial shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "1" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Initiate the onScenePostEvents function", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "1" - ] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "Sprite", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", - "type": "behavior" - }, - { - "description": "Duration of shake (in seconds) (Default: 0.5)", - "name": "Duration", - "type": "expression" - }, - { - "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", - "name": "PowerX", - "type": "expression" - }, - { - "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", - "name": "PowerY", - "type": "expression" - }, - { - "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", - "name": "PowerAngle", - "type": "expression" - }, - { - "description": "Amplitude of scale shake (in percent change) (For example: 5)", - "name": "PowerScale", - "type": "expression" - }, - { - "description": "Amount of time between shakes (in seconds) (Default: 0.08)", - "name": "TimeBetweenShakes", - "type": "expression" - }, - { - "description": "Keep shaking until stopped", - "longDescription": "Duration value will be ignored", - "name": "ShakeForever", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "doStepPostEvents", - "sentence": "", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Shake Object", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Start shaking", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "1" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Keep object shaking forever (if desired)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ObjectVariableAsBoolean" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeForever", - "True" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_Duration", - "=", - "100" - ] - }, - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_DurationTimer\"" - ] - } - ] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Calculate movement of the shake", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Run once before every shake movement", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "1" - ] - }, - { - "type": { - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"", - "Object.Variable(__ShakeObject_TimeBetweenShakes)" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeCounter", - "+", - "1" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "folded": true, - "name": "Correct for drift and reset drift tracking variables", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move to correct any drift from previous shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledX)" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledY)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_AngleTravelled)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerScale", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeScale" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_ScaleTravelled)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset drift detection variables", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ScaleTravelled", - "=", - "0" - ] - } - ] - } - ], - "parameters": [] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate Position Shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "1" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementX", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementY", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "After initial shake pick a random direction", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "0" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementX", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementY", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" - ] - } - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate Rotation (angle) shake ", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "!=", - "0" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Every \"even\" shake, rotate clockwise", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementAngle", - "=", - "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Every \"odd\" shake, rotate counter-clockwise", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementAngle", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate Scale shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerScale", - "!=", - "0" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate object scale displacement, with linear decay over time", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "ScaleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Every even shake, increase scale", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementScale", - "=", - "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Every \"odd\" shake, decrease scale", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "ScaleDisplacement = -1 * (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementScale", - "=", - "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save that initial shake has been processed", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_InitialShake", - "=", - "0" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Move object", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Calculate the fraction of shake that occured during this frame", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PercentTimeElapsedThisFrame", - "=", - "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Increase change for the first half of the shake (move away from original values)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"", - "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change position", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change angle", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Variable(__ShakeObject_PowerAngle)", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change scale", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Variable(__ShakeObject_PowerScale)", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeScale" - }, - "parameters": [ - "Object", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ScaleTravelled", - "+", - "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Decrease change the second half of the shake (return to original position)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_ShakeTimer\"", - "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change position", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change angle", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Variable(__ShakeObject_PowerAngle)", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change scale", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Variable(__ShakeObject_PowerScale)", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeScale" - }, - "parameters": [ - "Object", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Save movement to calculate drift", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ScaleTravelled", - "-", - "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" - ] - } - ] - } - ] - } - ] - } - ], - "parameters": [] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Stop shaking", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "\"__ShakeObject_DurationTimer\"", - "Object.Variable(__ShakeObject_Duration)" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "-1" - ] - } - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeCounter", - "=", - "0" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Correct for drift and reset drift tracking variables", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move to correct any drift from previous shake", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerX", - "!=", - "0" - ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerY", - "!=", - "0" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledX)" - ] - }, - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_DisplacementTravelledY)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerAngle", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetAngle" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_AngleTravelled)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_PowerScale", - "!=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ChangeScale" - }, - "parameters": [ - "Object", - "-", - "Object.Variable(__ShakeObject_ScaleTravelled)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset drift detection variables", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledX", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_DisplacementTravelledY", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_AngleTravelled", - "=", - "0" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ScaleTravelled", - "=", - "0" - ] - } - ] - } - ], - "parameters": [] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "Sprite", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Stop shaking an object.", - "fullName": "Stop shaking an object", - "functionType": "Action", - "name": "StopShaking", - "sentence": "Stop shaking _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ShakeObject::ShakeObject_PositionAngleScale::IsShaking" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "-1" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "Sprite", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if an object is shaking.", - "fullName": "Check if an object is shaking", - "functionType": "Condition", - "name": "IsShaking", - "sentence": "_PARAM0_ is shaking", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Object", - "__ShakeObject_ShakeInProgress", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "Sprite", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "VegeTato, arthuro555", - "category": "", - "extensionNamespace": "", - "fullName": "Repeat every X seconds", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXJlcGVhdCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNywxN0g3VjE0TDMsMThMNywyMlYxOUgxOVYxM0gxN003LDdIMTdWMTBMMjEsNkwxNywyVjVINVYxMUg3VjdaIiAvPjwvc3ZnPg==", - "name": "RepeatEveryXSeconds", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/repeat.svg", - "shortDescription": "This allows to trigger an event every X seconds.", - "version": "0.1.0", - "description": "Convenience conditions, actions and behaviors for timers to trigger a condition every X seconds.", - "origin": { - "identifier": "RepeatEveryXSeconds", - "name": "gdevelop-extension-store" - }, - "tags": [ - "repeat", - "timer", - "time", - "convenience" - ], - "authorIds": [ - "ZgrsWuRTAkXgeuPV9bo0zuEcA2w1", - "IRIhkkTTl2UHhfjrLTTH5GYwkYu1" - ], - "dependencies": [], - "eventsFunctions": [ - { - "description": "Triggers every X seconds.", - "fullName": "Repeat every X seconds", - "functionType": "Condition", - "name": "Repeat", - "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "ResetTimer" - }, - "parameters": [ - "player", - "GetArgumentAsString(\"timerName\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Timer" - }, - "parameters": [ - "player", - "GetArgumentAsNumber(\"time\")", - "GetArgumentAsString(\"timerName\")" - ] - } - ], - "actions": [ - { - "type": { - "value": "ResetTimer" - }, - "parameters": [ - "player", - "GetArgumentAsString(\"timerName\")" - ] - }, - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "The name of the timer to loop", - "name": "timerName", - "type": "string" - }, - { - "description": "The time in seconds between each trigger", - "name": "time", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Triggers every X seconds X amount of times.", - "fullName": "Repeat every X seconds in X number", - "functionType": "Condition", - "name": "RepeatXTimes", - "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds _PARAM3_ times", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "ResetTimer" - }, - "parameters": [ - "player", - "GetArgumentAsString(\"timerName\")" - ] - }, - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Timer" - }, - "parameters": [ - "player", - "GetArgumentAsNumber(\"time\")", - "GetArgumentAsString(\"timerName\")" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"limit\")", - "=", - "-1" - ] - }, - { - "type": { - "value": "VarScene" - }, - "parameters": [ - "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", - "<", - "GetArgumentAsNumber(\"limit\")" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "ResetTimer" - }, - "parameters": [ - "player", - "GetArgumentAsString(\"timerName\")" - ] - }, - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", - "+", - "1" - ] - }, - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "The name of the timer to loop", - "name": "timerName", - "type": "string" - }, - { - "description": "The time in seconds between each trigger", - "name": "time", - "type": "expression" - }, - { - "description": "The limit of loops", - "longDescription": "The condition will trigger at most this amount of times. Make it -1 for looping forever.", - "name": "limit", - "type": "expression" - } - ], - "objectGroups": [] - } - ], - "eventsBasedBehaviors": [ - { - "description": "Allows to repeat an object timer every X seconds.", - "fullName": "Repeat every X seconds", - "name": "RepeatTimer", - "objectType": "", - "eventsFunctions": [ - { - "fullName": "", - "functionType": "Action", - "name": "onCreated", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyTimerName()" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Triggers every X seconds, where X is defined in the behavior properties.", - "fullName": "Repeat every X seconds", - "functionType": "Condition", - "name": "Repeat", - "sentence": "Recurring timer _PARAM1_ of _PARAM0_ has triggered", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ObjectTimer" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyTimerName()", - "Object.Behavior::PropertyTimerLength()" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "RepeatEveryXSeconds::RepeatTimer::PropertyLimit" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "-1" - ] - }, - { - "type": { - "value": "RepeatEveryXSeconds::RepeatTimer::PropertyCounter" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyLimit()" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyTimerName()" - ] - }, - { - "type": { - "value": "RepeatEveryXSeconds::RepeatTimer::SetPropertyCounter" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "1" - ] - }, - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Pauses a recurring timer.", - "fullName": "Pause a recurring timer", - "functionType": "Action", - "name": "Pause", - "sentence": "Pause recurring timer _PARAM1_ of _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PauseObjectTimer" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyTimerName()" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Resumes a paused recurring timer.", - "fullName": "Resume a recurring timer", - "functionType": "Action", - "name": "Resume", - "sentence": "Resume recurring timer _PARAM1_ of _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "UnPauseObjectTimer" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyTimerName()" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Allows to trigger the recurring timer X times again.", - "fullName": "Reset the limit", - "functionType": "Action", - "name": "ResetLimit", - "sentence": "Allow to trigger the recurring timer _PARAM1_ of _PARAM0_ X times again", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "RepeatEveryXSeconds::RepeatTimer::SetPropertyCounter" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "MyTimer", - "type": "String", - "label": "The name of the timer to repeat", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "TimerName" - }, - { - "value": "1", - "type": "Number", - "label": "The time between each trigger (in seconds)", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "TimerLength" - }, - { - "value": "-1", - "type": "Number", - "label": "How many times should the timer trigger? -1 for forever.", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "Limit" - }, - { - "value": "0", - "type": "Number", - "label": "An internal counter", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "Counter" - } - ], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "@4ian", - "category": "General", - "extensionNamespace": "", - "fullName": "Health (life) points and shield", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWhlYXJ0LWhhbGYtZnVsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41LDVDMTUsNSAxMy41OCw1LjkxIDEzLDcuMlYxNy43NEMxNy4yNSwxMy44NyAyMCwxMS4yIDIwLDguNUMyMCw2LjUgMTguNSw1IDE2LjUsNU0xNi41LDNDMTkuNTgsMyAyMiw1LjQxIDIyLDguNUMyMiwxMi4yNyAxOC42LDE1LjM2IDEzLjQ1LDIwLjAzTDEyLDIxLjM1TDEwLjU1LDIwLjAzQzUuNCwxNS4zNiAyLDEyLjI3IDIsOC41QzIsNS40MSA0LjQyLDMgNy41LDNDOS4yNCwzIDEwLjkxLDMuODEgMTIsNS4wOEMxMy4wOSwzLjgxIDE0Ljc2LDMgMTYuNSwzWiIgLz48L3N2Zz4=", - "name": "Health", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/heart-half-full.svg", - "shortDescription": "Manage life points and a protective shield.", - "version": "0.1.0", - "description": "Manage health (life) and shield points of an object. Health can be assigned to players, enemies, NPCs, or even inanimate objects such as breaking doors and mining rocks.\n\nHow to use:\n\n- Set desired values in \"Health\" and \"Shield\" behavior properties\n- To apply damage use “Damage an object” or “Damage an object protected by a shield”\n- To heal health, use “Heal object” action \n- To activate the shield, use “Activate Shield” action\n- Health and shield regeneration will happen automatically based on properties\n \nTips:\n\n- While damage cooldown is active, no damage will be applied to health or shield\n- Try using the “Blink” extension while damage cooldown is active\n- Use the “Is just damaged” condition to trigger audio and visual effects\n\nHealth properties:\n\n- Health (life points) Used for starting health\n- Maximum health (0 for no maximum)\n- Damage cooldown (seconds) Use \"0\" for no cooldown\n- Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled\n- Delay (seconds) before health regeneration starts after being hit\n- Allow heal to increase health above max health (will not exceed max health)\n\nShield properties:\n\n- Max shield points (Shield will start with this many points when activated)\n- Duration of shield (seconds) Use \"0\" to disable shield timer\n- Rate of shield regeneration (points per second)\n- Shield will block all excess damage when shield is destroyed\n- Delay (seconds) before shield regeneration starts after being hit\n- Regenerate shield when it has zero points\n", - "origin": { - "identifier": "Health", - "name": "gdevelop-extension-store" - }, - "tags": [ - "health", - "life", - "damage", - "hit", - "heal", - "shield", - "regeneration" - ], - "authorIds": [ - "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", - "xpwUwByyImTDcHEqDUqfyg0oRBt1", - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ - { - "description": "Manage life points by damaging and healing the object.", - "fullName": "Health", - "name": "Health", - "objectType": "", - "eventsFunctions": [ - { - "fullName": "", - "functionType": "Action", - "name": "doStepPreEvents", - "sentence": "", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Regeneration", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Health", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyHealthRegenRate" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "0" - ] - }, - { - "type": { - "value": "Health::Health::PropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::MaxHealth()" - ] - }, - { - "type": { - "value": "CompareObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.TimeSinceLastHit\"", - ">", - "Object.Behavior::PropertyHealthRegenDelay()" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "Object.Behavior::PropertyHealthRegenRate() * TimeDelta()" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Correct any values above maximum limits", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::MaxHealth()" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyMaxHealth()" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Reset damage trigger", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyIsJustDamaged" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Apply damage directly to the object. Damage will not be affected by shield. Triggers damage cooldown.", - "fullName": "Damage an object", - "functionType": "Action", - "group": "Health", - "name": "Hit", - "sentence": "Damage _PARAM0_, removing _PARAM2_ points from its health", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Only consider damage if damage cooldown is NOT active", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Health::IsDamageCooldownActive" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Mark object was hit at least once (used for initial state of damage cooldown)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Health::PropertyHitAtLeastOnce" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHitAtLeastOnce" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Restart time since last hit timer", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.TimeSinceLastHit\"" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Apply damage", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "-", - "GetArgumentAsNumber(\"DamageValue\")" - ] - }, - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.DamageCooldown\"" - ] - }, - { - "type": { - "value": "Health::Health::SetPropertyIsJustDamaged" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Value of the damage to do (will be removed from object health)", - "name": "DamageValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change health points. This is not considered damage.", - "fullName": "Change health points", - "functionType": "Action", - "group": "Health", - "name": "SetHealth", - "sentence": "Set health of _PARAM0_ to _PARAM2_ points", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyMaxHealth" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyHealth(), Object.Behavior::PropertyMaxHealth())" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "New health value", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Heal the object by increasing its life points.", - "fullName": "Heal object", - "functionType": "Action", - "group": "Health", - "name": "Heal", - "sentence": "Heal _PARAM0_ with _PARAM2_ health points", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Change health points", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "GetArgumentAsNumber(\"HealValue\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Prevent exceeding max health (unless overhealing is enabled)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyMaxHealth" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - }, - { - "type": { - "inverted": true, - "value": "Health::Health::PropertyAllowOverHealing" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyHealth(), Object.Behavior::PropertyMaxHealth())" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Points to heal (will be added to object health)", - "name": "HealValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change the object maximum health points.", - "fullName": "Change maximum health points", - "functionType": "Action", - "group": "Health", - "name": "SetMaxHealth", - "sentence": "Set maximum health of _PARAM0_ to _PARAM2_ points", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyMaxHealth" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Maximum health", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change rate of health regeneration.", - "fullName": "Change rate of health regeneration", - "functionType": "Action", - "group": "Shield", - "name": "SetHealthRegenRate", - "sentence": "Set rate of health regen of _PARAM0_ to _PARAM2_ points per second", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealthRegenRate" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Rate of regen", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change duration of damage cooldown.", - "fullName": "Change duration of damage cooldown", - "functionType": "Action", - "group": "Health", - "name": "SetCooldownDuration", - "sentence": "Set duration of damage cooldown on _PARAM0_ to _PARAM2_ seconds", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyDamageCooldown" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Duration of damage cooldown (seconds)", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change delay before health regeneration starts after being hit.", - "fullName": "Change delay before health regeneration starts", - "functionType": "Action", - "group": "Health", - "name": "SetHealthRegenDelay", - "sentence": "Set delay before health regeneration starts on _PARAM0_ to _PARAM2_ seconds", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHealthRegenDelay" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Delay (seconds)", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Allow over-healing.", - "fullName": "Allow over-healing", - "functionType": "Action", - "group": "Health", - "name": "AllowOverHealing", - "sentence": "Allow over-healing on _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyAllowOverHealing" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyAllowOverHealing" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Allow over-healing", - "name": "Value", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Mark object as hit at least once.", - "fullName": "Mark object as hit at least once", - "functionType": "Action", - "group": "Health", - "name": "SetHitAtLeastOnce", - "sentence": "Mark _PARAM0_ as hit at least once: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHitAtLeastOnce" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyHitAtLeastOnce" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Hit at least once", - "name": "Value", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Mark object as just damaged.", - "fullName": "Mark object as just damaged", - "functionType": "Action", - "group": "Health", - "name": "SetJustDamaged", - "sentence": "Mark _PARAM0_ as just damaged: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyIsJustDamaged" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetPropertyIsJustDamaged" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - }, - { - "description": "Just damaged", - "name": "Value", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Check if the object has been hit at least once.", - "fullName": "Object hit at least once", - "functionType": "Condition", - "group": "Health", - "name": "HitAtLeastOnce", - "sentence": "_PARAM0_ has just been hit at least once", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyHitAtLeastOnce" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if the object was just damaged previously in the events.", - "fullName": "Is just damaged", - "functionType": "Condition", - "group": "Health", - "name": "IsJustDamaged", - "sentence": "_PARAM0_ has just been damaged", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyIsJustDamaged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if damage cooldown is active. Object (and shield) cannot be damaged while this is active.", - "fullName": "Is damage cooldown active", - "functionType": "Condition", - "group": "Health", - "name": "IsDamageCooldownActive", - "sentence": "Damage cooldown on _PARAM0_ is active", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyHitAtLeastOnce" - }, - "parameters": [ - "Object", - "Behavior" - ] - }, - { - "type": { - "value": "Health::Health::PropertyDamageCooldown" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - }, - { - "type": { - "value": "CompareObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.DamageCooldown\"", - "<", - "Object.Behavior::PropertyDamageCooldown()" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if the object is considered dead (no health points).", - "fullName": "Is dead", - "functionType": "Condition", - "group": "Health", - "name": "IsDead", - "sentence": "_PARAM0_ is dead", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::PropertyHealth" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Maximum health points of the object.", - "fullName": "Maximum health points", - "functionType": "Expression", - "group": "Health", - "name": "MaxHealth", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyMaxHealth()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Duration of damage cooldown (seconds).", - "fullName": "Duration of damage cooldown", - "functionType": "Expression", - "group": "Health", - "name": "DamageCooldownDuration", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyDamageCooldown()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Health points of the object.", - "fullName": "Health points", - "functionType": "Expression", - "group": "Health", - "name": "Health", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyHealth()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Delay before health regeneration starts after last hit (seconds).", - "fullName": "Delay before health regeneration starts", - "functionType": "Expression", - "group": "Health", - "name": "HealthRegenDelay", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyHealthRegenDelay()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Rate of health regeneration (points per second).", - "fullName": "Rate of health regeneration", - "functionType": "Expression", - "group": "Health", - "name": "HealthRegenRate", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyHealthRegenRate()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Time before damage cooldown ends (seconds).", - "fullName": "Time before damage cooldown ends", - "functionType": "Expression", - "group": "Health", - "name": "DamageCooldownRemaining", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Health::IsDamageCooldownActive" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "max(0,Object.Behavior::PropertyDamageCooldown() - Object.ObjectTimerElapsedTime(\"__Health.DamageCooldown\"))" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Time since last hit (seconds).", - "fullName": "Time since last hit", - "functionType": "Expression", - "group": "Health", - "name": "TimeSinceLastHit", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\")" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "onCreated", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.DamageCooldown\"" - ] - }, - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.TimeSinceLastHit\"" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "100", - "type": "Number", - "label": "Health (life points) Used for starting health", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": false, - "name": "Health" - }, - { - "value": "0", - "type": "Number", - "label": "Damage cooldown (seconds) Use \"0\" for no cooldown", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": false, - "name": "DamageCooldown" - }, - { - "value": "100", - "type": "Number", - "label": "Maximum health (0 for no maximum)", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": false, - "name": "MaxHealth" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": true, - "name": "IsJustDamaged" - }, - { - "value": "0", - "type": "Number", - "label": "Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": false, - "name": "HealthRegenRate" - }, - { - "value": "0", - "type": "Number", - "label": "Delay (seconds) before health regen starts after being hit", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": false, - "name": "HealthRegenDelay" - }, - { - "value": "", - "type": "Boolean", - "label": "Allow heal to increase health above max health (regen will never exceed max health)", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": false, - "name": "AllowOverHealing" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "Health", - "extraInformation": [], - "hidden": true, - "name": "HitAtLeastOnce" - } - ], - "sharedPropertyDescriptors": [] - }, - { - "description": "Protective shield that prevents damage to health points.", - "fullName": "Shield", - "name": "Shield", - "objectType": "", - "eventsFunctions": [ - { - "fullName": "", - "functionType": "Action", - "name": "doStepPreEvents", - "sentence": "", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Regeneration", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Shield", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyShieldRegenRate" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "0" - ] - }, - { - "type": { - "value": "Health::Shield::PropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyMaxShieldPoints()" - ] - }, - { - "type": { - "value": "CompareObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.TimeSinceLastHit\"", - ">", - "Object.Behavior::PropertyShieldRegenDelay()" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Only regen when shield is active or when \"RegenShieldWhenZeroPoints\" is enabled", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "Health::Shield::PropertyRegenShieldWhenZeroPoints" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "+", - "Object.Behavior::PropertyShieldRegenRate() * TimeDelta()" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Correct any values above maximum limits", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::PropertyMaxShieldPoints()" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyMaxShieldPoints()" - ] - } - ] - } - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Remove shield points if shield expired", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Reset damage trigger", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyIsShieldJustDamaged" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - } - ], - "parameters": [] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Apply damage to the shield and object. If the shield is active, it will be damaged first and any excess damage will reduce health and trigger damage cooldown.", - "fullName": "Damage an object protected by a shield", - "functionType": "Action", - "group": "Health", - "name": "ShieldHit", - "sentence": "Damage shield and health of _PARAM0_ for _PARAM2_ points of damage", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Only consider damage if damage cooldown is NOT active", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Health::IsDamageCooldownActive" - }, - "parameters": [ - "Object", - "RequireHealth", - "" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Mark object was hit at least once (used for initial state of damage cooldown)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Health::HitAtLeastOnce" - }, - "parameters": [ - "Object", - "RequireHealth", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetHitAtLeastOnce" - }, - "parameters": [ - "Object", - "RequireHealth", - "yes", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Restart time since last hit timer", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.TimeSinceLastHit\"" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "If shield is NOT active, perform normal damage", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetHealth" - }, - "parameters": [ - "Object", - "RequireHealth", - "Object.RequireHealth::Health() - GetArgumentAsNumber(\"DamageValue\")", - "" - ] - }, - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.DamageCooldown\"" - ] - }, - { - "type": { - "value": "Health::Health::SetJustDamaged" - }, - "parameters": [ - "Object", - "RequireHealth", - "yes", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "If shield is active, damage shield first", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::IsShieldActive" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "-", - "GetArgumentAsNumber(\"DamageValue\")" - ] - }, - { - "type": { - "value": "Health::Shield::SetPropertyIsShieldJustDamaged" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Excess damage is based on negative shield points", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "0" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Apply excess damage only if shield does NOT block excess damage", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "Health::Shield::PropertyShieldBlocksExcessDamage" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Health::SetHealth" - }, - "parameters": [ - "Object", - "RequireHealth", - "Object.RequireHealth::Health() + Object.Behavior::PropertyShieldPoints()", - "" - ] - }, - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.DamageCooldown\"" - ] - }, - { - "type": { - "value": "Health::Health::SetJustDamaged" - }, - "parameters": [ - "Object", - "RequireHealth", - "yes", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ] - } - ] - } - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Value of the damage to do (will be removed from object health)", - "name": "DamageValue", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change the object maximum shield points.", - "fullName": "Change maximum shield points", - "functionType": "Action", - "group": "Shield", - "name": "SetMaxShield", - "sentence": "Set maximum shield of _PARAM0_ to _PARAM2_ points", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyMaxShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Maximum shield", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change shield points. This is not considered damage.", - "fullName": "Change shield points", - "functionType": "Action", - "group": "Shield", - "name": "SeShieldPoints", - "sentence": "Set shield on _PARAM0_ to _PARAM2_ points", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Shield points", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change rate of shield regeneration.", - "fullName": "Change rate of shield regeneration", - "functionType": "Action", - "group": "Shield", - "name": "SetShieldRegenRate", - "sentence": "Set rate of shield regeneration of _PARAM0_ to _PARAM2_ points per second", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldRegenRate" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Rate of regen", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change delay before shield regeneration starts after being hit.", - "fullName": "Change delay before shield regeneration starts", - "functionType": "Action", - "group": "Shield", - "name": "SetShieldRegenDelay", - "sentence": "Set delay before shield regeneration starts on _PARAM0_ to _PARAM2_ seconds", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldRegenDelay" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Delay (seconds)", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change duration of shield.", - "fullName": "Change duration of shield", - "functionType": "Action", - "group": "Shield", - "name": "SetShieldDuration", - "sentence": "Set duration of shield on _PARAM0_ to _PARAM2_ seconds", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldDuration" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Duration of shield (seconds)", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Activate shield. If the shield was already active, this will reset it's points and timer.", - "fullName": "Activate shield", - "functionType": "Action", - "group": "Shield", - "name": "ActivateShield", - "sentence": "Activate (or renew) shield on _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResetObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.ShieldDuration\"" - ] - }, - { - "type": { - "value": "Health::Shield::SetPropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyMaxShieldPoints()" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Change max shield points. This value is used when the shield is activated or renewed.", - "fullName": "Change max shield points ", - "functionType": "Action", - "group": "Shield", - "name": "SetMaxShieldPoints", - "sentence": "Set max shield of _PARAM0_ to _PARAM2_ points", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyMaxShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Shield points", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Shield blocks excess damage when it breaks.", - "fullName": "Shield blocks excess damage when it breaks", - "functionType": "Action", - "group": "Shield", - "name": "ShieldBlockExcessDamage", - "sentence": "Shield on _PARAM0_ blocks excess damage when it breaks: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldBlocksExcessDamage" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyShieldBlocksExcessDamage" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Shield blocks excess damage", - "name": "Value", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Regenerate shield when it has zero points.", - "fullName": "Regenerate shield when it has zero points", - "functionType": "Action", - "group": "Shield", - "name": "RegenShieldWhenZero", - "sentence": "Regenerate shield on _PARAM0_ when it has zero points: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyRegenShieldWhenZeroPoints" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "Health::Shield::SetPropertyRegenShieldWhenZeroPoints" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - }, - { - "description": "Regen shield when it has zero points", - "name": "Value", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Check if the shield was just damaged previously in the events.", - "fullName": "Is shield just damaged", - "functionType": "Condition", - "group": "Shield", - "name": "IsShieldJustDamaged", - "sentence": "Shield on _PARAM0_ has just been damaged", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyIsShieldJustDamaged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Check if the shield is active (based on shield points and duration).", - "fullName": "Is shield active", - "functionType": "Condition", - "group": "Shield", - "name": "IsShieldActive", - "sentence": "Shield on _PARAM0_ is active", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "False" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "To be considered \"active\", a shield must have positive points AND not exceed duration", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyShieldPoints" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Don't check the timer when duration is zero (or negative)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyShieldDuration" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyShieldDuration" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - }, - { - "type": { - "value": "CompareObjectTimer" - }, - "parameters": [ - "Object", - "\"__Health.ShieldDuration\"", - "<", - "Object.Behavior::PropertyShieldDuration()" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Maximum shield points of the object.", - "fullName": "Maximum shield points", - "functionType": "Expression", - "group": "Shield", - "name": "MaxShield", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyMaxShieldPoints()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Duration of shield (seconds).", - "fullName": "Duration of shield", - "functionType": "Expression", - "group": "Shield", - "name": "ShieldDuration", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyShieldDuration()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Delay before shield regeneration starts after last hit (seconds).", - "fullName": "Delay before shield regeneration starts", - "functionType": "Expression", - "group": "Shield", - "name": "ShieldRegenDelay", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyShieldRegenDelay()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Rate of shield regeneration (points per second).", - "fullName": "Rate of shield regeneration", - "functionType": "Expression", - "group": "Shield", - "name": "ShieldRegenRate", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyShieldRegenRate()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Time before shield ends (seconds).", - "fullName": "Time before shield ends", - "functionType": "Expression", - "group": "Shield", - "name": "ShieldTimeRemaining", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Health::Shield::PropertyShieldDuration" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "max(0,Object.Behavior::PropertyShieldDuration() - Object.ObjectTimerElapsedTime(\"__Health.ShieldDuration\"))" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Shield points of the object.", - "fullName": "Shield points", - "functionType": "Expression", - "group": "Shield", - "name": "ShieldPoints", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyShieldPoints()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "Health::Shield", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "", - "type": "Behavior", - "label": "", - "description": "", - "group": "", - "extraInformation": [ - "Health::Health" - ], - "hidden": false, - "name": "RequireHealth" - }, - { - "value": "100", - "type": "Number", - "label": "Max shield points (Shield will start with this many points when activated)", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": false, - "name": "MaxShieldPoints" - }, - { - "value": "5", - "type": "Number", - "label": "Duration of shield (seconds) Use \"0\" to disable shield timer", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": false, - "name": "ShieldDuration" - }, - { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": true, - "name": "ShieldPoints" - }, - { - "value": "0", - "type": "Number", - "label": "Rate of shield regeneration (points per second)", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": false, - "name": "ShieldRegenRate" - }, - { - "value": "", - "type": "Boolean", - "label": "Shield will block all excess damage when shield is destroyed", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": false, - "name": "ShieldBlocksExcessDamage" - }, - { - "value": "", - "type": "Number", - "label": "Delay (seconds) before shield regeneration starts after being hit", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": false, - "name": "ShieldRegenDelay" - }, - { - "value": "", - "type": "Boolean", - "label": "Regenerate shield when it has zero points", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": false, - "name": "RegenShieldWhenZeroPoints" - }, - { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "Shield", - "extraInformation": [], - "hidden": true, - "name": "IsShieldJustDamaged" - } - ], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", - "category": "General", - "extensionNamespace": "", - "fullName": "Draw resource bar (NEW)", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBkPSJNMjgsMTJIMTRINGMtMi4yLDAtNCwxLjgtNCw0czEuOCw0LDQsNGgxMGgxNGMyLjIsMCw0LTEuOCw0LTRTMzAuMiwxMiwyOCwxMnogTTQsMThjLTEuMSwwLTItMC45LTItMnMwLjktMiwyLTJoMTANCgljMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJINHoiLz4NCjwvc3ZnPg0K", - "name": "DrawResourceBar", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_loading_progress_bar.svg", - "shortDescription": "Draw a resource bar that represents health, shield, or any value.", - "version": "0.0.1", - "description": "How to use:\n- \n\nTips:\n- ", - "origin": { - "identifier": "DraggableSliderControl", - "name": "gdevelop-extension-store" - }, - "tags": [ - "health", - "shield", - "resource", - "shape painter", - "ui", - "widget" - ], - "authorIds": [ - "gqDaZjCfevOOxBYkK6zlhtZnXCg1", - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ - { - "description": "Draw a resource bar that represents health, shield, or any value.", - "fullName": "Draw resource bar", - "name": "DrawResourceBar", - "objectType": "PrimitiveDrawing::Drawer", - "eventsFunctions": [ - { - "fullName": "", - "functionType": "Action", - "name": "onCreated", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure object doesn't get re-drawn every frame", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::ClearBetweenFrames" - }, - "parameters": [ - "Object", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Use correct min value (instead of always starting at 0)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMin()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "doStepPostEvents", - "sentence": "", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Slider drawing", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior" - ] - }, - { - "type": { - "value": "Visible" - }, - "parameters": [ - "Object" - ] - }, - { - "type": { - "value": "LayerVisible" - }, - "parameters": [ - "", - "Object.Layer()" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Drawer::ClearShapes" - }, - "parameters": [ - "Object" - ] - } - ], - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Inactive bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set inactive track parameters (by default, use the active bar color)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyActiveBarColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyInactiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyInactiveBarColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyInactiveBarOpacity()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::OutlineOpacity" - }, - "parameters": [ - "Object", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw inactive track", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "-Object.Behavior::PropertyBarThickness() / 2", - "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness() / 2" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of track (inactive side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyBarLength()", - "0", - "Object.Behavior::PropertyBarThickness() / 2", - "270", - "90", - "", - "yes" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Active bar", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set active track parameters", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyActiveBarColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyActiveBarColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyActiveBarOpacity()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw active bar", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "0", - "-(Object.Behavior::PropertyBarThickness() / 2)", - "Object.Behavior::PropertyThumbOffset()", - "Object.Behavior::PropertyBarThickness() / 2" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of bar (active side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DrawResourceBar::DrawResourceBar::PropertyRoundedBar" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "0", - "0", - "Object.Behavior::PropertyBarThickness() / 2", - "90", - "270", - "", - "yes" - ] - } - ] - } - ], - "parameters": [] - } + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Maximum units", + "name": "Value", + "supplementaryInformation": "Sprite", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the current quantity of units.", + "fullName": "Unit quantity", + "functionType": "ActionWithOperator", + "getterName": "CurrentQuantity", + "name": "SetCurrentQuantity", + "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyMaxQuantity())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Current units", + "name": "Value", + "supplementaryInformation": "Sprite", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Increase the current quantity of units.", + "fullName": "Increase quantity", + "functionType": "Action", + "name": "IncreaseQuantity", + "sentence": "Increase the quantity of _PARAM0_ by _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyMaxQuantity(), Object.Behavior::PropertyCurrentQuantity() + GetArgumentAsNumber(\"Value\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "supplementaryInformation": "Sprite", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Decrease the current quantity of units.", + "fullName": "Decrease quantity", + "functionType": "Action", + "name": "DecreaseQuantity", + "sentence": "Decrease the quantity of _PARAM0_ by _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,Object.Behavior::PropertyCurrentQuantity() - GetArgumentAsNumber(\"Value\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "supplementaryInformation": "Sprite", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "quantity", + "fullName": "Current quantity", + "functionType": "ExpressionAndCondition", + "name": "CurrentQuantity", + "sentence": "quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "max quantity", + "fullName": "Max quantity", + "functionType": "ExpressionAndCondition", + "name": "MaxQuantity", + "sentence": "max quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Starting quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "StartingQuantity" + }, + { + "value": "", + "type": "Number", + "label": "Quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentQuantity" + }, + { + "value": "10", + "type": "Number", + "label": "Maximum quantity (Use \"0\" for unlimited)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "MaxQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NextUnitToCreate" + }, + { + "value": "", + "type": "Color", + "label": "Empty color tint", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyUnitColorTint" + }, + { + "value": "64", + "type": "Number", + "label": "Opacity of empty units (Range: 0 to 255)", + "description": "Empty units exist between the current and maximum value.", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyUnitOpacity" + }, + { + "value": "0", + "type": "Number", + "label": "Animation number for empty units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "EmptyUnitAnimationNumber" + }, + { + "value": "255", + "type": "Number", + "label": "Opacity of active units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ActiveUnitOpacity" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Color tint of active units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ActiveUnitColorTint" + }, + { + "value": "0", + "type": "Number", + "label": "Animation number for active units", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ActiveUnitAnimationNumber" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Use a tiled sprite to display repeated objects to represent a resource in the game (hearts, lives, ammo, etc). ", + "fullName": "Resource bar (tiled sprite)", + "name": "ResourceBar_TiledSprite", + "objectType": "TiledSpriteObject::TiledSprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyStartingQuantity()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Display a tiled resource bar.", + "fullName": "Draw a resource bar (tiled sprite)", + "functionType": "Action", + "name": "DrawResourceBar", + "sentence": "Display resource bar using _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledSpriteObject::Width" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyUnitWidth() * Object.Behavior::PropertyCurrentQuantity()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the quantity of a tiled resource bar.", + "fullName": "Quantity", + "functionType": "Action", + "name": "SetQuantity", + "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,GetArgumentAsNumber(\"Value\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the quantity of a tiled resource bar.", + "fullName": "Quantity", + "functionType": "ActionWithOperator", + "getterName": "Quantity", + "name": "SetQuantityOp", + "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If max quantity has NOT been set, do not enforce it.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::PropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,GetArgumentAsNumber(\"Value\"))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If max quantity has been set, make sure quantity does not exceed it.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::PropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(GetArgumentAsNumber(\"Value\"), 0, Object.Behavior::PropertyMaxQuantity())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum quantity of a tiled resource bar.", + "fullName": "Maximum quantity", + "functionType": "Action", + "name": "SetMaxQuantity", + "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,GetArgumentAsNumber(\"Value\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum quantity of a tiled resource bar.", + "fullName": "Maximum quantity", + "functionType": "ActionWithOperator", + "getterName": "MaxQuantity", + "name": "SetMaxQuantityOp", + "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyMaxQuantity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,GetArgumentAsNumber(\"Value\"))" ] } - ], - "parameters": [] + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the quantity", + "fullName": "Quantity", + "functionType": "ExpressionAndCondition", + "name": "Quantity", + "sentence": "the quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the max quantity", + "fullName": "Max quantity", + "functionType": "ExpressionAndCondition", + "name": "MaxQuantity", + "sentence": "the max quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledSpriteObject::TiledSprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Starting quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "StartingQuantity" + }, + { + "value": "", + "type": "Number", + "label": "Quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentQuantity" + }, + { + "value": "16", + "type": "Number", + "label": "Unit width (pixels)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "UnitWidth" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum quantity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "MaxQuantity" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@Bouh, D8H", + "category": "General", + "extensionNamespace": "", + "fullName": "Extended variables support", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXZhcmlhYmxlLWJveCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOSAzSDVDMy45IDMgMyAzLjkgMyA1VjE5QzMgMjAuMSAzLjkgMjEgNSAyMUgxOUMyMC4xIDIxIDIxIDIwLjEgMjEgMTlWNUMyMSAzLjkgMjAuMSAzIDE5IDNNNy40IDE4QzUuOSAxNi41IDUgMTQuMyA1IDEyUzUuOSA3LjUgNy40IDZMOSA2LjdDNy43IDcuOSA3IDkuOSA3IDEyUzcuNyAxNi4xIDkgMTcuM0w3LjQgMThNMTIuNyAxNUwxMS45IDEzTDEwLjUgMTVIOUwxMS4zIDExLjlMMTAgOUgxMS4zTDEyLjEgMTFMMTMuNSA5SDE1TDEyLjggMTJMMTQuMSAxNUgxMi43TTE2LjYgMThMMTUgMTcuM0MxNi4zIDE2IDE3IDE0LjEgMTcgMTJTMTYuMyA3LjkgMTUgNi43TDE2LjYgNkMxOC4xIDcuNSAxOSA5LjcgMTkgMTJTMTguMSAxNi41IDE2LjYgMThaIiAvPjwvc3ZnPg==", + "name": "ExtendedVariables", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/variable-box.svg", + "shortDescription": "Add conditions, actions and expressions to check for the existence of a variable, copy variables, delete existing ones from memory, and create dynamic variables.", + "version": "1.0.0", + "description": "This extension provides: \n- Conditions to check if a global/scene/object variable exists.\n- Actions to copy object variables, global and scene variables.\n- Actions to delete an existing global/scene variable from memory.\n- Actions to create a global/scene variable using a text expression, rather than a variable name input.\n- Expressions to get the value or text from a global/scene variable using a text expression, rather than a variable name.\n\nText expressions allows to enter the name of the variable with an expression like `\"MyVar\"+ ToString(Variable(Health))`", + "origin": { + "identifier": "ExtendedVariables", + "name": "gdevelop-extension-store" + }, + "tags": [ + "variable", + "scene", + "global", + "object", + "remove", + "expression", + "copy", + "structure", + "array", + "boolean", + "duplication" + ], + "authorIds": [ + "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "eventsFunctions": [ + { + "description": "Check if a global variable exists.", + "fullName": "Global variable exists", + "functionType": "Condition", + "group": "Deprecated", + "name": "C_global_variable_exist", + "private": true, + "sentence": "If the global variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ExtendedVariables::GlobalVariableExist" + }, + "parameters": [ + "", + "GetArgumentAsString(\"GlobalVariableName\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Name of the global variable", + "name": "GlobalVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the global variable exists.", + "fullName": "Global variable exists", + "functionType": "Condition", + "group": "Global variables", + "name": "GlobalVariableExist", + "sentence": "If the global variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\neventsFunctionContext.returnValue = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the global variable", + "name": "GlobalVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a scene variable exists.", + "fullName": "Scene variable exists", + "functionType": "Condition", + "group": "Deprecated", + "name": "C_scene_variable_exist", + "private": true, + "sentence": "If the scene variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ExtendedVariables::SceneVariableExist" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "" + ] } ], - "parameters": [ + "actions": [ { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the scene variable exists.", + "fullName": "Scene variable exists", + "functionType": "Condition", + "group": "Scene variables", + "name": "SceneVariableExist", + "sentence": "If the scene variable _PARAM1_ exist", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\neventsFunctionContext.returnValue = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object variable exists.", + "fullName": "Object variable exists", + "functionType": "Condition", + "group": "Deprecated", + "name": "C_object_variable_exist", + "private": true, + "sentence": "Object _PARAM1_ has object variable _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ExtendedVariables::ObjectVariableExist" + }, + "parameters": [ + "", + "ObjectToCheck", + "GetArgumentAsString(\"ObjectVariableName\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "ObjectToCheck", + "type": "objectList" + }, + { + "description": "Name of object variable", + "name": "ObjectVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object variable exists.", + "fullName": "Object variable exists", + "functionType": "Condition", + "group": "Object variables", + "name": "ObjectVariableExist", + "sentence": "Object _PARAM1_ has object variable _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "let returnValue = true;\r\nif (!objects.length) {\r\n returnValue = false;\r\n} else {\r\n const objectVariableName = eventsFunctionContext.getArgument(\"ObjectVariableName\");\r\n for (let i = 0; i < objects.length; i++) {\r\n if (!objects[i].hasVariable(objectVariableName)) {\r\n // If any object does NOT have the variable, return false.\r\n returnValue = false;\r\n break;\r\n }\r\n }\r\n}\r\n\r\neventsFunctionContext.returnValue = returnValue;", + "parameterObjects": "ObjectToCheck", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "ObjectToCheck", + "type": "objectList" + }, + { + "description": "Name of object variable", + "name": "ObjectVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete a global variable, removing it from memory.", + "fullName": "Delete global variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Delete_global_variable", + "private": true, + "sentence": "Delete global variable _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ExtendedVariables::DeleteGlobalVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"GlobalVariableName\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Name of the global variable to delete", + "name": "GlobalVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete the global variable, removing it from memory.", + "fullName": "Delete global variable", + "functionType": "Action", + "group": "Global variables", + "name": "DeleteGlobalVariable", + "sentence": "Delete the global variable _PARAM1_ from memory", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "runtimeScene.getGame().getVariables().remove(eventsFunctionContext.getArgument(\"GlobalVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the global variable to delete", + "name": "GlobalVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a scene variable.", + "fullName": "String of a scene variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_scene_variable_string", + "private": true, + "sentence": "Change the text of scene variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" + "type": { + "value": "ExtendedVariables::ModifySceneVariableString" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" + ] } - ], - "objectGroups": [] + ] + } + ], + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" }, { - "description": "The value of the resource bar.", - "fullName": "Value", - "functionType": "Expression", - "group": "Bar", - "name": "Value", - "sentence": "", - "events": [ + "description": "Value", + "name": "SceneVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a scene variable.", + "fullName": "String of a scene variable", + "functionType": "Action", + "group": "Scene variables", + "name": "ModifySceneVariableString", + "sentence": "Change the text of scene variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\nvariable.setString(eventsFunctionContext.getArgument(\"SceneVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" + }, + { + "description": "Value", + "name": "SceneVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a global variable.", + "fullName": "String of a global variable", + "functionType": "Action", + "group": "Global variables", + "name": "ModifyGlobalVariableString", + "sentence": "Change the text of global variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\nvariable.setString(eventsFunctionContext.getArgument(\"GlobalVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the global variable", + "name": "GlobalVariableName", + "type": "string" + }, + { + "description": "Value", + "name": "GlobalVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a global variable.", + "fullName": "Value of a global variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_global_variable", + "private": true, + "sentence": "Change the global variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValue()" - ] - } + "type": { + "value": "ExtendedVariables::ModifyGlobalVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" ] } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ + ] + } + ], + "parameters": [ + { + "description": "Name of the global variable", + "name": "SceneVariableName", + "type": "string" + }, + { + "description": "Value", + "name": "SceneVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the text of a global variable.", + "fullName": "String of a global variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_global_variable_string", + "private": true, + "sentence": "Change the text of global variable _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, + "type": { + "value": "ExtendedVariables::ModifyGlobalVariableString" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Name of the global variable", + "name": "SceneVariableName", + "type": "string" + }, + { + "description": "Value", + "name": "SceneVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a global variable.", + "fullName": "Value of a global variable", + "functionType": "Action", + "group": "Global variables", + "name": "ModifyGlobalVariable", + "sentence": "Change the global variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\nvariable.setNumber(eventsFunctionContext.getArgument(\"GlobalVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the global variable", + "name": "GlobalVariableName", + "type": "string" + }, + { + "description": "Value", + "name": "GlobalVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a scene variable.", + "fullName": "Value of a scene variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Modify_scene_variable", + "private": true, + "sentence": "Change the scene variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" + "type": { + "value": "ExtendedVariables::ModifySceneVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "GetArgumentAsNumber(\"SceneVariableValue\")", + "" + ] } - ], - "objectGroups": [] + ] + } + ], + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" }, { - "description": "Change the value of the resource bar.", - "fullName": "Value", - "functionType": "Action", - "group": "Resource Bar", - "name": "SetValue", - "sentence": "Change the value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyValueMin()" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMin()" - ] - } - ] - }, + "description": "Value", + "name": "SceneVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Modify the value of a scene variable.", + "fullName": "Value of a scene variable", + "functionType": "Action", + "group": "Scene variables", + "name": "ModifySceneVariable", + "sentence": "Change the scene variable _PARAM1_ with value: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const variable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\nvariable.setNumber(eventsFunctionContext.getArgument(\"SceneVariableValue\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" + }, + { + "description": "Value", + "name": "SceneVariableValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Delete scene variable, the variable will be deleted from the memory.", + "fullName": "Delete scene variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_Delete_scene_variable", + "private": true, + "sentence": "Delete the scene variable _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::PropertyValueMax()" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMax()" - ] - } + "type": { + "value": "ExtendedVariables::DeleteSceneVariable" + }, + "parameters": [ + "", + "GetArgumentAsString(\"SceneVariableName\")", + "" ] - }, + } + ] + } + ], + "parameters": [ + { + "description": "Name of the scene variable to delete", + "name": "SceneVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete the scene variable, the variable will be deleted from the memory.", + "fullName": "Delete scene variable", + "functionType": "Action", + "group": "Scene variables", + "name": "DeleteSceneVariable", + "sentence": "Delete the scene variable _PARAM1_ from memory", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "runtimeScene.getVariables().remove(eventsFunctionContext.getArgument(\"SceneVariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name of the scene variable to delete", + "name": "SceneVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Copy an object variable from one object to another.", + "fullName": "Copy an object variable", + "functionType": "Action", + "group": "Deprecated", + "name": "A_CopyObjectVariable", + "private": true, + "sentence": "Copy the variable _PARAM1_ of _PARAM2_ to the variable _PARAM3_ of _PARAM4_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "ExtendedVariables::CopyObjectVariable" }, - "comment": "Set the proper offset", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyBarLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } + "parameters": [ + "", + "SourceObject", + "GetArgumentAsString(\"SourceVariableName\")", + "TargetObject", + "GetArgumentAsString(\"TargetVariableName\")", + "no", + "" ] } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - }, + ] + } + ], + "parameters": [ + { + "description": "Source object", + "name": "SourceObject", + "type": "objectList" + }, + { + "description": "Variable to copy", + "name": "SourceVariableName", + "type": "string" + }, + { + "description": "Destination object", + "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", + "name": "TargetObject", + "type": "objectList" + }, + { + "description": "Destination variable", + "name": "TargetVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Copy the object variable from one object to another.", + "fullName": "Copy an object variable", + "functionType": "Action", + "group": "Object variables", + "name": "CopyObjectVariable", + "sentence": "Copy the variable _PARAM2_ of _PARAM1_ to the variable _PARAM4_ of _PARAM3_ (clear destination first: _PARAM5_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sourceObject = eventsFunctionContext.getObjects(\"SourceObject\")[0];\nconst targetObject = eventsFunctionContext.getObjects(\"TargetObject\")[0];\nconst sourceVariableName = eventsFunctionContext.getArgument(\"SourceVariableName\");\nconst targetVariableName = eventsFunctionContext.getArgument(\"TargetVariableName\");\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\nconst sourceVariables = sourceObject.getVariables();\nconst targetVariables = targetObject.getVariables();\n\nif (sourceVariables.has(sourceVariableName))\n{\n gdjs.Variable.copy\n (\n sourceVariables.get(sourceVariableName),\n targetVariables.get(targetVariableName),\n isExactCopy\n );\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Source object", + "name": "SourceObject", + "type": "objectList" + }, + { + "description": "Variable to copy", + "name": "SourceVariableName", + "type": "string" + }, + { + "description": "Destination object", + "longDescription": "To copy the variable between 2 instances of the same object, the variable has to be copied to another object first.", + "name": "TargetObject", + "type": "objectList" + }, + { + "description": "Destination variable", + "name": "TargetVariableName", + "type": "string" + }, + { + "defaultValue": "yes", + "description": "Clear destination first", + "name": "isExactCopy", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Copy all object variables from one object to another.", + "fullName": "Copy all object variables", + "functionType": "Action", + "group": "Deprecated", + "name": "A_CopyAllObjectVariables", + "private": true, + "sentence": "Copy all variables from _PARAM1_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "description": "Resource bar value", - "name": "Value", - "type": "expression" + "type": { + "value": "ExtendedVariables::CopyAllObjectVariables" + }, + "parameters": [ + "", + "SourceObject", + "TargetObject", + "no", + "" + ] } - ], - "objectGroups": [] + ] + } + ], + "parameters": [ + { + "description": "Source object", + "name": "SourceObject", + "type": "objectList" + }, + { + "description": "Destination object", + "name": "TargetObject", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Copy all object variables from one object to another.", + "fullName": "Copy all object variables", + "functionType": "Action", + "group": "Object variables", + "name": "CopyAllObjectVariables", + "sentence": "Copy all variables from object _PARAM1_ to object _PARAM2_ (clear destination first: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "// This JS event use private scope from the API, this can be borken at anytime.\n\nconst sourceObject = eventsFunctionContext.getObjects(\"SourceObject\")[0];\nconst targetObject = eventsFunctionContext.getObjects(\"TargetObject\")[0];\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\nconst targetVariables = targetObject.getVariables();\nconst sourceVariables = sourceObject.getVariables()._variables.items;\nfor (const variableName in sourceVariables)\n{\n if (sourceVariables.hasOwnProperty(variableName))\n {\n gdjs.Variable.copy(sourceVariables[variableName], targetVariables.get(variableName), isExactCopy);\n }\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Source object", + "name": "SourceObject", + "type": "objectList" + }, + { + "description": "Destination object", + "name": "TargetObject", + "type": "objectList" + }, + { + "defaultValue": "yes", + "description": "Clear destination first", + "name": "isExactCopy", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Delete an object variable, removing it from memory.", + "fullName": "Delete object variable", + "functionType": "Action", + "group": "Object variables", + "name": "DeleteObjectVariable", + "sentence": "Delete for the object _PARAM1_ the object variable _PARAM2_ from the memory", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const object = eventsFunctionContext.getObjects(\"Object\")[0];\r\nconst objectVariables = object.getVariables();\r\n\r\nobjectVariables.remove(eventsFunctionContext.getArgument(\"VariableName\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "objectList" }, { - "description": "The minimum value of the resource bar.", - "fullName": "Minimum value", - "functionType": "Expression", - "group": "Value configuration", - "name": "ValueMin", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValueMin()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] + "description": "Name of object variable", + "name": "VariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the text of a global variable.", + "fullName": "Text of a global variable", + "functionType": "StringExpression", + "group": "Global variables", + "name": "GlobalVariableString", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\nconst variableExist = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = globalVariables.get(eventsFunctionContext.getArgument(\"GlobalVariableName\")).getAsString();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Name of the global variable", + "name": "GlobalVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the text of a scene variable.", + "fullName": "Text of a scene variable", + "functionType": "StringExpression", + "group": "Scene variables", + "name": "VariableString", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\nconst variableExist = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = sceneVariables.get(eventsFunctionContext.getArgument(\"SceneVariableName\")).getAsString();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the value of a global variable.", + "fullName": "Value of a global variable", + "functionType": "Expression", + "group": "Global variables", + "name": "GlobalVariable", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariables = runtimeScene.getGame().getVariables();\r\nconst variableExist = globalVariables.has(eventsFunctionContext.getArgument(\"GlobalVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = globalVariables.get(eventsFunctionContext.getArgument(\"GlobalVariableName\")).getAsNumber();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Name of the global variable", + "name": "GlobalVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the value of a scene variable.", + "fullName": "Value of a scene variable", + "functionType": "Expression", + "group": "Scene variables", + "name": "Variable", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariables = runtimeScene.getVariables();\r\nconst variableExist = sceneVariables.has(eventsFunctionContext.getArgument(\"SceneVariableName\"));\r\n\r\nif (variableExist) {\r\n eventsFunctionContext.returnValue = sceneVariables.get(eventsFunctionContext.getArgument(\"SceneVariableName\")).getAsNumber();\r\n}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Name of the scene variable", + "name": "SceneVariableName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Copy the global variable to scene. This copy everything from the types to the values.", + "fullName": "Copy a global variable to scene", + "functionType": "Action", + "group": "Convert", + "name": "CopyGlobalVariableToScene", + "sentence": "Copy the global variable:_PARAM1_ to a scene variable:_PARAM2_ (clear destination first: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const globalVariable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"globalVariableName\"));\nconst sceneVariable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"sceneVariableName\"));\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\ngdjs.Variable.copy(globalVariable, sceneVariable, isExactCopy);\n", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Global variable to copy", + "name": "globalVariableName", + "type": "string" }, { - "description": "Change the minimum value of the resource bar.", - "fullName": "Minimum value", - "functionType": "Action", - "group": "Value configuration", - "name": "SetValueMin", - "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMin" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMin\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Minimum value", - "name": "ValueMin", - "type": "expression" - } - ], - "objectGroups": [] + "description": "Scene variable destination", + "name": "sceneVariableName", + "type": "string" }, { - "description": "The maximum value of the resource bar.", - "fullName": "Maximum value", - "functionType": "Expression", - "group": "Value configuration", - "name": "ValueMax", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyValueMax()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] + "defaultValue": "yes", + "description": "Clear destination first", + "name": "isExactCopy", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Copy the scene variable to global. This copy everything from the types to the values.", + "fullName": "Copy a scene variable to global ", + "functionType": "Action", + "group": "Copy variables", + "name": "CopySceneVariableToGlobal", + "sentence": "Copy the scene variable:_PARAM1_ to a global variable:_PARAM2_ (clear destination first: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const sceneVariable = runtimeScene.getVariables().get(eventsFunctionContext.getArgument(\"sceneVariableName\"));\nconst globalVariable = runtimeScene.getGame().getVariables().get(eventsFunctionContext.getArgument(\"globalVariableName\"));\nconst isExactCopy = eventsFunctionContext.getArgument(\"isExactCopy\");\n\ngdjs.Variable.copy(sceneVariable, globalVariable, isExactCopy);", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Scene variable to copy", + "name": "sceneVariableName", + "type": "string" }, { - "description": "Thickness of the resource bar.", - "fullName": "Bar thickness", - "functionType": "Expression", - "group": "Bar configuration", - "name": "BarThickness", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyBarThickness()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] + "description": "Global variable destination", + "name": "globalVariableName", + "type": "string" }, { - "description": "Length of the resource bar.", - "fullName": "Bar length", - "functionType": "Expression", - "group": "Bar configuration", - "name": "BarLength", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyBarLength()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] + "defaultValue": "yes", + "description": "Clear destination first", + "name": "isExactCopy", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] + }, + { + "author": "D8H", + "category": "", + "extensionNamespace": "", + "fullName": "Stick objects to others", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXN0aWNrZXItb3V0bGluZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik01LjUgMkMzLjYgMiAyIDMuNiAyIDUuNVYxOC41QzIgMjAuNCAzLjYgMjIgNS41IDIySDE2TDIyIDE2VjUuNUMyMiAzLjYgMjAuNCAyIDE4LjUgMkg1LjVNNS44IDRIMTguM0MxOS4zIDQgMjAuMSA0LjggMjAuMSA1LjhWMTVIMTguNkMxNi43IDE1IDE1LjEgMTYuNiAxNS4xIDE4LjVWMjBINS44QzQuOCAyMCA0IDE5LjIgNCAxOC4yVjUuOEM0IDQuOCA0LjggNCA1LjggNCIgLz48L3N2Zz4=", + "name": "Sticker", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/sticker-outline.svg", + "shortDescription": "Behavior to stick objects to other objects - so that they follow the position and rotation of the object they are stuck to.", + "version": "0.3.4", + "description": "This extension can be useful for:\n* Stick an accessory to a moving object,\n* Animate a skeleton.", + "origin": { + "identifier": "Sticker", + "name": "gdevelop-extension-store" + }, + "tags": [ + "sticker", + "stick", + "follow", + "skeleton", + "joint" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "eventsFunctions": [ + { + "description": "Check if the object is stuck to another object.", + "fullName": "Is stuck to another object", + "functionType": "Condition", + "name": "IsStuck", + "sentence": "_PARAM1_ is stuck to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const stickerBehaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\n/** @type {Hashtable} */\nconst stickerObjectsLists = eventsFunctionContext.getObjectsLists(\"Object\");\n/** @type {Hashtable} */\nconst basisObjectsLists = eventsFunctionContext.getObjectsLists(\"BasisObject\");\n\neventsFunctionContext.returnValue = gdjs.evtTools.object.twoListsTest(\n (stickerObject, basisObject, stickerBehaviorName) => {\n const behavior = stickerObject.getBehavior(stickerBehaviorName);\n return behavior.basisObject === basisObject;\n },\n stickerObjectsLists,\n basisObjectsLists,\n false,\n stickerBehaviorName\n);", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Sticker", + "name": "Object", + "type": "objectList" + }, + { + "description": "Sticker behavior", + "name": "Behavior", + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" }, { - "description": "Change the maximum value of a resource bar.", - "fullName": "Maximum value", + "description": "Basis", + "name": "BasisObject", + "type": "objectList" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Stick the object to another. Use the action to stick the object, or unstick it later.", + "fullName": "Sticker", + "name": "Sticker", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", "functionType": "Action", - "group": "Bar value configuration", - "name": "SetValueMax", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "name": "onCreated", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMax" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMax\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" - ] - } - ] + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\n// Set up the scene sticker objects list - if not done already.\nif (!runtimeScene.__allStickers)\n runtimeScene.__allStickers = new Set();\n\n// Set up the behavior extra methods - if not done already.\nconst prototype = Object.getPrototypeOf(behavior);\nif (!prototype.updateRelativeCoordinates) {\n // Unstick from deleted objects.\n gdjs.registerObjectDeletedFromSceneCallback(function (runtimeScene, deletedObject) {\n if (!runtimeScene.__allStickers) return;\n\n for (const sticker of runtimeScene.__allStickers) {\n if (sticker.basisObject === deletedObject) {\n sticker.basisObject = null;\n }\n }\n });\n\n /**\n * Update the coordinates in the basisObject basis.\n * \n * It uses the basisObject coordinates from the previous frame.\n * This way, the sticker can move relatively to it and still\n * follow basisObject.\n * \n * @param {gdjs.RuntimeObject} basisObject\n */\n prototype.updateRelativeCoordinates = function (basisObject) {\n const object = this.owner;\n\n // Update relative coordinates\n this.relativeX = object.getX() - this.basisOldX;\n this.relativeY = object.getY() - this.basisOldY;\n if (!this._getOnlyFollowPosition()) {\n this.relativeAngle = object.getAngle() - this.basisOldAngle;\n this.relativeWidth = object.getWidth() / this.basisOldWidth;\n this.relativeHeight = object.getHeight() / this.basisOldHeight;\n const deltaX = object.getCenterXInScene() - this.basisOldCenterXInScene;\n const deltaY = object.getCenterYInScene() - this.basisOldCenterYInScene;\n const angle = this.basisOldAngle * Math.PI / 180;\n this.relativeRotatedX = (deltaX * Math.cos(angle) + deltaY * Math.sin(angle)) / this.basisOldWidth;\n this.relativeRotatedY = (-deltaX * Math.sin(angle) + deltaY * Math.cos(angle)) / this.basisOldHeight;\n\n // Save initial values to avoid calculus and rounding errors\n this.basisOriginalWidth = basisObject.getWidth();\n this.basisOriginalHeight = basisObject.getHeight();\n this.basisOriginalAngle = basisObject.getAngle();\n }\n }\n\n /**\n * Copy the coordinates to use it the next frame.\n * @param basisObject {gdjs.RuntimeObject}\n */\n prototype.updateOldCoordinates = function (basisObject) {\n const object = this.owner;\n\n this.ownerOldX = object.getX();\n this.ownerOldY = object.getY();\n\n this.basisOldX = basisObject.getX();\n this.basisOldY = basisObject.getY();\n\n if (!this._getOnlyFollowPosition()) {\n this.ownerOldAngle = object.getAngle();\n this.ownerOldWidth = object.getWidth();\n this.ownerOldHeight = object.getHeight();\n\n this.basisOldAngle = basisObject.getAngle();\n this.basisOldWidth = basisObject.getWidth();\n this.basisOldHeight = basisObject.getHeight();\n this.basisOldCenterXInScene = basisObject.getCenterXInScene();\n this.basisOldCenterYInScene = basisObject.getCenterYInScene();\n }\n }\n /**\n * Follow the basisObject (called in doStepPostEvents).\n * \n * This method is also called by children to ensure\n * parents are updated first.\n */\n prototype.followBasisObject = function () {\n if (this.followingDoneThisFrame) {\n return;\n }\n this.followingDoneThisFrame = true;\n /** @type {gdjs.RuntimeObject} */\n const basisObject = this.basisObject;\n if (basisObject) {\n // If the behavior on the basis object has a different name,\n // the objects will still follow their basis objects\n // but frame delays could happen.\n if (basisObject.hasBehavior(behaviorName)) {\n const basisBehavior = basisObject.getBehavior(behaviorName);\n if (basisBehavior.type === this.type) {\n // Follow parents 1st to avoid frame delays\n basisBehavior.followBasisObject();\n }\n }\n\n const object = this.owner;\n\n if (this._getOnlyFollowPosition()) {\n if (object.getX() !== this.ownerOldX\n || object.getY() !== this.ownerOldY) {\n this.updateRelativeCoordinates(basisObject);\n }\n\n if (this.basisOldX !== basisObject.getX() ||\n this.basisOldY !== basisObject.getY()) {\n object.setPosition(\n basisObject.getX() + this.relativeX,\n basisObject.getY() + this.relativeY);\n }\n } else {\n if (object.getX() !== this.ownerOldX\n || object.getY() !== this.ownerOldY\n || object.getAngle() !== this.ownerOldAngle\n || object.getWidth() !== this.ownerOldWidth\n || object.getHeight() !== this.ownerOldHeight) {\n this.updateRelativeCoordinates(basisObject);\n }\n\n // Follow basisObject\n if (basisObject.getAngle() === this.basisOriginalAngle && this.basisOriginalAngle === 0) {\n if (basisObject.getWidth() === this.basisOriginalWidth ||\n basisObject.getHeight() === this.basisOriginalHeight) {\n if (this.basisOldX !== basisObject.getX() ||\n this.basisOldY !== basisObject.getY()) {\n object.setPosition(\n basisObject.getX() + this.relativeX,\n basisObject.getY() + this.relativeY);\n }\n } else {\n object.setPosition(\n basisObject.getX() + this.relativeRotatedX * basisObject.getWidth(),\n basisObject.getY() + this.relativeRotatedY * basisObject.getHeight());\n }\n } else {\n object.setAngle(basisObject.getAngle() + this.relativeAngle);\n\n const deltaX = this.relativeRotatedX * basisObject.getWidth();\n const deltaY = this.relativeRotatedY * basisObject.getHeight();\n const angle = -basisObject.getAngle() * Math.PI / 180;\n object.setX(basisObject.getCenterXInScene() + object.getX() - object.getCenterXInScene() + deltaX * Math.cos(angle) + deltaY * Math.sin(angle));\n object.setY(basisObject.getCenterYInScene() + object.getY() - object.getCenterYInScene() - deltaX * Math.sin(angle) + deltaY * Math.cos(angle));\n }\n // Unproportional dimensions changes won't work as expected\n // if the object angle is not null but nothing more can be done\n // because there is no full affine transformation on objects.\n if (basisObject.getWidth() !== this.basisOriginalWidth) {\n object.setWidth(this.relativeWidth * basisObject.getWidth());\n }\n if (basisObject.getHeight() !== this.basisOriginalHeight) {\n object.setHeight(this.relativeHeight * basisObject.getHeight());\n }\n }\n\n this.updateOldCoordinates(basisObject);\n }\n }\n}\n\n// Register this object as a sticker.\nruntimeScene.__allStickers.add(behavior);\n", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "Sticker::Sticker", "type": "behavior" - }, - { - "description": "Maximum value", - "name": "ValueMax", - "type": "expression" } ], "objectGroups": [] }, { - "description": "The tick spacing of a bar.", - "fullName": "Tick spacing", - "functionType": "Expression", - "group": "Value configuration", - "name": "TickSpacing", - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyTickSpacing()" - ] - } - ] + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.followingDoneThisFrame = false;", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "Sticker::Sticker", "type": "behavior" - }, - { - "description": "Tick spacing", - "name": "TickSpacing", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the tick spacing of a resource bar.", - "fullName": "Tick spacing", + "fullName": "", "functionType": "Action", - "group": "Value configuration", - "name": "SetTickSpacing", - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "name": "doStepPostEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"TickSpacing\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" - ] - } - ] + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.followBasisObject();", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "Sticker::Sticker", "type": "behavior" - }, - { - "description": "Tick spacing", - "name": "TickSpacing", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change length of a resource bar.", - "fullName": "Bar length", + "description": "Stick on another object.", + "fullName": "Stick", "functionType": "Action", - "group": "Bar configuration", - "name": "SetBarLength", - "sentence": "Change bar length of _PARAM0_ to _PARAM2_ px", + "name": "Stick", + "sentence": "Stick _PARAM0_ to _PARAM2_", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackLength" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move thumb to correct place (based on new track size)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyValue()", - "" - ] - } - ] + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const object = objects[0];\nconst behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst basisObjects = eventsFunctionContext.getObjects(\"BasisObject\");\n\nif (basisObjects.length === 0) return;\nconst basisObject = basisObjects[0];\n\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.basisObject = basisObject;\nbehavior.updateOldCoordinates(basisObject);\nbehavior.updateRelativeCoordinates(basisObject);\n", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "Sticker::Sticker", "type": "behavior" }, { - "description": "Track width", - "name": "Value", - "type": "expression" + "description": "Object to stick to", + "name": "BasisObject", + "type": "objectList" } ], "objectGroups": [] }, { - "description": "Change thickness of a resource bar", - "fullName": "Bar thickness", + "description": "Unstick from the object it was stuck to.", + "fullName": "Unstick", "functionType": "Action", - "group": "Bar configuration", - "name": "SetBarThickness", - "sentence": "Change the bar thickness of _PARAM0_ to _PARAM2_ px", + "name": "Unstick", + "sentence": "Unstick _PARAM0_", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure thumb width is not smaller than track height + 2 pixels (to prevent track ends from showing)", - "comment2": "" - }, + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const object = objects[0];\nconst behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst behavior = object.getBehavior(behaviorName);\n\nbehavior.basisObject = null;", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyBarThickness() + 2" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyBarThickness() + 2", - "" - ] - } - ] + "description": "Object", + "name": "Object", + "type": "object" }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbHeight" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyBarThickness() + 2" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetThumbHeight" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyBarThickness() + 2", - "" - ] - } - ] + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Sticker::Sticker", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDestroy", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\nconst object = objects[0];\nconst behavior = object.getBehavior(behaviorName);\n\nif (runtimeScene.__allStickers)\n runtimeScene.__allStickers.delete(behavior);\n", + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "Sticker::Sticker", "type": "behavior" - }, - { - "description": "Track thickness", - "name": "Value", - "type": "expression" } ], "objectGroups": [] - }, + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Boolean", + "label": "Only follow the position", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "OnlyFollowPosition" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "", + "extensionNamespace": "", + "fullName": "Shake Object (position, angle, scale)", + "helpPath": "https://victrisgames.itch.io/gdevelop-camera-shake-example", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWFycm93LWFsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMywxMUgxOEwxNi41LDkuNUwxNy45Miw4LjA4TDIxLjg0LDEyTDE3LjkyLDE1LjkyTDE2LjUsMTQuNUwxOCwxM0gxM1YxOEwxNC41LDE2LjVMMTUuOTIsMTcuOTJMMTIsMjEuODRMOC4wOCwxNy45Mkw5LjUsMTYuNUwxMSwxOFYxM0g2TDcuNSwxNC41TDYuMDgsMTUuOTJMMi4xNiwxMkw2LjA4LDguMDhMNy41LDkuNUw2LDExSDExVjZMOS41LDcuNUw4LjA4LDYuMDhMMTIsMi4xNkwxNS45Miw2LjA4TDE0LjUsNy41TDEzLDZWMTFaIiAvPjwvc3ZnPg==", + "name": "ShakeObject", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/arrow-all.svg", + "shortDescription": "Shake an object, using one or more ways to shake (position, angle, scale).", + "version": "1.5.5", + "description": "Select one or more methods of shaking:\n- Position: Shake the X and/or Y position of the object \n- Angle: Shake the angle (rotation) of the object \n- Scale: Shake the scale of the object (must be a sprite)\n\nControl how the object shakes:\n- Amplitude: How far the object moves during each shake\n- Duration: Amount of time to shake the object\n- Time between shakes: Amount of time between each movement of the object\n- Keep shaking until stopped (boolean)\n\nTips:\n- For a single-shake effect, set the \"Time between shakes\" to be equal to \"Duration\" (great for a hit or impact)\n- To make the single-shake move in the opposite direction, use negative numbers \n- To repeat a single-shake effect in a loop, add a condition \"Object is not shaking\" \n- Use a long \"Time between shakes\" to simulate a slow moving object (like a ship rocking back and forth)\n- Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. \n- Use \"Shake until stopped\" to simulate engine vibration, earthquake, or pulsing", + "origin": { + "identifier": "ShakeObject", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shaking", + "object", + "effect", + "shake", + "scale", + "position", + "rotate", + "angle" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).\nThis behavior can be used on any type of object.", + "fullName": "Shake object (position, angle)", + "name": "ShakeObject_PositionAngle", + "objectType": "", + "eventsFunctions": [ { - "description": "Make bar use rounded ends.", - "fullName": "Rounded bar ends", + "description": "Shake an object, using one or more ways to shake (position, angle).", + "fullName": "Shake object (position, angle)", "functionType": "Action", - "group": "Bar configuration", - "name": "SetRoundedBar", - "sentence": "Draw _PARAM0_ with a rounded bar: _PARAM2_", + "name": "ShakeObject_PositionAngle", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_. Wait _PARAM6_ seconds between shakes. Keep shaking until stopped: _PARAM7_", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "Egal" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "0" + "comment": "Start/Reset duration timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } ] - } - ], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "no" + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { - "type": { - "value": "Egal" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "1" + "comment": "Determine if the shake should keep going until stopped", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } ] - } - ], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "comment": "Add default values if none were provided", + "comment2": "" + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Rounded bar", - "name": "Value", - "type": "yesorno" - } - ], - "objectGroups": [] - }, - { - "description": "Change opacity of inactive bar.", - "fullName": "Inactive bar opacity", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetInactiveBarOpacity", - "sentence": "Change inactive bar opacity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackOpacity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } ] }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "yes" + "comment": "If duration is less than a single shake, increase duration to make 1 full shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Inactive bar opacity", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change opacity of active bar.", - "fullName": "Active bar opacity", - "functionType": "Action", - "group": "Bar configuration", - "name": "SetActiveBarOpacity", - "sentence": "Change active bar opacity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackOpacity" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "comment": "Detect initial shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } ] }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "yes" + "comment": "Initiate the onScenePostEvents function", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } ] } - ] + ], + "parameters": [] } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" }, { - "description": "Active bar opacity", - "name": "Value", + "description": "Duration of shake (in seconds) (Default: 0.5) ", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" } ], "objectGroups": [] }, { - "description": "Change the color of the left side of the bar.", - "fullName": "Active bar color ", + "fullName": "", "functionType": "Action", - "group": "Bar configuration", - "name": "SetActiveBarColor", - "sentence": "Change active bar color of _PARAM0_ to _PARAM2_", + "name": "doStepPostEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Color\")" - ] + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 *(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] } - ] + ], + "parameters": [] } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" - }, - { - "description": "Active bar color", - "name": "Color", - "type": "color" } ], "objectGroups": [] }, { - "description": "Change the color of the right side of the resource bar.", - "fullName": "Inactive bar color", + "description": "Stop any shaking of object that was initiated by the Shake Object extension.", + "fullName": "Stop shaking the object", "functionType": "Action", - "group": "Bar configuration", - "name": "SetInactiveBarColor", - "sentence": "Change inactive bar color of _PARAM0_ to _PARAM2_", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Color\")" - ] - }, + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "ShakeObject::ShakeObject_PositionAngle::IsShaking" }, "parameters": [ "Object", "Behavior", - "yes" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Inactive bar color", - "name": "Color", - "type": "color" - } - ], - "objectGroups": [] - }, - { - "description": "Update the hitbox.", - "fullName": "Update hitbox", - "functionType": "Action", - "group": "Private", - "name": "UpdateHitbox", - "private": true, - "sentence": "Update the hitbox of _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::SetRotationCenter" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyBarLength() / 2", - "Object.Behavior::PropertyBarThickness() / 2" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::SetRectangularCollisionMask" - }, - "parameters": [ - "Object", - "0", - "-Object.Behavior::PropertyBarThickness() / 2", - "Object.Behavior::PropertyBarLength()", - "Object.Behavior::PropertyBarThickness() / 2" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Draw health bar.", - "fullName": "Draw health bar", - "functionType": "Action", - "name": "DrawHealthBar", - "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "ObjectWithHealth.HealthBehavior::MaxHealth()", "" ] } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Object with health", - "name": "ObjectWithHealth", - "type": "objectList" - }, - { - "description": "Health behavior", - "name": "HealthBehavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Draw shield bar.", - "fullName": "Draw shield bar", - "functionType": "Action", - "name": "DrawShieldBar", - "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + "value": "ModVarObjet" }, "parameters": [ "Object", - "DraggableSliderBehavior", - "ObjectWithShield.ShieldBehavior::MaxShield()", - "" + "__ShakeObject_ShakeInProgress", + "=", + "-1" ] } ] } ], "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", - "type": "behavior" - }, - { - "description": "Object with shield", - "name": "ObjectWithShield", - "type": "objectList" + { + "description": "Object", + "name": "Object", + "type": "object" }, { - "description": "Shield behavior", - "name": "ShieldBehavior", - "supplementaryInformation": "Health::Shield", + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Draw resource bar.", - "fullName": "Draw resource bar", - "functionType": "Action", - "name": "DrawResourceBar", - "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + "value": "VarObjet" }, "parameters": [ "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.Behavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", - "" + "__ShakeObject_ShakeInProgress", + "=", + "1" ] - }, + } + ], + "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "DraggableSliderBehavior", - "GetArgumentAsNumber(\"MaxValue\")", - "" + "True" ] } ] @@ -26215,366 +19909,447 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBar::DrawResourceBar", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", "type": "behavior" - }, - { - "description": "Current value", - "name": "CurrentValue", - "type": "expression" - }, - { - "description": "Max value", - "name": "MaxValue", - "supplementaryInformation": "Health::Health", - "type": "expression" } ], "objectGroups": [] } ], - "propertyDescriptors": [ - { - "value": "0", - "type": "Number", - "label": "Minimum value", - "description": "", - "group": "Value", - "extraInformation": [], - "hidden": false, - "name": "ValueMin" - }, - { - "value": "1", - "type": "Number", - "label": "Maximum value", - "description": "", - "group": "Value", - "extraInformation": [], - "hidden": false, - "name": "ValueMax" - }, - { - "value": "0", - "type": "Number", - "label": "Tick spacing", - "description": "", - "group": "Value", - "extraInformation": [], - "hidden": false, - "name": "TickSpacing" - }, - { - "value": "200", - "type": "Number", - "label": "Bar length", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "BarLength" - }, - { - "value": "4", - "type": "Number", - "label": "Bar thickness", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "BarThickness" - }, - { - "value": "11;255;0", - "type": "Color", - "label": "Inactive bar color", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "InactiveBarColor" - }, - { - "value": "96", - "type": "Number", - "label": "Inactive bar opacity", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "InactiveBarOpacity" - }, - { - "value": "11;255;0", - "type": "Color", - "label": "Active bar color", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "ActiveBarColor" - }, - { - "value": "255", - "type": "Number", - "label": "Active bar opacity", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "ActiveBarOpacity" - }, - { - "value": "false", - "type": "Boolean", - "label": "Rounded bar ends", - "description": "", - "group": "Bar", - "extraInformation": [], - "hidden": false, - "name": "RoundedBar" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "Value" - }, - { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ThumbOffset" - }, - { - "value": "true", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "NeedRedraw" - }, - { - "value": "0", - "type": "Number", - "label": "Time to complete moving the bar when the value is changed (seconds)", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ChangeDuration" - } - ], + "propertyDescriptors": [], "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", - "category": "Input", - "extensionNamespace": "", - "fullName": "Draggable slider", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", - "name": "DraggableSliderControl", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", - "shortDescription": "A draggable slider that users can move to select a numerical value.", - "version": "1.0.5", - "description": "Draws a draggable slider that users can move to select a numerical value.\nThe value range, tick spacing, and the appearance of the slider can be defined with properties.\n\nHow to use:\n- Add this behavior a **Shape Painter** object\n- Place an instance of that shape painter on the screen where you want the slider to appear\n- Use the \"Value\" expression to find the Value based on the position of the slider\n\nTips:\n- You can disable the slider to prevent a user from interacting with it\n- You can set the Value of the slider and the slider will move to the correct position\n\nFurther details can be found in [this tutorial video](https://youtu.be/iiTUwdAT_hs).\n\nBreaking changes (1.0.0)\n- Track thickness and length properties replaced track width and height. These 2 properties must be set again if they were different from the default size.\n- Hidden sliders can be dragged. The \"enable\" action must be used to disable them.\n", - "origin": { - "identifier": "DraggableSliderControl", - "name": "gdevelop-extension-store" - }, - "tags": [ - "draggable", - "slider", - "shape painter", - "ui", - "widget" - ], - "authorIds": [ - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ + }, { - "description": "Let users select a numerical value by dragging a slider.", - "fullName": "Draggable slider", - "name": "DraggableSliderControl", - "objectType": "PrimitiveDrawing::Drawer", + "description": "Shake an object, using one or more ways to shake (position, angle, scale)\nThis behavior can only be used on sprite objects.", + "fullName": "Shake object (position, angle, scale)", + "name": "ShakeObject_PositionAngleScale", + "objectType": "Sprite", "eventsFunctions": [ { - "fullName": "", + "description": "Shake an object, using one or more ways to shake (position, angle, scale).", + "fullName": "Shake object (position, angle, scale)", "functionType": "Action", - "name": "onCreated", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure object doesn't get re-drawn every frame", - "comment2": "" - }, + "name": "ShakeObject_PositionAngleScale", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_, and scale amplitude _PARAM6_. Wait _PARAM7_ seconds between shakes. Keep shaking until stopped: _PARAM8_", + "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "PrimitiveDrawing::ClearBetweenFrames" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "no" + "comment": "Start/Reset duration timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Use correct min value (instead of always starting at 0)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMin()" + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "=", + "GetArgumentAsNumber(\"PowerScale\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set track height function (which enforces valid thumb sizes)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyTrackThickness()" + "comment": "If duration is less than a single shake, increase duration to make 1 full shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Start halo at same size as thumb", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" + "comment": "Detect initial shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "" + "comment": "Initiate the onScenePostEvents function", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } ] } - ] + ], + "parameters": [] } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", + "supplementaryInformation": "Sprite", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", "type": "behavior" + }, + { + "description": "Duration of shake (in seconds) (Default: 0.5)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", + "type": "expression" + }, + { + "description": "Amplitude of scale shake (in percent change) (For example: 5)", + "name": "PowerScale", + "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" } ], "objectGroups": [] @@ -26582,75 +20357,1579 @@ { "fullName": "", "functionType": "Action", - "name": "doStepPreEvents", + "name": "doStepPostEvents", "sentence": "", "events": [ { "colorB": 228, "colorG": 176, "colorR": 74, - "creationTime": 0, - "name": "Slider logic", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::IsEnabled" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - } - ], - "actions": [], + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Track where the mouse is (in relation to object)", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseX" + "value": "VarObjet" }, "parameters": [ "Object", - "Behavior", + "__ShakeObject_ShakeInProgress", "=", - "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } ] }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseY" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" - ] + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Scale shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate object scale displacement, with linear decay over time", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every even shake, increase scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, decrease scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = -1 * (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] } ] - }, + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { "type": "BuiltinCommonInstructions::Comment", "color": { @@ -26661,7 +21940,7 @@ "textG": 0, "textR": 0 }, - "comment": "Move slider when being dragged", + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", "comment2": "" }, { @@ -26669,560 +21948,2491 @@ "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyMouseX()" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "value": "BuiltinCommonInstructions::Or" }, - "comment": "End sliding and update variables", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "MouseButtonReleased" - }, - "parameters": [ - "", - "Left" - ] - } - ], - "actions": [ + "parameters": [], + "subInstructions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + "value": "ObjectTimer" }, "parameters": [ "Object", - "Behavior", - "no" + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Update \"Value\" based on the location of the thumb", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + "value": "VarObjet" }, "parameters": [ "Object", - "Behavior", - "Object.Behavior::PropertyValueMin() + (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin()) * Object.Behavior::PropertyThumbOffset() / Object.Behavior::PropertyTrackLength()", - "" + "__ShakeObject_ShakeInProgress", + "=", + "-1" ] } ] }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "BuiltinCommonInstructions::Once" }, - "comment": "Grow halo even more when pressed", - "comment2": "" - }, + "parameters": [] + } + ], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "1.25 * Object.Behavior::PropertyHaloRadius()" - ] - } + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Detect hover/touch/click (but only if the layer and object is visible, and the object is not already being dragged)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { "type": { - "inverted": true, - "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + "value": "ModVarObjet" }, "parameters": [ "Object", - "Behavior" + "__ShakeObject_ShakeCounter", + "=", + "0" ] } ], - "actions": [], "events": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Detect mouse clicks near track, start dragging", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "SourisBouton" - }, - "parameters": [ - "", - "Left" - ] - }, + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "BuiltinCommonInstructions::Once" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [] - } - ], - "actions": [], - "events": [ + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "Egal" + "value": "BuiltinCommonInstructions::Or" }, - "parameters": [ - "Object.Behavior::PropertyMouseX()", - ">=", - "-Object.Behavior::PropertyHaloRadius()" + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } ] - }, + } + ], + "actions": [ { "type": { - "value": "Egal" + "value": "MettreX" }, "parameters": [ - "Object.Behavior::PropertyMouseX()", - "<=", - "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyHaloRadius()" + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" ] }, { "type": { - "value": "Egal" + "value": "MettreY" }, "parameters": [ - "Object.Behavior::PropertyMouseY()", - ">=", - "-Object.Behavior::PropertyHaloRadius()" + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "Egal" + "value": "VarObjet" }, "parameters": [ - "Object.Behavior::PropertyMouseY()", - "<=", - "Object.Behavior::PropertyHaloRadius()" + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" ] } ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + "value": "SetAngle" }, "parameters": [ "Object", - "Behavior", - "yes" + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "VarObjet" }, "parameters": [ "Object", - "Behavior", - "yes" + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" ] } - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset hover detection ", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsHovered" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Grow halo when hovered", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "SourisBouton" - }, - "parameters": [ - "", - "Left" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseX()", - ">=", - "Object.Behavior::PropertyThumbOffset() - Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseX()", - "<=", - "Object.Behavior::PropertyThumbOffset() + Object.Behavior::PropertyHaloRadius()" - ] - }, - { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseY()", - ">=", - "- Object.Behavior::PropertyHaloRadius()" ] }, { - "type": { - "value": "Egal" - }, - "parameters": [ - "Object.Behavior::PropertyMouseY()", - "<=", - "Object.Behavior::PropertyHaloRadius()" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsHovered" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] + "comment": "Reset drift detection variables", + "comment2": "" }, { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyHaloRadius()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } ] } - ] - }, + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop shaking an object.", + "fullName": "Stop shaking an object", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "VegeTato, arthuro555", + "category": "", + "extensionNamespace": "", + "fullName": "Repeat every X seconds", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXJlcGVhdCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNywxN0g3VjE0TDMsMThMNywyMlYxOUgxOVYxM0gxN003LDdIMTdWMTBMMjEsNkwxNywyVjVINVYxMUg3VjdaIiAvPjwvc3ZnPg==", + "name": "RepeatEveryXSeconds", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/repeat.svg", + "shortDescription": "This allows to trigger an event every X seconds.", + "version": "0.1.0", + "description": "Convenience conditions, actions and behaviors for timers to trigger a condition every X seconds.", + "origin": { + "identifier": "RepeatEveryXSeconds", + "name": "gdevelop-extension-store" + }, + "tags": [ + "repeat", + "timer", + "time", + "convenience" + ], + "authorIds": [ + "ZgrsWuRTAkXgeuPV9bo0zuEcA2w1", + "IRIhkkTTl2UHhfjrLTTH5GYwkYu1" + ], + "dependencies": [], + "eventsFunctions": [ + { + "description": "Triggers every X seconds.", + "fullName": "Repeat every X seconds", + "functionType": "Condition", + "name": "Repeat", + "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Timer" + }, + "parameters": [ + "player", + "GetArgumentAsNumber(\"time\")", + "GetArgumentAsString(\"timerName\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "The name of the timer to loop", + "name": "timerName", + "type": "string" + }, + { + "description": "The time in seconds between each trigger", + "name": "time", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Triggers every X seconds X amount of times.", + "fullName": "Repeat every X seconds in X number", + "functionType": "Condition", + "name": "RepeatXTimes", + "sentence": "Repeat timer _PARAM1_ every _PARAM2_ seconds _PARAM3_ times", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Timer" + }, + "parameters": [ + "player", + "GetArgumentAsNumber(\"time\")", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"limit\")", + "=", + "-1" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", + "<", + "GetArgumentAsNumber(\"limit\")" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "player", + "GetArgumentAsString(\"timerName\")" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RepeatEveryXSeconds_.Counter[GetArgumentAsString(\"timerName\")]", + "+", + "1" + ] + }, + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "The name of the timer to loop", + "name": "timerName", + "type": "string" + }, + { + "description": "The time in seconds between each trigger", + "name": "time", + "type": "expression" + }, + { + "description": "The limit of loops", + "longDescription": "The condition will trigger at most this amount of times. Make it -1 for looping forever.", + "name": "limit", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Allows to repeat an object timer every X seconds.", + "fullName": "Repeat every X seconds", + "name": "RepeatTimer", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Triggers every X seconds, where X is defined in the behavior properties.", + "fullName": "Repeat every X seconds", + "functionType": "Condition", + "name": "Repeat", + "sentence": "Recurring timer _PARAM1_ of _PARAM0_ has triggered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()", + "Object.Behavior::PropertyTimerLength()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::PropertyLimit" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + }, + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::PropertyCounter" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyLimit()" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + }, + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::SetPropertyCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + }, + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Pauses a recurring timer.", + "fullName": "Pause a recurring timer", + "functionType": "Action", + "name": "Pause", + "sentence": "Pause recurring timer _PARAM1_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PauseObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Resumes a paused recurring timer.", + "fullName": "Resume a recurring timer", + "functionType": "Action", + "name": "Resume", + "sentence": "Resume recurring timer _PARAM1_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "UnPauseObjectTimer" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTimerName()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Allows to trigger the recurring timer X times again.", + "fullName": "Reset the limit", + "functionType": "Action", + "name": "ResetLimit", + "sentence": "Allow to trigger the recurring timer _PARAM1_ of _PARAM0_ X times again", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RepeatEveryXSeconds::RepeatTimer::SetPropertyCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RepeatEveryXSeconds::RepeatTimer", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "MyTimer", + "type": "String", + "label": "The name of the timer to repeat", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TimerName" + }, + { + "value": "1", + "type": "Number", + "label": "The time between each trigger (in seconds)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TimerLength" + }, + { + "value": "-1", + "type": "Number", + "label": "How many times should the timer trigger? -1 for forever.", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Limit" + }, + { + "value": "0", + "type": "Number", + "label": "An internal counter", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Counter" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian", + "category": "General", + "extensionNamespace": "", + "fullName": "Health (life) points and shield", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWhlYXJ0LWhhbGYtZnVsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41LDVDMTUsNSAxMy41OCw1LjkxIDEzLDcuMlYxNy43NEMxNy4yNSwxMy44NyAyMCwxMS4yIDIwLDguNUMyMCw2LjUgMTguNSw1IDE2LjUsNU0xNi41LDNDMTkuNTgsMyAyMiw1LjQxIDIyLDguNUMyMiwxMi4yNyAxOC42LDE1LjM2IDEzLjQ1LDIwLjAzTDEyLDIxLjM1TDEwLjU1LDIwLjAzQzUuNCwxNS4zNiAyLDEyLjI3IDIsOC41QzIsNS40MSA0LjQyLDMgNy41LDNDOS4yNCwzIDEwLjkxLDMuODEgMTIsNS4wOEMxMy4wOSwzLjgxIDE0Ljc2LDMgMTYuNSwzWiIgLz48L3N2Zz4=", + "name": "Health", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/heart-half-full.svg", + "shortDescription": "Manage life points and a protective shield.", + "version": "0.1.0", + "description": "Manage health (life) and shield points of an object. Health can be assigned to players, enemies, NPCs, or even inanimate objects such as breaking doors and mining rocks.\n\nHow to use:\n\n- Set desired values in \"Health\" and \"Shield\" behavior properties\n- To apply damage use “Damage an object” or “Damage an object protected by a shield”\n- To heal health, use “Heal object” action \n- To activate the shield, use “Activate Shield” action\n- Health and shield regeneration will happen automatically based on properties\n \nTips:\n\n- While damage cooldown is active, no damage will be applied to health or shield\n- Try using the “Blink” extension while damage cooldown is active\n- Use the “Is just damaged” condition to trigger audio and visual effects\n\nHealth properties:\n\n- Health (life points) Used for starting health\n- Maximum health (0 for no maximum)\n- Damage cooldown (seconds) Use \"0\" for no cooldown\n- Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled\n- Delay (seconds) before health regeneration starts after being hit\n- Allow heal to increase health above max health (will not exceed max health)\n\nShield properties:\n\n- Max shield points (Shield will start with this many points when activated)\n- Duration of shield (seconds) Use \"0\" to disable shield timer\n- Rate of shield regeneration (points per second)\n- Shield will block all excess damage when shield is destroyed\n- Delay (seconds) before shield regeneration starts after being hit\n- Regenerate shield when it has zero points\n", + "origin": { + "identifier": "Health", + "name": "gdevelop-extension-store" + }, + "tags": [ + "health", + "life", + "damage", + "hit", + "heal", + "shield", + "regeneration" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Manage life points by damaging and healing the object.", + "fullName": "Health", + "name": "Health", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Health", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHealthRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "Health::Health::PropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::MaxHealth()" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "Object.Behavior::PropertyHealthRegenDelay()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyHealthRegenRate() * TimeDelta()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "Health::Health::PropertyHealth" }, - "comment": "Shrink halo to zero when not hovered", - "comment2": "" - }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsHovered" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" - ] - } + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMaxHealth()" ] } ] } ] - }, + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset damage trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply damage directly to the object. Damage will not be affected by shield. Triggers damage cooldown.", + "fullName": "Damage an object", + "functionType": "Action", + "group": "Health", + "name": "Hit", + "sentence": "Damage _PARAM0_, removing _PARAM2_ points from its health", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only consider damage if damage cooldown is NOT active", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Mark object was hit at least once (used for initial state of damage cooldown)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Restart time since last hit timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Apply damage", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "GetArgumentAsNumber(\"DamageValue\")" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Value of the damage to do (will be removed from object health)", + "name": "DamageValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change health points. This is not considered damage.", + "fullName": "Change health points", + "functionType": "Action", + "group": "Health", + "name": "SetHealth", + "sentence": "Set health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyHealth(), Object.Behavior::PropertyMaxHealth())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "New health value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Heal the object by increasing its life points.", + "fullName": "Heal object", + "functionType": "Action", + "group": "Health", + "name": "Heal", + "sentence": "Heal _PARAM0_ with _PARAM2_ health points", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change health points", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "GetArgumentAsNumber(\"HealValue\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prevent exceeding max health (unless overhealing is enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "inverted": true, + "value": "Health::Health::PropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyHealth(), Object.Behavior::PropertyMaxHealth())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Points to heal (will be added to object health)", + "name": "HealValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the object maximum health points.", + "fullName": "Change maximum health points", + "functionType": "Action", + "group": "Health", + "name": "SetMaxHealth", + "sentence": "Set maximum health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum health", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change rate of health regeneration.", + "fullName": "Change rate of health regeneration", + "functionType": "Action", + "group": "Shield", + "name": "SetHealthRegenRate", + "sentence": "Set rate of health regen of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealthRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Rate of regen", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change duration of damage cooldown.", + "fullName": "Change duration of damage cooldown", + "functionType": "Action", + "group": "Health", + "name": "SetCooldownDuration", + "sentence": "Set duration of damage cooldown on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Duration of damage cooldown (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change delay before health regeneration starts after being hit.", + "fullName": "Change delay before health regeneration starts", + "functionType": "Action", + "group": "Health", + "name": "SetHealthRegenDelay", + "sentence": "Set delay before health regeneration starts on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealthRegenDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Allow over-healing.", + "fullName": "Allow over-healing", + "functionType": "Action", + "group": "Health", + "name": "AllowOverHealing", + "sentence": "Allow over-healing on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Allow over-healing", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as hit at least once.", + "fullName": "Mark object as hit at least once", + "functionType": "Action", + "group": "Health", + "name": "SetHitAtLeastOnce", + "sentence": "Mark _PARAM0_ as hit at least once: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Hit at least once", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as just damaged.", + "fullName": "Mark object as just damaged", + "functionType": "Action", + "group": "Health", + "name": "SetJustDamaged", + "sentence": "Mark _PARAM0_ as just damaged: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Just damaged", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object has been hit at least once.", + "fullName": "Object hit at least once", + "functionType": "Condition", + "group": "Health", + "name": "HitAtLeastOnce", + "sentence": "_PARAM0_ has just been hit at least once", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object was just damaged previously in the events.", + "fullName": "Is just damaged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDamaged", + "sentence": "_PARAM0_ has just been damaged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyIsJustDamaged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if damage cooldown is active. Object (and shield) cannot be damaged while this is active.", + "fullName": "Is damage cooldown active", + "functionType": "Condition", + "group": "Health", + "name": "IsDamageCooldownActive", + "sentence": "Damage cooldown on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Health::Health::PropertyDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"", + "<", + "Object.Behavior::PropertyDamageCooldown()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is considered dead (no health points).", + "fullName": "Is dead", + "functionType": "Condition", + "group": "Health", + "name": "IsDead", + "sentence": "_PARAM0_ is dead", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHealth" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Maximum health points of the object.", + "fullName": "Maximum health points", + "functionType": "Expression", + "group": "Health", + "name": "MaxHealth", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxHealth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Duration of damage cooldown (seconds).", + "fullName": "Duration of damage cooldown", + "functionType": "Expression", + "group": "Health", + "name": "DamageCooldownDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyDamageCooldown()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Health points of the object.", + "fullName": "Health points", + "functionType": "Expression", + "group": "Health", + "name": "Health", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay before health regeneration starts after last hit (seconds).", + "fullName": "Delay before health regeneration starts", + "functionType": "Expression", + "group": "Health", + "name": "HealthRegenDelay", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "Object.Behavior::PropertyTargetHaloRadius()" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Redraw slider only when halo is not at final size", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "abs(Object.Behavior::PropertyCurrentHaloRadius() - Object.Behavior::PropertyTargetHaloRadius())", - "<", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyTargetHaloRadius()" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "Object.Behavior::PropertyTargetHaloRadius()" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "lerp(Object.Behavior::PropertyCurrentHaloRadius(), Object.Behavior::PropertyTargetHaloRadius(), Object.Behavior::PropertyHaloGrowSpeed())" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - } + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealthRegenDelay()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Rate of health regeneration (points per second).", + "fullName": "Rate of health regeneration", + "functionType": "Expression", + "group": "Health", + "name": "HealthRegenRate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealthRegenRate()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time before damage cooldown ends (seconds).", + "fullName": "Time before damage cooldown ends", + "functionType": "Expression", + "group": "Health", + "name": "DamageCooldownRemaining", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" ] } ], - "parameters": [] + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,Object.Behavior::PropertyDamageCooldown() - Object.ObjectTimerElapsedTime(\"__Health.DamageCooldown\"))" + ] + } + ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time since last hit (seconds).", + "fullName": "Time since last hit", + "functionType": "Expression", + "group": "Health", + "name": "TimeSinceLastHit", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\")" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", "type": "behavior" } ], @@ -27231,7 +24441,144 @@ { "fullName": "", "functionType": "Action", - "name": "doStepPostEvents", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "100", + "type": "Number", + "label": "Health (life points) Used for starting health", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "Health" + }, + { + "value": "0", + "type": "Number", + "label": "Damage cooldown (seconds) Use \"0\" for no cooldown", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "DamageCooldown" + }, + { + "value": "100", + "type": "Number", + "label": "Maximum health (0 for no maximum)", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "MaxHealth" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "IsJustDamaged" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of health regeneration (points per second) Will not exceed max health, even with overhealing enabled", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "HealthRegenRate" + }, + { + "value": "0", + "type": "Number", + "label": "Delay (seconds) before health regen starts after being hit", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "HealthRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "Allow heal to increase health above max health (regen will never exceed max health)", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "AllowOverHealing" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "HitAtLeastOnce" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Protective shield that prevents damage to health points.", + "fullName": "Shield", + "name": "Shield", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", "sentence": "", "events": [ { @@ -27239,364 +24586,120 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Slider drawing", + "name": "Regeneration", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shield", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyNeedRedraw" + "value": "Health::Shield::PropertyShieldRegenRate" }, "parameters": [ "Object", - "Behavior" - ] - }, - { - "type": { - "value": "Visible" - }, - "parameters": [ - "Object" + "Behavior", + "!=", + "0" ] }, { "type": { - "value": "LayerVisible" - }, - "parameters": [ - "", - "Object.Layer()" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "Health::Shield::PropertyShieldPoints" }, "parameters": [ "Object", "Behavior", - "no" + "<", + "Object.Behavior::PropertyMaxShieldPoints()" ] }, { "type": { - "value": "PrimitiveDrawing::Drawer::ClearShapes" + "value": "CompareObjectTimer" }, "parameters": [ - "Object" + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "Object.Behavior::PropertyShieldRegenDelay()" ] } ], + "actions": [], "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Inactive track", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set inactive track parameters (by default, use thumb color)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyInactiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyInactiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyInactiveTrackColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyInactiveTrackOpacity()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::OutlineOpacity" - }, - "parameters": [ - "Object", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw inactive track", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "-Object.Behavior::PropertyTrackThickness() / 2", - "Object.Behavior::PropertyTrackLength()", - "Object.Behavior::PropertyTrackThickness() / 2" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw half circle at end of track (inactive side)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyRoundedTrack" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Arc" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyTrackLength()", - "0", - "Object.Behavior::PropertyTrackThickness() / 2", - "270", - "90", - "", - "yes" - ] - } - ] - } - ], - "parameters": [] + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only regen when shield is active or when \"RegenShieldWhenZeroPoints\" is enabled", + "comment2": "" }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Active track", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "BuiltinCommonInstructions::Or" }, - "comment": "Set active track parameters (by default, use thumb color)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyActiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "\"\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyActiveTrackColor" - }, - "parameters": [ - "Object", - "Behavior", - "!=", - "\"\"" - ] - } - ], - "actions": [ + "parameters": [], + "subInstructions": [ { "type": { - "value": "PrimitiveDrawing::FillColor" + "value": "Health::Shield::IsShieldActive" }, "parameters": [ "Object", - "Object.Behavior::PropertyActiveTrackColor()" + "Behavior", + "" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { - "value": "PrimitiveDrawing::FillOpacity" + "value": "Health::Shield::PropertyRegenShieldWhenZeroPoints" }, "parameters": [ "Object", - "=", - "Object.Behavior::PropertyActiveTrackOpacity()" + "Behavior" ] } ] - }, + } + ], + "actions": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" }, - "comment": "Draw active track (2 pixels bigger than property) ", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "0", - "-(Object.Behavior::PropertyTrackThickness() / 2 + 1)", - "Object.Behavior::PropertyThumbOffset()", - "Object.Behavior::PropertyTrackThickness() / 2 + 1" - ] - } + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyShieldRegenRate() * TimeDelta()" ] - }, + } + ], + "events": [ { "type": "BuiltinCommonInstructions::Comment", "color": { @@ -27607,7 +24710,7 @@ "textG": 0, "textR": 0 }, - "comment": "Draw half circle at end of track (active side)", + "comment": "Correct any values above maximum limits", "comment2": "" }, { @@ -27615,213 +24718,378 @@ "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyRoundedTrack" + "value": "Health::Shield::PropertyShieldPoints" }, "parameters": [ "Object", - "Behavior" + "Behavior", + ">", + "Object.Behavior::PropertyMaxShieldPoints()" ] } ], "actions": [ { "type": { - "value": "PrimitiveDrawing::Arc" + "value": "Health::Shield::SetPropertyShieldPoints" }, "parameters": [ "Object", - "0", - "0", - "1 + Object.Behavior::PropertyTrackThickness() / 2", - "90", - "270", - "", - "yes" + "Behavior", + "=", + "Object.Behavior::PropertyMaxShieldPoints()" ] } ] } - ], + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove shield points if shield expired", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset damage trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply damage to the shield and object. If the shield is active, it will be damaged first and any excess damage will reduce health and trigger damage cooldown.", + "fullName": "Damage an object protected by a shield", + "functionType": "Action", + "group": "Health", + "name": "ShieldHit", + "sentence": "Damage shield and health of _PARAM0_ for _PARAM2_ points of damage", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only consider damage if damage cooldown is NOT active", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "RequireHealth", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Mark object was hit at least once (used for initial state of damage cooldown)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::HitAtLeastOnce" + }, + "parameters": [ + "Object", + "RequireHealth", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHitAtLeastOnce" + }, + "parameters": [ + "Object", + "RequireHealth", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Restart time since last hit timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If shield is NOT active, perform normal damage", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealth" + }, + "parameters": [ + "Object", + "RequireHealth", + "Object.RequireHealth::Health() - GetArgumentAsNumber(\"DamageValue\")", + "" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Halo", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Prepare halo", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillColor" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbColor()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::OutlineOpacity" - }, - "parameters": [ - "Object", - "=", - "0" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw halo (it will grow or shrink as needed)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyHaloOpacityHover()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Circle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "0", - "Object.Behavior::PropertyCurrentHaloRadius()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Use a more opaque halo while being dragged (it will grow or shrink as needed)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::FillOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyHaloOpacityClick()" - ] - }, - { - "type": { - "value": "PrimitiveDrawing::Circle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset()", - "0", - "Object.Behavior::PropertyCurrentHaloRadius()" - ] - } - ] - } + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.DamageCooldown\"" + ] + }, + { + "type": { + "value": "Health::Health::SetJustDamaged" + }, + "parameters": [ + "Object", + "RequireHealth", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If shield is active, damage shield first", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "GetArgumentAsNumber(\"DamageValue\")" + ] + }, + { + "type": { + "value": "Health::Shield::SetPropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Excess damage is based on negative shield points", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "0" ] } ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Thumb", - "source": "", - "type": "BuiltinCommonInstructions::Group", + "actions": [], "events": [ { "type": "BuiltinCommonInstructions::Comment", @@ -27833,172 +25101,542 @@ "textG": 0, "textR": 0 }, - "comment": "Prepare thumb settings", + "comment": "Apply excess damage only if shield does NOT block excess damage", "comment2": "" }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "PrimitiveDrawing::FillColor" + "inverted": true, + "value": "Health::Shield::PropertyShieldBlocksExcessDamage" }, "parameters": [ "Object", - "Object.Behavior::PropertyThumbColor()" + "Behavior" ] - }, + } + ], + "actions": [ { "type": { - "value": "PrimitiveDrawing::FillOpacity" + "value": "Health::Health::SetHealth" }, "parameters": [ "Object", - "=", - "Object.Behavior::PropertyThumbOpacity()" + "RequireHealth", + "Object.RequireHealth::Health() + Object.Behavior::PropertyShieldPoints()", + "" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw Circle thumb", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + }, { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + "value": "ResetObjectTimer" }, "parameters": [ "Object", - "Behavior", - "=", - "\"circle\"" + "\"__Health.DamageCooldown\"" ] - } - ], - "actions": [ + }, { "type": { - "value": "PrimitiveDrawing::Circle" + "value": "Health::Health::SetJustDamaged" }, "parameters": [ "Object", - "Object.Behavior::PropertyThumbOffset()", - "0", - "ceil(max(Object.Behavior::PropertyThumbWidth(),Object.Behavior::PropertyThumbHeight())/2)" + "RequireHealth", + "yes", + "" ] } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Draw Rectangle thumb", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + "value": "Health::Shield::SetPropertyShieldPoints" }, "parameters": [ "Object", "Behavior", "=", - "\"rectangle\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "PrimitiveDrawing::Rectangle" - }, - "parameters": [ - "Object", - "Object.Behavior::PropertyThumbOffset() - (Object.Behavior::PropertyThumbWidth() / 2)", - "-Object.Behavior::PropertyThumbHeight() / 2", - "Object.Behavior::PropertyThumbOffset() + (Object.Behavior::PropertyThumbWidth() / 2)", - "Object.Behavior::PropertyThumbHeight() / 2" + "0" ] } ] } - ], - "parameters": [] + ] } ] } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "description": "Value of the damage to do (will be removed from object health)", + "name": "DamageValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the object maximum shield points.", + "fullName": "Change maximum shield points", + "functionType": "Action", + "group": "Shield", + "name": "SetMaxShield", + "sentence": "Set maximum shield of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyMaxShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "description": "Maximum shield", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change shield points. This is not considered damage.", + "fullName": "Change shield points", + "functionType": "Action", + "group": "Shield", + "name": "SeShieldPoints", + "sentence": "Set shield on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change rate of shield regeneration.", + "fullName": "Change rate of shield regeneration", + "functionType": "Action", + "group": "Shield", + "name": "SetShieldRegenRate", + "sentence": "Set rate of shield regeneration of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "description": "Rate of regen", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change delay before shield regeneration starts after being hit.", + "fullName": "Change delay before shield regeneration starts", + "functionType": "Action", + "group": "Shield", + "name": "SetShieldRegenDelay", + "sentence": "Set delay before shield regeneration starts on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldRegenDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "description": "Delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change duration of shield.", + "fullName": "Change duration of shield", + "functionType": "Action", + "group": "Shield", + "name": "SetShieldDuration", + "sentence": "Set duration of shield on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "description": "Duration of shield (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Activate shield. If the shield was already active, this will reset it's points and timer.", + "fullName": "Activate shield", + "functionType": "Action", + "group": "Shield", + "name": "ActivateShield", + "sentence": "Activate (or renew) shield on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"" + ] + }, + { + "type": { + "value": "Health::Shield::SetPropertyShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change max shield points. This value is used when the shield is activated or renewed.", + "fullName": "Change max shield points ", + "functionType": "Action", + "group": "Shield", + "name": "SetMaxShieldPoints", + "sentence": "Set max shield of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyMaxShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Shield blocks excess damage when it breaks.", + "fullName": "Shield blocks excess damage when it breaks", + "functionType": "Action", + "group": "Shield", + "name": "ShieldBlockExcessDamage", + "sentence": "Shield on _PARAM0_ blocks excess damage when it breaks: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldBlocksExcessDamage" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } ], - "parameters": [] + "actions": [ + { + "type": { + "value": "Health::Shield::SetPropertyShieldBlocksExcessDamage" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] } ], "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Shield", "type": "behavior" + }, + { + "description": "Shield blocks excess damage", + "name": "Value", + "type": "yesorno" } ], "objectGroups": [] }, { - "description": "Check if the slider is being dragged.", - "fullName": "Being dragged", - "functionType": "Condition", - "group": "Slider", - "name": "IsBeingDragged", - "sentence": "_PARAM0_ is being dragged", + "description": "Regenerate shield when it has zero points.", + "fullName": "Regenerate shield when it has zero points", + "functionType": "Action", + "group": "Shield", + "name": "RegenShieldWhenZero", + "sentence": "Regenerate shield on _PARAM0_ when it has zero points: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + "value": "Health::Shield::SetPropertyRegenShieldWhenZeroPoints" }, "parameters": [ "Object", - "Behavior" + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" ] } ], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "Health::Shield::SetPropertyRegenShieldWhenZeroPoints" }, "parameters": [ - "True" + "Object", + "Behavior", + "yes" ] } ] @@ -28008,32 +25646,50 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Shield", "type": "behavior" + }, + { + "description": "Regen shield when it has zero points", + "name": "Value", + "type": "yesorno" } ], "objectGroups": [] }, { - "description": "Check if the slider interations are enabled.", - "fullName": "Interactions enabled", + "description": "Check if the shield was just damaged previously in the events.", + "fullName": "Is shield just damaged", "functionType": "Condition", - "group": "Slider", - "name": "IsEnabled", - "sentence": "Interactions of _PARAM0_ are enabled", + "group": "Shield", + "name": "IsShieldJustDamaged", + "sentence": "Shield on _PARAM0_ has just been damaged", "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyEnabled" + "value": "Health::Shield::PropertyIsShieldJustDamaged" }, "parameters": [ "Object", @@ -28057,51 +25713,68 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Shield", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Enable or disable the slider. Users cannot interact while it is disabled.", - "fullName": "Enable interactions", - "functionType": "Action", - "group": "Slider", - "name": "SetEnabled", - "sentence": "Enable interactions of _PARAM0_: _PARAM2_", + "description": "Check if the shield is active (based on shield points and duration).", + "fullName": "Is shield active", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldActive", + "sentence": "Shield on _PARAM0_ is active", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" + "value": "SetReturnBoolean" }, "parameters": [ - "\"Enable\"" + "False" ] } - ], - "actions": [ + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "To be considered \"active\", a shield must have positive points AND not exceed duration", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyEnabled" + "value": "Health::Shield::PropertyShieldPoints" }, "parameters": [ "Object", "Behavior", - "no" + ">", + "0" ] } ], + "actions": [], "events": [ { "type": "BuiltinCommonInstructions::Comment", @@ -28113,126 +25786,137 @@ "textG": 0, "textR": 0 }, - "comment": "Stop dragging (so the slider won't be dragging when it gets enabled)", + "comment": "Don't check the timer when duration is zero (or negative)", "comment2": "" }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + "value": "Health::Shield::PropertyShieldDuration" }, "parameters": [ "Object", "Behavior", - "no" + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" ] } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reset halo size (so halo won't appear when slider gets enabled)", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "Health::Shield::PropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"", + "<", + "Object.Behavior::PropertyShieldDuration()" + ] + } + ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + "True" ] } ] } ] - }, + } + ], + "parameters": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Enable\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyEnabled" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] + "description": "Object", + "name": "Object", + "type": "object" }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Maximum shield points of the object.", + "fullName": "Maximum shield points", + "functionType": "Expression", + "group": "Shield", + "name": "MaxShield", + "sentence": "", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyMaxShieldPoints()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Shield", "type": "behavior" - }, - { - "description": "Enable", - "name": "Enable", - "type": "yesorno" } ], "objectGroups": [] }, { - "description": "The value of the slider (based on position of the thumb).", - "fullName": "Slider value", + "description": "Duration of shield (seconds).", + "fullName": "Duration of shield", "functionType": "Expression", - "group": "Slider", - "name": "Value", + "group": "Shield", + "name": "ShieldDuration", "sentence": "", "events": [ { @@ -28244,7 +25928,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyValue()" + "Object.Behavior::PropertyShieldDuration()" ] } ] @@ -28257,211 +25941,173 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Shield", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Change the value of a slider (this will move the thumb to the correct position).", - "fullName": "Slider value", - "functionType": "Action", - "group": "Slider", - "name": "SetValue", - "sentence": "Change the value of _PARAM0_: _PARAM2_", + "description": "Delay before shield regeneration starts after last hit (seconds).", + "fullName": "Delay before shield regeneration starts", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldRegenDelay", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - "<=", - "0" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "Object.Behavior::PropertyShieldRegenDelay()" ] } ] - }, + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" - ] - } - ] + "description": "Object", + "name": "Object", + "type": "object" }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Rate of shield regeneration (points per second).", + "fullName": "Rate of shield regeneration", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldRegenRate", + "sentence": "", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyValueMin()" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMin()" + "Object.Behavior::PropertyShieldRegenRate()" ] } ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Shield", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time before shield ends (seconds).", + "fullName": "Time before shield ends", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldTimeRemaining", + "sentence": "", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" - }, - "parameters": [ - "Object", - "Behavior", - ">", - "Object.Behavior::PropertyValueMax()" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyValueMax()" + "0" ] } ] }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set the proper offset (it moves the slider)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" + "value": "Health::Shield::PropertyShieldDuration" }, "parameters": [ "Object", "Behavior", - "=", - "Object.Behavior::PropertyTrackLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" + ">", + "0" ] - }, + } + ], + "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "max(0,Object.Behavior::PropertyShieldDuration() - Object.ObjectTimerElapsedTime(\"__Health.ShieldDuration\"))" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Shield", "type": "behavior" - }, - { - "description": "Slider value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "The minimum value of a slider.", - "fullName": "Slider minimum value", + "description": "Shield points of the object.", + "fullName": "Shield points", "functionType": "Expression", - "group": "Slider value configuration", - "name": "ValueMin", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "group": "Shield", + "name": "ShieldPoints", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -28472,7 +26118,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyValueMin()" + "Object.Behavior::PropertyShieldPoints()" ] } ] @@ -28485,144 +26131,294 @@ { "description": "Object", "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", "type": "object" }, { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "supplementaryInformation": "Health::Shield", "type": "behavior" } ], "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Health::Health" + ], + "hidden": false, + "name": "RequireHealth" }, { - "description": "Change the minimum value of a slider.", - "fullName": "Slider minimum value", + "value": "100", + "type": "Number", + "label": "Max shield points (Shield will start with this many points when activated)", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "MaxShieldPoints" + }, + { + "value": "5", + "type": "Number", + "label": "Duration of shield (seconds) Use \"0\" to disable shield timer", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": true, + "name": "ShieldPoints" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of shield regeneration (points per second)", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldRegenRate" + }, + { + "value": "", + "type": "Boolean", + "label": "Shield will block all excess damage when shield is destroyed", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldBlocksExcessDamage" + }, + { + "value": "", + "type": "Number", + "label": "Delay (seconds) before shield regeneration starts after being hit", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "Regenerate shield when it has zero points", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "RegenShieldWhenZeroPoints" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": true, + "name": "IsShieldJustDamaged" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/), D8H", + "category": "Input", + "extensionNamespace": "", + "fullName": "Draggable slider", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", + "name": "DraggableSliderControl", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", + "shortDescription": "A draggable slider that users can move to select a numerical value.", + "version": "1.0.5", + "description": "Draws a draggable slider that users can move to select a numerical value.\nThe value range, tick spacing, and the appearance of the slider can be defined with properties.\n\nHow to use:\n- Add this behavior a **Shape Painter** object\n- Place an instance of that shape painter on the screen where you want the slider to appear\n- Use the \"Value\" expression to find the Value based on the position of the slider\n\nTips:\n- You can disable the slider to prevent a user from interacting with it\n- You can set the Value of the slider and the slider will move to the correct position\n\nFurther details can be found in [this tutorial video](https://youtu.be/iiTUwdAT_hs).\n\nBreaking changes (1.0.0)\n- Track thickness and length properties replaced track width and height. These 2 properties must be set again if they were different from the default size.\n- Hidden sliders can be dragged. The \"enable\" action must be used to disable them.\n", + "origin": { + "identifier": "DraggableSliderControl", + "name": "gdevelop-extension-store" + }, + "tags": [ + "draggable", + "slider", + "shape painter", + "ui", + "widget" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Let users select a numerical value by dragging a slider.", + "fullName": "Draggable slider", + "name": "DraggableSliderControl", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "fullName": "", "functionType": "Action", - "group": "Slider value configuration", - "name": "SetValueMin", - "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "name": "onCreated", + "sentence": "", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure object doesn't get re-drawn every frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use correct min value (instead of always starting at 0)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyValueMin()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set track height function (which enforces valid thumb sizes)", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMin" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"ValueMin\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "Object.Behavior::PropertyTrackThickness()" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start halo at same size as thumb", + "comment2": "" }, - { - "description": "Minimum value", - "name": "ValueMin", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "The maximum value of a slider.", - "fullName": "Slider maximum value", - "functionType": "Expression", - "group": "Slider value configuration", - "name": "ValueMax", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" }, "parameters": [ - "Object.Behavior::PropertyValueMax()" + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight()/2,Object.Behavior::PropertyThumbWidth()/2)" ] } ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Thickness of track.", - "fullName": "Slider track thickness", - "functionType": "Expression", - "group": "Slider track configuration", - "name": "TrackThickness", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" }, "parameters": [ - "Object.Behavior::PropertyTrackThickness()" + "Object", + "Behavior", + "" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -28640,73 +26436,638 @@ "objectGroups": [] }, { - "description": "Length of track.", - "fullName": "Slider track length", - "functionType": "Expression", - "group": "Slider track configuration", - "name": "TrackLength", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider logic", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyTrackLength()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::IsEnabled" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Track where the mouse is (in relation to object)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingX(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyMouseY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.ToDrawingY(MouseX(Object.Layer(), 0), MouseY(Object.Layer(), 0))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move slider when being dragged", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMouseX()" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "End sliding and update variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update \"Value\" based on the location of the thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValueMin() + (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin()) * Object.Behavior::PropertyThumbOffset() / Object.Behavior::PropertyTrackLength()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo even more when pressed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1.25 * Object.Behavior::PropertyHaloRadius()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect hover/touch/click (but only if the layer and object is visible, and the object is not already being dragged)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect mouse clicks near track, start dragging", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "-Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset hover detection ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Grow halo when hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisBouton" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + ">=", + "Object.Behavior::PropertyThumbOffset() - Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseX()", + "<=", + "Object.Behavior::PropertyThumbOffset() + Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + ">=", + "- Object.Behavior::PropertyHaloRadius()" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::PropertyMouseY()", + "<=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shrink halo to zero when not hovered", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsHovered" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + } ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Height of thumb.", - "fullName": "Slider thumb height", - "functionType": "Expression", - "group": "Slider thumb configuration", - "name": "ThumbHeight", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyThumbHeight()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Redraw slider only when halo is not at final size", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyCurrentHaloRadius() - Object.Behavior::PropertyTargetHaloRadius())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "Object.Behavior::PropertyTargetHaloRadius()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Behavior::PropertyCurrentHaloRadius(), Object.Behavior::PropertyTargetHaloRadius(), Object.Behavior::PropertyHaloGrowSpeed())" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } ] } - ] + ], + "parameters": [] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -28724,40 +27085,730 @@ "objectGroups": [] }, { - "description": "Change the maximum value of a slider.", - "fullName": "Slider maximum value", + "fullName": "", "functionType": "Action", - "group": "Slider value configuration", - "name": "SetValueMax", - "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "name": "doStepPostEvents", + "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMax" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"ValueMax\")" - ] - }, + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Slider drawing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "Object.Layer()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Drawer::ClearShapes" + }, + "parameters": [ + "Object" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inactive track", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set inactive track parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyInactiveTrackColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyInactiveTrackOpacity()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw inactive track", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "-Object.Behavior::PropertyTrackThickness() / 2", + "Object.Behavior::PropertyTrackLength()", + "Object.Behavior::PropertyTrackThickness() / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of track (inactive side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyTrackLength()", + "0", + "Object.Behavior::PropertyTrackThickness() / 2", + "270", + "90", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Active track", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set active track parameters (by default, use thumb color)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyActiveTrackColor()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyActiveTrackOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw active track (2 pixels bigger than property) ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "-(Object.Behavior::PropertyTrackThickness() / 2 + 1)", + "Object.Behavior::PropertyThumbOffset()", + "Object.Behavior::PropertyTrackThickness() / 2 + 1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw half circle at end of track (active side)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Arc" + }, + "parameters": [ + "Object", + "0", + "0", + "1 + Object.Behavior::PropertyTrackThickness() / 2", + "90", + "270", + "", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Halo", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyCurrentHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare halo", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineOpacity" + }, + "parameters": [ + "Object", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw halo (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityHover()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use a more opaque halo while being dragged (it will grow or shrink as needed)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyHaloOpacityClick()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "Object.Behavior::PropertyCurrentHaloRadius()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Thumb", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prepare thumb settings", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbColor()" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyThumbOpacity()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Circle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"circle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset()", + "0", + "ceil(max(Object.Behavior::PropertyThumbWidth(),Object.Behavior::PropertyThumbHeight())/2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Draw Rectangle thumb", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyThumbOffset() - (Object.Behavior::PropertyThumbWidth() / 2)", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyThumbOffset() + (Object.Behavior::PropertyThumbWidth() / 2)", + "Object.Behavior::PropertyThumbHeight() / 2" + ] + } + ] + } + ], + "parameters": [] + } ] } - ] + ], + "parameters": [] } ], "parameters": [ @@ -28769,44 +27820,46 @@ }, { "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" - }, - { - "description": "Maximum value", - "name": "ValueMax", - "type": "expression" + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" } ], "objectGroups": [] }, { - "description": "The tick spacing of a slider.", - "fullName": "Tick spacing", - "functionType": "Expression", - "group": "Slider value configuration", - "name": "TickSpacing", - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "description": "Check if the slider is being dragged.", + "fullName": "Being dragged", + "functionType": "Condition", + "group": "Slider", + "name": "IsBeingDragged", + "sentence": "_PARAM0_ is being dragged", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "SetReturnBoolean" }, "parameters": [ - "Object.Behavior::PropertyTickSpacing()" + "True" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -28819,47 +27872,38 @@ "name": "Behavior", "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" - }, - { - "description": "Tick spacing", - "name": "TickSpacing", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the tick spacing of a slider.", - "fullName": "Tick spacing", - "functionType": "Action", - "group": "Slider value configuration", - "name": "SetTickSpacing", - "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", + "description": "Check if the slider interations are enabled.", + "fullName": "Interactions enabled", + "functionType": "Condition", + "group": "Slider", + "name": "IsEnabled", + "sentence": "Interactions of _PARAM0_ are enabled", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTickSpacing" + "value": "DraggableSliderControl::DraggableSliderControl::PropertyEnabled" }, "parameters": [ "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"TickSpacing\")" + "Behavior" ] - }, + } + ], + "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "Object.Behavior::Value()", - "" + "True" ] } ] @@ -28877,48 +27921,134 @@ "name": "Behavior", "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" - }, - { - "description": "Tick spacing", - "name": "TickSpacing", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change length of track.", - "fullName": "Track length", + "description": "Enable or disable the slider. Users cannot interact while it is disabled.", + "fullName": "Enable interactions", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetTrackLength", - "sentence": "Change track length of _PARAM0_ to _PARAM2_ px", + "group": "Slider", + "name": "SetEnabled", + "sentence": "Enable interactions of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackLength" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyEnabled" }, "parameters": [ "Object", "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "no" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop dragging (so the slider won't be dragging when it gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyIsBeingDragged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } ] }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset halo size (so halo won't appear when slider gets enabled)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTargetHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyThumbHeight(), Object.Behavior::PropertyThumbWidth()) / 2" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Enable\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyEnabled" }, "parameters": [ "Object", "Behavior", - "" + "yes" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { "type": { "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" @@ -28930,38 +28060,55 @@ ] } ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" }, { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Move thumb to correct place (based on new track size)", - "comment2": "" + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" }, + { + "description": "Enable", + "name": "Enable", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "The value of the slider (based on position of the thumb).", + "fullName": "Slider value", + "functionType": "Expression", + "group": "Slider", + "name": "Value", + "sentence": "", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "Object.Behavior::PropertyValue()", - "" + "Object.Behavior::PropertyValue()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -28974,30 +28121,37 @@ "name": "Behavior", "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" - }, - { - "description": "Track width", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change thickness of track.", - "fullName": "Track thickness", + "description": "Change the value of a slider (this will move the thumb to the correct position).", + "fullName": "Slider value", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetTrackThickness", - "sentence": "Change track thickness of _PARAM0_ to _PARAM2_ px", + "group": "Slider", + "name": "SetValue", + "sentence": "Change the value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" }, "parameters": [ "Object", @@ -29005,57 +28159,63 @@ "=", "GetArgumentAsNumber(\"Value\")" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "DraggableSliderControl::DraggableSliderControl::PropertyTickSpacing" }, "parameters": [ "Object", "Behavior", - "yes" + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "round(GetArgumentAsNumber(\"Value\") / Object.Behavior::PropertyTickSpacing()) * Object.Behavior::PropertyTickSpacing()" ] } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure thumb width is not smaller than track height + 2 pixels (to prevent track ends from showing)", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" + "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" }, "parameters": [ "Object", "Behavior", "<", - "Object.Behavior::PropertyTrackThickness() + 2" + "Object.Behavior::PropertyValueMin()" ] } ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::PropertyTrackThickness() + 2", - "" + "=", + "Object.Behavior::PropertyValueMin()" ] } ] @@ -29065,60 +28225,30 @@ "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbHeight" + "value": "DraggableSliderControl::DraggableSliderControl::PropertyValue" }, "parameters": [ "Object", "Behavior", - "<", - "Object.Behavior::PropertyTrackThickness() + 2" + ">", + "Object.Behavior::PropertyValueMax()" ] } ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetThumbHeight" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValue" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::PropertyTrackThickness() + 2", - "" + "=", + "Object.Behavior::PropertyValueMax()" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" }, - { - "description": "Track thickness", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change width of thumb.", - "fullName": "Thumb width", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbWidth", - "sentence": "Change thumb width of _PARAM0_ to _PARAM2_ px", - "events": [ { "type": "BuiltinCommonInstructions::Comment", "color": { @@ -29129,7 +28259,7 @@ "textG": 0, "textR": 0 }, - "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", + "comment": "Set the proper offset (it moves the slider)", "comment2": "" }, { @@ -29138,29 +28268,13 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbWidth" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOffset" }, "parameters": [ "Object", "Behavior", "=", - "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" - }, - "parameters": [ - "Object", - "Behavior", - "" + "Object.Behavior::PropertyTrackLength() * (Object.Behavior::PropertyValue() - Object.Behavior::PropertyValueMin()) / (Object.Behavior::PropertyValueMax() - Object.Behavior::PropertyValueMin())" ] }, { @@ -29190,7 +28304,7 @@ "type": "behavior" }, { - "description": "Thumb width", + "description": "Slider value", "name": "Value", "type": "expression" } @@ -29198,65 +28312,79 @@ "objectGroups": [] }, { - "description": "Change height of thumb.", - "fullName": "Thumb height", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbHeight", - "sentence": "Change thumb height of _PARAM0_ to _PARAM2_ px", + "description": "The minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMin", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbHeight" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "=", - "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" + "Object.Behavior::PropertyValueMin()" ] } ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the minimum value of a slider.", + "fullName": "Slider minimum value", + "functionType": "Action", + "group": "Slider value configuration", + "name": "SetValueMin", + "sentence": "Change the minimum value of _PARAM0_: _PARAM2_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMin" }, "parameters": [ "Object", "Behavior", - "" + "=", + "GetArgumentAsNumber(\"ValueMin\")" ] }, { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" }, "parameters": [ "Object", "Behavior", - "yes" + "Object.Behavior::Value()", + "" ] } ] @@ -29276,20 +28404,62 @@ "type": "behavior" }, { - "description": "Thumb height", - "name": "Value", + "description": "Minimum value", + "name": "ValueMin", "type": "expression" } ], "objectGroups": [] }, { - "description": "Change radius of the halo around the thumb. This size is also used to detect interaction with the slider.", - "fullName": "Halo radius", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetHaloRadius", - "sentence": "Change halo radius of _PARAM0_ to _PARAM2_ px", + "description": "The maximum value of a slider.", + "fullName": "Slider maximum value", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "ValueMax", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyValueMax()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Thickness of track.", + "fullName": "Slider track thickness", + "functionType": "Expression", + "group": "Slider track configuration", + "name": "TrackThickness", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -29297,28 +28467,18 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloRadius" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyTrackThickness()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -29331,22 +28491,17 @@ "name": "Behavior", "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" - }, - { - "description": "Halo radius", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change opacity of halo when hovered.", - "fullName": "Halo opacity (hover)", - "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetHaloOpacityHover", - "sentence": "Change halo opacity when hovered of _PARAM0_ to _PARAM2_ px", + "description": "Length of track.", + "fullName": "Slider track length", + "functionType": "Expression", + "group": "Slider track configuration", + "name": "TrackLength", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -29354,28 +28509,18 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloOpacityHover" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyTrackLength()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -29388,22 +28533,17 @@ "name": "Behavior", "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" - }, - { - "description": "Halo opacity (hover)", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change opacity of halo when pressed.", - "fullName": "Halo opacity (pressed)", - "functionType": "Action", + "description": "Height of thumb.", + "fullName": "Slider thumb height", + "functionType": "Expression", "group": "Slider thumb configuration", - "name": "SetHaloOpacityPressed", - "sentence": "Change halo opacity when pressed of _PARAM0_ to _PARAM2_ px", + "name": "ThumbHeight", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -29411,28 +28551,18 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloOpacityClick" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyThumbHeight()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -29445,22 +28575,17 @@ "name": "Behavior", "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" - }, - { - "description": "Halo opacity (pressed)", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Change shape of thumb (circle or rectangle).", - "fullName": "Thumb shape", + "description": "Change the maximum value of a slider.", + "fullName": "Slider maximum value", "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbShape", - "sentence": "Change shape of _PARAM0_ to _PARAM2_", + "group": "Slider value configuration", + "name": "SetValueMax", + "sentence": "Change the maximum value of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -29468,75 +28593,23 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbShape" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsString(\"Shape\")" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Make sure thumb width is not smaller than track height (to prevent track ends from showing)", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyValueMax" }, "parameters": [ "Object", "Behavior", "=", - "\"rectangle\"" + "GetArgumentAsNumber(\"ValueMax\")" ] }, { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" - }, - "parameters": [ - "Object", - "Behavior", - "<", - "Object.Behavior::PropertyTrackThickness()" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" }, "parameters": [ "Object", "Behavior", - "Object.Behavior::PropertyTrackThickness()", + "Object.Behavior::Value()", "" ] } @@ -29557,93 +28630,39 @@ "type": "behavior" }, { - "description": "New thumb shape", - "name": "Shape", - "supplementaryInformation": "[\"circle\",\"rectangle\"]", - "type": "stringWithSelector" + "description": "Maximum value", + "name": "ValueMax", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Make track use rounded ends.", - "fullName": "Rounded track ends", - "functionType": "Action", - "group": "Slider track configuration", - "name": "SetRoundedTrack", - "sentence": "Draw _PARAM0_ with a rounded track: _PARAM2_", + "description": "The tick spacing of a slider.", + "fullName": "Tick spacing", + "functionType": "Expression", + "group": "Slider value configuration", + "name": "TickSpacing", + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "Egal" - }, - "parameters": [ - "GetArgumentAsNumber(\"Value\")", - "=", - "1" - ] - } - ], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" - }, - "parameters": [ - "Object", - "Behavior", - "yes" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "yes" + "Object.Behavior::PropertyTickSpacing()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -29658,20 +28677,20 @@ "type": "behavior" }, { - "description": "Rounded track", - "name": "Value", - "type": "yesorno" + "description": "Tick spacing", + "name": "TickSpacing", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change opacity of thumb.", - "fullName": "Thumb opacity", + "description": "Change the tick spacing of a slider.", + "fullName": "Tick spacing", "functionType": "Action", - "group": "Slider thumb configuration", - "name": "SetThumbOpacity", - "sentence": "Change thumb opacity of _PARAM0_ to _PARAM2_", + "group": "Slider value configuration", + "name": "SetTickSpacing", + "sentence": "Change the tick spacing of _PARAM0_: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -29679,23 +28698,24 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOpacity" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTickSpacing" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "GetArgumentAsNumber(\"TickSpacing\")" ] }, { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" }, "parameters": [ "Object", "Behavior", - "yes" + "Object.Behavior::Value()", + "" ] } ] @@ -29715,20 +28735,20 @@ "type": "behavior" }, { - "description": "Thumb opacity", - "name": "Value", + "description": "Tick spacing", + "name": "TickSpacing", "type": "expression" } ], "objectGroups": [] }, { - "description": "Change opacity of inactive track.", - "fullName": "Inactive track opacity", + "description": "Change length of track.", + "fullName": "Track length", "functionType": "Action", "group": "Slider track configuration", - "name": "SetInactiveTrackOpacity", - "sentence": "Change inactive track opacity of _PARAM0_ to _PARAM2_", + "name": "SetTrackLength", + "sentence": "Change track length of _PARAM0_ to _PARAM2_ px", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -29736,7 +28756,7 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackOpacity" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackLength" }, "parameters": [ "Object", @@ -29745,6 +28765,16 @@ "GetArgumentAsNumber(\"Value\")" ] }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, { "type": { "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" @@ -29756,6 +28786,36 @@ ] } ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb to correct place (based on new track size)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyValue()", + "" + ] + } + ] } ], "parameters": [ @@ -29772,7 +28832,7 @@ "type": "behavior" }, { - "description": "Inactive track opacity", + "description": "Track width", "name": "Value", "type": "expression" } @@ -29780,12 +28840,12 @@ "objectGroups": [] }, { - "description": "Change opacity of active track.", - "fullName": "Active track opacity", + "description": "Change thickness of track.", + "fullName": "Track thickness", "functionType": "Action", "group": "Slider track configuration", - "name": "SetActiveTrackOpacity", - "sentence": "Change active track opacity of _PARAM0_ to _PARAM2_", + "name": "SetTrackThickness", + "sentence": "Change track thickness of _PARAM0_ to _PARAM2_ px", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -29793,7 +28853,7 @@ "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackOpacity" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyTrackThickness" }, "parameters": [ "Object", @@ -29813,60 +28873,74 @@ ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than track height + 2 pixels (to prevent track ends from showing)", + "comment2": "" }, - { - "description": "Active track opacity", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Change the color of the track that is LEFT of the thumb.", - "fullName": "Active track color ", - "functionType": "Action", - "group": "Slider track configuration", - "name": "SetActiveTrackColor", - "sentence": "Change active track color of _PARAM0_ to _PARAM2_", - "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness() + 2" + ] + } + ], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackColor" + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" }, "parameters": [ "Object", "Behavior", - "=", - "GetArgumentAsString(\"Color\")" + "Object.Behavior::PropertyTrackThickness() + 2", + "" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbHeight" }, "parameters": [ "Object", "Behavior", - "yes" + "<", + "Object.Behavior::PropertyTrackThickness() + 2" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbHeight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness() + 2", + "" ] } ] @@ -29886,34 +28960,63 @@ "type": "behavior" }, { - "description": "Active track color", - "name": "Color", - "type": "color" + "description": "Track thickness", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the color of the track that is RIGHT of the thumb.", - "fullName": "Inactive track color", + "description": "Change width of thumb.", + "fullName": "Thumb width", "functionType": "Action", - "group": "Slider track configuration", - "name": "SetInactiveTrackColor", - "sentence": "Change inactive track color of _PARAM0_ to _PARAM2_", + "group": "Slider thumb configuration", + "name": "SetThumbWidth", + "sentence": "Change thumb width of _PARAM0_ to _PARAM2_ px", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackColor" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbWidth" }, "parameters": [ "Object", "Behavior", "=", - "GetArgumentAsString(\"Color\")" + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" + }, + "parameters": [ + "Object", + "Behavior", + "" ] }, { @@ -29943,102 +29046,73 @@ "type": "behavior" }, { - "description": "Inactive track color", - "name": "Color", - "type": "color" + "description": "Thumb width", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Change the thumb color to a specific value.", - "fullName": "Thumb color", + "description": "Change height of thumb.", + "fullName": "Thumb height", "functionType": "Action", "group": "Slider thumb configuration", - "name": "SetThumbColor", - "sentence": "Change thumb color of _PARAM0_ to _PARAM2_", + "name": "SetThumbHeight", + "sentence": "Change thumb height of _PARAM0_ to _PARAM2_ px", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbColor" - }, - "parameters": [ - "Object", - "Behavior", - "GetArgumentAsString(\"Color\")" - ] - }, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Thumb cannot be less than track thickness (plus 2 pixels)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbHeight" }, "parameters": [ "Object", "Behavior", - "yes" + "=", + "max(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyTrackThickness() + 2)" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" }, - { - "description": "Thumb color", - "name": "Color", - "type": "color" - } - ], - "objectGroups": [] - }, - { - "description": "Update the hitbox.", - "fullName": "Update hitbox", - "functionType": "Action", - "group": "Private", - "name": "UpdateHitbox", - "private": true, - "sentence": "Update the hitbox of _PARAM0_", - "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "PrimitiveDrawing::SetRotationCenter" + "value": "DraggableSliderControl::DraggableSliderControl::UpdateHitbox" }, "parameters": [ "Object", - "Object.Behavior::PropertyTrackLength() / 2", - "Object.Behavior::PropertyTrackThickness() / 2" + "Behavior", + "" ] }, { "type": { - "value": "PrimitiveDrawing::SetRectangularCollisionMask" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" }, "parameters": [ "Object", - "-Object.Behavior::PropertyThumbWidth() / 2", - "-Object.Behavior::PropertyThumbHeight() / 2", - "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyThumbWidth() / 2", - "Object.Behavior::PropertyThumbHeight() / 2" + "Behavior", + "yes" ] } ] @@ -30053,383 +29127,715 @@ }, { "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "0", - "type": "Number", - "label": "Minimum value", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMin" - }, - { - "value": "1", - "type": "Number", - "label": "Maximum value", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "ValueMax" - }, - { - "value": "0", - "type": "Number", - "label": "Tick spacing", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "TickSpacing" - }, - { - "value": "circle", - "type": "Choice", - "label": "Thumb shape", - "description": "", - "group": "Thumb", - "extraInformation": [ - "circle", - "rectangle" - ], - "hidden": false, - "name": "ThumbShape" - }, - { - "value": "20", - "type": "Number", - "label": "Thumb width", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbWidth" - }, - { - "value": "20", - "type": "Number", - "label": "Thumb height", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbHeight" - }, - { - "value": " 24;119;211", - "type": "Color", - "label": "Thumb Color", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbColor" - }, - { - "value": "255", - "type": "Number", - "label": "Thumb opacity", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "ThumbOpacity" - }, - { - "value": "200", - "type": "Number", - "label": "Track length", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "TrackLength" - }, - { - "value": "4", - "type": "Number", - "label": "Track thickness", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "TrackThickness" - }, - { - "value": "", - "type": "String", - "label": "Inactive track color (thumb color by default)", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "InactiveTrackColor" - }, - { - "value": "96", - "type": "Number", - "label": "Inactive track opacity", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "InactiveTrackOpacity" - }, - { - "value": " ", - "type": "String", - "label": "Active track color (thumb color by default)", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "ActiveTrackColor" - }, - { - "value": "255", - "type": "Number", - "label": "Active track opacity", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "ActiveTrackOpacity" - }, - { - "value": "24", - "type": "Number", - "label": "Halo size (hover)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloRadius" - }, - { - "value": "32", - "type": "Number", - "label": "Halo opacity (hover)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloOpacityHover" - }, - { - "value": "64", - "type": "Number", - "label": "Halo opacity (pressed)", - "description": "", - "group": "Thumb", - "extraInformation": [], - "hidden": false, - "name": "HaloOpacityClick" - }, - { - "value": "true", - "type": "Boolean", - "label": "Rounded track ends", - "description": "", - "group": "Track", - "extraInformation": [], - "hidden": false, - "name": "RoundedTrack" - }, - { - "value": "true", - "type": "Boolean", - "label": "Enable interactions", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "Enabled" + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Thumb height", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "IsBeingDragged" + "description": "Change radius of the halo around the thumb. This size is also used to detect interaction with the slider.", + "fullName": "Halo radius", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloRadius", + "sentence": "Change halo radius of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Halo radius", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "Value" + "description": "Change opacity of halo when hovered.", + "fullName": "Halo opacity (hover)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityHover", + "sentence": "Change halo opacity when hovered of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloOpacityHover" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Halo opacity (hover)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "0", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ThumbOffset" + "description": "Change opacity of halo when pressed.", + "fullName": "Halo opacity (pressed)", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetHaloOpacityPressed", + "sentence": "Change halo opacity when pressed of _PARAM0_ to _PARAM2_ px", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyHaloOpacityClick" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Halo opacity (pressed)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "true", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "NeedRedraw" + "description": "Change shape of thumb (circle or rectangle).", + "fullName": "Thumb shape", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbShape", + "sentence": "Change shape of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Shape\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure thumb width is not smaller than track height (to prevent track ends from showing)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbShape" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"rectangle\"" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::PropertyThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyTrackThickness()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetThumbWidth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyTrackThickness()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "New thumb shape", + "name": "Shape", + "supplementaryInformation": "[\"circle\",\"rectangle\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Boolean", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "IsHovered" + "description": "Make track use rounded ends.", + "fullName": "Rounded track ends", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetRoundedTrack", + "sentence": "Draw _PARAM0_ with a rounded track: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"Value\")", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyRoundedTrack" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Rounded track", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "MouseX" + "description": "Change opacity of thumb.", + "fullName": "Thumb opacity", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbOpacity", + "sentence": "Change thumb opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Thumb opacity", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "MouseY" + "description": "Change opacity of inactive track.", + "fullName": "Inactive track opacity", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetInactiveTrackOpacity", + "sentence": "Change inactive track opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Inactive track opacity", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "CurrentHaloRadius" + "description": "Change opacity of active track.", + "fullName": "Active track opacity", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetActiveTrackOpacity", + "sentence": "Change active track opacity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Active track opacity", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] }, { - "value": "0.2", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "HaloGrowSpeed" + "description": "Change the color of the track that is LEFT of the thumb.", + "fullName": "Active track color ", + "functionType": "Action", + "group": "Slider track configuration", + "name": "SetActiveTrackColor", + "sentence": "Change active track color of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyActiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" + }, + { + "description": "Active track color", + "name": "Color", + "type": "color" + } + ], + "objectGroups": [] }, { - "value": "", - "type": "Number", - "label": "", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "TargetHaloRadius" - } - ], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "", - "category": "General", - "extensionNamespace": "", - "fullName": "Draw resource bar (health, shield, etc) OLD", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBkPSJNMjgsMTJIMTRINGMtMi4yLDAtNCwxLjgtNCw0czEuOCw0LDQsNGgxMGgxNGMyLjIsMCw0LTEuOCw0LTRTMzAuMiwxMiwyOCwxMnogTTQsMThjLTEuMSwwLTItMC45LTItMnMwLjktMiwyLTJoMTANCgljMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJINHoiLz4NCjwvc3ZnPg0K", - "name": "DrawResourceBarOLD", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_loading_progress_bar.svg", - "shortDescription": "Draw a bar that displays a resource like health, shield, or any value.", - "version": "0.0.1", - "description": "\nTo adjust the appearance of the resource bar, edit the Draggable Slider properties. The shape painter appearance settings will be overwritten by the Draggable Slider.", - "tags": [], - "authorIds": [ - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ - { - "description": "", - "fullName": "Draw resource bar (OLD)", - "name": "DrawResourceBarOLD", - "objectType": "PrimitiveDrawing::Drawer", - "eventsFunctions": [ - { - "description": "Draw health bar.", - "fullName": "Draw health bar", + "description": "Change the color of the track that is RIGHT of the thumb.", + "fullName": "Inactive track color", "functionType": "Action", - "name": "DrawHealthBar", - "sentence": "Draw health bar with _PARAM0_ based on health of _PARAM2_", + "group": "Slider track configuration", + "name": "SetInactiveTrackColor", + "sentence": "Change inactive track color of _PARAM0_ to _PARAM2_", "events": [ { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyInactiveTrackColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + }, + { + "type": { + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", + "type": "behavior" }, + { + "description": "Inactive track color", + "name": "Color", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Change the thumb color to a specific value.", + "fullName": "Thumb color", + "functionType": "Action", + "group": "Slider thumb configuration", + "name": "SetThumbColor", + "sentence": "Change thumb color of _PARAM0_ to _PARAM2_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyThumbColor" }, "parameters": [ "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.DraggableSliderBehavior::Value(), ObjectWithHealth.HealthBehavior::Health(), 0.05)", - "" + "Behavior", + "GetArgumentAsString(\"Color\")" ] }, { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + "value": "DraggableSliderControl::DraggableSliderControl::SetPropertyNeedRedraw" }, "parameters": [ "Object", - "DraggableSliderBehavior", - "ObjectWithHealth.HealthBehavior::MaxHealth()", - "" + "Behavior", + "yes" ] } ] @@ -30445,67 +29851,50 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" }, { - "description": "Object with health", - "name": "ObjectWithHealth", - "type": "objectList" - }, - { - "description": "Health behavior", - "name": "HealthBehavior", - "supplementaryInformation": "Health::Health", - "type": "behavior" + "description": "Thumb color", + "name": "Color", + "type": "color" } ], "objectGroups": [] }, { - "description": "Draw shield bar.", - "fullName": "Draw shield bar", + "description": "Update the hitbox.", + "fullName": "Update hitbox", "functionType": "Action", - "name": "DrawShieldBar", - "sentence": "Draw shield bar with _PARAM0_ based on shield of _PARAM2_", + "group": "Private", + "name": "UpdateHitbox", + "private": true, + "sentence": "Update the hitbox of _PARAM0_", "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" + "value": "PrimitiveDrawing::SetRotationCenter" }, "parameters": [ "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.DraggableSliderBehavior::Value(), ObjectWithShield.ShieldBehavior::ShieldPoints(), 0.05)", - "" + "Object.Behavior::PropertyTrackLength() / 2", + "Object.Behavior::PropertyTrackThickness() / 2" ] }, { "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" + "value": "PrimitiveDrawing::SetRectangularCollisionMask" }, "parameters": [ "Object", - "DraggableSliderBehavior", - "ObjectWithShield.ShieldBehavior::MaxShield()", - "" + "-Object.Behavior::PropertyThumbWidth() / 2", + "-Object.Behavior::PropertyThumbHeight() / 2", + "Object.Behavior::PropertyTrackLength() + Object.Behavior::PropertyThumbWidth() / 2", + "Object.Behavior::PropertyThumbHeight() / 2" ] } ] @@ -30521,219 +29910,306 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", - "type": "behavior" - }, - { - "description": "Object with shield", - "name": "ObjectWithShield", - "type": "objectList" - }, - { - "description": "Shield behavior", - "name": "ShieldBehavior", - "supplementaryInformation": "Health::Shield", + "supplementaryInformation": "DraggableSliderControl::DraggableSliderControl", "type": "behavior" } ], "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Minimum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMin" + }, + { + "value": "1", + "type": "Number", + "label": "Maximum value", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "ValueMax" + }, + { + "value": "0", + "type": "Number", + "label": "Tick spacing", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "TickSpacing" + }, + { + "value": "circle", + "type": "Choice", + "label": "Thumb shape", + "description": "", + "group": "Thumb", + "extraInformation": [ + "circle", + "rectangle" + ], + "hidden": false, + "name": "ThumbShape" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb width", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbWidth" + }, + { + "value": "20", + "type": "Number", + "label": "Thumb height", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbHeight" + }, + { + "value": " 24;119;211", + "type": "Color", + "label": "Thumb Color", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbColor" + }, + { + "value": "255", + "type": "Number", + "label": "Thumb opacity", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "ThumbOpacity" + }, + { + "value": "200", + "type": "Number", + "label": "Track length", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "TrackLength" + }, + { + "value": "4", + "type": "Number", + "label": "Track thickness", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "TrackThickness" + }, + { + "value": "", + "type": "String", + "label": "Inactive track color (thumb color by default)", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "InactiveTrackColor" + }, + { + "value": "96", + "type": "Number", + "label": "Inactive track opacity", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "InactiveTrackOpacity" + }, + { + "value": " ", + "type": "String", + "label": "Active track color (thumb color by default)", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "ActiveTrackColor" + }, + { + "value": "255", + "type": "Number", + "label": "Active track opacity", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "ActiveTrackOpacity" + }, + { + "value": "24", + "type": "Number", + "label": "Halo size (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloRadius" + }, + { + "value": "32", + "type": "Number", + "label": "Halo opacity (hover)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityHover" + }, + { + "value": "64", + "type": "Number", + "label": "Halo opacity (pressed)", + "description": "", + "group": "Thumb", + "extraInformation": [], + "hidden": false, + "name": "HaloOpacityClick" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rounded track ends", + "description": "", + "group": "Track", + "extraInformation": [], + "hidden": false, + "name": "RoundedTrack" }, { - "description": "Draw resource bar.", - "fullName": "Draw resource bar", - "functionType": "Action", - "name": "DrawResourceBar", - "sentence": "Draw resource bar with _PARAM0_ with current value _PARAM2_ and max value _PARAM3_", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set values", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValue" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "Tween::Ease(\"easeOutCirc\", Object.DraggableSliderBehavior::Value(), GetArgumentAsNumber(\"CurrentValue\"), 0.05)", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValueMax" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "GetArgumentAsNumber(\"MaxValue\")", - "" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", - "type": "behavior" - }, - { - "description": "Current value", - "name": "CurrentValue", - "type": "expression" - }, - { - "description": "Max value", - "name": "MaxValue", - "supplementaryInformation": "Health::Health", - "type": "expression" - } - ], - "objectGroups": [] + "value": "true", + "type": "Boolean", + "label": "Enable interactions", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Enabled" }, - { - "fullName": "", - "functionType": "Action", - "name": "onCreated", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Set slider properties", - "comment2": "" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetEnabled" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "no", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetValueMin" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "0", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetHaloOpacityHover" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "0", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetThumbOpacity" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "0", - "" - ] - }, - { - "type": { - "value": "DraggableSliderControl::DraggableSliderControl::SetRoundedTrack" - }, - "parameters": [ - "Object", - "DraggableSliderBehavior", - "no", - "" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "PrimitiveDrawing::Drawer", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "DrawResourceBarOLD::DrawResourceBarOLD", - "type": "behavior" - } - ], - "objectGroups": [] - } - ], - "propertyDescriptors": [ { "value": "", - "type": "Behavior", + "type": "Boolean", "label": "", "description": "", "group": "", - "extraInformation": [ - "DraggableSliderControl::DraggableSliderControl" - ], - "hidden": false, - "name": "DraggableSliderBehavior" + "extraInformation": [], + "hidden": true, + "name": "IsBeingDragged" }, { "value": "0", "type": "Number", - "label": "Time to complete moving the bar when the value is changed (seconds)", + "label": "", "description": "", "group": "", "extraInformation": [], - "hidden": false, - "name": "ChangeDuration" + "hidden": true, + "name": "Value" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbOffset" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "NeedRedraw" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsHovered" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentHaloRadius" + }, + { + "value": "0.2", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HaloGrowSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetHaloRadius" } ], "sharedPropertyDescriptors": [] From 098a9666e85b51e9a7e5aecf7eb25f2aa08f6853 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 27 Nov 2022 06:11:22 +0000 Subject: [PATCH 20/24] Optimised images with calibre/image-actions --- examples/resource-bar/assets/Arrow.png | Bin 3049 -> 271 bytes examples/resource-bar/assets/Arrow2.png | Bin 3056 -> 277 bytes .../resource-bar/assets/Bomb_No Shadow.png | Bin 3145 -> 354 bytes examples/resource-bar/assets/Bomb_Shadow.png | Bin 3164 -> 371 bytes examples/resource-bar/assets/Heart-1-1.png | Bin 375 -> 259 bytes examples/resource-bar/assets/Heart-1.png | Bin 369 -> 258 bytes examples/resource-bar/assets/Minus Key.png | Bin 1225 -> 893 bytes .../assets/Playing Card_Back Blue 1.png | Bin 25862 -> 14269 bytes .../assets/Playing Card_Back Blue 2.png | Bin 27646 -> 13615 bytes .../assets/Playing Card_Back Brown 1.png | Bin 27300 -> 13704 bytes .../assets/Playing Card_Back Brown 2.png | Bin 28338 -> 13438 bytes .../assets/Playing Card_Back Red 1.png | Bin 24606 -> 14106 bytes .../assets/Playing Card_Back Red 2.png | Bin 25981 -> 14338 bytes .../assets/Playing Card_Clubs 02.png | Bin 3650 -> 2565 bytes .../assets/Playing Card_Clubs 03.png | Bin 4294 -> 2987 bytes .../assets/Playing Card_Clubs 04.png | Bin 4198 -> 3002 bytes .../assets/Playing Card_Clubs 05.png | Bin 5059 -> 3489 bytes .../assets/Playing Card_Clubs 06.png | Bin 5266 -> 3744 bytes .../assets/Playing Card_Clubs 07.png | Bin 5574 -> 3998 bytes .../assets/Playing Card_Clubs 08.png | Bin 6176 -> 4257 bytes .../assets/Playing Card_Clubs 09.png | Bin 6423 -> 4351 bytes .../assets/Playing Card_Clubs 10.png | Bin 6689 -> 4501 bytes .../assets/Playing Card_Clubs A.png | Bin 3668 -> 2692 bytes .../assets/Playing Card_Clubs J.png | Bin 4645 -> 3208 bytes .../assets/Playing Card_Clubs K.png | Bin 6073 -> 4109 bytes .../assets/Playing Card_Clubs Q.png | Bin 4798 -> 3339 bytes .../assets/Playing Card_Diamond 02.png | Bin 3231 -> 2206 bytes .../assets/Playing Card_Diamond 03.png | Bin 3707 -> 2538 bytes .../assets/Playing Card_Diamond 04.png | Bin 3639 -> 2458 bytes .../assets/Playing Card_Diamond 05.png | Bin 4366 -> 2871 bytes .../assets/Playing Card_Diamond 06.png | Bin 4921 -> 3303 bytes .../assets/Playing Card_Diamond 07.png | Bin 5057 -> 3499 bytes .../assets/Playing Card_Diamond 08.png | Bin 5630 -> 3705 bytes .../assets/Playing Card_Diamond 09.png | Bin 5825 -> 3486 bytes .../assets/Playing Card_Diamond 10.png | Bin 5960 -> 3488 bytes .../assets/Playing Card_Diamond A.png | Bin 3175 -> 2383 bytes .../assets/Playing Card_Diamond J.png | Bin 4540 -> 3105 bytes .../assets/Playing Card_Diamond K.png | Bin 6132 -> 4261 bytes .../assets/Playing Card_Diamond Q.png | Bin 4869 -> 3308 bytes .../assets/Playing Card_Hearts 02.png | Bin 3366 -> 2273 bytes .../assets/Playing Card_Hearts 03.png | Bin 3991 -> 2651 bytes .../assets/Playing Card_Hearts 04.png | Bin 3869 -> 2648 bytes .../assets/Playing Card_Hearts 05.png | Bin 4643 -> 3070 bytes .../assets/Playing Card_Hearts 06.png | Bin 5063 -> 3358 bytes .../assets/Playing Card_Hearts 07.png | Bin 5265 -> 3655 bytes .../assets/Playing Card_Hearts 08.png | Bin 5826 -> 3835 bytes .../assets/Playing Card_Hearts 09.png | Bin 6094 -> 3990 bytes .../assets/Playing Card_Hearts 10.png | Bin 6327 -> 4130 bytes .../assets/Playing Card_Hearts A.png | Bin 3479 -> 2514 bytes .../assets/Playing Card_Hearts J.png | Bin 4565 -> 3150 bytes .../assets/Playing Card_Hearts K.png | Bin 6159 -> 4275 bytes .../assets/Playing Card_Hearts Q.png | Bin 4901 -> 3335 bytes .../assets/Playing Card_Joker Black.png | Bin 5617 -> 3673 bytes .../assets/Playing Card_Joker Red.png | Bin 5623 -> 3733 bytes .../assets/Playing Card_Spades 02.png | Bin 3473 -> 2351 bytes .../assets/Playing Card_Spades 03.png | Bin 4060 -> 2707 bytes .../assets/Playing Card_Spades 04.png | Bin 3785 -> 2793 bytes .../assets/Playing Card_Spades 05.png | Bin 4702 -> 3230 bytes .../assets/Playing Card_Spades 06.png | Bin 5219 -> 3494 bytes .../assets/Playing Card_Spades 07.png | Bin 5428 -> 3776 bytes .../assets/Playing Card_Spades 08.png | Bin 5907 -> 4048 bytes .../assets/Playing Card_Spades 09.png | Bin 6234 -> 4226 bytes .../assets/Playing Card_Spades 10.png | Bin 6614 -> 4423 bytes .../assets/Playing Card_Spades A.png | Bin 3576 -> 2544 bytes .../assets/Playing Card_Spades J.png | Bin 4530 -> 3127 bytes .../assets/Playing Card_Spades K.png | Bin 5933 -> 4045 bytes .../assets/Playing Card_Spades Q.png | Bin 4768 -> 3310 bytes examples/resource-bar/assets/Plus Key.png | Bin 1337 -> 943 bytes 68 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/resource-bar/assets/Arrow.png b/examples/resource-bar/assets/Arrow.png index aebf650552cb5eb4d3613b533f7235b007e38f23..c46f57c852afc83f3d405398953e9c152d7f0689 100644 GIT binary patch delta 223 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 diff --git a/examples/resource-bar/assets/Bomb_Shadow.png b/examples/resource-bar/assets/Bomb_Shadow.png index a784165a1e3396559b3967369a2dba9beb8933c7..8b55cf5d78101c24ddb42fa4837f66dd62978b31 100644 GIT binary patch delta 345 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 delta 348 zcmV-i0i*td0`~%tB!2;OQb$4nuFf3k0003oNklr(sycTpSyWls$|-eTN-`?2*9#c%W4MubFPLT>;(h?K!2KzCyX{ij03o!1Gp!E;>hmcn&yB4mRGsfMU)#7%nU)q-8q7 z3B2Lu?&OtO-&I8QTL)KOW`M~|crN@vDu@?Y&NL9NNy{?|vNF@0SZ>s=v$~7_@9-Kc u6RG1mLf2@S$vKI&fAs340H9tT8uS6QD8CdO!gd`10000<4xLisX z3y>`$Dwv3|0A?7v>uKr(q9dA63Zlq@Taz08gD|Nn35L=03t!AUss^9U41eSknCmI_0n9M;-~ky- z^&rBPyortjeBqDFaGXJOYf=L^Q$;K~4AzUB2k@mNm_?ve1_H4BvLenF%vZ~6V8ojb zV20y!F|sA-84@IiVgVtaAX^A?H7=Kf%);;i%r*Ej9kOrGg9clfg;5s4e1R`cV3weV zIV{|f9f7r!Bv0fMY!-lm16y3-wE$O~U~@S(*JDI7uGE5D?jx(gRZkEVM6gtVEl!Zr oIiVzsH;B+R!z{xU-q9NaMF0Q* diff --git a/examples/resource-bar/assets/Minus Key.png b/examples/resource-bar/assets/Minus Key.png index 1e6dcf7224dfda73c32b082acc5ea6b547bf115a..2639ac86b301ddb0bf03752f09bb404d4f4b90ff 100644 GIT binary patch delta 871 zcmV-t1DO2D3H=6;BYyx1a7bBm000XT000XT0n*)m`~Uz0FG)l}RCwC$olR;YK^TU; z!QfK-nT4PzilPXDV89Ew5)}NyKXf%GP`BQ}MUIdo%+i(Q2suKI(Bmf&Oj(^|W=wTg z_w&L_mi@i;*i~(r`Z^Lp2qAyLTSma8xv1~gcXLk zTCI8qBpQwWP=7C+N~J;#L@Z;Vj*E;HcZf%}YRYQ0T280aar*uK*{jv+TRor8?{b|> zy;8em@H3E`?;w>*MO$dM+x>O`rYvA|86~@?-$itfz49oi7TRvN0|Vn?$)x6#?4CaM zeievJ9YF&knXCjNbFLa@G#WXB!NBSDdRAC!9goL1Ie*mk#7ZFY$+886YV}SJ1d!Qm z1`zI$@Bn#I3n&(gp#>t@H9($B0@wgORes5vFO2FMm5009U<00Izz z00bbR0HXdTVbea=^?sK68wo%F0uX=z#Q#91)9HC1>D~s&KLXioHqPO2xU2X3JwW~k z$nki*tA7C!0wCFJRtMylNgxku0qJx)v_K@g2FL?I00Izz0OV^YsN~>ESb^vc?U+76 z#ZwlKy#VnX$a=kYcDvo(4G=aL0Rj+!00bcXlLP;C0uX=z1Rwwb2tWW59w53ti_$;p zy2xg;`7Xp_v9K11)P9{svR!AD?7IGo9Qx!GE`LC*1rnqw%Ss@PM&o8N91e%p!H{+! zYL0rnZfEnE$zmHU5l^YBzdoI!h6CeO_Yl0aDyEMUcJYCdvn~Pzw%jTldMP2(6 z7howY=uP-l>tGn)Ts&Q@%_}KBbvt5Gx@il0FkM|8N#K=7etPB61qye{`#Zxk7@9RD x@UP1I=oNa#*9?RZLI@#*5JCtcgb+eL)*r^b)^H6i19JcX002ovPDHLkV1mcsh+Y5y delta 1206 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 WFubf@6?pB(Lr_tC|F&8l6#9RdsGzn0 literal 25862 zcmXt91y~nPv_(Pb?iP^lZuk?@-QC^YA=2H_EdtWr-Hn8Fmvnc%@xAZ)sXthj-PzeY z_nv#snQ#R;aYQ&gI0y&`L`exzCGcqu{zbri1phZ?s1$+^C}&|w6&Ucx2gW1}d=Kj& zq3I0Hpa1vooiJ5~2RMl9@-O$Mt!rk4S!P3s!+1Sv*l)>J~JmZuP4+7#7 zgrumDibv*gySs;~>C)}Xa(l|Po}}=nAe8rcL3n7Q2ko$7*I^@Le>Dco2OJ5!{eOhP zaU>z-Nr-zfPLsg?xLb2yKO?rTB`FTO;+lLST<4v4gogNRs$`$FpzD{9e~hTS^L!nwt78 zCheK{>4UVKoZ0zC_Z`tG#YePLfrO-_>rOYtw`$%$h0-bB$mC(o=7G3aSht;SLf{}4 z9-h}3N#V7S|Ds)E?VA_LD6;OhlO#R;cV2{oIg^5t#c!f?!VD=>OI9M~2}U&wj$E04 z>)|lq!tw1{mMv^*K4C>FjF8vWEh&`zNY(YoQj1Y?+@BsZ<3*I+%h{mE;&lr}FBgkB ztf(|IxH9fG2n;nvoP3*kN7OgWgFSyHrcs$$C)NHj<; z%LcCh-cv*-CsFyw>?IjmF$<0IQ@U>Qe(-ee$c@m7obz3oH44G1#kW!z4u`$jF;Zlw zch6dnwr3Y9O%qUjM=(rn>->sUTZq^p5(mADNRRP{0r1d7G1fqTy${DVzL+~lYT`a>luKZ;7tQwEer zcxxt`$qv}<&Q1u;D%rgPl0nom^uKHYK*_VIl^>Cg)5Kh5o!6Lw7u?^&XN zv(6~CV|nRgCPmeuFX@)AG+Ip~n03Nk#JmyY-apZ7e3E+S=f%DcPZKZg@5QZYS`R@m z!O*|wprGY{h7nYD$rEMuL7%8KMu_}vagx^FqTj~Zp&}P8a$HDHm5joAc|1pkbPv4K zcOTi;^+&|%zODQk$jPK_Z6gX+>3OW>gk>sj*3k*P&rX}Ns#a867d9;j&y4Uo)TW

(G|=pE_JVrZ%v;^&6L9%(E*mE=U>L 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 diff --git a/examples/resource-bar/assets/Playing Card_Back Blue 2.png b/examples/resource-bar/assets/Playing Card_Back Blue 2.png index 76fea3c2f2ad04faed80702ef911b7c59096c8e4..16d6f9b318aa10fa2fe3fe863cf1d7c35515a3ce 100644 GIT binary patch literal 13615 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 literal 27646 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 literal 27300 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 IH`-qR15%dt8~^|S diff --git a/examples/resource-bar/assets/Playing Card_Back Red 1.png b/examples/resource-bar/assets/Playing Card_Back Red 1.png index 4c904df93d92bfa28528832b465741f1f11667f8..a1afd182c37b0c64217822020c9c0ed3a97fa746 100644 GIT binary patch literal 14106 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 Yf1`(gkP$*3EC2ui07*qoM6N<$g5!VH!~g&Q literal 24606 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 literal 25981 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 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 02.png b/examples/resource-bar/assets/Playing Card_Clubs 02.png index 0be3cf9af8751ac7fc5dba4a7ec9c8ac3955d513..e3ee65c3846b582cd0af88ecb450ecf07cbca6d7 100644 GIT binary patch delta 2538 zcmVgj<4S z|ER*rds;HdNnW)q$^MnWkrXOfHaW*93>-r9xY&a79x106cIeQ7O`A52tzNyF%wU6G zJ9X;Bf`WovHF4l#>#zJ}jT$xBxpU_j$$TXyCUSqP00I|Vtm6+s^5VsdC%O~f8_eeT{{9K3eK7} zYjlr#M~)mx-WLI9$&w|q*GEJ|u(M~+%52uGS+dteMMaVKf4u<*L4i`ccI_fK1c%_r zbmhtwwqnJKd^>;sJi+m`aSrtU{d;!n)-5Mnwrm-}@g|%{j~=mFwQ6aK)`krmM&1_% zM-P}bZQ8KR%uMpW2sn=)Kh_K;EG&$D{`{Fd@2zO9T)A?rcJ10u*0Ezp_UY3n^182u z(xQbarMq|Uf3m%M_p-FKH1_@bcY@;z4#I1!kK1j*f(530pud0r^68}V<;%ecm~gb1(Qq*Ht>^l4f9K96IHKUJT)9%$^?UW|MQ}vH z*}QqPuImpTJUB4mBqt~H&{&ThJb2L14|4nVZC!BuVMmeSv(nzu@87@qoShahn8A4U z>Q&&v!C()a^r1tC*t>V{Ou6|VKYp+qH*T=4TetFk+}OgZC1OMWl$x5#jvYJZ(~wMo zlaZ0Ze+PT^_m?eOmK{EP*w7nazkWR{Q>Kj5&AZs4U!aAChO(naj|K)DwdMtYjCz6w z4jgF8IT%duSQ-ungRVY2nmA9jefxG(4=U~3x6it8(AN|#T2%FeKX~xK<4(U)rAns4 zsamxvpV77~9JOW#C*pqo{OQrn-nnx}$T7crfA{WL3l5qa`)a6iy58RB6e&`Kza}m& z&L^8RyY1Mq!#Z$IpFXYI0UI}N)P1uEmqoxibLNb7;PmU)PqzbFwQ8mNX0gOA0uF*2 z%fRW}xwCEupm}pgef#z`6%3X(EETOSUc6Yh6NU^K;?@mgtW>#jC&YvDJhBXqsAc5 zh@CLGxw&lZ+O<4vZ``;s-#dWWZp=#M@S9|`_&0v3)pg%B8j1cgP3o=zhX9GyCHC@QaortKS^**7EWekVGkpF7-lSBr%s*XcJky&cH+bdZpV)w=jQ7RZI)}+tR{j( za7YA);E)IoiQo_%62T!jB!WXCI0T18a0m{G;E)Io!66YGf_$7Fkk?iK7BenaNq#X8il;jj_LaCPYn_mAz(nky+MNp@xp$S zCr{=%;Ec{Cef8>94kacgh6g7|$!|{th@5c9@iuejOrCzsQgDz;5_Q*HCGAF1zEPt_ z$$pMJq+7OZVWmr#R(&7xe_q3hMrir+<+6;3s5;WHVMG2k>ZK|J7rfpQaFA`VZr!>C zcKXQY*{D$?r~I8-lEQjgmKou?mVBbhry4^6zlWpD-D$LWTF@LtW8JwfQj+;K9E?l! z{#EKVG)G7g=B|*-)Sc^IyLQdL;UEpAh@{^Ib<%|i#W2Fd!*yK`f0>2V67%^L9CYX+ z;GmL~C&IMQ@ZrN*wQALP)Tj&q@bn}1DRPlcnl#Dflj>J+5T1&FbN%{t!|oZG64kDO z&tj=@4suDCC{e;xFbK6#3(hE^F-BKXvLf;tPH3^Zvy$BlIyJx$q$4I50m7tDC;ZCdd(e_Iv~nm0Yp7(IG4!4W0w zA<*Lt)XgC{g5)Y>b!9VV%pf?T^!oK{U7@uRrI@wCL4_M@RETKD%N0o#6Ng zoPZwZ5FC;wIM`T-U7(Iuvt~_#;|*c?!oHzHi{S)>f8Xzw_P4Q)7C-=#mX=1*nrPvq zT|tAISwK-^eIWr^Yj1VcO{Ge0QF1%h3<1lr2qf`07*qoM6N<$f~3yz AiU0rr literal 3650 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 KMNUMnLSTaHVYBW4 delta 4279 zcmWlccRbX89LLW(`;w7$;qW^vtBkvFMs^A%Ga+P;LsoP+Ih&#=vy)_9hwLq zh>sv~)!u)=Wa{J~fxpCJousTF9Qo;FIN@QEb`tlnR{47+x4R!N{v6f1!Q!DPJUKck zX=Y}UYG=XS6fyZmNcbKxJ_>V(j%&XOvsvjJPt$k;YS`!5f)+skFz5kPG8pg-+pArdbQ{g(Q8$}wee@Pt=c?zVoIl#{9cXsrXD*pcX5;r5{*0V^{o#Xn zUyjOzDpHF{=!a?nhT{tdFRxoJC!FrrxH@TYaL{xgLBXY@q=dW(%WQtOx4UbnlA zc64>|ap4`ta`S`#{u#K2TmEqyxZ$m@!t~F??`Bx*8ld(Y0 zc?T8wSc||zBzrmgA-oO(O^zm21DP!>EacbK@hmPbniQL1?O{)}*I<(sj`W3cr}g2- zN~og+4tlFjwX!^<%U~|4;qjW$Fu|^Mpk|WF&C83FVfWNP%E!Qf@#*QF#g+SYsTNt7 z!-xvR+}s?X&Tvya(B{gqp>L?VjlU%&C7UNl{?kWNQc^k+ka=%u7>ugEzJ4VssJ1_b zm7nM~0`H1p?Hnt$2f~xVU(8 zcenGUl!f?5sh5Tcng~Mh@$XtM7tE?&aB$skBkJfe=5{hEp(1$eA;I(QEmv1@VG$8i zTU)Pde_}6+q-JKWfJ*Cd92YcgZ1@4?Q-MZ`jK6#^EvOS8kLH$rkY7`CNl{VJMDpci zOSsBXe-;kdWC^y@)dgEyTblsgNzxT*$PY{7nOR@=)J3;&adCBi|Nb2l+?tWWEg>zv zsPGCQCWaH|WJ<92iPP=~h9nvm3hSi^ERLdNz77n$ubg;_ZfIzTy;J;2JYapY;$3NJ z0!P8mCx6r)z$MG?*T3L6u8T5+nhQitPg^S}E8Dy~cr4;M)rwJv2%`ELppt%me!iQ( zG#~UVF`1K__NP74DSq`BXk=uhXS}Yl@rCh^c7r7>Hf2^-U|GACg=&Zrk^RfW1UI0Q zDt%)^!%9i0Ezr#5ni?f@=Sh5X^X12nA2*G+gS*IVTEy_pb^u zZ7=fhxCYe*P=^0&+;EIfZKh8obq@^a0wobp3#A36JHm}~F{)HBT2@xp;PcZ1^y;WY zSB$Aq+^=V61vOgO3dHgLZ^!#_YBYYyZ#oq%=S>6buOzDtMjjvhxz^&cyE4@DL=do+ zd^5?Aax7~i>9xEgc;0X}{J^&B0Mu+Nez~X+hr@N(8^NnWQW_go0DD@m>@}6U{Dx+O_h~{?n5aUvej7yK#lny3Nl1e$0c9dT6x#o2)GP$E#+XTwHU9Tl1iZd!^xkrdC#%I4KK){mJ20rji#QJ3D*6d8zc7 zrQyw+rY0s4fC=M?M7HZWkf1-a&#cS4MvL!0&&`DZkZSbu6D;>Qn`Bwei9lYJhVJDs#*Sg+)FfJ8PnHYNcHf_N~L z)AK^ZM*rpH74WpSSTYVrKXzUIBSsXzJ|4q#8%>*d7fL14;F7Gky0(_I;}5^}Cfeb1 z=XpU~%i{X?+6%L@vkXj39WVa7nLp(EYhxoBFunPyDi^GmfRwfr1V$Sd7iZZLhP1Y^ zxkUhk36qjycCY3G3U^tQc}m0@U0GSVxihGKA+xBZCAT)!UQfsnEr7y=#U}A95BJ!Z znMLFA!nx99deiv3wzf$Gg3R>MV4nJ5f#M0w5S7+*nfO#Xt=(xygYw$v@==dazR?Qtt*Lt zXlg31%4Lv`21dfrmhw>R<&U|?0ZJwPfW9_*Di>CFJh zPIgC(o6`HaqPV`;%Wbv@JhryxYiMlzcVD8omQ&O*XGC9Dzgqx)&Q5lWAFSD9?MZL1 zCFL-CO0!?{v{d86o2 z_6noo{R07231rdK)XbjlRgAh|8kd~h1sF9k=+A?MBP7t)*!cKLOP!LkG8VmLX#4t9 zm8qpAL-T`_CkGq6%gauW9$ELra7acSl(TB<=+G4!|K6PYjP>FZ(Wcn&#{v#&Woxe} zEuC~wt$U>Vi44@w5kQ)G>*n|AX*rC~tm==ZkdgLRXq-6dXfeZ14!9&{=H`&hkHy7| z0GWXE3PPQDYZ=a-wPo+`2lB9h!wzPGKr4fTZtm{vGvuFmjxV1-JDR*AKv}e>%2~Ox z$qYP22gsq3EKALJ%}aP@T0;INtbCQfc{5fv4Fre_`UV87UvPKt$KEQSX0RcF!s7S2kbl=8WKF}<7TFTbaQlIj2w#F;#vlnG! z1McSL7I=!n6gLgyLzc3U{$Rjns;jGcl)a(&f&zKRE*4QZTv$k`%}MsoYoi$F-dA(u zCsliyP z1a4W~fB=PpO1c?80EJ&Wo-s?<;Qm2RLIT!{$&ghx$OC+P$h|uKSP&!x7|;TM&+N(C zr>CK5m1=5gz>p~n($~<4Fes}rldS%Gyci}+(?VHU5js0NQ=%EeVzIY|`>?ackit6# z09iVFP|Xi~sswgE_xC5MK0TSlUm0SpadvY01)QH|NuGzL4m}@Z@FwJ&3Rgd-zu&Uj zolEN2lhw-P-@WvhAPn_LS)y}M;qlqo&#^$lPD1w^Q$rjE*`TG!qDfe*k%rmL?y%>q<*UXVpa4P**1;DoP83 z!M^tODaerZ=-XQijk7TbQ_j7^zkl)h`5@3<3`O=qQ`=C1-fwFcGorMZswxzS)igdw zCPxv8asxdoehUoFq2AsE+eJomsD*{a^vw^Gy%u)ibjr%g13e<(H3AC)xQt7|dB-c?nlmD$t|UnmG$ozaEfEii^Lqd|0@wEuIIPIvivMXU{N6Q~Re$?~zm76br(|<9bx1tL$L$~U5 z<=J4YDkkjEm)Kt&xAH@I9B2#px8ms8*|87wdO)m8LPSgq_=A}w@c8Kgw4S~NH^y_~ zC})ge#ywuHt{V66L(l%M$(Dw!uCB`YFB$1l$KA>PUh8wMNBx^@l5{{c1zW7~?+XjH zyxACOn;JRxRssRi82B6i(juL#t*bly26HflJL*%Gkq;W!n5>}j^74Y~g@*o(IIz5t zP6qn&5O{oi+AbM$7ZnrR@f>QctFO1B4f(q0*Vw~ehyW42zAKgT|K59RA`W=CJdg~% z6-hekoS`}8ZyLaV1#;?pHXF{~_T=bX~FJ2@P zc?j6F>Aic;09pVEyDIQS<8c0b4mUEGxn(kG<=}95$IqXFfZh{(*{c!Zv|upAnps|O zOx5=n2m(detEMC+RX_QDa|q=h-J$$5>~q%g4++RkVBpCgp#)1Dzg!syr&U&7P1^xv zl(x*A1qv-fK&u{-FihiHzTt>QMS7xh?-!&*Yy%Ue*U4!Nms>It+)Bj)Nxfdj@@{j1QQbz zjo$ha6LAxOu0gXQIP0T;Z zRk7cTS(6@7kUU5M)Ik;NqjqI(hqF0PP(Fjoj9Ogi(Zdr#@bl(BKZ%R&AYd8j+}0*& H*+=~k4t7#~ diff --git a/examples/resource-bar/assets/Playing Card_Clubs 04.png b/examples/resource-bar/assets/Playing Card_Clubs 04.png index 990ce0705f5e233b95c53c09a6c5dc8d3d582383..178f85bb06246d6a3df2ab8707fd4916a9534cb5 100644 GIT binary patch delta 2979 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 Ph{s6ZT(9bubJYI;+ts;H literal 4198 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 literal 5059 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

Y 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 diff --git a/examples/resource-bar/assets/Playing Card_Clubs 07.png b/examples/resource-bar/assets/Playing Card_Clubs 07.png index d0105853bdc2fd9257c1a2df0c4fbb2beefdc8dc..5e6b414f3e5f11c35b2ab1918cf4d64d65e39780 100644 GIT binary patch delta 3983 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±4cMLcY6IB^|^ym>-XVicbBhg?MP-wu1d&91qKt*|qljFD} zHImk52AmiPFRs%MRkdo>(m+P4HB#2!e<@!+Z@`IxaD9huoI%EfTa>B+M>CBZH%?n= zm&7{Th%F;{!>)YjtbPcSvO%{FUCuU6PmJd^CgZ`BJ@#|9QRlQQ;JA5p6FYMVoAnFT z1sJ&+d%i@Nli!jAfI)Et{GI5WFuRIO3GitG_Cf2B&K zwGb#mY74Or@&SMsfEh^%ONvhrj+M#-!ELwQmLn)%6!L~M z8`0*ME?p|_zWeU1G07pK91GDmf7Cf(Hj}zStL7l`>PZ?@O(ZekP;AJpy^9?Ri=JTr zpYq6Fdl8$tYCB@?>s8x;9&FCv5m_oPO{&YC7dR9|N<27p-_Vf{>Wr5TBC1g7%rfvR zA})s$+f3+h;=%EHgQHAjqL+d0mdk!bDKfkE8%^hl&A{YzOXQsXk927qos5xwa}6qbkroG8j37aSaw#t>oojW^!#9FLf2olRry zJRLvZ3>F2seH#525)Y2tYBFD@;j3J(OD4ImPre*<@}hO6^YffORjR)i92|5Lx2(1( znua?~Ltz^MdNFOt(2e|vf9!7AT$37S+matmbnq3~8S9?D|Jjval$Xxg-? zRp*n>(XWT%dMYGWPYmi;nt0n9{Wyc(Tr3N^NTuZqW}dLgQ#jw`fBVSoGgAi+_O&>x zsFSX)vXn7n!Vo%F7=<Y^u~d{Svls=$XKtN~@M5t>MFh*nV%6w6H1 zew=(8z#enVFC2L8E`=l~=4Px^XDP z`1k>Yy~ry7BZ%bMrG5t4RDzRMTDELi&Wu;JC>U@eChA=0e_Pt$fD;kPEz7Xo8E_Ip zlrxs=#1RQ9GZo$qI5Co&^66LA-GCD#sahKhI0YcpMo9*o0?^{ci^Zf#la!by8)3oO zVr53K^c}RvMlXzF1e;tPJaA_I9=q54Qy;hs;m>Q&Lhp!|S4mD>fXO zISAA&1!o&TEN>f(a0<#ykd~#G*gtFos7{7w8X*;g*;;C6;o py%Ag_j9h1Dxc|0QtAdQh|3~U60sjvun*aa+07*qo1w^hwV1kmw$MFCF literal 5574 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 Uio1^*oVh}j71ZS`WZwk;4^qVFX#fBK diff --git a/examples/resource-bar/assets/Playing Card_Clubs 08.png b/examples/resource-bar/assets/Playing Card_Clubs 08.png index 4b113cf35cdad581baf146add363195cdb755fb7..14b9b41f8941494d6b7fe171abaf840b98088684 100644 GIT binary patch delta 4244 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 literal 6176 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 J)$*2a{|Crl1nd9+ diff --git a/examples/resource-bar/assets/Playing Card_Clubs 09.png b/examples/resource-bar/assets/Playing Card_Clubs 09.png index 30ae1db2b730f30fec600913b3b969874fa7cd38..ec1ce3feb14b31cc81e845cc71e91da7ab3d7358 100644 GIT binary patch delta 4338 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 F{{S%Di;(~T diff --git a/examples/resource-bar/assets/Playing Card_Clubs 10.png b/examples/resource-bar/assets/Playing Card_Clubs 10.png index 0b8e005a5c33666ad46d024fd3fe377b77335be2..d2c845b541936a99ed097f905050616edb552cfb 100644 GIT binary patch delta 4489 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 SA&-~<0000%I5fV`E{AS%hkp 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 diff --git a/examples/resource-bar/assets/Playing Card_Clubs K.png b/examples/resource-bar/assets/Playing Card_Clubs K.png index 5c17db37cbae39cb181e448d1c568e7b6a9deff2..607eb0eb824959189b480fe82387bf0326d9d08c 100644 GIT binary patch delta 4094 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 w2~e%dRWv@qOWkV98*i_*;iE_yj)iy%p6A zh`}qE*cJ)?C-G2y<_+#2zkcH=a-jmiMFyY8#yj9$Je*Eu(uPs&w{cz(N$fDpT}Y1vM<(_=$0{|~5sDbuSTVSj zbRo3a#*f`3D=FQRbf9pU30w(eU2fbPklH$v-4ay7H-|-8LA($Z!5tcT7-Whh)}jn| zfk<)82t8gA#wsXb2`$;ft02`s${|ujmNY7qx27b&9Md>OA z#eKVD?bLwtidvTgPabzxI^1G)*%C%LD7{CP^c z3_6@Ao@ExTiPMe#-XpTdvv`=PsXZ@sr5ggC;s{K5ON*?Z94{|fdGjHodx27QI-jpV4x>m$Ru%9LmvoN^33{I zpe@y+%u0g9Ot@YVZAU7SA_D1scIe9X14-7#>xpo!Pw{Ly-_=0N1Q}69E3sI;gSWT0 zNA|Gl>FZ1Wbf&&cH!robvs2&+8O<6xQsn8Ntm^(CY)5KT{`{vJ6DI9$2jz3}h@-z@ ztP~U!*p?P;9qPR~j>NpYyAI*xFzMhs*0N2g5tp$N1sxr##&V-#q5~FWI+43)z8<%* zh=`<9ZxU;-#NXh~@%@`gcLZ|wmVb6O1@6I}n8Xn4*RE2cF}j&oyky3x9hf-;__cYNG`C^GC$3g;6R@g$@Zv0iCRJefT?10)|3A_E?y ztD^&b(2ROkWzQxi=Bv|+LY|~^3@r7(Pk!?zytYPw5zhbonRGrK$uLh#Prp!*9V#4f9w*QeZc@6ul#0BS(p~Sp zGVrFCRW=y;-+w$+w*lt9&EwPrm9>}Ziq6Pj{L>otclDf-MY`=<3a84@ z-OzMi?SKGyM`tHFOW0D{Q}}{(@Q|bE={(0lu2Jz$#|;5Xfc?Uf5@zu*Q&T2u8=K^} zZzBMXTgnoNm1DfOW@HeP)g&VJKjdv~?=5=Ow>OE2i6P_TyLOlQcMira_PpE%vt)=# zNEmh*#s~j1EcW;}#+Ul;-TZ_@c6ZE8PO{~T!LZB7)m2BcdM|>6galP>?NCH-4!ja6 z<-fVu^}xu`FuAU-Zldx49EzZnkuVn*5_+SU^D#c2Z2jNAU#P92oJWhRt9{(#zkjEV z{Q5<-)a?83*2(Fq*RC+xqbi3%@$Ur@5xD;q7mJ*Q33m--N*$QD=5)uz#Vs@+w^!Qq zYWf{^#oV-YcORU5)4xPZO|3vjM~4nJG&EdXTKZJ?XJ?`Jmxe&Il8lUul2U4Rw)=Lp zy@P`a;Dwgw7B7N=*4kd;(Xy~;gX$s-yB93@44s%rVGWC_gZIDV6PcJO$aW z#a8oCVR?DdsI!~ug)8sga`O3(HCdOfr@Fd&zzw``_Pckrys8Tek!EIQWRof1Y_H?KLC=5B#l
z!MM<$iou1zbO?nH8s7* z$+^c9ZUrkbs~=fCuXF#a?BrCW8<;@XW3W$h_kI7);goxlYTzTQ3X{7dV~s*WLXmFu zLqj^T@$t4t3kwU9h7j~t_1^wmG^-bugOgL=(UI#@e*O@k$JNt=fB8nm6AK#ec&YPw z=w9gaq>WBZNwFJdJp0WE0m@ov+-m7;k0kP(>mVrn?X2|pF&j5GNy>dK>pku?bz588 zS%8hNejALqxVUf7==j1yuEge&5?;-0+1qD_8=aRIXLDFA8Q4ZVlLW=g%nTPdH^Tr& z92GsiLoz0hZHxI4cB(GPJ1a60?_&Sg6XndH#Xf4lyI+o{EwRgUa|!??!EW(Z!~QGj zVl*!{|I{l~$xKa7z5$iJzP@fXXi;H_V?UV1XDl(O3U+IgZ1+>M0yBBB zx3|YM93?LoVd$bL6msg5pPx@Qk?iaQfWUj}6=G*X!n774bi&~)S_xjp6SwG9*pp`g zSp*=)scRMy>~V2;&`nP5>Qw2?-qO<(NgNUq;^FNb+1xC1kH%GNYGNX0p*N}O zBqAb0(0ARyQIzp~FZ;^2bG_h6Hh+M=S&q)^_FQLSY3bvjASqD9d}A5a#*{eJ!>@19 z_kH^oBP}g`T|bjzm5WyYSuJ-OUB0 z^EM^rW|6^vR{dq=(SNP)QMFww`^VryP0iRZ_0RdsEHLEev%E`&Ws;|<- zyaLEu1qfAAsNAvl)Jt^c`VZFqPX(a_o|hblAu#BuLlI#$Kdkj_+Q zeYc&6^^Foc8?-+kCy;>{r)4R2PC)7y7~n%5zP{b%p$88jd2p*#yCQqC<=V(6sJb|E zRaszPAl|^(7&$g(1Wod|ZcNtPKbzm!Am1oh{|Z8@Fq}$YlF+Q}r;m&AKH0UaRlh+& zVc)3cw=vmmWX{6Ef<^x8Wetm;oHT(hUzyV(?8#?vOgDr7#azgR|Uu9&4}m_X;2na49Lgp%$34C?hnvqIIQr4%`8@UO_>j z;>#DB(LoN4ck=AXA8Tsp0KMECJ@hcvL|<0i0L%N$jhWWDRr;rB-nV%Kd%(lvakOa; z{AuUZ6cdmMJcyQ-cDrmO>QSAuRLE)d>|t~Vy9_=70YM2dzyYFMUR#@jk%Pdf^XbH}7k<{dywz(@0lbTs-m>PIz}5ebp};6bhw+P`208qk%;!*x1}nWR?_W zw}V-aqDC$+FY&_xjxp7Mw}w`-!?ZzZe$LHhZ}8vB(yf&}!-|OGwsm$!e(&!mII3%C z$oMloO#*dybrHK|uL`ZToB(p~o0-XKYHC`Y_Ww)QWgqs24vI}oT-My8i+%Hk3RfQR zQ9fV~Qn$Y)YhM*_-ntb9SZJnmq`A2no8JY>j@P1vnU9Z;3!E8<@$#TN?1NohK>-mt zIr-}Px}v|oL_G+v#YDB|HjM5gF=DZZwBqr;?~v^($^6sB_;70 zmR!lIjvcQ^@^!cZ%x{DkV?XGdnrc{CSw$);`CP35Da-4z%*e>VeAWJ>rv{i9Te-RE zrrnCp%)I>*C6Sas!ojZoAMEidZ+36f z0ST?Wrhh*ByE}K-(QzbSt>ouiRG}dc-KS5V7|b^Aad6mSS~_&ysa9LOSN*&gH9!qJ zoX`S&;{h%#bqnR*GFLrcQd;^AJV*BG+`B3y35gV(IBGp#5{TsAj-`7L|ImN5I|jgQ zoX|dMU)|jymn)ma7%VzjtVPvFyEyu4OLBQib0sXPh#i?&fh@8hP zh)e%1~T&vcqC;Ypgf}9%bKT)DNo`ug6_vb%`;2J%)%Uaq*R>1C8!H(a8fsu+;qLPRlz+8VXOx0K3Anzvv7tpxOn}HZ{vaPZusKth+9A)>3Qgh-9YEK{ny+GV5w}O6lK*1#0L09 zE-|q*BvM*NCNK_k8j^AA&kz-^fHIFa8@B|54iTwoX_ahI7a|UXxjJ0emK^8^W@2K8 z--0L28cZ|NMI0zZ8OixATH;y5&Z(c4nJGMeOaKt@QLpGuvMRcf`I#TiR5d~y~ zf0gkKOg{FtZJGO!e@)Gj?glve zps18_%Rh>k8Z&b9B>(n@GwU`*&K;W&BhiQkqk8L(V}&mMah z0=D8&tte1hA)6kul#SSV;x3D;)2ETWBO@ai_+5RfZfYc$OUwfyM7tM$w-vUvx1XmB zJC1xN-u<~c{71GND}WOSPX**a@zEo4ZAT$OUFMfouqg7F#W>?qnI7c)_F}(4D}JXS zdZXj@jmX^z48~)3Kl&-fYc7f>G&gS&X$7ilY1!RvJ-GuS0v2nD*FE@P-7t9f8)wsX zNb;beyte+@ldMU_$Au z^F4I+=%_)S+(Jnl*8uUG%*>x8n+>1^9d)kx=BMPT91i@kWqSlc(*|-r9#SkN;fWQ& z%`YhMwpPnTqko*rzvW77`_mM7Gwf{YFWiZNfgu;3gy-ITaEp^s8V<+I2G`Dk#J*{2 zl14xDjZJx%ndy2c@fSp@SZZVglm}f+ZxNh4?%WJw0zDjs-v?p&Dbwv?71o_E+#pB5 zMfLUd&E}J19Yl!05yLP(etv$+CMJyTjk$2?dd~&IYu~Ik1yXchGreu97A_Xc2^<7k zz*dMXQWB{2_wm+3J-HqvC&4xqBz3bfERBkTC5sx6B#|@}e+<1zL_t(|+U=bMY!uxV$G3QKcQ5V|oCHd64f=RASOURa zi)$cA2woE09fDht;%>nuSa2!O;&9*oC%gOZPG@F!cE{R1Cplj}wzE4k=Qmf6jEym7 z;VxYqVW|kZP{c4*SB+ZDIE~EJR@P+V!Yi8L8oVf6T7=CE+;eeI_HB zs$cEe&JB)TLhKq##<7HgLx_WmEs>+|b2}&~D2UanRf`QCJebXyGlx`T9WrDH3k?kw z>?{E&%E84JCjMj2oHKA! zuXYzKSU^@c0#3t*4c(3#J9aEPcI=p&HgDeC?U-rPrjgane}J=L!-hD=^z7M_;1C>w zLvRQV3Be&a1c%@d9D+k|NC-~A!g>7oG5h=XFTt@IoXeLlvrL&Xu}+;jvF_cw6C5kR zsavyEw$zbj6AlWNowHeEjJ>;Wro+6(vmLTeoh_zJC4c)pxF4yT-?okm0}McK2-e9wr$(odH_IG+v+R_=hv@aEJuzUvS9M$$s_o8 zjFjQSe}~7pjtm(xumcAUNFG0F(j>`bStQab3E*wqxRLGJwaZ#?;JZO4@Pr8y;yBiL z?bWLnn=)kzTeohVFwOQye*XOF@tBJjFG}T9x;9~_PoM5O7F}1ncI^~f{h~#SB+qm3 z;6YZQLIvR%Pp#50I7sE_)~%aQdG)DNr)Eo*e=PCof-xSXNt1?k?AVd*+qX}0l7Uw2 zO==2&+`W6(Wn3i%XzX@4<^1{ctWKReuD_QkQNlXi+SI92{VIHb?!y<~PUp^@-F_!? z=FCEiJ#pfMYiyV}aiXg0Q1ei2-MUp6hs1vyF=B*u;3$nR-m2OxZFGmpk|mSI zVnsMzx^%JDR9cItc-5*^USDWLM1*Av2VrewDL9xBN#%qVFJ4@T!g2n)L4yXuKq@{C zV}nz6@7~Sk&z~<$5S~AOF1d~bT)YP+w`jDoE?l@Ue!y9?W{u=DHf73`!ur6ISh9c3gtPcmRW59p`e~OAa zVoHMPD2naH7ck|@m5ZNlYG38Wix-xiG8-L-XE`_!?Cu(AWQ=u~Wj1Njg!Sv!kM-~0 zpLOlpRhW%pwh6yZ#*7)`d=Hze0S5;H1L+N=TD5AzZZo`|-pGv`H{AB(Fv|=`I6r>; z5c+gIpdirE*8s;VRjRmtNAFlXf6Kyw+`D&AF)qOu#cUEjC|_m9j2UhzF98b&vU250 zP2s>h>W{#o#*bBc#^zZb4g@;|T7b!(J-a4bEvUX|M2WI^0SDcX6b#P5=0Q#T;te|-7!MaU)f z7tY9$BYiqIf+ewQq2$lP4thYsK_00VUE0;FSG_*x)2B~`07QPliOB@Nc`FX0eDL5w z;K32sG4Mt6=g+U|oN^&wc-aOYidCRM0oUK)cM3Q-yyMPSg~LycU^@p3OvJ}IeNx!1 zKtMb%Lx&D^oug#Ql7R&We|uS4bZNte4fE;zaF4@_iQl;PC4Se^jqM zFu>#AbAw4jK)^xYF7tvP)rxn~=p}vo_H~^nBqSs-;2>&WtNpZh@80QlohWS1pXg zYDqXKudf#v7!iUzQ}N$0W#@e|XaSWgR~D+tBQZEKGEy*Hbab?E3|9Tv*~VwcIB@>X z_U+ph?+=0Q$X1ZMMnv!^xid_IgBwTCgdSjO)TrUMVn=HcSB4h{e83?ml^2Adcht)9 zr!WLcIg7uGe{1^u`Li{z3AmjY(e6BE-j)DN`oS!W70rD=Ji|kXPqYDnx|e zLhzyU9F;0nax094KtvQ+!VL2M{ri$T*`~ljQ6IUd(I2f{ySCfYh#TgEFnC4ilhS?| z43A{oX3d(p0zJek6?cuU57*(Gw3 ze-)r{v;4r0fgY*#QpcxHpI&vGSxiif5YL9$9>%fFn>WWf1|^#1QYQIS7NrMs&z?Qz z!9nz7)22-|YdI*8B(6RMLpEyENVZB8ZvZVtsotEoipq+nk2&Zz;L^oY>}#MP(l5j{ zIN|8xf3wfTilBJC#G4v#YGNJ?h4b;_N6GF2(^uS>r^P5rKq9Ce^$w(p;9b9dofR!w zRQCIDE9)uPYx5TjW|Gc0Im6(fucpBWDANGIZLbT+__WmqbSXc@R}I8 z3LtSe*OB!c55ir$Pb8^+G^!Fe?+|GR?gdGT^CSnSX^^M%*2VF3N z;c+agXo&++bcch2Ll`UM42T6E25C?3UTmSDJPZ6jo+3eE4CLcz<^A+Wl(O>hfGQOg ze>bFC!&VKRCjKpmQi?SK7H}vKf#7qbVzg@2N@yWjvu5?GYrs?Jsm6|xf?1`~^`h3C zCAM!qeflIU7QHpJnhLil<|Y$y6K`-@QTU1y4cEvFf!lK#Ip3p#%bLY+pRqO{18YHZ{ym|Et!LhIq z932Jm0hpZ<9E%B(ce7>7CfE-PXM$r9L5&@;)6JKRH-e+n;4kIchFh9f?ENW~f1)Hf zI*GSoUno8y2Z-S4Ac(9%27;RU)KY*5jt(LhSfaM76~WO##DV#E8HF?J8UcpLdli>v zmMQ^5a14Nh_%{^2m^*i_>zGlaMiCsVz!3|*j)q%Tx=2Ix@CyPA~8;o z;vz9#fr~9n+}B}VuIJk{Nd7NKMi#Gw911SBM0SmmN`yu6y72IDq2L0kY_x983>n9CF#mNiasH13PyxFhCnK4nC+u3t zjR*e^2cRHFE1GZDQ`DMt(-?<+VdwU+yO_oQ0IJc9cJCq}j{pDw07*qoM6N<$g3+yG AuK)l5 literal 4798 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 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 02.png b/examples/resource-bar/assets/Playing Card_Diamond 02.png index b5c65a0b9a9abdfa8030ad09808eccacd333f489..30bc42adc061f3b5589c3bd025122e4a1e6044a4 100644 GIT binary patch delta 2176 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 delta 3687 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 FV1iokPImwR diff --git a/examples/resource-bar/assets/Playing Card_Diamond 04.png b/examples/resource-bar/assets/Playing Card_Diamond 04.png index 210b18a04d180cb281699b1776a163c94b9ad9f2..bea1b5c3e1128ef23e00977915387632b3e6c693 100644 GIT binary patch delta 2430 zcmX|@XE+-O7{^16Sdo}@Vrz|_I=zG#Rg^A!Qzul1t@a9HmNrJs+N5cj=@RBz0C$vlo?C5BEIxe*C@v_v7#Rzpc<>;m3;EFcCD5*>z(>yT}h4WjrAw_TYFe zx?37YQsSeVNH1@RGX_L(8kEi(JeW}+i&g$|TG`t8T|7J8%EAO>0y-m<{CHAvPSz1C ztCfB3PQ&c(w}ZRF;b)t4Bf>o=UCAQrin<*?y5bt#y0IUPfCOOvjr-M@mtwYc*dZ*V z9?r%}EJLFn27?W}&0FGC4gG^ZnYQFBLsfsgoPL@uUrjTQjS76(jP<#^V4T99s>yb~ z08yPnl6i!|C|tjOUGdyG%->5(PZ_oDj<3`y&Ky>^;xTt$ZFv|Ov8$-4$SL=m1_fy} zwE|^n9?p>O9x*X`Dr#ybHE?WRe!fNr9}OUGdKbNg!Q=5>bwD7+6~Nu*RQgW+o~I}7 zxxB1<1RIn_s#x3E*%`NifM0bCw&S3nCqLi>=4oo>e2zlrTDcS}YR1)6v+`>RZ>B;B zFFy9!?WE{%DVl3U-G`x$FYgbaby|~wZcwUvdFrTCTixq|CX^lAu4VKU%gh`S2^|_+) ztMvWz$TQQg@p20KU7+5>$u!u_H@BCT9}B#?GnsS=*^kPjN0b^y^}W+?oojhze%gx1)4Lh8PBb` z2T*(brYVC*KxFg)7%|GTD;<|TtD;r+g&Ax05Y}5xmr@_? zC0*v0xg%!AIq<{Qa6x^izoYklNOA?2W$6pLkNC)ykn|E^bR2Em+wynlfp*uxXrb@T zBv?m_Ys7X-e01*L>jkaOAHCxI!NcyUWx*R3noiAg11;aL=5lgKtD_7qu7@_k-8=|8 z!YtySjH|oWQMg&u_fjAAF#d9q{tG;f=#_Ke@wj)7TE{c?;s8X@XJzh8bo%8sruY3N zBSJl8bMf#an)$wU45BOO4P&fu**aWktTdbT8nx3XUX|t-DsJ4IyigR05iHS)T{w)3 zSg~dXU;5nr(;%)_D}+GD&7yZT39l`mgvkUPs_rW3OWkhlvt@}YiAXmREexY<))&Ej23vFBagL@TMdV}VPc%l6_mFb zG2x0(C&_qY^5M^Zbo>0}+L%HJlF=Qe8%}G}`XZ#hO7>(gTMK1)3s-HGdp5)&d3~!k zM&xRZ8dmAo$Y_DZw}0RSOPsN$4vfX;wU}w)FlwK+_uD_|$qbxWEzBU^zz`F8`1m}w zVb&CjabTQ|lUT0cd(W3T?5x@VSTmK#S$uqX^d~vO*;3P)(+M7_!n}@L82ePOyY1S3 zPajc!Dt}1FQlO+hF}*@`tH8CrFlseu(Ix(Kk6brjB-*wu4rtBIJp^{C*sSYZX)O&< zcz3I*(!9t|y-TV4`-RBRz!VeftY^O`d(#jP%#~Q-S1^1A=)0sE(T03t!X4`cS1quzWj{VgHwXE_m zK*37E4jqCK<3#dG3BA)bo++J|d62=5I|T|Yzad@kwv7Lj@;QO)lNDonE-m2fVtBbw z$vow7HM)i8DV%~`<54p9zU@jM$6JTH{Kk-?o#`Aabn_^W%?y|4IDzQ)W1 z5Ih$B%8FVjF%s+}Y;4U>^M+hj!C-?^PWCJn8}?s)6bIQ7z*cnc)L zKo_=e_Eu?E%{$ibZxjna#gKe5TjO|~=$L7r^w$2qr2QtjmIjN4`P>)Q`-SY^%;=|$ z@PbS&i&n6td)%pYm(E5(9f1QHnyGEAf2Z16-pc<*FEk;2l@b*QI50Ol5ulI<1XVOT zY(Q>!FF-7siI6M4qN--5^-DJ2cPqI!D0L_wfB)~OMs)fZen3vZ{(i%FCT!Gv;Y7A literal 3639 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 delta 4351 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

MNpQ;8|?`U)g zYJ@TH_;jo||7(A6cXvZl%VtnD&h}waQw)bE;{cojP!n|d$Pwq9S@ypMbM57(yT1{> z_frgjkXf&ik`j~VU91q{d;fv~u(NJTad9y|`NW=W5ia`Jym>Q4LPhG^D1co|~Hf zjwmfHMM+5sii?XQ39}JEcS0!zAtV*RSE$o5a7h@a0JNr*mNEc9DJ=!?$e9~1iK7C* zfHQgkl+v0DKq`O_0Z{ik=hp@R&Fktx=vmwC2q6SO9{}k9t^?2pKw=M)`E4Qs*ahHI h0L1`S(z6%D_zfe^T@XI(N^Cg9?

$3wQt`Z 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 diff --git a/examples/resource-bar/assets/Playing Card_Diamond 08.png b/examples/resource-bar/assets/Playing Card_Diamond 08.png index 29e69034a893578d86d00f5e855820bde91f6393..6e3a6bdc652bb0325e742447d0ba60cf1e75a6ec 100644 GIT binary patch delta 3687 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 TFLzcS00000NkvXXu0mjfwk6w` diff --git a/examples/resource-bar/assets/Playing Card_Diamond 09.png b/examples/resource-bar/assets/Playing Card_Diamond 09.png index e5e3fe67978dc1cbdb2240c656f092b0c3dbc0db..9586c0b8dfd87348c9707719249cb6d27a7848cc 100644 GIT binary patch delta 3467 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 delta 5822 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 o;}{}e4x+=P%4ko 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 Z{0lv(v|F~luNVLT002ovPDHLkV1i7Qa5w+} delta 3151 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 diff --git a/examples/resource-bar/assets/Playing Card_Diamond J.png b/examples/resource-bar/assets/Playing Card_Diamond J.png index 99dbd1c53385fc16e2ff9be05f2cc2d80da41e23..45027abb55c6bf9f702b049b84164f72c47b6c07 100644 GIT binary patch delta 3083 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�pxYk;6wq*EDLkQd19q@*TyXSo)8v#Uf@ z)+EqcBzkPPf7)_|KPW!wdYBBH1fmX$zUk>hM3SelddC`Bh3IdGvPM2KOgO901O4mz93 zd>w1^!7aw@pbE9dK;Jnrmf@>2@rWdAs`>tik%WVkacQ(UNDC`x^f+hW9O{rQ-*D2>N$U97^z*hYzqZ z4!pf=kwnB#m}KtFRKOySs2&^-da)H|lYMgJBbO2ZMBMMK*wB7(9;)#icjY9o3Fij~ zr3UBHXsF7-B^h{1&TW5pDB_j-g>D78*{fduXiuz#EVtH0N_9-_|5tqN_<{*xYebkV z$g}O*URlh`>86#D<~ummD!nJWV-`gdUM6Yt#Sx{$wV#V5R%lp9x6Go6(Puytk`Dna zeX_grm$igDOqXXCx>v`?cAM~yVnB!LzTAZ0W2&t8qq3$;e@b)aH@k43 z80@zKy;4dRy%;%uou|T|-T>~Gr|(Y*_&wVCC#^YHWM#{Or2D-qj%eYVczuBJNu zh^XM58StZ=9QETz0VgUe6Zz~8A+7-zDl3y;__@+Ce$iz1^}P1=h0_L}CEl>H^MJ~W zh?1j?XVaxDYfmGCr@QOUdLyo+;%uwCaIK}6*yGvM>9$N*X}{)~tj!&lDrjO|5a-H~ zD@_7db|wwU>Nu^_)E!Wvy-1{UB*R?tWr{?ma}#3z-K1V`o_Cg0kOGk+m`ww#Rd96| z_R+BUO1<-AvaC&1dR=|x;I1WffuZQ=zPgZg&l1r}t*J}JpZRirpz5&2>vc-tN?Y(s zHt479n`)ufJw&Rte$GrtkE=m!(G#CU_@KSmdkGH=HtNE#)A$B$dwcyll|DcI?HS|L zz-(N0P_P#c3D-;=NA62725{bpVja|#92e->T!)ANFU8TQ;;`OqFaZ-RAsKhIa&(E~Xvh#jql>E$x9683I%teS?m(M#Vdi*ACpx40~R{jJM|TrvlK z5~lYzs7Ad}t)wVr_>id&Ma7oucs#vyeEur*^oLwwrlfAljf@C}GAtO4P|s4BvCH&T zwMT7A0{4Z#QzXhN`w6vHl99m(+22QFQNQ6EVsg7>@qp=tNcs63Z_`QwF1Gm-C1RCl zspeIj!4Ar%c}=UG3pr+<1tzS6*_8n;ky3kKc(ospj@iLIG40%}HHM-D;q~U!2fEzD zAA6Nf2*=h`DKww^PIoqoM8g8O(ma1sMtrJ&mmIRps4LS>uN^ibCJ9yqg75f{U>@P) zm#8})9BXCNJM$@(dK5Q^ToOg(|;m?T14I}Vp<$8g**^q3hI|qms8o+{tGY9j8>55FyTTFY*CvY z-(kygpo#CWsHMpsrNNIBXTZaFs@1RHg*rCDzTVSn_KhZiV`R#<*|GkhglD4;VVnv! z>p`ZQLbp>uw^+$`P&~3{tMg##YoJ`pvFn{}{jJ8if!T!jM86BHj(ezcvWR^&M*-o}9Qp;xwL<^T0lXA*Mur02NXNlA_W)LM^5129A9 zhqHbT!O}K_PJX`fS66HW92R@qur>Poj`?JhVz_&o0so79RCo<$JVuEsV|S0Y>hWB) zIul_?+ih&?K6CTHh_pub|ebcdeQ9hk~HSzD&pslyJu|LFio6wGV!>vv0^G**enVJWr>Y#28 zi`GmEoM`u3#Z=qY1IlnO3%?0z&baRf_S_jrYB?JWW<2-h&eKe1J)tEzt>X5J(#tp( z3j3#wr3Xc&dx!Uu1m%%l+4KSj6Vx$ED@O4EvBUU8wy%jAk&0sO5}u)`t^QP&Y709n zB5z@LdrQZ4F;);^GB(wgx9j*|_VB1O@71QPy}$WGU;u(_skkdH`$FRVp-yrSq$Na~ zbCls?H9Pa9mv>k5v^`18jt2WN;a+*w^bWP`F;6A)C2Q1b>C(8ZPHYJJaH9rz`8eyF zAObHA8rWWuEUJ_4yxw~%#V#?y?A&n6UM~F==*756iyOLuQaI@u?|W7e_D)j%dcyr@ zpAVjkZ}!(%snI-AqYGvX1Zlr{&2qY*OSviy+#V6Ynju>xhQ~k5Q`f|B!&>iV#e}_Q%pIP4C&*I64 zLh;zA%%Zbhqvn^m!&hY=wIHZ;+N30wyQt9cl?`m|wLU2eA@Vz|gm;K3sNW9VRxhIPUY>VN zG8a+;AN#G*AJS3q)xT3j$!3(jVR?F{=WA3lJCo(Y{PY6ZcPPp|Q{og>LpWGzbRtIY z1A3=r{8yRMI8_@ZAotECT>Sn?zDft>Yia2Yu0GLVscC!-j*8CtcCaeOd4J@kELn-S z-y(39^Sdx@plXLFTbbK|7ui0i_HWmDLm6e*V65OBq%}Cz2?TC z09?DsbjIaG7{(4SrJcUGx&_3JR*7f~Ph-WUfSwy$5@Be5s5*RXcLKhixjqwdP&T zZYXdX?UekqX8*7PoB{eN5K68-#1&q4^U9wAL=U9J?PKx&Fy>REJ*>C0>>2h z4DVk4V0hWQc6a9CLR|Df!%MwP;q=gTso;Q_l927Vz*Efb)lty3XeTaJ8Tm-mEq`-( zJztkE6`a_Lx+&vE)Q*usp*92IfS zGnT2vtwBPvlBtHe<MBH`GnvjC1VRf+m?>|M7iiXzXdEH0r zk~7MG@t`87kZ09cBPNidH?a2x1LQL0%S$b;q~@F3UF`ae%sVQiwLf!Or zqzeUh{ZI1IE)Ku}`^(`lWRJE~Z)KPb__A4c(m8(LGxKCZGArGmdzr=FbOgg|w34{b zENFu4=I;-RRM;X}kY4b8gC9Rd%{A+qsU`|(!B#*zj3-RiI-^~0`+xWwa}Zvg@1@=Z z`Vz@FT}v)95C!OCQne>~%o(3FSgs%Rp7FHOqm3g#%fj<|MWSn^(sjDoCM<|hF|KHo z4Q|H&h2AK;|Ks}wxi$R6b6+J)8hdI~{yx2f<;GV?Ru<-?iO^hxh-;O2=RdVdaPWzd zM5Ngqt7Z7#I-~9vR8D;=5$m)J*z(0(g@Kp*SosxB^2lh#oY z^3%^u-|OKszt@8QBxl~!81J)`TbP^pZ-duXEkuK`rS0p*J(HYzxDib9w>;Y*N>Z>c zb_UL@jqHqR_|aYGyH!?Yz(SqeXBbeu1AO9yYz6K(2JB z*pH9=%~z&H;!xtN&lQ~c0iiBvjiVKJry%Ckop9e4-^hZTpYT9m@6;K%Ma=yG;A^ya zNc2TFs|b~7c!l20+`ZVHQLnzgt89XXiAd=lT_cWXdT>C%upQv5rms8qZKH)1D$ kq-jngN$s3D-c4ixrCgjfN3df^lNK@~eK4>__tEqJ0bzOE7XSbN diff --git a/examples/resource-bar/assets/Playing Card_Diamond K.png b/examples/resource-bar/assets/Playing Card_Diamond K.png index 38176310a741cb9016c6dd5bb5c9873ed0faa2bf..a741a984e358c080f6748c4d858ab7febe4bd56f 100644 GIT binary patch delta 4248 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 V!?Joh`n3Q6002ovPDHLkV1ma3cX$8* delta 4858 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

%NDk#(o|3m-)02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{01a_TL_t(|+U;G-k|j40J<3$wN4LiwV;eKza1aC#YzTrq z!IqVOfDNBue~N#B4L`t&JwHIO0<*yoc#O@&;9@I3!%K_jEmPzDxrjVHPnjC$&*@QrCYgTV0HhCo z{VV+F-M0~&i>|ssO8J<(K{(FkbDvd)?i&zxN@=EBeG$)6W-EvGeEq+@e@Y24rBd$k zb?x=!9Gr9Yn)ZMFt>@@vdYW^Xu8q_6TBaUz&cQPwB|u`V=l9&|`C6CFdIc2OF;nHz zc)z2(BSB)qW;GxI7|OMJZ{z&-I45#n^`&09xaoA|_A1fzZTRTpPx0aJ{s0dEpM3rp zKX~UYoNw3I?Z=~vPcM~cGqU}8?MtV`v*{!hPz{2j%nRgc5NMEOmGe$a&W1uBK8vVIi*g_ z4on0hSMK2oKe_(Z%Ot8YNdTCxQ!eBEW#GMSE0Kd|M$*XQYM3>#cUH46V`2?>{#yH`g~G%kAtGyeT`DI@O1d2+0*C zbkhr%76_dbAywJM#_Ma9FeM;})Osdz2r`$ymOpDV9eXsbvgq#^Q}sGUA|%G#Cgl2f z=FCTo@ScH`5MqR9h68X2vgoB4?=KJUT2_z<2@!`eASJ*vA*SpY#F)TLi!VOo{F~?e zVt1I;U**U|Gp9`!>aHTvcI$OZk?2yi(ZBBp&meLbL)MwidYFtxdxJ3uoO3watgf|A z^YCnb%qKchs6NCd=P-C)v~F!9TC3lC1Fk`6a_IQNDw&W`mjtd5bxP|zbm}!wJ{>f2oXU_ z5vegQ_N+f2&hOtls|KQt*!rwbeorTmrjg4vy|L)iaxEv4Y|meX zA66jtMX97d%=%p<)be}9)3%CaPg3ipbx^8SgU7w|4bCn;4Sn#ndsK@>6G z?>O)4vo)Bx$~KG#mw!-Z+0woIknP)w=hoz?!mhxj$;D(_Gut z_jxF1D*N`l_T4^s#)G%+S3?nkz-?B?kwz;(DS7O{Gami-DgOMof8wK$AL8#1|AT?~ z*+(-R{c`xKV)Fy2p#ckg+YeK5{X<5}PBN4)pTpW~IY4c>m^ z)tRAg?SyYFH`Pv~{CmCfINz@Em%l$mO37WqaEdVA4Th6II^V9bUin#{5_Me^v@{~4 z4QsR`)L<|e40jt#Bj@@w7-_&1yO9gmjTkT(3!_14DUaA{?E}z^p3?l)dNtIk@$O|_Gs$2u7z|$;+C9OPM|t)0MSOcAkUPJ} zW|*46U@#a?%V+?Y&C!@Gi87st+3dfi*@y;%!C<)CXlL~go=esVOGcwi+F{>aY=*;N zFc?n9U^FZ7vab^jmyJf8W_{-MS;$gU27|$HBFM{@P@SdU+Jz&dp@u@jSbNS527|$H zde9NH62@vkj*Uh!68l52ky8eP!EoXcM@k9%Lzvlznb8=7fSIt}ZfZyp>r%XPXBVwr(C$g1eHx3AhFX{XVXQk&nb9y942IJ) z8oGt={xBY8otkAt@@J6vOnb;03uQVid`vzG6IzjEJVb8BN0x&HHSa3BIheMdZLlU?xx* zg1kG7*pGQsS=*MnXKq=mMSpwGweD5;<&#VKRd2KoO?ohh)OJdYwOzV!SSu$gbtdQF znHSTFb=$_$=ITM{+?;Ozl$PUHw(A+6A`w9%#t^U{11@$4j6o2BAT=`4Hm4$YSL8v> zr}vyU{VH;4<*&RM=eN)KW;MVw8Sf{?J2{8JGwz*l>eP$2uC>i`Ym?wTLnLDGj5ogh zT|D^SyNfUWlp>rXq%;?9wocR;2mw+;jFM-W#|Q}{!nns61cxyo6p~_`8nqfc)+>*1 zz4aXsab9sz0>XH}VSkBne~I0G#O3~gi`@ac{aA&fgyqk?F8ts*D-BZ>`rz|@*$-g$ zfOGJE0Q(_FTbEDqz;xcN*eAxeNq zs4^N4x!nCB;4n^0ytEJ3YVf(NVGZ^JTxl~A1J32oj=Lq!l+#%#I;@&{N#<;SiQR68 zi`@ZFp6+lML)U()vek!D<-m>4G-shv9Y-q-y| zQuQ8MrS8vfl|mo3rHPgL|I$7uD#J0z5hv}vxOhqZy<1MMI_8Mr9D$iZoRziaLBp6A zHj6PE7Ln=%gvJ|e+uWDY4#c3&J2lR4hjZmrB*Jrffq=lpn|8$Y}k0H z_2l$FrtA%^hDqVI4sFVEse?`GT4(uO?fbBEUHWk@{i{lASkAM`;9M zyubXA5o2 zcoI@_X^}MTsCt%(j>r8z$D~{>uj6BJa@7{EiQNjsa*bxRUc^mpm{I}2C=m|8?l6MM z!NFabQk-(H4Chf(6|F2?sl?<-%^i{{N`-NL%be$tGT94uxi=TP-M)JD#{1pn{knQy z><(ZeJb3ed?bCSQ0UzQ8hAn1dFc=Ik1U~pbfQi`!G+2&a00000NkvXXu0mjfGk~6i literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Bar Frame_Shadow.png b/examples/resource-bar/assets/Bar Frame_Shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..c32155d0505e6d525eef0e5b8bf95c24caa7f4e2 GIT binary patch literal 4289 zcmV;y5I*mTP)EX>4Tx04R}tkv&MmKpe$iTg4)k4hEFskfAzR5EXHhDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RR%KKJJsPzojkd?N82(+!JwgLr1s z(mC%F3#=?D#OK8023?T&k?XR{Z=6dG`+25dWYhD+0jVfq16NwdUuy!hpQJZB zTJ#7AZvz+C9ZlW?E_Z<8CtWfmM+(sN7mL9A8GTb87`z4g*WBLP`#607veeb`4RCM> zjFl*R-Q(TC?%w`A)9&vFa_MrX6#Z@F00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru

%NDFP&&Wl;bC02y>eSad^gZEa<4bO1wgWnpw> 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Blue bar.png b/examples/resource-bar/assets/Blue bar.png new file mode 100644 index 0000000000000000000000000000000000000000..37162d39d9857d19ee191a96571dd1bbd58b3ad0 GIT binary patch literal 2910 zcmV-k3!(IhP)EX>4Tx04R}tkv&MmKpe$iTg4)k4hEFskfAzR5EXHhDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RR%KKJJsPzojkd?N82(+!JwgLr1s z(mC%F3#=?D#OK8023?T&k?XR{Z=6dG`+25dWYhD+0jVfq16NwdUuy!hpQJZB zTJ#7AZvz+C9ZlW?E_Z<8CtWfmM+(sN7mL9A8GTb87`z4g*WBLP`#607veeb`4RCM> zjFl*R-Q(TC?%w`A)9&vFa_MrX6#Z@F00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru

%NDIy>9MVSBq02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00}lpL_t(|+U;H2a@;l&J+0x~Jc=W2vRlcA?Eh?4em_;3 zDB|z}lD!Wkfo@zloY;vqGEn6zn*#!kzMMYY7|HbC|NX|81`%O*I$^WhV^b8keJ}t* z9(jCZk6XYNej=&ZdlFja->k2AK10|1~pzn~x@9G{=?>8GFZ`0xMV z`239h=`jKF8ENjx-LJ3iW<=+HKyzmg{+c@Z*8cksigX8#(;I`Pe8Xn90|1!1Mtwe` z*qu%|{O}paAD?i1e#WQge_{XlXeZ{7dxzr3_Pr-neki0(9pD$)g zcHg#WUSF|$JfYa^_9zYqY>!9mPbcgjAF(?Q=XzK(aRyFH3cQDC#(PJedT>~<*j`y`Y98fVNLAdj5ga)jjZl{`Z{ z>`W{0e2Yy{pcr~!=zzWh`WEOLpx@3f5+J^cV+XjPw`7TrW@4*I2!6B4;2bFmVWq zSdf`mqv?`9tvjv5j&*oO(>@$`SvyC6KD5Bl0KFOi3>{(UfnqSg&=UG;1o*B79tr|? z026~a0j3l=^&H&OGsdVd`7C-WX02EjQ9r*Ylx{^x^`>Qz5thA501|^IQH7yX05%K6 z?50bR7aY%>#RI~5UH0_LLfFXjdH*08%%~}359ZDRb1iA7beBvtERNwhq<=0VFthM) z0x^fkPeR{t_O<))df;W6_wcfI#8sKb5Ds)`>?(Z~x?yn^s$O}k2 zLpqdyw$wa-O)OCMm{)4u={4lKYvoJR)wn(6i5S=EuC^sZfMH-uL}Zpyr1oO5K6^b} z-xvJ-m$Onlf5qhBg|ZPzJI>6Gk{7e745=*~^SiX(wC_3pN762Fz36qdZd3DpTp;De zq;SAre_ex$;UzBRA1OJmmA)|<5@mM8PXfPF32UiTik+MmaYbUOFK=%MUCA&Ppsz>5 zKD0nFOf4F7A#^37-4bX3hAnJ188bP1@{0{;CPt*0xhgwp%7`qENRIK%i8Np^LV;?I zE80j@H{&|&$QfuffnY$h{0yBn-K}aMliLyxbaa?spBq76<@yBnrlTq(SiJ9p?1iMHlTfm;XhM*v0vzjP%jQ|= zk>ImjQK-wR-hVd7pZV zZHjU6)dq9Or)Yr*uIUTtAac8gY*_ckq%vtGU!aA`g^>DD2Q7hLyDaS;u1f+wIQf30 z5>R~$x^fm@kJs6YlZPYk_*^o@HYvh-efyH@fKY7zCEsDCTUj}u}PaI?w0NSw|`E-#+;~grRXKD;3u~y za-`H0y+qM%0aep@_XHl!Ic6K?a+MHlERm~@WfPpm!@#k`n%@1P2=Fj2$YF|Yb$R!5 zPwx8m4Ms>IOyElxVA0G?z0Tik+SO zu-RrO%K?_pdyhKIN&UMVLvKcqFJI7H&S^2p=P zK)!D)G?z2#KYvG4z5vYQuNrRO#@{>Kn;NEi#b$fRAfHDbdE{|#AaCliGgH1;T(|#e zNc;AJwmhTQpRn2P@$gV&t>uwN9(mjg$PXQQ)1Yfg^{u`C1D#X^We1h>JOBUy07*qo IM6N<$g7sR6M*si- literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Energy Bar.png b/examples/resource-bar/assets/Energy Bar.png new file mode 100644 index 0000000000000000000000000000000000000000..a98f6a81e49ff9afafacfdd661b55e85b36aa7ab GIT binary patch literal 3086 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 literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Health Bar Box2.png b/examples/resource-bar/assets/Health Bar Box2.png new file mode 100644 index 0000000000000000000000000000000000000000..e02e8033917d6f3c47c281eff86506bb9d0ecda3 GIT binary patch literal 2983 zcmV;Y3t04tP)Cj00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002eNklDkqreX5BN7P; zcJrSU$ySu+{ktS*sHy-Eg9`Z@s+!4$>dQ9(imwm^Vh3dMFNdAnyN4{d3!0jNQhT=VE{idP(%Hx*+(Q zHX*wv(;4Hkp{BYp00zJS_^VkM>$>ryF)2F@a}usR3G*zdV)ggmfOr~;c#%T#MMRze d009600|1YqWT#2#%)$Tw002ovPDHLkV1k-jj7k6i literal 0 HcmV?d00001 diff --git a/examples/resource-bar/assets/Health Bar2.png b/examples/resource-bar/assets/Health Bar2.png new file mode 100644 index 0000000000000000000000000000000000000000..18a7e8e70b4097ff91b53014cef538470fd7d94a GIT binary patch literal 2845 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", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "UnitObject.Variable(__ResourceBar.UnitID)", + ">", + "Object.Behavior::PropertyMaxQuantity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "UnitObject", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If no max value, delete objects greater than current value", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ @@ -15150,7 +17988,7 @@ }, "parameters": [ "Object.Behavior::PropertyMaxQuantity()", - "!=", + "=", "0" ] }, @@ -15161,7 +17999,7 @@ "parameters": [ "UnitObject.Variable(__ResourceBar.UnitID)", ">", - "Object.Behavior::PropertyMaxQuantity()" + "Object.Behavior::PropertyCurrentQuantity()" ] } ], @@ -15185,7 +18023,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Update non-empty units", + "name": "Update actives units", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -15204,15 +18042,6 @@ } ], "actions": [ - { - "type": { - "value": "ChangeColor" - }, - "parameters": [ - "UnitObject", - "Object.Behavior::PropertyActiveUnitColorTint()" - ] - }, { "type": { "value": "Opacity" @@ -15233,6 +18062,59 @@ "Object.Behavior::PropertyActiveUnitAnimationNumber()" ] } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Color tint", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only apply color if it has changed from default value", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Object.Behavior::PropertyActiveUnitColorTint()", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "UnitObject", + "Object.Behavior::PropertyActiveUnitColorTint()" + ] + } + ] + } + ], + "parameters": [] + } ] } ], @@ -15452,8 +18334,8 @@ "parameters": [ "Object", "Behavior", - "GetArgumentAsString(\"ColorTint\")", - "" + "=", + "GetArgumentAsString(\"ColorTint\")" ] } ] @@ -15473,7 +18355,7 @@ }, { "description": "Color tint", - "longDescription": "Use \"white\" to remove all color tint", + "longDescription": "Use white (\"255;255;255\") to remove all color tint", "name": "ColorTint", "type": "color" } @@ -15498,8 +18380,8 @@ "parameters": [ "Object", "Behavior", - "GetArgumentAsString(\"ColorTint\")", - "" + "=", + "GetArgumentAsString(\"ColorTint\")" ] } ] @@ -15519,7 +18401,7 @@ }, { "description": "Color tint", - "longDescription": "Use \"white\" to remove all color tint", + "longDescription": "Use white (\"255;255;255\") to remove all color tint", "name": "ColorTint", "type": "color" } @@ -15666,7 +18548,8 @@ { "description": "Change maximum units that can be displayed.", "fullName": "Maximum units", - "functionType": "Action", + "functionType": "ActionWithOperator", + "getterName": "MaxQuantity", "name": "SetMaxQuantity", "sentence": "Change maximum units of _PARAM0_ to _PARAM2_", "events": [ @@ -15717,6 +18600,19 @@ "name": "SetCurrentQuantity", "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prevent values less than 0", + "comment2": "" + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], @@ -15729,89 +18625,40 @@ "Object", "Behavior", "=", - "min(GetArgumentAsNumber(\"Value\"), Object.Behavior::PropertyMaxQuantity())" + "max(0,GetArgumentAsNumber(\"Value\"))" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", - "type": "behavior" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Prevent values more than max (when max is non-zero)", + "comment2": "" }, - { - "description": "Current units", - "name": "Value", - "supplementaryInformation": "Sprite", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Increase the current quantity of units.", - "fullName": "Increase quantity", - "functionType": "Action", - "name": "IncreaseQuantity", - "sentence": "Increase the quantity of _PARAM0_ by _PARAM2_", - "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::MaxQuantity" }, "parameters": [ "Object", "Behavior", - "=", - "min(Object.Behavior::PropertyMaxQuantity(), Object.Behavior::PropertyCurrentQuantity() + GetArgumentAsNumber(\"Value\"))" + ">", + "0", + "" ] } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", - "type": "behavior" - }, - { - "description": "Value", - "name": "Value", - "supplementaryInformation": "Sprite", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Decrease the current quantity of units.", - "fullName": "Decrease quantity", - "functionType": "Action", - "name": "DecreaseQuantity", - "sentence": "Decrease the quantity of _PARAM0_ by _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + ], "actions": [ { "type": { @@ -15821,7 +18668,7 @@ "Object", "Behavior", "=", - "max(0,Object.Behavior::PropertyCurrentQuantity() - GetArgumentAsNumber(\"Value\"))" + "clamp(GetArgumentAsNumber(\"Value\"), 0, Object.Behavior::PropertyMaxQuantity())" ] } ] @@ -15840,7 +18687,7 @@ "type": "behavior" }, { - "description": "Value", + "description": "Current units", "name": "Value", "supplementaryInformation": "Sprite", "type": "expression" @@ -16011,7 +18858,7 @@ "name": "ActiveUnitOpacity" }, { - "value": "255;255;255", + "value": "", "type": "Color", "label": "Color tint of active units", "description": "", @@ -16080,11 +18927,11 @@ "objectGroups": [] }, { - "description": "Display a tiled resource bar.", - "fullName": "Draw a resource bar (tiled sprite)", + "description": "Draw a resource bar using a tiled sprite.", + "fullName": "Draw resource bar (tiled sprite)", "functionType": "Action", "name": "DrawResourceBar", - "sentence": "Display resource bar using _PARAM0_", + "sentence": "Draw a tiled resource bar using _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -16119,58 +18966,12 @@ ], "objectGroups": [] }, - { - "description": "Change the quantity of a tiled resource bar.", - "fullName": "Quantity", - "functionType": "Action", - "name": "SetQuantity", - "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "max(0,GetArgumentAsNumber(\"Value\"))" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", - "type": "behavior" - }, - { - "description": "Value", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, { "description": "Change the quantity of a tiled resource bar.", "fullName": "Quantity", "functionType": "ActionWithOperator", "getterName": "Quantity", - "name": "SetQuantityOp", + "name": "SetQuantity", "sentence": "Change the quantity of _PARAM0_ to _PARAM2_", "events": [ { @@ -16279,58 +19080,12 @@ ], "objectGroups": [] }, - { - "description": "Change the maximum quantity of a tiled resource bar.", - "fullName": "Maximum quantity", - "functionType": "Action", - "name": "SetMaxQuantity", - "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyMaxQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "max(0,GetArgumentAsNumber(\"Value\"))" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", - "type": "behavior" - }, - { - "description": "Value", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, { "description": "Change the maximum quantity of a tiled resource bar.", "fullName": "Maximum quantity", "functionType": "ActionWithOperator", "getterName": "MaxQuantity", - "name": "SetMaxQuantityOp", + "name": "SetMaxQuantity", "sentence": "Change the maximum quantity of _PARAM0_ to _PARAM2_", "events": [ { From e623d4bfba739672d3fd5a6df553ecea6f098a5c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 01:28:11 +0000 Subject: [PATCH 23/24] Optimised images with calibre/image-actions --- .../assets/Bar Frame_No Shadow.png | Bin 3993 -> 3164 bytes .../resource-bar/assets/Bar Frame_Shadow.png | Bin 4289 -> 3489 bytes examples/resource-bar/assets/Blue bar.png | Bin 2910 -> 2508 bytes examples/resource-bar/assets/Energy Bar.png | Bin 3086 -> 263 bytes .../resource-bar/assets/Health Bar Box2.png | Bin 2983 -> 246 bytes examples/resource-bar/assets/Health Bar2.png | Bin 2845 -> 134 bytes examples/resource-bar/assets/Heart-1-0.png | Bin 375 -> 259 bytes examples/resource-bar/assets/Heart-1-2.png | Bin 375 -> 259 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/resource-bar/assets/Bar Frame_No Shadow.png b/examples/resource-bar/assets/Bar Frame_No Shadow.png index dde997f1389a52276328c6e919697df147d7b37f..cae05f6e7806ec777409d4e7c147563576719baa 100644 GIT binary patch delta 3160 zcmXw*c{J4h7sq+XsH{;KTT-bk51QYxoOhhMH6KKwxb@`&Ar&zjtl(` zcDD3PQ8qRnz8i)xGhfP57TM=yk6`z?*|U#*Ueq+HJ)_#)L9%pB~J!v3zaRcQDyH zGNW^>Gp-H&;hmUST`c05Jj)2C^)M^@!DDl*3qO04r5-`iQk()Vml}V8qXw(O)Xc;) z@FO=IZ;0Hnp!S&-WBQs<4kq_* ziBVPVya2`f;p>WRE>l1Kw z7qp5q8#CFhJ`DsO(LNfTN5~SsNFCOkXR8AE5X9+4u`q{{a>-bXz>9sB83Ll_yRwNqj%oXcwglX`Dz`VvQw*58F6G6~R83A+|rK4Gl=Qfyx{& zdZ3uY%e)KcIYitf%Y+;}#J69`ZDUXc9H+l+N=j;6ajzX^JFJ|os$?z-Sv zW1X)yzRp(x&o_VWZZ7Vx&@6$Q?0%R$m&(^k-FyNvk`9fAumD#sVuVnOY4?xg98rXc<;o*B3hgLbOM0|L(ZO4 z)Ctl4p~9qm&6n}i*2y$>~cRcY|vZP0~jLzhh zR(GsMgO8iWM9ulwWoyaqM!onRCqCE69prIty`9iZX-0exgrc5w1By+t97AZYlm?zp z+&L!+UrhVMk7A`7IWGhdUM}L7Z-q%OXQJ93bTI7EK|Xk5HgPIWvD9r5dx^}QVaKu2 zIYNuZMh8BasX0R>*Gh?fBzT5sd=Y@$z8;N=U7cT98Mrq!8vja=>5F6;qx}kO9lp_@ z`CqIrQmx$XBvH3vqX+Y>zp34uR~gTIWWB$qynZQ7sa6D{e zOyk*NpS&1f^*jlyf%GM4;RjCmT}9+$aY5e|e81#6-G(}L#KMAWZp4gb<~(PPve zdXYSBld51&gH}vh%AKm5s9AO?gz4NSorXgeA)^ytf@xP}2}YUi!`V}4)S=Rwguexh zU`K#yw$Qb4+KFei8Xh{Xx8r=-bAU8IJlrsh3aWaV(%g zS5y?RCrzch*Z%#rB_}t*gmU2RR~`T^rp*9{l^{O2Zm;nnBy-~>h*wTduJFks7e&dn zjk(s*vSatdLOx4B+aKWX*hf(LS!%5!{_4%*xj$MJUI%(_(v?T{JT)2sA2&`d84f7U zBBe(wV5Ch5Q-RgSe6stNUS|iT4e0BxUQ^OYooAQ!4wY+^MPT*bIhqeg5p)-lf6~-+ zmfTCUgY~fC2@c%Vf_s9caY&AY*7RFPDY!ah52l}l0ZtagmamOpRwx}c*BIJy{E>O=TTS*_avC%!1Z3zXp zHfxAVWi2GAZZvA4$fs_Y-jUkOlgOs6{1{(N4f1l+0CZZF69JL%49IWelzhylyrS`# zq(Va+nl7~j7H^#pp|0b*AQ*&Dl8oBPE!nx1&BM*_d(?@g-mMezHg=hYlW1XdFyj|O z8%ozf`MilnHkApkv5OVuJVp(}NpY3ohv&{6n_+&}ORb||>lLLntLMb%z|EnSsPD@N zIiTl^JJjw?NSNe9hu~UuLW6I8&A`vCzlc~1i;v6=ZHnyB7#11;J(wCO>SE+CZywtk zFaJex9<9GE0*NGDGF0Kw@9{*5Df3C@@WQJ|>ZOw$lTk9kTX#WH(~hw08JC{BkQLD` zHjWoBjK$oFOvHQV((J`k`}8%@A(9@0K%6}mZ$eb*Olij@X%bM7kS_HycTo65SI?V| zRh4QNt3`^I+@H9wCc7(~MKmiw*rl?U%Wj1_;qKXOPp0prEPtIV6<5J;KHM1_y{IVAbh4e8Ofz&gv zpL1isM^?K;F%>qd%Jc6VnyiVxn|&n^Ec4;p$a7h@jA~W!)Kc~#W|5Sm6NlQ`Sk&z| zb>ktgdaH0UUoVb-cs1|pR`Np?csEVdYPj)4&QR+jtM_{GxKq+;GR+BZGTT^`DJabBY^2Vzj?9KjOI5@1>&^#s!75 zUKd;di+;9sEKIy9{yHWP^JUtRczV$m&bnP-T(a|utT0PGmM~{j!mNclbGeAnZA!>% z9l5ur25p^MKcBCyG-fURjoF8$R u=J31EX>4Tx04R}tkv&MmKpe$iTg4)k4hEFs zkfAzR5EXHhDi*;)X)CnqU~=gfG-*guTpR`0f`cE6RR+H7*Gl(1AHR!9McVpc!PLm)6zNb6AP>?Da7Z*;|5)j_>t?f%Ws@Z4*Pkg zU}V$t!~(Hc>SDQzS=msDr-`GAs!_f_=d!|ii?dp-v-Umt3qu8MCBt=^BS>HgNu(e` zMjaJYVIfAVMt_QlH0{Sd{1L~WB9~0A3K%&SP=gA|@q_=t?{3ZF)TEmfiUYkbw*4^* z^z8zzhHZZz+ji>&2s{H2jwO{cYp` z000JJOGiWi{{a60|De66laV18e*gz`Nliru

%NDk#(o|3m-)02y>eSad^gZEa<4 zbO1wgWnpw>WFU8GbZ8()Nlj2!fese{01a_TL_t(|+U;G-k|j40J<3$wN4LiwV;eKz za1aC#YzTrq!IqVOfDNBue~N#B4L`t&JwHIO0<*yoc#O@&;9c1mfcTYVAFQf4cM_I&-n zy?;sxF{M)O@pbL>{Jo|gD*@7L3>#cUH46V`2?>{#yH`g~G%kAtG zyeT`DI@O1d2+0*Cbkhr%76_dbAywJM#_Ma9FeM;})Osdze+V*{zm`91GaY+0t+MFv z7*q8+MIt1|+$QAuc;?JUjPRa;ln`QsXNCiC2(sv<81F9+?^;%n2ni8~F(4(tGa;tz z7{r*sOp7l*Q)nDbvL^G#N7V54d(st{0OOfbOw9&us2hSjK7(>>X&3c%O zMtg%X2%K{`f7`6CwNCT!Y<|oqI#Q@U#3tu3cwV$_Z6jK%-+KeGD1j2ALRJqIR^ldiL4;G0cV>PUVG#1S-3SPG*%(>A*6HEg*XC~ms5;cIVFq; z;~rxWe;meuAoJX-a}KM)W4-biJY!gGz`iIy`$~jJ$oDIsQ36B)qJ(-siLpjfu~Dw< zJWKVkTjdx$WAKc7=Nr6s|8=al=lQ%aB7_l02_gX!Mnnna-f8mWBw`n&mf0$`lD1h7 zINPkSU9YfN4;a>4Y|meXA66jtMX97d%=%pMnM!Y-tRc?>$5eOxym+-2jl!XasKGDhq%}sN)$My)zk@C4OvF( z&9=&jh(N@EbNRF5ZizGHbg2&`rGzgYeTv*o+r_WLcPPOPwnAL|-YO%R^2pR%vDn%8bFJl&xH^8D#a`>uaCQ^InG%v&Tqw~`7sJ*rZHw~t!f1^i` zZtO@}9w9iD=KB9!U(Qs9w(+RElyKA73D-5uHSKn#;H7qJ9cFD#z$n>)Fy2p#ckg+Y zeK5{X<5}PBN4)pTpW~IY4c>m^)tRAg?SyYFH`Pv~{CmCfINz@Em%l$mO37WqaEdVA z4Th6II^V9bUin#{5_Me^v@{~4e+_H2Bh+9p7z}qCOC#s{G#F{X6uXfN*Nqr37z_r( z-9`WYZ~JX(7@;{X?VO1zJ>R7S3^F@4nB9J@3$7YzC!C){LPRnQjn9b3cEr~Lnh}rDFf2G-o27|$1 zxZ7xF^$(s))(J~SqfFXi-(75m!(cENPRC$0EAg_g6AhP*Mx17S=Ji>~Qd95P~2zGSN1tB6nBhLCvT4oHzX{a%ttSycy@W&-rFGz%v=|C&oKD zhru)Mop0*Ye~Y%Rwas&Dli)o=Bx3N4H@^K{Jow(bi!c6^BAg?nG#75RPShC)0a8MY zl4qI62ni#?xW^a-hcO@&l46`1wHiFuE01rz^&Jp#UU5+Z!g#=8e~EE_iQRt0<^F(+ z-2uD(ScRg5<{NOn&4O12R;PZXi4`B9ybMSrufBPXvTbEDqz;xcN*eAxeNqs4^N4x!nCB;4n^0ytEJ3YVf(NVGZ^J zTxl~A1J32oj=Lq!l+#%#I;@&{N#<;SiQR68i`@ZFp6+lML)U()vek!D<-ms{o}=k6wQ5U4do?Ud36K~u2C3G(RlMp|G{!4R7Iu)y zVy7;exo-dSRyp!^hg_|@TI?Dn#i^Y-_1@S0e@IgG9$KaD&u^7NAGW25mHPkEJ|`-} zF~|`o?Y+2oN&UTBPOduUh~ON7nL(VDwdO&?m=`vSF&h?<>I8(w8*JO$m(dQypw2rr z&TofvsE zZGWHko63zO>}k0H_2l$FrtA%^hDqVI4sFVEse?`G zT4(uO?fbBEUHWk@{i{lASkAM`;9MyubX}^* zc1lRagUU<8^P;lqxs|v^Sz3j0&cT=VB%0?0OZs#6AhjNa%D(L*>La|RdgNTEJ8EOk z+r-n&9b|PU#}byV%BOl?F(w>hIBJW^qFu|T^?uqqv^uFCnsI)+oTmhYm~vl$BZQcM z6pIs>a?C+gLM`0l+8`4#4g(g2}in%oad1;*$Z~LHy69zzIye>``zXJx_Vyh4qzfYc=LYk(|F$jAL0du iEoNdc7z{52KKMU?iP;4-SdLx*0000202&p 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

%NDFP&&Wl;bC02y>eSad^gZEa<4 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 N002ovPDHLkV1i7%J)8gl delta 2885 zcmV-L3%c~o6W$h(BYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iTg4)k4hEFs zkfAzR5EXHhDi*;)X)CnqU~=gfG-*guTpR`0f`cE6RR+H7*Gl(1AHR!9McVpc!PLm)6zNb6AP>?Da7Z*;|5)j_>t?f%Ws@Z4*Pkg zU}V$t!~(Hc>SDQzS=msDr-`GAs!_f_=d!|ii?dp-v-Umt3qu8MCBt=^BS>HgNu(e` zMjaJYVIfAVMt_QlH0{Sd{1L~WB9~0A3K%&SP=gA|@q_=t?{3ZF)TEmfiUYkbw*4^* z^z8zzhHZZz+ji>&2s{H2jwO{cYp` z000JJOGiWi{{a60|De66laV18e*gz`Nliru

%NDIy>9MVSBq02y>eSad^gZEa<4 zbO1wgWnpw>WFU8GbZ8()Nlj2!fese{00}lpL_t(|+U;H2a@;l&J+0x~Jc=W2vRlcA z?Eh?4em_;3DB|z}lD!Wkfo@zloY;vqGEn6zn*#!kzMMYY7|HbC|NX|8e+Cg@cRFFS z+hbD{xP34HLLPa1WRGAl=)3aszr%{($}>JLM)h5XzHQK!C73O&!y@_d=^4l8CmeqG zjN)*>X1mRpox?SctjqVQgYQN8H=MIK23=jF{__>p%Nf=A#ew|s=^3AY{RN+X`WeR` zpRhe1N07e<0`Qghc(=Zje-R~*58`Vd)s<)NOyB6Ny)iIVh3bzpwub`%pgO;xAR-)} zpYZ9YpYizb|KRxijQ!~`0rDAX?#bP+ukL0<=YBwQXAl0GI{DWA`wxnA2aeMlgQk4L zX14Y&Ae zN&pgrCsBo=e^UT93&iZEOOY2G&z;2s!g*cx^vgon$n$ysAQ{Z4DP#}k&H-~RX{U6T zOf)Qx;W?y#E+R0q@NWV!hsaMt-*EP|`|x_;Wt#W!vUbE(nZ^(fbZF)C0@8wzw5RY# z0Vd4S?BuS&rT@*JlcyJO;A`W0G#-;Co!Y>OumJL%e^vU-_*{yu%}1ahZpHb1u#C}B z7Wx-pWBozG#02mbUs#7?Ope*67K^-Cw&84Jk)u8&#k1xV803XVZGDY?_#HdPNacKI zR~I1efA2JX?yn^s$O}k2Lpqdyw$wa-O)OCMm{)4u={4lKYvoJR)wn(6i5S=EuC^sZ zfMH-uL}Zpyr1oO5K6^b}-xvJ-m$Onlf5qhBg|ZPzJI>6Gk{7e745=*~^SiX(wC_3p zN762Fz36qdZd3DpTp;Deq;SAre_ex$;UzBRe;+A1u9dzq84_i7#7_dhQweLSREnLP z7I8&lsV{GD2wllA7oe|4!alS>F-$EQb0Kskq1_T_0ER7WHW@QHd-977XC_9ZnYk)E zY08K!j!2I2&51N%FhYT9jw{+oR5#-~?8q5tG=X41v-}LP*7U-hMXfWjP%DX|Y@+RB zfA*c(yaQoZbxfI^Xj*?}0St&N4$EW-nyhJ7Ze5%>TGfo|q3Jbt)u&>v0tOTT)j!M0 zf-2Euc*&Z1{>-v+7B(V~O3tK<3SvP>BrJ)tNcC}Cbwwm0!gtA-gF*NcTmMpta?-se@3w&Oe>5`Nbe?aI$yP`6`K*rYGY(j$qbej=yzhhT zg`}jDP_nUTLXfBe9P4Du=2_^G;Imv&sLQI}e>TVE9Jegud(ywd8V0kh^jzX{6h+23 zG)=T7W!)i}3`pdq6qZFYsfvssjm(q(2mn@97Qjp)4HWCncxzoXp(|IFkNXXVf6pZVZHjU6)dq9Or)Yr*uIUTtAac8gY*_ckq%vtGU!aA` zg^>DD2Q7hLyDaS;u1f+wIQf305>R~$x^fm@kJs6YlZPYk_*^o@HYvh-efyH@fKY7z zCEsDCTUj}~hQVmRhWzD7C0mgDxIm5dlSuzA+X9-fDFf4@y7a&mof zCJkleHNhbFaEsVprcU+ZOi+x&Isq>nQuWET?5MA2;lRnvI)1Rl;gW*g>ml@M$!k*khn z6P(4vz_G-d-uGEv*r7MTL($%hvv)tf^i1znC;4mFd3@A({7Anb^9#q&wJ`M? znzuK!ml~#OVCn`%*OX|hS2UM19*Uiv{IJ<(C(8kr&wGzLf6Ph!yBtGrMvyOG&|J=F zt5bZr{e=JKUQZ zrh3I@d&nT4M;>|Pac>}R>ajCZzF1th|7l43_JX!Nqu8IY+3xZ1P-Ly;kw+eR+zZGL j9eUHCYfAO47rp-jom2#62bJ?Y00000NkvXXu0mjf4wjB+ diff --git a/examples/resource-bar/assets/Energy Bar.png b/examples/resource-bar/assets/Energy Bar.png index a98f6a81e49ff9afafacfdd661b55e85b36aa7ab..cce76fe2cc14ced792ce29ee69be8f800a7dc7eb 100644 GIT binary patch delta 215 zcmV;|04V>C7>5FoIDY`SNkl;NKGAZI`FoaSLcF%y=f_WXn3G?;(^wQHy^YQ?x%~% z8t`;Dt7v<8U*SG47!OBN?co6j9B{yyf|CPWN)B-Uf^$!w1yEc{x&Q|paKM>{lXw=Z znKZ#!#;aMJZ;ui#KGg82KnvNgbMV^G<~=wq!{Ggbw!uj}s<&EYaNxD0#U@_v^^w$+ RV%z`#002ovPDHLkV1hCCVuSzy delta 3060 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 A&Hw-a delta 2957 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 delta 2817 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 delta 348 zcmV-i0i*td0`~%tB!2;OQb$4nuFf3k0003oNklr(sycTpSyWls$|-eTN-`?2*9#c%W4MubFPLT>;(h?K!2KzCyX{ij03o!1Gp!E;>hmcn&yB4mRGsfMU)#7%nU)q-8q7 z3B2Lu?&OtO-&I8QTL)KOW`M~|crN@vDu@?Y&NL9NNy{?|vNF@0SZ>s=v$~7_@9-Kc u6RG1mLf2@S$vKI&fAs340H9tT8uS6QD8CdO!gd`10000@MEQagpJB6zff9hrXV`o~v1RD>4n=hkF5lpa hGphN3P*9Sp4**_ZpKM!~;<^9;002ovPDHLkV1lMuVdww= delta 348 zcmV-i0i*td0`~%tB!2;OQb$4nuFf3k0003oNklr(sycTpSyWls$|-eTN-`?2*9#c%W4MubFPLT>;(h?K!2KzCyX{ij03o!1Gp!E;>hmcn&yB4mRGsfMU)#7%nU)q-8q7 z3B2Lu?&OtO-&I8QTL)KOW`M~|crN@vDu@?Y&NL9NNy{?|vNF@0SZ>s=v$~7_@9-Kc u6RG1mLf2@S$vKI&fAs340H9tT8uS6QD8CdO!gd`10000 Date: Sun, 27 Nov 2022 22:01:59 -0700 Subject: [PATCH 24/24] Added missing functions to get/set properties Done for tonight --- examples/resource-bar/game.json | 533 +++++++++++++++++++++++--------- 1 file changed, 382 insertions(+), 151 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 5d5571db9..d116087a6 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -3264,7 +3264,8 @@ "EmptyColorTint": "255;255;255", "ActiveUnitOpacity": 255, "MaxQuantity": 5, - "StartingQuantity": 1 + "StartingQuantity": 1, + "Quantity": 1 } ], "animations": [ @@ -3369,7 +3370,8 @@ "StartingQuantity": 1, "CurrentQuantity": 0, "UnitWidth": 16, - "MaxQuantity": 10 + "MaxQuantity": 10, + "Quantity": 1 } ] }, @@ -3431,7 +3433,8 @@ "StartingQuantity": 10, "CurrentQuantity": 0, "UnitWidth": 8, - "MaxQuantity": 20 + "MaxQuantity": 20, + "Quantity": 10 } ] }, @@ -3452,7 +3455,8 @@ "StartingQuantity": 10, "CurrentQuantity": 0, "UnitWidth": 8, - "MaxQuantity": 20 + "MaxQuantity": 20, + "Quantity": 10 } ] }, @@ -3494,7 +3498,8 @@ "EmptyUnitAnimationNumber": 0, "ActiveUnitOpacity": 255, "ActiveUnitColorTint": "255;255;255", - "ActiveUnitAnimationNumber": 0 + "ActiveUnitAnimationNumber": 0, + "Quantity": 1 } ], "animations": [ @@ -3604,7 +3609,8 @@ "StartingQuantity": 1, "CurrentQuantity": 0, "UnitWidth": 26, - "MaxQuantity": 5 + "MaxQuantity": 5, + "Quantity": 1 } ] }, @@ -3629,7 +3635,8 @@ "EmptyUnitAnimationNumber": 0, "ActiveUnitOpacity": 255, "ActiveUnitColorTint": "255;255;255", - "ActiveUnitAnimationNumber": 0 + "ActiveUnitAnimationNumber": 0, + "Quantity": 1 } ], "animations": [ @@ -3892,7 +3899,8 @@ "EmptyUnitAnimationNumber": 0, "ActiveUnitOpacity": 255, "ActiveUnitColorTint": "255;255;255", - "ActiveUnitAnimationNumber": 0 + "ActiveUnitAnimationNumber": 0, + "Quantity": 1 } ], "animations": [ @@ -3989,7 +3997,8 @@ "EmptyUnitAnimationNumber": 1, "ActiveUnitOpacity": 255, "ActiveUnitColorTint": "255;255;255", - "ActiveUnitAnimationNumber": 0 + "ActiveUnitAnimationNumber": 0, + "Quantity": 1 } ], "animations": [ @@ -4144,7 +4153,8 @@ "EmptyUnitAnimationNumber": 0, "ActiveUnitOpacity": 255, "ActiveUnitColorTint": "74;144;226", - "ActiveUnitAnimationNumber": 0 + "ActiveUnitAnimationNumber": 0, + "Quantity": 1 } ], "animations": [ @@ -7784,7 +7794,8 @@ "EmptyUnitAnimationNumber": 0, "ActiveUnitOpacity": 255, "ActiveUnitColorTint": "255;255;255", - "ActiveUnitAnimationNumber": 0 + "ActiveUnitAnimationNumber": 0, + "Quantity": 12 } ], "animations": [ @@ -8142,7 +8153,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Sprites", @@ -8161,7 +8172,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart", @@ -8173,7 +8184,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Key", @@ -8185,7 +8196,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Arrow", @@ -8197,7 +8208,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Bomb", @@ -8209,7 +8220,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart_Pixel", @@ -8221,7 +8232,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "BlueBar", @@ -8233,7 +8244,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "PlayingCard", @@ -8263,7 +8274,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Sprites", @@ -8282,7 +8293,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart", @@ -8294,7 +8305,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Key", @@ -8306,7 +8317,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Arrow", @@ -8318,7 +8329,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Bomb", @@ -8330,7 +8341,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart_Pixel", @@ -8342,7 +8353,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "BlueBar", @@ -8354,7 +8365,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "PlayingCard", @@ -8603,7 +8614,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart", @@ -8615,7 +8626,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Key", @@ -8627,7 +8638,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Arrow", @@ -8639,7 +8650,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Bomb", @@ -8651,7 +8662,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart_Pixel", @@ -8663,7 +8674,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "BlueBar", @@ -8675,7 +8686,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "PlayingCard", @@ -8693,7 +8704,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Sprites", @@ -8773,7 +8784,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart", @@ -8785,7 +8796,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Key", @@ -8797,7 +8808,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Arrow", @@ -8809,7 +8820,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Bomb", @@ -8821,7 +8832,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Heart_Pixel", @@ -8833,7 +8844,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "BlueBar", @@ -8845,7 +8856,7 @@ }, { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "PlayingCard", @@ -8863,7 +8874,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetQuantity" }, "parameters": [ "Sprites", @@ -15844,7 +15855,7 @@ "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSI3IiByPSIzIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMyIgeTE9IjciIHgyPSIyMCIgeTI9IjciLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjciIHgyPSIyNiIgeTI9IjciLz4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjEyIiBjeT0iMTYiIHI9IjMiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIzIiB5MT0iMTYiIHgyPSI5IiB5Mj0iMTYiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjE2IiB4Mj0iMTUiIHkyPSIxNiIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjMiIGN5PSIyNSIgcj0iMyIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjMiIHkxPSIyNSIgeDI9IjIwIiB5Mj0iMjUiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOSIgeTE9IjI1IiB4Mj0iMjYiIHkyPSIyNSIvPg0KPC9zdmc+DQo=", "name": "ResourceBar", "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/UI Essentials/UI Essentials_sliders_options.svg", - "shortDescription": "Display a bar that represents a resource in the game (health, shield, mana, ammo, etc)", + "shortDescription": "Display a bar that represents a resource in the game (health, mana, ammo, etc)", "version": "0.0.1", "description": "The resource bar can be displayed using these objects:\n\n- Shape painter\n- Tiled sprite\n- Sprite\n", "origin": { @@ -15863,8 +15874,8 @@ "ammo" ], "authorIds": [ - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", - "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "q8ubdigLvIRXLxsJDDTaokO41mc2" ], "dependencies": [], "eventsFunctions": [], @@ -17739,17 +17750,6 @@ "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyStartingQuantity()" - ] - }, { "type": { "value": "Cache" @@ -17804,7 +17804,7 @@ "Object", "Behavior", "<", - "max(Object.Behavior::PropertyCurrentQuantity(),Object.Behavior::PropertyMaxQuantity())" + "max(Object.Behavior::PropertyQuantity(), Object.Behavior::PropertyMaxQuantity())" ] } ], @@ -17949,7 +17949,7 @@ }, "parameters": [ "UnitObject.Variable(__ResourceBar.UnitID)", - ">", + ">=", "Object.Behavior::PropertyMaxQuantity()" ] } @@ -17998,8 +17998,8 @@ }, "parameters": [ "UnitObject.Variable(__ResourceBar.UnitID)", - ">", - "Object.Behavior::PropertyCurrentQuantity()" + ">=", + "Object.Behavior::PropertyQuantity()" ] } ], @@ -18023,7 +18023,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Update actives units", + "name": "Update active units", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -18037,7 +18037,7 @@ "parameters": [ "UnitObject.Variable(__ResourceBar.UnitID)", "<", - "Object.Behavior::PropertyCurrentQuantity()" + "Object.Behavior::PropertyQuantity()" ] } ], @@ -18139,7 +18139,7 @@ "parameters": [ "UnitObject.Variable(__ResourceBar.UnitID)", ">=", - "Object.Behavior::PropertyCurrentQuantity()" + "Object.Behavior::PropertyQuantity()" ] } ], @@ -18319,7 +18319,8 @@ { "description": "Apply color tint to empty units. Empty units exist between the current and maximum value.", "fullName": "Color tint of empty units", - "functionType": "Action", + "functionType": "ActionWithOperator", + "getterName": "EmptyUnitColor", "name": "SetEmptyUnitColor", "sentence": "Apply color tint _PARAM2_ to empty units of _PARAM0_", "events": [ @@ -18335,7 +18336,7 @@ "Object", "Behavior", "=", - "GetArgumentAsString(\"ColorTint\")" + "GetArgumentAsString(\"Value\")" ] } ] @@ -18365,7 +18366,8 @@ { "description": "Apply color tint to active units.", "fullName": "Color tint of active units", - "functionType": "Action", + "functionType": "ActionWithOperator", + "getterName": "ActiveUnitColor", "name": "SetActiveUnitColor", "sentence": "Apply color tint _PARAM2_ to active units of _PARAM0_", "events": [ @@ -18381,7 +18383,7 @@ "Object", "Behavior", "=", - "GetArgumentAsString(\"ColorTint\")" + "GetArgumentAsString(\"Value\")" ] } ] @@ -18411,7 +18413,8 @@ { "description": "Change the opacity of empty units. Empty units exist between the current and maximum value.", "fullName": "Opacity of empty units", - "functionType": "Action", + "functionType": "ActionWithOperator", + "getterName": "EmptyUnitOpacity", "name": "SetEmptyUnitOpacity", "sentence": "Change the opacity of empty units of _PARAM0_ to _PARAM2_", "events": [ @@ -18427,7 +18430,7 @@ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Opacity\")" + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -18457,7 +18460,8 @@ { "description": "Change the opacity of active units. ", "fullName": "Opacity of active units", - "functionType": "Action", + "functionType": "ActionWithOperator", + "getterName": "ActiveUnitOpacity", "name": "SetActiveUnitOpacity", "sentence": "Change the opacity of active units of _PARAM0_ to _PARAM2_", "events": [ @@ -18473,7 +18477,7 @@ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"Opacity\")" + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -18503,7 +18507,8 @@ { "description": "Change the animation of empty units. Empty units exist between the current and maximum value.", "fullName": "Animation of empty units", - "functionType": "Action", + "functionType": "ActionWithOperator", + "getterName": "EmptyUnitAnimation", "name": "SetEmptyUnitAnimation", "sentence": "Change the animation of empty units of _PARAM0_ to _PARAM2_", "events": [ @@ -18519,7 +18524,53 @@ "Object", "Behavior", "=", - "GetArgumentAsNumber(\"AnimationNumber\")" + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + }, + { + "description": "Animation number", + "name": "AnimationNumber", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the animation of empty units. Empty units exist between the current and maximum value.", + "fullName": "Animation of empty units", + "functionType": "ActionWithOperator", + "getterName": "ActiveUnitAnimation", + "name": "SetActiveUnitAnimation", + "sentence": "Change the animation of empty units of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyActiveUnitAnimationNumber" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -18596,8 +18647,8 @@ "description": "Change the current quantity of units.", "fullName": "Unit quantity", "functionType": "ActionWithOperator", - "getterName": "CurrentQuantity", - "name": "SetCurrentQuantity", + "getterName": "Quantity", + "name": "SetQuantity", "sentence": "Change the unit quantity of _PARAM0_ to _PARAM2_", "events": [ { @@ -18619,7 +18670,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyQuantity" }, "parameters": [ "Object", @@ -18662,7 +18713,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_Sprite::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_Sprite::SetPropertyQuantity" }, "parameters": [ "Object", @@ -18697,9 +18748,9 @@ }, { "description": "quantity", - "fullName": "Current quantity", + "fullName": "Quantity", "functionType": "ExpressionAndCondition", - "name": "CurrentQuantity", + "name": "Quantity", "sentence": "quantity", "events": [ { @@ -18711,7 +18762,247 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyCurrentQuantity()" + "Object.Behavior::PropertyQuantity()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "active unit color", + "fullName": "Active unit color", + "functionType": "ExpressionAndCondition", + "name": "ActiveUnitColor", + "sentence": "active unit color", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyActiveUnitColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "empty unit color", + "fullName": "Empty unit color", + "functionType": "ExpressionAndCondition", + "name": "EmptyUnitColor", + "sentence": "empty unit color", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyEmptyUnitColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "empty unit opacity", + "fullName": "Empty unit opacity", + "functionType": "ExpressionAndCondition", + "name": "EmptyUnitOpacity", + "sentence": "empty unit opacity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "ToString(Object.Behavior::PropertyEmptyUnitOpacity())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "empty unit animation", + "fullName": "Empty unit animation", + "functionType": "ExpressionAndCondition", + "name": "EmptyUnitAnimation", + "sentence": "empty unit animation", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "ToString(Object.Behavior::PropertyEmptyUnitAnimationNumber())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "active unit animation", + "fullName": "Active unit animation", + "functionType": "ExpressionAndCondition", + "name": "ActiveUnitAnimation", + "sentence": "active unit animation", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "ToString(Object.Behavior::PropertyActiveUnitAnimationNumber())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ResourceBar::ResourceBar_Sprite", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "active unit opacity", + "fullName": "Active unit opacity", + "functionType": "ExpressionAndCondition", + "name": "ActiveUnitOpacity", + "sentence": "active unit opacity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "ToString(Object.Behavior::PropertyActiveUnitOpacity())" ] } ] @@ -18777,16 +19068,6 @@ } ], "propertyDescriptors": [ - { - "value": "0", - "type": "Number", - "label": "Starting quantity", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "StartingQuantity" - }, { "value": "", "type": "Number", @@ -18794,8 +19075,8 @@ "description": "", "group": "", "extraInformation": [], - "hidden": true, - "name": "CurrentQuantity" + "hidden": false, + "name": "Quantity" }, { "value": "10", @@ -18886,46 +19167,6 @@ "name": "ResourceBar_TiledSprite", "objectType": "TiledSpriteObject::TiledSprite", "eventsFunctions": [ - { - "fullName": "", - "functionType": "Action", - "name": "onCreated", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "Object.Behavior::PropertyStartingQuantity()" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "TiledSpriteObject::TiledSprite", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ResourceBar::ResourceBar_TiledSprite", - "type": "behavior" - } - ], - "objectGroups": [] - }, { "description": "Draw a resource bar using a tiled sprite.", "fullName": "Draw resource bar (tiled sprite)", @@ -18944,7 +19185,7 @@ "parameters": [ "Object", "=", - "Object.Behavior::PropertyUnitWidth() * Object.Behavior::PropertyCurrentQuantity()" + "Object.Behavior::PropertyUnitWidth() * Object.Behavior::PropertyQuantity()" ] } ] @@ -19005,7 +19246,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyQuantity" }, "parameters": [ "Object", @@ -19047,7 +19288,7 @@ "actions": [ { "type": { - "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyCurrentQuantity" + "value": "ResourceBar::ResourceBar_TiledSprite::SetPropertyQuantity" }, "parameters": [ "Object", @@ -19143,7 +19384,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyCurrentQuantity()" + "Object.Behavior::PropertyQuantity()" ] } ] @@ -19212,30 +19453,20 @@ ], "propertyDescriptors": [ { - "value": "0", - "type": "Number", - "label": "Starting quantity", - "description": "", - "group": "", - "extraInformation": [], - "hidden": false, - "name": "StartingQuantity" - }, - { - "value": "", + "value": "1", "type": "Number", "label": "Quantity", "description": "", "group": "", "extraInformation": [], - "hidden": true, - "name": "CurrentQuantity" + "hidden": false, + "name": "Quantity" }, { "value": "16", "type": "Number", "label": "Unit width (pixels)", - "description": "", + "description": "Width of one individual unit", "group": "", "extraInformation": [], "hidden": false,

S0|$`&!&Qvs2y-e>xih@^CNW7q@P8{D4DS*H<_;g8bRm<5s_LCgDo+Vtws}|pnJ?Y>5+&0H5JyBuemXEttCK`=R zUS8*hYy&j`Tqx%dK){ zND*b_*db>t%-obupYMP0ef{`+yncN>UX>EeqXaZjOB96WTA1Q4-kA9DFf&{W)bvCBfPi97Lc3=>ncPmE)`y3nT$3US83>fj7d& z@_0ml(2<2l`_`_mu7v!2zFY;{w8t0nNkO5D&g<&Cu8@%~S+Pm)9U(HATv}ay4FQw@*z2;Hnyzjya8@re~; z*OQm8HDx%e#f5lVY}fP3bkHdj?$EIF+s-dBWo4~>_wa!W{j9VeVrR<*u|)m$5Ua?| zg7b;+)N)}fsNHK@eu6#F!HTKo9Sd9@79(y6B$2;A(V(=Of&B3sOB$S^8YpNx5V{7w z5(hL+6W%s|)##GL@+esSBIkFt`$YC{`v&ma49@A0dcl$;U@iyBQKOpzLn-o89kA@? ztdHkH9Fe50JIT4w;{hwe2ualJO?d{idAW+WXG210CQ>h!_B8MvdyTI%N-0}of#HBC z!4Rm9s(Gg#YoOqD56?Z8vGC4d4M8#%t|ySByLUa=(4oYe)- zrNczVB7~2lP&>J}`l#H`pd~;BLW~?ptCi`vpq;GWEPK{y$p!vPL`;)Ukm`%N;a>;U zq^<@Pb~C}B0^gs-nF>*17b;+!RN9JC!7=@;&`$#Kk}(0iD9k-Lst7DZ)otYLi5C~V zyyKamz<#z9IN%)5zPX`L4NJ1}K$WBi#VOD%{n<9DUQ|Xe{q?6FW@r(0*xKJ)&7BBL8L$3s2a!Rpu4paGw(P9kie#_z;I|ol*mxjUpQkRpZB7zN zJ9WIFp~x6tRvx$3UD1h6xACKfdt%wa&Xxnrrz?%E+%%zDqL&s7jiq3+A!_>`>z3fys><944yV_fA`xLfA zI6{q{coEE>w>UkSI+j3aaHOe?Vm#h_mzM9n@y71eH_;0GUsVXGbGTXFI-B0TG1*2( zBtX&&611?dtm9-oE8KVb4)!((xqt-Qt0nle^$zR3GSXZhMm5&8piUGX4EbsMjJTS? zwnQ1uS!eBub!~0}l4z*Sl-W6AdFy z_<^+p;I42Nf6<lb8aM;~exr^M}OuL$VfS0B->lpUeUT?WpJLLVzaiyU|-`nMw&lwZ#0o@*~F1AYl zn743bzb&m)KP;ns*pUwZs3>5b;e+0xL0O#^70*+}trhazDD~%w3rTTX<^ABirLwj= zpP;tKrv{EFtGs-!$9JJ~W1z?`&M)*p#pC6%`&q2_c=Af`$ne=nr~2M6!a#jciL}5* zyq-{qVRwo4X)~WYV-1UdoAPki5>5#F`Flq7sKpTumuF#%f?TBcUc6_c2pU}&##%+q|1Y<@7-P~_hidw8i*F3V?BdVFrkIt9?a(yXHJ~b48ihq9y@ll98+FQg2l8}lDTGSCQ_v!k`TviPq*uZv{}WNSp`tCQ8hq7moA?wbw4 zkZ7G*T_kzpnD)A()$TGCA2(<`E+{g2m+Ab4hM5#4N2)TtzpiJjO-@}JPtVOdfmKvt z_DMC-Foh0dZppb^#@JV3d?(n@=)$ZHhno1(I)@OOABx82r3j;v zbG0G3g)5=W){Z?tTzDwA?RLE%epBE6{HitjW+%v0>iR>AY7fas(uqke!}LIYRAm?3 z?&C56;E3g(`5Ig0LV$IdyoNF#6RWf>vAL{`TZ|DuKI>Bx2JZUcaFEzRo>ICWK)4ka zJ0|A-A`sHp*f^`oeaX?WXa9f4XfhY+dF`6o$4{S#RQL${D@9I0!93_CPOV90Kxxj< zl!W~Vs6GAXAK9_bBXx^jsYkhS(yrS4(ps^M)iCJiJZlo2TCc3wR zt&THlCFx4ZDHQnJy(4dS)CPg5#hIYp6~8DBOwD3Fhosh51{pIYCj;0rJ3Q;&f362( Q5B-kCIUCbjWAEgD0kld)H2?qr literal 3366 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 delta 3973 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 G)V~2O*eBWm literal 3869 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 diff --git a/examples/resource-bar/assets/Playing Card_Hearts 05.png b/examples/resource-bar/assets/Playing Card_Hearts 05.png index 79ae89b52485ca5573912b10dc30c7fa8423f8e3..2e6754286aa6c0eab25f9d1f611577bed99e9ed1 100644 GIT binary patch delta 3047 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 literal 4643 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 F{s&ykw6y>L diff --git a/examples/resource-bar/assets/Playing Card_Hearts 07.png b/examples/resource-bar/assets/Playing Card_Hearts 07.png index 88b6e099b876ab757f8f67e1d15ea6cd9ce82f22..5b1c7615c38e01049a9024da09fda47c796448bc 100644 GIT binary patch delta 3637 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 P00000NkvXXu0mjfgRBp# diff --git a/examples/resource-bar/assets/Playing Card_Hearts 08.png b/examples/resource-bar/assets/Playing Card_Hearts 08.png index 7623d82cbd4a4292145716b2d96bae35de087adf..de7a4b23541d82d8af94b1be8c915eb6ae7583a2 100644 GIT binary patch delta 3818 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 TqH7lA00000NkvXXu0mjfoBgvl diff --git a/examples/resource-bar/assets/Playing Card_Hearts 10.png b/examples/resource-bar/assets/Playing Card_Hearts 10.png index 4eae476fa99b1925c2b65226162815b8002043fc..52344d0178737e18071713049711d8179c450437 100644 GIT binary patch delta 4116 zcmV+v5bN)^F`^)lB#|@}e-G42L_t(|+U;G3pB2>=Uhuz21cgXq5|fx_Oe7I-)s-d! zDpJITV%xY8Ls498s3&^YnD?8=R%$<4j z$_#UVzXQAPy?yt+^WAd#sbh@QX^D@sInCwN%Bho6JRsMpGtXb}e|dxu2Ms8_IIZTy z0;)K@!RZ(wIDCxEqZu%&dep^fv^f%&7?i4t?{u)b-%BR{NqJJ$kVI{rj_~ zrY1Ij{``PkCh!&f1)l`~tLC$m%0w+gAEN00k^6!z;_Kez@;vxd~oK>nE|J&Fu->WIKV}H z)-7GSG~iSf2KX+xcg(?w-+n)f44F(6n>J7NT=x6JEIQ`;;`2&Mu6#Y*p8)lc&(Hf6iu^FTXMTK-qAVrQiFQ zWq&wq`oS|h_p;2VyZ8^8l9`b0?8?pA6*ieLL-S!?md$z#oYcC_mcSG!deIC$gT6V) zqT_C0UA+e8Uiaex^g2AQ9O?EgEd1vSy21YGSuB3a@M-ODN z#@Q@;IHY=Ae`?h_7W&PI?m2%kj3rmR=pk@kS*HRZxpFm2t?4LI>c6?X*$|xQ_^GBlE!KDk%SK`>bmB3c!w$sRbwLO&a9 z`nvSHANUuX%>O>OJ_?VmXUXT@w0vFov`gf6&HDGP@5U3)VabP|cXUMi1{@it6XXAM zzV+*R4=Nraf0b) zN6TIRc4oHOe~_dtM~mS6)>7C)A7e^l6EQgreyB}q$}|L$R-N=3|v9= zmTk=ia0*Ik=;uS_B&Fe3^UEVqG857pJ|K};YB5Z@*@K2pm%t%rZT!%ZSulQP4|Tf6 zh}4U38`|xPpL@t;#$s{rxeT=6z=ZgWVF6D*^qk7&khuRzQ)@x?;P>A2=VZ3; zBxjnGJ~Cs0)Q3wfTPb$fZP?n)aK0!YMhpE$pX}@wo$qK7?}qc5RDK*RB;9*)JuI_h zkGGv|$){ekz9)uVC1w9AGHcdiLy26vv9dzMrp{GatZ}b&i_E8$ zU1Y9|n>rs~U}hu~9XICkZk9!_m?hN4WB<5YO8<$B`n&n-`0=ScCLv@*MqHEo`^Q&# z%T0~T6W&Jp$qrbR&o);UZr}DOF=mHQmfl-2?4Sr zI&r#d;H0;1_ZK(_aSH!+yvj11eCCau7x0LrLI3M-chmp{zmA&@tgMfA?dq<2NlV&D8)MX77HVfy0j}BPl3+>V;xP{NzkW z@nzFbUbp>Z^J^=)LW&^@*9 z0NsU#7K6ONfGh%`%e>dXvRkdoV)!)85EBfzm`%mr+m_NXW))|qfAo+l0TQYK8~{^8 z=(3f$aIKThGfksZ`GNdqmBtFTvX5c6$i!5`K_+|rT8jQ$MSz{qQg^%dcK?Dyl9h~} zWN_@Mh>OrN7k2WI7hIbYccgE@Ni2QR-4u}h)|T)1EiR^jaABjSQb1hYIb70mEd_*2 zQZm`qS~0t%VD?ilfAsO4^UXom+|95~OZ$Ob0;inz!kTbX8^x5_HUHZQAVG|E$vc(n zbhe|3yao=mb9hQi3edP~xxG0Ld`F6INogmKl{ajvW&%7QQo|1C=s24+)6u1jh)^S? z)^ag4FY=y+pd^$3_MNs<5Xpj2f|Z#nkJ!BP$byi`99iJde`VdaMVeV;Wp?4rH>=X2 zTMP}8%9?6e)8OQowOTGP!^Pn8#DW!4H3#hEo%#|SV%EY(&GRu^-*bJ=*bVoXF9xUK z#C`+E%ph8};Bq7mPnar>(pkI7yUw<DEa7%Rr&fgA1jT^ z7ZMpsNtZWQeIlFIzzIeG zP5@3Y0&s#6fD?cdi~yVfoL~gt1S0?^0H@S}hDj(wRLC}{#K?TUkHv3XP}TIr+6M;} zoX);F7r=MT?G;-Lg*+jr#a;am4r-rWrq0-=UOD9)f3Y~#gfpus6@Y_HGxJ}iwPJCy z7%sg@7_4q58O-#ZAym2dhzBS2(i+Q3wP-24LCVaXHL zadIb*VcG9~IC8-;%)vCOZ{R}t;?xV)Ws8eJg+s5bn7h2T!f|)(kuLaMWEPj?N~z^W z1-~V$fBF`~aVr#PQagd{4oc-0b7Zc%)mb3BgHrjG3el<^aJcyDw8=y<`+5E&_7($b z!j)KtvfLemYa@B;?&YrJX4;XakOf_G@)SRU%PAmKKkbkoXLiqg!@EGTS15Xfx|Vh* zSzX?f;Gj6GYYDsk8l>(XnHH1M3A+O(`WKuaf7QK~caEleNJ&K^`kXFTBtmlMNEL}V zWt@L^4$2=}S_4pC1&FnfzlyFIS1|0IA44i0qv=l4=nU6oq)mal}H{T~dGLIfe ze^nH*Lsd-LyWg-P6o4z1^fJm(-xx3G=rj;>AH=ng7^%)!@|8bh78*mZYOp>mp&GcGarpYZ%37!>sApxPf2&EWG?->BawQD2nlqn$LE!3k#F*=Kj4#gl zgY{8^tT!iiJTzevl~qPB2BXhY^UgMBO6?)jZtO_Pt@!8ZKi>HB!1Zn*iu(#2>Y6Jd z{w5YbUYXBxsMGK+RRJ`8zR$ryPlK^jDrt#JuQ5Gpw23@)QdX zy4bo;=;m#@Bd6R2R=p1nI(g(HWfBWl=p`Z(M;(3)lHrxf00+Dd&r4u znOsk711Fx=pQ8+`uNOWhak(TbELT z=8du=ii=@nqbd>1li&y&LL6I9z8cl3$3dV@zxiE+V@%hsC6T0NN6O|)XsoAg6IN`9 zAyrLxc^912f9vgfC9c3Mu3?Mx68M2Ed$RFe1jm;s5G3*7bLK(w67FS~ zgk&Ye!guf#ICPhobSx~iMv-#L$u0(iCVaa7JQmJ2rD+CL;)p3N1iIU);9I|Qwy!Ebk!Lid6w#cl;f7zui2Fb>+Dus2< z14kA(qN=pgj;eVNJDbyH%Ve1h1OI`8L|KbCGD~JX|CT*qP<7WqvvDgC+jro|_E59z zWn-gzu1I9I?F-_&P8;6jD{v^P(q^imjP78%QMm}~R<|qdk?JdOs6~ofDIlCNmGGWw zyMp)@9K*Q*F(O%mE|De^Z`kKDz z8A}TRK4)aeXCF(c-~Fz#X$yDqsSlx&}(v318^!la95_*bm&MF z*@-HM#pm<)kQq2}lQoFu->WFu*(kRxK+WiapOkfy9ONKQa3?+*7fPrhyEZK`P)ui&p>$FMveJ?l7l0H`0QsNh8bRi1!DKf(q7;XQ#fEwRVl)0Y!Q>f z4|#z4aC#?TQdMXjr{h$3D1XTV)PvLcoECH1q}780a*g77{({eAz;`Vc{|7_LOwQko S5I6t;3IG5}MNUMnLSTZR-WO&7 literal 6327 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 diff --git a/examples/resource-bar/assets/Playing Card_Hearts A.png b/examples/resource-bar/assets/Playing Card_Hearts A.png index 86009da91836ee5bbd9d7e8fc19611af877dfbc3..8d41a37089fd86a67710d987ad30115fb5dd9539 100644 GIT binary patch delta 2487 zcmV;o2}t&r8`2YyB#|@}e+h(1L_t(|+U=c*a}-4shd1HBPzeS^%A2yhMKOmMqd)+S z+#rYtD4OzsAR(Z5l!^fn16~LS;)QY<42D2LAORH>6p>3oED(gSGkfn$+pn`(wr6L^ zZZgv|n|-h9QLwvgk>AHm_q?lJgbE0aCe;0HfsLMeEr5p8X z>I7Z5e@nfqE*xt2QFo(AwmMu*gE=_Vx>J`?97i~C=pNzX%Aj7W{ZK|m2Ik^1_2f@Zzd)zvY*bpQbu*TUErGcz;E)~#Dn zHG$U9(7<%pzyU6332?%@_7e96eL45fT!2bD0Zw4vvN$+$zlTt1 zC&2OC_f#Al_eD8GZFZyDcEVA;KH~0{9}kCmXahbc*$OALf2m0q3|n_*%ty8DgaZq| z5ga*x9I9<6969$vLpbgW?;z^wv#7WoaMXWK^DwgSB%T42_;qLf7F660IKeNgIS}4q z&yc{}rTn@xeI6=q2OQs%uW%p&3s;ixj@|salRFj_w*!uJ?GO%xviBg}zJ-X?<1T*P zIdukA7YRq%e|MMzBlR8}ea}1eX@1>Vw;5Fz2`BLW7yNoN;#s2X+0WcJWe)eAue1VH z7YWBZdaCgjTKl}ycQmRl3=XU-Jqr?s0}k76Gy!nJjXx&^hOIlRYfyO+aQv@*z;6aF z?@#0#iaD3A9Kf$T&&@&QMZod&pU7Voo0{UUE=>YXf4*%bDsMF$)h!cu*PL_0cgtsK zgLpa$k$M&K>&}T&sJ@kOLRIyg;7~hYxT706h5Kx9)kaj`N;pus;eTUs)I(c#8gCr7 z{*drz(M%5CpdlQD)2@8ZKmU^8XH_k?D^=xVZ+{*m!DXvS_=jInanW!fi6&igF8VCr zG?XX@e~+|m1Rk5kqS4W3oRU}L;GtOrNByrkZkx;?OniZaHt*1l5CoU6L*+%l(Qc<> zYt`gFBX!^NK3tB<3xV_9_M~HLz9(j*@49+m@q3Zv8x7? zZQ{4mp*5TMIGf&D^T6cA3!+CSa{nm;+;^&%6sEtcisE3;S}MYeoumk zf6D3_p!zf}9+;KKrjGcg&9(I*+VOB8Cg(4E%P^qIdDk4`FMpe;p7Y1?l*4}$&ydLp zr8uN3`m=~T!qHwWyY>?K))7f(S|L5Ip3!fsXML*lN=x=TA>AQ5;^A00Ftb3qrYLC< zW4pPvxg+)D>A2q2q|)n;&qg?4@ISS^et9|Jb1zefr?{lU-x>O*F1_KftZD~E zjCOVJ{)2sI@Z+_ne4li65i18vTR8Id#iqgWzw&O&m8j|J?$CG6UYMS6pl`=45nCIz zAla8_0ZJn789X^X;e@IiOoh{W^_cm6(4Z`$P{na@v^}P#xQSOybS>L=IQ`&we<#c^ zAC3hsVgi=)uAG+^r34&h@1ZnYb5_?l9t^a*bTrtSl5mtmM;#BxQ}lS6KIf=vhr%`@ z95yZK8zER*>)cyfuR>w7N}U^9d$`<@Z~~PpG4Ki5PU)(FjsgS8K9T*bj?U+>o>GGe z@4`0$1rvxWdog9e0s5wnKH=xue+ovveUz|BbV|Wt;r>+{Sp%>wV6HDF>ai1;ramvA z73&hKBQSGkc6Cv7o&v&Y!vY_CDRj%+ny5oKi2{0ix%F_m_haKR?Y5LGDzqf65KS-S zve^nwu#_#w_0M|8d@yuPbJCE$l&+QbO?}f;IKhv;a@5b4+J)@&XSXJ5oo&zvDV(IHCZZI>XND z;lSK9l&Hr~rp(XKsT+0ye}sJVu*gwmgV+e=RI*OrO|2X~PUO6CMEUJN%Kh8Zqt)FB z(-G;;5ZWjajuRh}$4+CFqT%oNARMQLm!!+?ZJC{baO~cZsKht<<@hXXf}0bBW1+#> zbcTf^32f^Tjz#95F~9A~o;Dtc5snobvn1*qSjU1v@D<^hz04dte?iKjHW6>j+287R}G*X~(6)-&jnP{eQ)m71KY5 zckV_w!lFfg{25JINImXisqof`Q&8a}-}pfEYJzj_aJOa$q@&06$ABpcQ4Snw^WY7H z<6uKL2q#UV0@LU5e}#$_OAJ4o$XVS8$INZCW~h?kbSb@4?sej92*=FmfaKv@B(w5# zhrvS9O*@kmZ)*Y!PTA6q6AOM?#kn?(0MToNBftW47AHS}YIP055n=GOpDY}s!Qu$V z^j$$%_pENioKD}-xRn-ZP|TrCs(Bxr#=NzTE|EiR5snq>f6j-i4A0_*VdUI;v$huD z2#u*7IKrn3t|@Bi0Sbj!c~oozIw+5Gwih8N|qzEy-{ zv+1371t%#cVhG3TP>xRBG@QtYa2#OaU-reXH`NUY#~BYiDhbu@AfZi7QHMz*2q(qO z2#!DYh4S)pRLTYe-8Eoi-m=SsFV!`x@+J7e;3!H*cZEW=|UPC8&NHR*3{I* zbl1QEF0N79dtG*RHv0=`)*D<1ptsI?16*90)a$ix0?GXRd{SCk$`&hha~*UAeRZxF z65)~QqVNDvPwHNs521^9;LwwCfnOqkhEw;TIJUY>eOQ!9>u(}}E}^~!MY6>=Q_tpj z#Qq@yEhvNfQ0fb)@6bL6p_}IZh`yln1E9N>#s7d7CBJ^d+!6o)002ovPDHLkV1mIV B!QlV^ delta 3457 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 diff --git a/examples/resource-bar/assets/Playing Card_Hearts J.png b/examples/resource-bar/assets/Playing Card_Hearts J.png index bc5a54c97b4cb33ced050895a3e8f2600536ae7b..b1bad2217f3b987732eff3c5af2e729108ac9483 100644 GIT binary patch delta 3128 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 P!H{UF>%*#4?V|q&%7n+r diff --git a/examples/resource-bar/assets/Playing Card_Hearts K.png b/examples/resource-bar/assets/Playing Card_Hearts K.png index 4bc672adf345cecb5f9483797a79adf694050bb1..d00782ac4855b0b1d48dbd2e9f2de943b6604d1a 100644 GIT binary patch delta 4262 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 bK0JD{MjMB%W_=1I??EbxnhKS2??e6r?%ymq diff --git a/examples/resource-bar/assets/Playing Card_Hearts Q.png b/examples/resource-bar/assets/Playing Card_Hearts Q.png index 099f403c09a0ac6b77bf82f7ea34e980319379a4..2e0b19d4bb2688379870959f52ac84815a1886bb 100644 GIT binary patch delta 3314 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 G{`()1CVub$ diff --git a/examples/resource-bar/assets/Playing Card_Joker Black.png b/examples/resource-bar/assets/Playing Card_Joker Black.png index 393cdeaccbf982dabfc32aae6dbcbb7b3b622893..94e35a337f98f5e5e6ebe48fc730625d1ce69d58 100644 GIT binary patch delta 3655 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 QKLoZ%is}kgDC5xo0e>c!wg3PC diff --git a/examples/resource-bar/assets/Playing Card_Joker Red.png b/examples/resource-bar/assets/Playing Card_Joker Red.png index 327defbeb6763a8613b9f1db1420796b1f41bf2d..099547623d3d9c9aa8fb899e0dcaa5571358eeb8 100644 GIT binary patch delta 3715 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 M07*qoM6N<$f`$gBl>h($ diff --git a/examples/resource-bar/assets/Playing Card_Spades 02.png b/examples/resource-bar/assets/Playing Card_Spades 02.png index aeae7f5413f8009692fc61300fb2e07849172174..74e7fc7d4efefc3e25be002e72033ad39655d793 100644 GIT binary patch delta 2323 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 literal 3473 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 Bl_CHD diff --git a/examples/resource-bar/assets/Playing Card_Spades 03.png b/examples/resource-bar/assets/Playing Card_Spades 03.png index 7cfff0c341da23ab3f9f8d9f7c6456d32e7c8e8c..60cfe290b2d6cfb6bf8ed8e3e0b83621108fe959 100644 GIT binary patch delta 2681 zcmV-<3WoLEACnc3B#|@}e+orOL_t(|+U=bOXcSu)#}j++iUmtzf`|>VV?`9ZK0l&< z#x6GOy&$omA{s@oU<)dW4Lhh&QDaOj@fmx=E?7|P#w6DJ=09YY-O0@E%lCAUy?LA!xFop9Re()m>rN^MbAv^dDIce-bEF1wAP!BQ;!4 z30hqijv)Wbp-F}^PrnKp;{`{MNI^5mIF?Xwh|J*<7A|O#^iAR6;jC4wR&2_YDQwlM zRirvA>zOlW2#(eEIiB+C*DrSc`gON1Sg?TLSOw1O*ROqgYyJB5BkNlc zPGn>xd-?JuS>K9qN|Y!;xgj&*ynXwYRj*#%t!2xWrDu*+;E=aw5jZe>+qP}px^CS% zfG!Z`iOQn>1;Xmv-#f(NH)@WAy3MNBpe#`1sI;bMW9n zrCKXRU9@Nsw~PAo=MNh+Xpq#`3YK7-+;X8Nkl&iuINKuWNnVIQ)I44e=5M5R|BNQ%Nm?bAC2fgUWj~}xl zMT+R!JvMFHG-ty}N=gy|_%Z?#ZRzRhK`pvXn>M<)_Ter>PmCks!1F0qte7f8RIFH$ zef;<_patXkz^nHX8(2re88BdgCPM_;^KrY&TDENIOgQ!G)zf4MM5(O?2L<+y zgwwZgUqik^(47#h`>dqn#*K3(97F;N7A)xX{}n1!$m^#|OO`CjUc7h_@S#g0maYMX=nl^1Jx~4sP^l-O(AmN7Bk!OJ`9E{w%cQ4mJgkTlx4w(qSiWMuo zf85mV+qdhw@V$HYif*}_q05yk=gxw<0-e4bmJS^{u=nrZhXx#MH06?AdPjnvKYz{! z4jjm8)~qQ$hpJYsD&D2|%EVpj`T0m?Al!rMAl!9u`!OwJ!-frFf-YpjH`rvt7*f4^ z_b#^!@eIE#S+XS8MFE`aIhUQCEvB+5f1hKpV1|s+*H=_j6npdLjcu;QQE)bG+GOh} zv}561xpGBylseE2Fu@5>kfs)7`}Xa{$N<4HSrGNET)A?t3+vUZmpC7R;Fu(cf1hEJ zuhIr|@ZiCg4Rksh4yrd1Kl2wMm@r`i!7)< zh+q>Oj`H>E*IbD;wTc8CitPyw2l@W}d(g!m$k3vvmEhpC&kZ z2`WbQtiGvGp@QX#JZuT)>eZ{_f7g-Tb!)M)u>>brnLK$im!d*A2v(YRZA&;PZ{k%i zjW!m76NEHr(u5lvE0yHh63*DMW4Xb>5I=$wgkWF715Ew;^~oX7L%MhGt}7ULe~xWC zG+I!(*|>3IMPnnmR;ElDuUw8&TO=Bc*REYln@~LkiL-?Z7m8^DS3?yBe?QEfJC~h3 zd)Dh3+O=!P?%cT}o`Z(@H+Zdh@#12X0qJZC-*A-ApFg{&aUe>Kfqc?E%(iXY#6QOb z!>3Q5TE3XwahXs+Qu?~%HA#fvsE~||3~?HVuLnOSi&!-Z?Pxe^k0wJDnnrpVC>Xek z!)86_Tl>--J9ZEp5`sf;e@F-p3Be&aBm{?vCoC$>vz98x98*uIfr3fvYSROVyV0Fv zu*{e-L)DbTM~@y695ZD6`0jRi&?jB-Nc3|WIvI7`}FBku67XQaxl$mfAr|ltX8dB;&W%j zh!I>%p|B48{SO~L6c2N9rNfUOKQ112aqHGCpE)Jl!okI1l$YGs7mPoA_;9buh;eao zvg22fgv0pAtgI|u*SCB3Zm+aBg0lFDHDi6Q*YTC7G_v28a9+K7C3Z>stKRfXviWlq zFiBA_dGO$Yrb&vJf9U8KI6Zsz8nwqN1`h1NQlT#ceAh++b9UKh3<59$}=c!m) z;h_2lbq%(MgJ%t|YELBL^bqW${2d$MshB_Nh_5v*kpQjQs8J)`)(P)W&HQVWbt&}) z*$xhh33kP>qO);NA~9bLLFV&B3+~->8W~tBFzvJHB77 zpk4C7fdiovl}21TeLNL1g&i#fz4Xusb4UfXFV+G|;jmKY8+` z<eTVsgX*Yc8{$*0GkcU2CxKW2j2b|W z%Y_6`a3B~}jMEFTex#<2 z6zM5f@$vCu%Gy(LY?|kLrca+9I&dIpLBzO7qkBK4e{keFwb4`@(s0ZYf@5FIKv6dM62R<07?YUAXc zDrj+uj*gal-V6eqJc6dk&HKj$b3B9aup-r0Z(SE2VPMdTvD1E6R@GkLZ6k!n(K zh!(lvmmEO-1X2_P`IFdbG*2;9DkdP nr@z9kR|H)r=>K7NDU1IATpl)J*YS3&00000NkvXXu0mjf?v^bi delta 4043 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 diff --git a/examples/resource-bar/assets/Playing Card_Spades 06.png b/examples/resource-bar/assets/Playing Card_Spades 06.png index 6358cbeb92d8647c162abb763233c5d83e71f0b0..51d1f4d9e9d0d1c09b9b86bc29893c47587dccc8 100644 GIT binary patch delta 3475 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 BqR#*T literal 5219 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 XO1D^kgiIgU5QHensmoSMTmJVys;c|x diff --git a/examples/resource-bar/assets/Playing Card_Spades 07.png b/examples/resource-bar/assets/Playing Card_Spades 07.png index de854dab4f69d351587bd3324fc5521ac69fec5e..8d69d7666d48193ea38f684a7b77db650cc1ce78 100644 GIT binary patch delta 3759 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 diff --git a/examples/resource-bar/assets/Playing Card_Spades 08.png b/examples/resource-bar/assets/Playing Card_Spades 08.png index 86f074578f12f20f482ba8a1b3d253b56ec56317..daabb221b9fbfa07f8e78849855b6b2d307a3c47 100644 GIT binary patch delta 4033 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 literal 5907 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 L0aLGdU>Es6nsZf- diff --git a/examples/resource-bar/assets/Playing Card_Spades 10.png b/examples/resource-bar/assets/Playing Card_Spades 10.png index f122789f34555eccf3845d4ec680ebdfe1ed9c4f..d2086479e41ce5cc517a88e573803bb94138a223 100644 GIT binary patch delta 4411 zcmV-B5ybA+Gshy3B#|@}e-QaeL_t(|+U=bOkQ7B1#}CXoXAw!}ggH}Yr6h_H6m!lw z$1(?0R20mZEprwu1rAUFa|9#itcWDzeEXa4daAdtd!}c$XLo0AUe!}>Q}4e2O!w>m z3*F#(UW2M7=~2=_C2cI}w35y#)VWS;vM+Y-sl`D7rAxI;LyGamxfj)9i_ggRjXFs)?07wop8bl-Zj@;Q>bIb zuGkklYXBP6giFH!^~qIMS;cE?Z1f6AU&f9d>)Trc5V$l9l^<-~y0tfc{P@CZRg`h# z#`$(vzyX(r3G#!xf9|?#VXYbnc2~dwmxkH$gXf%cPGPAU2zFP%0hjW*?xve=DlAn4 z!S0%MCmftpPd(M!Y_rXLJ>rNX%AWiA=bycucG@X;Ue@8mhZh!48=Rg!dj`*S>Cz>5 z{I9?M^8YsZ>+{Y#ukVQzQUh=fI_RLt4b?KsEaOd`I<>HTe>K4wIdY`+j<o(=lk!!_uhHuo&16G z<(FTUy=Tuo_e=!NlqplZ<(FUHTW6hhykCC#rD}#@taaC2*IRD6<-CtR`ltX$mCru= z%v*Wom4o-;fARhC#~-O1W!ki9-bNd36pY)pZCmfFuf8h45rQ$=wQJYx%k8kk4&IzO zb5b+Nj2Sb$Ew|jV*|=-0v4;24Pd^pleD~dV-fF9@W^^bR|DS*Uac+#+vuFF?%``4| z)9=6k-g3d=>Rfy6wIe;g{r20>`|rR1oEhTJKmYW0f7@-h$Z`3-fY{=|`R%vgyw06F zTf5}P9e11)BmDjM-(Ig?y{yOGefQn{_p}&rrca;lFZgkzgy)}senkfO_uqfL0Rsla z9+&s<-rR#TbLPyleNbE-Ja}-TAJ4RC!)lmRSaIU@fTBj*QOm8;(kmsL&-g)}ctFOMA9dKA^adm}u>eQ(j zIENf^h;t*o{PN3@Kl_O7eDymgU-i&;)y5fJJ@!|9d|_jh%L6*BH+dzfBbQ$23lf?CA51dsGuKy_@RtY zbv>P?5z=r94nlr`=|{9_)5edH2!S6!hFy5!g|+T7Q`)}!?rXhH9D3-X+Hr5V;RfyN`AzrUdvE;*+f4H4qmKqVex@9C zJ+hV4Pd`1>u!}9WnD^FOZdRmuWe|o9^8Dy%?GtWGcub+SZ`Kyx0;0zoVP`VsoDuDaIMEjZNeEVR%OoAwq_qRUZ(6>tsC(@#Hb zHFhSz`S8OJ{aw52YRdnYoq{-FWSOh$*RP*<=9y-;*a#PLv%Z-h+4_e;4TzB1d&0cfz$tPzQ z9QH9P^#LFC`s=SJ`eNL5CXVZ&haM`6bndgyKK^D`ZfF6`B3BA@f9=}UyYtRF{c;lV z*n$f#=tpHm7y;peGEq2}TyjY^!C@1}rcl)+#Ya)QerO_+G-QFg=R)}O(@(WgS*Rr3 zZ?RVLz0}42o_p@mHD)N&8*jWZo70*Lx#*&ctkwvwdQ(>sa?*50#z}!{(g_JFHfdUX zF3fw211D})%;JkLf8LCCVLA&lGE~zmue{Q1Lu;Fyf!6aMLMA}AWn2s4UCja0>#ZjVElm+6w@mV&CcSiG{DAG1e7hQDG#12m; zz~Rb`T7+$s_MwP5pGnoWe^!UhZCH6>T!q2N9XNO2 zeYaEk1rN@K3!5})l5^@uxbV3Fhh4X8Bfao5l+}m!uEnncczJl4`*z_ovIB}wLaMEbQQd4lg`Q{tn9d%_OQgUqsuTD<$tyF2l zl1AL8=C1VZf4AQrnTjMY_+b?WWNq3CiHTt@yzRK$tu|9>W;dY_j!-cwfOZS!O%w}8^_PfPS zYlRfxe-z*pQh-x{Q%C_$Aq6-EII)HFS~44VS{k z(k4BNwBBm9?XNp`EA6A2&ln^_vzEePp^`54Axt3 zJwMP!pE<^4Y>JQNLatnbLy`vx61r(boSP&5-g)Ppjd6d`n$lMAxJ>=5F+Od)vxT4j#^y74qJTE&bl%M1Z z9NQ|kIBF9JbJa6PRvH%N3LHwvT^otSkSMw8s;iujOU6*Hz#+}ZwUKP57gC{IkDEr7 zTTQ_sN34>HHeKf@8zG6Ll8QE60hL@Xf1ev~ElK-F)1n-w1W;~hQK{15J(sRD2Sb?p zJI7Jlq0r@!#;-OCd1<1EDrw7-JBEO1CanEQl%90bN&e^1AWvo#!lof;BHKgsObWe} z=Gkp^!>zIR=-9DiYy)xHh%B(xVdd^*lFC&9QO8f3l=q~0UTNJCpQOW5wr*=6e|Rt* z0m_LSx<(ODFuJM$)4{DKr4v@14!Lyvr4m9_lIJtUN>li%OC(nno=xVo=qo_kJWc_u zv3l$mU~yM54bj1)v9Yl%AznT5*rc3cnk3l9@s;xDK%lC}$z&p)LkY&R%Pwm)5LdZy zT`8F2hs!QGg;c|b5BE0TeDmP3f9~D8`)%;$H3v}w8kc$;h}t+pj{>5* z9H=2qbmR_Zv&;oT*gI3;AkYPczXM(;Hm_6>=t>e-SYd_O zoff$mL{A+q9&s`W-YK6aGuxc?lNoTtCROgTfx{q5FkCl!=-RW19)I)AH=R>3a!o0BC0!78U8Zb=63MtML*~Fi zIF^N8qO#n4^Ucn|dGg68%f=uQoAeCOxZrRhWD*>mkZj=^9NN9O6549Ui5YS7Np8R) ze&QM&_3o@x$cwNU7Z+Zaf2f#QaM%QzI^!l$at6{UCyWY*)0x-Q5-iiX(q!GZ00z1z zY`;;d9C_rCp-ucUx6iQ^dJ$9tOf`=C;*M00zQj9YW12aJAg<7~At^Z3O0R`dVlQQC z9GeMn*r~&d*{D2Mho#Y)^x}&z4&Dz>XFG1v#&_^~&_$+}%XJS9e+zwBBOsY!Rw<7- z{o8cy?`Z;I^IkT<)sVWJ)@ZAe}Y5`|%=hP9Caifl05pL{7uDyiH4^an|eh8e>xqeh@XfUkbHIPPJWli zl0Vzzq;PS_9eFv}+{US3-&6PCM3opOjmZch6fLI7w20G9HrXV|WeAJlsw#qabqNkJ zbl2o%R9s$obuL=v%PP+1VG0zF(FT({Rw&7b@_WPq8FdNH!w)~~92`C~O5o94k1ISm z85|0LW#L$tf6RcB^jMZKwfU~L<@9m%@WT(!7dYgQ)uIFh56ktqL}qgZ4z8_Dj+(8K zlwsTZQ?B`}RN1tOqOIJ3gK&(ODTt-<{B8^FfwIXQ&7nR^D9h6IO*n1?Ye-R}ej8Bv-%kMEb1uj+_`hvamg(L9Km@pk4G6Ojjrq%CTd*rsC9HuivUMZ z{!|5oaap>=@3fs065gpH3X|M}BPf4e>y@PSF_k(e5SqksqNGKDgAk)(`V!xxef##Y z>tm8Se;k{;zsHnp@Q)8GioAJ2%sHfbF980MVd35Fd|t`n-OZ4aFl zYi4G_K`4h$aI6@I`6g5QQl$`0AX>hV8z@jxLN;6CG31j%9er zF@H1x)T*R?OFE>a6V-iCq0V$plYOysKkTkz@jtSzjqf&d4I}^n002ovPDHLkV1mNP B$?gCE literal 6614 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 `q602$?`p}!^6YZPo4k| zx;@vYN!js_h&vGA^Zq8}N{nDu1;R5~rUleB34s{CY!S-edF=+GRCU~@i9w#3DM6Ed zb%)<;2CmmF1g3J~{TD!!%-KsV`V(2Xy<@N%AQpx1*4Nijpa1wqWM^m3+XxtNX5Z-< z`^~2ak+3oapWxg(g_QdJA;Ju2MHNGB=1^UVqRQaRLfKL|B?Im{5P9~1T|=A zD&w&PUp$5b?qY&;+_69?{S8PgCip@Fy;Q)5z)$Xk6hkQGr)I-g9dK%QgReK$d{U?& zVGsnK_H2@@Qc?0OL@oCOiGyDtEFVrAfdp%3A(Sq$_46-Nb`##+N}#{VUrSF^Rzqd0>8mPo+@dge<#y;aNxj!eZ`fy65iQyX@Py zZ>((DvZm+Gf7`cj$?GEF+`oU{bbXyVb^PZB3>aWKcjU+s^14Vkn>TM}{Q6IJcD8QQ zrcE=Qn=xYsd0ix&Awz~ZPF85qq6K+f6dXKP%9k%6QZ@;O-6R2Ukc<#&s?WiL2g&my z;P6YSRjXEI4H`5sS@r7GP1j7FI+Z*x0#4ViT}{^_fB4CZUw~`YtQmRUZ8$kOIjmT* zV*cx}T!3W*UO#^PU==G?G`;4lSFgzXZo)Zs?3n2~4Rbkft)$;&FiS+r=8|K17}DzIC( zZjq-|e}H3^w^prMHTK}a1M;>^I2$%>unpN@z317pXXJ4ia8grK3yi5XY0`wfe*K!f zE)ve!vuEwL$^{t0JxF#Z34#+WC5ocb65;&%^^27#Q6eNbNl8iMc~PI7=FOXj1P9M2 zk{~!p7UZ8fn1CAp_8CB0MXpIMj@A&!96EHUf1c&JX3ZKsR{-}eSg=6PX~PaTBo)$D z5Q&pejKs!`8|S~bT)A@kwr!FEaQHMSSdAJr*vF3_rTl^jB|Uodh~Pk2SB?|MlzFm-6$KgQJT0#FM5?n?_tJ@NWrc_3G7@LwIZ)M&1L#k)%zVHU*ty zfA#FylYRaAmEee0T3VW;NidR4kf};=1ZnTyy^e#gurXuCC?A0RE#MqFbjXxH=hUW8 zpH6Vx)QJ-(Sn=Y;3tggd;lhOk#|>c}sZ^;_MXsT_ZrwV96HXzkr%ahLVJmXFbLUQi z6Ase=1dSr9?0i@z0$*M{o)wWRPP2kDE1|5k%|;G$gXHl5%j6Mx`ltW~Ap1glG}l3loPA^PB?q@+Xy9Bi+QIylG$hy*xzpHT+~fyPLH zBPt-O6dcUJD_5?pG#I=;QIP`We}>Y1`}S2D4&GnX&T~{Bu~`-Si>lb#q)C&M1cUb# z^?}b%pFZh(YQpVYi>9cK4etlXPr8A(pNRD`pVha=+UETB{Y~&e-AW1KHk=W z$T2|9^Y`!H1NtiPcJJOj{W@$(v`b9HZUt2E6*bw6XgEG0;D{~tt5&VjdnD}My*r>1 z)r1KXg2KUhpRn|dzCQpvapFXMM;zj2vNjh-G@OFuq;eH($BrEl@%#KXa8P~MX$>B% zXrjzN!4V*ocj3#pI7z!be|72hG*5~%a;jGxD?9d)QOE6HOiGi3aVxChE9;bEgW^Z4;&*0Ezp|3V!KpkKLig*|!le}v%35IPI{w%=n! z*sotde{2s0(0zU#IdUY+&(9|~qICN7>5!gv^XJbeIHH7pbfLfr)*_AINQM)vUpK)C zv#?b@6gVhWOK=1Vy@Q-C4q|PI;0P4*+NMmI5)=%E*9GMy5FD3;3Fz3dV=cj;@VS$E zqXft0NCxIIMqkFof5ovEFJ4fDKn0;(rLXHfvWc8T1_+KoAqs#`PMssIwf38OxL{%oq$i{LsyTRI>(E{Wf8jG!m>l{(EIAUG}xJLQZ%T)TEH zTd`t=>Da7Uf3paV3}NSj(T7MZ^d%Si4Eu@*js)RZVr)}}K0n5mGB{VzE^UJ2qT07_ zZ#%zf+qP|i_Y)i!m6ViZ3nwu#k>JQwumnT2geEu=g=Vo{??&q)zig5$FI5t^?J zvl9^LT`a6FmQ<1x!?~k zpno*WOC#q)nO};&ul>%g800000NkvXXu0mjfD-z&z delta 3555 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 diff --git a/examples/resource-bar/assets/Playing Card_Spades J.png b/examples/resource-bar/assets/Playing Card_Spades J.png index 57117be5cdbbe930a63d299f27b052d2e490c561..63adab4a9ba2508df68d063b5109d057ac54f43e 100644 GIT binary patch delta 3105 zcmV++4BqpyBexikB#|@}e+%hJL_t(|+U=bMY!q7*hPSwTa4kH7yK8WFFFYW@Ap~~| z9xOm`f;$8V?xfIC+zIaPP@q83`{uvt_RUUbJ2SgGvb*Ob=Y_XjnLXdm+;fkOjWK4E zsvu1Soh4|9py7f>l6qXjqwEViHk`Hu-UU`lX_TTSJ)SJmH`wT#l;pR z{bTm**;zwLvRQV!67&Vhu{z#f7~ z92YlkT()oDKC-$IaQ^=N%X;*1b-uRH@kI%a_UG zM#C94Y?!JjL52(&*xkE#$?8VI89#o!rubUUoH^OEXV1v;dc#?}cCAa@!6i$U87B+qQbe?nS)29#Le<5mtK7S+t(Mp~oMGD!T z|HO$CvuxS2vEs#xvs$%kv3Bj+ac^|~{Q2z4l`DpYrd)=DUzs~_kY;d4ux8!5b&GA= zwvA1ge=vcyY14)kDpZJXdi9>Dfo(y91`T*i<;jyL*^eJTtmhCo+jJ^vvSi8F!-o$w z9VmVbD_5>$ojP@5MT!(*2@@u?%=iJu ziumuDGiPQ;jvP@uu$M1ivJD$H@E<_#+_^13f1l>krAyY_gxU`(6(~@^`hidU+Vkek8{-Yt zoboqr-0<3|PLn53wlq+(e(Z{ED&sqkgXma*Z(hqG3#T5%@<*-K9X zK?Hr&s8Kw7s&po&OP4PCb!x&)g>>l9 zfsGh3f-PLQkhe9W4qF_A{QUVde@mY}y~FF1CQZuDpFi)`@r@lj*1>`B8#t&LOOqyz zTMIk@b;yt*?8Ao-G4fX8_q=-bs(-*ijRDf! zdQ{dR%Nm=^m@z~4b#OMM0%ySfcevbsO<6p3{1+?oHXe^Cr5x5z8$ zv17+#{Y+-qUOQJAbuVAK9%*-7Tr_;N4@9ukW&{m-rn4(3C>UzfGvTOgWf3#`Sa!19d;Go|H zGuT$FSixOoPr^ZqhMofFLF^sw-MiPfy)`EXxyL0Cb@5zMAth8fStC;`h?tTfeHmoIT zKNAsefb?oO*b}T@f4`nJZ{9q5M{d_@)vB?B2M_XL5>D>Xtjg_1Le5n|<&RS04sJ9e z57-8v{}ewiulLq2UcAWnDoO^%rA_7zv#Jzf7*_;&9$dPV-XHrdBjzX=3J19twLwcf z&(%xYp+ko>pUFt%OE2b zo#ONDwcEHXsugGVd%#*JcfTQ@g99%R2G(2b&I4))w1{-XCY&QRQ|fhx1FuMLPYr8{ z-hv4u_Rqr_6r133h*Dv+_zxU7kSF5A8|r!U=JB})kq%|JBQ6JW58eEsDqYTJajF{wLh9(LjX`1GkNpoO|Gbz(b~agMZqOpnu2%M!R;(`ME7jd ze^JnO65AFcSFT*_`Sa)2sUh$;L9vQlLJw0waK*4hn%bWQ)9c0YML0Ncj4Y7}C1Jev z9&t6SL+FUGM6!+Kf59G2DThOFyhI2N!SPRlHx}C{X6$jq_2C4^B4E@2A~+_3Q36D8 zbP(i=v<5zrfh9Nw2-4nS`^}s=lV?fAe~Q8n@pCX|hv1k1N3M}eTF*vs2o8xFI4B)P zJ)2$Sf}jM)BsjDQB{(Dmhu{z#f@I-=F197o!E|ctdr3SaxOs)lf8aoH zvHdI8OQP4^E=U{&Cj#s(v)+JC_n*% vwh?rJpl7A~AX1NMWR!hj=eDrB7nH?+T+3Sl6klnb00000NkvXXu0mjf&r$y& literal 4530 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 diff --git a/examples/resource-bar/assets/Playing Card_Spades K.png b/examples/resource-bar/assets/Playing Card_Spades K.png index c71a5e0e3199aea5ecc2a0a10837adaa2c18f27a..62d4a6086e20b2f8cb5bf198e2108b7d84c32d3b 100644 GIT binary patch delta 4030 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 literal 5933 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 NqNVl(R<2?h`9Eb8pyL1l diff --git a/examples/resource-bar/assets/Playing Card_Spades Q.png b/examples/resource-bar/assets/Playing Card_Spades Q.png index 618c6936c1b68439e3e75bf40098685441cb0125..bd8dc7be58cedcfc82d8ed16a0cda50f22a5ace4 100644 GIT binary patch delta 3289 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 Xjgt)9iFu1+00000NkvXXu0mjfe9%qg literal 4768 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 Ny0Vs1m4a31{{h~JFVO%1 diff --git a/examples/resource-bar/assets/Plus Key.png b/examples/resource-bar/assets/Plus Key.png index ebc1035243822dd10b593ed5dbe4d1a0a1bc3d67..bc9cb6ed7086e54b2d656818008ca103f7ecae36 100644 GIT binary patch delta 922 zcmV;L17-ZV3a|C0yyW|2gh)aqG(}gb+dqA%qY@2qA@o%i0YVB}+QTb9TLZKFRuq;6d;r1c4;dTdK$Zu7XYd34Zu;zKG3eVZ zV`L1-=c48-BAd;6xm?c6=ks2nP>8f8qhyuLy0MTkGC5uO3OGAE^D31}EG^k}V`3FZ zTw#dI<+42>$$w<>mwMpi}1t6o*$eTl=O#bV(zKmY;|fB?jOAnI=tyMB&k0*KVC{zd{2fB*y_ z009U;lNs(^F_~yX^hR=lm}a-KHJW zJE*uZG9)Ao5fd&ZM5dZ=ZfE*?eU7tniAGKLz ztycRIqTB5{3q)$)%p%z~vr2Yd|3x-^vI`d=&H{0+664m~n7G6HL$QqON!A|Qq6o&t#DF{IX6%|rj5S3W6U}nP_A+er$ zg9~qRA7y6A4&DG*!eY2f7Kjd|>4vJkDr%J~iSL3If#Y5hCk{?~KB)`b_}D%_^|2j0 z0SJO12!bF8f*=TjAP9mWi2P%uVWd*2Y@4QeU>HUn01U&ZGk?bFY1q~k!!R0*u?7Gz z#u`BoT(sNm{}bCylDSf;Y+IJ~9l&wYip&WAc%Jt?i7?WF)M~Xo(=;yttjXG#QF=iT z9JE@kA2OLu*-}l@JOha#Vr}djDWn9c)oR}W)MX2u1L|WR#m17!WEjS=D1B*Z357!8 z?K8{xzW??a4u6NC@5es+H?Cb-K@Rvd+qSX1yewlb_gI#Ne!u@AP2{5}NXHPKc@+bA z?HSS{wjiZaX_Zeij8vvGxy3Y1p$|m9`qWn34Bc+`C!fX`i)&`)5cxpltIv>%A#t&7 z8|&-qSX^9u`&%WR=V3S;CN5_Z7hKmxr_%|=2^Gi+(tiLq?Dc(LII`N=*+HpPk}O6J z%d%1tePYA5ZIsJpJU>69(P)IO^L<~GJ$zvVq=Ncn4d*?gN>!`X%*9Yixm-rIS`DR( z+Ai`@6jB>yiP+fKP-*^4P~9eFF~qiQSk_1LgTVkn5Ww?1RmG-?WmzZ`3Ll2GlkQMe zJjo=e1Ani9b~GAgRa`1~o(IqKP%IWh|6Hn2+GV|mhQ`szOptk>JVr%UkRG291VO^8 zBKaX5L)o3RO0IaO6B+74^W?~z0&|&%gf=|fX?b$R*bNQWux@M3dnn8kShEz~z zjDOYnO$%uq&~aTCS65e&u3cSS#opdtD81Qi;^E;TmHI?M)b{ZyCiAt~6!{ue{)d{W1wSOQtH#c8hh18)gOEX9i&5#l#%4#qFgq*w{ zpaH^l=iBz>tG%Kpj`Ee__r&J;6fR$PzHPs`9}*ktvNVH^MMogZx+@ce-wjwO6i_S{ zRTZa*eJI!0SY6o*0crZ*70i*hjIE4eDnQyj4e3 zu{lQS9U{_;G@F~7|H%&RW*x@Z?bFlKpE7x+gF0jE7?S7cW}M#GH&RFo(rUGS1VL~h z8@y%_#@KC=_fG*Sy*6)aYwIrnf6w}>@}^-JMgzcEv)R<=d^JH31VIo4K_CzWK@bE% d5Crjs`~u|vpV94lV4DB{002ovPDHLkV1kvQZ_xk% From c5edc96fe16c12345b26e8f096605a292970e4c3 Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 27 Nov 2022 12:46:26 -0700 Subject: [PATCH 21/24] Cleaning up old behavior names --- examples/resource-bar/game.json | 60 ++++++++++++++++----------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/examples/resource-bar/game.json b/examples/resource-bar/game.json index 8d5c49a46..895c8694a 100644 --- a/examples/resource-bar/game.json +++ b/examples/resource-bar/game.json @@ -1435,9 +1435,9 @@ "layer": "", "name": "TiledEmptyUiHeart", "persistentUuid": "a1be0010-4eb7-4e54-a651-7d77ae646149", - "width": 80, - "x": 513, - "y": 276, + "width": 128, + "x": 448, + "y": 240, "zOrder": 0, "numberProperties": [], "stringProperties": [], @@ -1450,9 +1450,9 @@ "layer": "", "name": "Tiled_ResourceBar", "persistentUuid": "be98771a-978f-443c-80e8-197098aef457", - "width": 80, - "x": 513, - "y": 252, + "width": 15, + "x": 449, + "y": 240, "zOrder": 15, "numberProperties": [], "stringProperties": [], @@ -1466,8 +1466,8 @@ "name": "HealthBarBox", "persistentUuid": "fddebf95-4d5f-40b5-a087-80bd8c33b68c", "width": 265, - "x": 504, - "y": 296, + "x": 440, + "y": 304, "zOrder": 0, "numberProperties": [], "stringProperties": [], @@ -1481,8 +1481,8 @@ "name": "HealthBarFill", "persistentUuid": "1e7ce7cc-5104-4c95-95a0-343f3d97e140", "width": 248, - "x": 513, - "y": 300, + "x": 449, + "y": 308, "zOrder": 17, "numberProperties": [], "stringProperties": [], @@ -1496,8 +1496,8 @@ "name": "NewPanelSprite", "persistentUuid": "d0461165-f597-4574-b3e8-8e78014d1c61", "width": 288, - "x": 464, - "y": 490, + "x": 400, + "y": 498, "zOrder": 0, "numberProperties": [], "stringProperties": [], @@ -1511,8 +1511,8 @@ "name": "Heart_Tiled", "persistentUuid": "63560c9a-582e-4a76-9560-e929ab4a1fdf", "width": 24, - "x": 504, - "y": 512, + "x": 440, + "y": 520, "zOrder": 21, "numberProperties": [], "stringProperties": [], @@ -1556,8 +1556,8 @@ "name": "TiledSpriteResourceBar_Text", "persistentUuid": "6337ed4e-77e0-4cf5-b4cd-b4770b6396e5", "width": 0, - "x": 528, - "y": 80, + "x": 520, + "y": 88, "zOrder": 23, "numberProperties": [], "stringProperties": [], @@ -1739,7 +1739,7 @@ "effects": [], "behaviors": [ { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, @@ -1827,7 +1827,7 @@ "effects": [], "behaviors": [ { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, @@ -1885,7 +1885,7 @@ "effects": [], "behaviors": [ { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, @@ -6291,7 +6291,7 @@ "type": "DrawResourceBarOLD::DrawResourceBarOLD" }, { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter" }, { @@ -6492,7 +6492,7 @@ "effects": [], "behaviors": [ { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, @@ -6580,7 +6580,7 @@ "effects": [], "behaviors": [ { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, @@ -6638,7 +6638,7 @@ "effects": [], "behaviors": [ { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter", "ValueMin": 0, "ValueMax": 1, @@ -8654,7 +8654,7 @@ }, "parameters": [ "Shield_Bar", - "DrawResourceBar222", + "ResourceBar_ShapePainter", "Fly", "Shield", "" @@ -8672,7 +8672,7 @@ }, "parameters": [ "ResourceMouseX_Bar", - "DrawResourceBar222", + "ResourceBar_ShapePainter", "Variable(MyResource)", "Variable(MaxResource)", "" @@ -8690,7 +8690,7 @@ }, "parameters": [ "Health_Bar", - "DrawResourceBar222", + "ResourceBar_ShapePainter", "Fly", "Health", "" @@ -8735,7 +8735,7 @@ "type": "DrawResourceBarOLD::DrawResourceBarOLD" }, { - "name": "DrawResourceBar222", + "name": "ResourceBar_ShapePainter", "type": "ResourceBar::ResourceBar_ShapePainter" }, { @@ -13090,7 +13090,7 @@ "version": "0.0.1", "description": "The resource bar can be displayed using these objects:\n\n- Shape painter\n- Tiled sprite\n- Sprite\n", "origin": { - "identifier": "DraggableSliderControl", + "identifier": "ResourceBar", "name": "gdevelop-extension-store" }, "tags": [ @@ -13999,7 +13999,7 @@ "type": "behavior" }, { - "description": "Slider value", + "description": "Resource value", "name": "Value", "type": "expression" } @@ -14917,7 +14917,7 @@ "description": "", "group": "", "extraInformation": [], - "hidden": true, + "hidden": false, "name": "Value" }, { From 8c2656586967b4e8a98066df4ac27d67762c189e Mon Sep 17 00:00:00 2001 From: Tristan Rhodes Date: Sun, 27 Nov 2022 18:26:17 -0700 Subject: [PATCH 22/24] Great progress on Demo game! - TODO: Sprite without maximum show an extra unit when removing units. --- .../assets/Bar Frame_No Shadow.png | Bin 0 -> 3993 bytes .../resource-bar/assets/Bar Frame_Shadow.png | Bin 0 -> 4289 bytes examples/resource-bar/assets/Blue bar.png | Bin 0 -> 2910 bytes examples/resource-bar/assets/Energy Bar.png | Bin 0 -> 3086 bytes .../resource-bar/assets/Health Bar Box2.png | Bin 0 -> 2983 bytes examples/resource-bar/assets/Health Bar2.png | Bin 0 -> 2845 bytes examples/resource-bar/assets/Heart-1-0.png | Bin 0 -> 375 bytes examples/resource-bar/assets/Heart-1-2.png | Bin 0 -> 375 bytes examples/resource-bar/game.json | 4009 ++++++++++++++--- 9 files changed, 3382 insertions(+), 627 deletions(-) create mode 100644 examples/resource-bar/assets/Bar Frame_No Shadow.png create mode 100644 examples/resource-bar/assets/Bar Frame_Shadow.png create mode 100644 examples/resource-bar/assets/Blue bar.png create mode 100644 examples/resource-bar/assets/Energy Bar.png create mode 100644 examples/resource-bar/assets/Health Bar Box2.png create mode 100644 examples/resource-bar/assets/Health Bar2.png create mode 100644 examples/resource-bar/assets/Heart-1-0.png create mode 100644 examples/resource-bar/assets/Heart-1-2.png diff --git a/examples/resource-bar/assets/Bar Frame_No Shadow.png b/examples/resource-bar/assets/Bar Frame_No Shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..dde997f1389a52276328c6e919697df147d7b37f GIT binary patch literal 3993 zcmV;K4`%R*P)EX>4Tx04R}tkv&MmKpe$iTg4)k4hEFskfAzR5EXHhDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RR%KKJJsPzojkd?N82(+!JwgLr1s z(mC%F3#=?D#OK8023?T&k?XR{Z=6dG`+25dWYhD+0jVfq16NwdUuy!hpQJZB zTJ#7AZvz+C9ZlW?E_Z<8CtWfmM+(sN7mL9A8GTb87`z4g*WBLP`#607veeb`4RCM> zjFl*R-Q(TC?%w`A)9&vFa_MrX6#Z@F00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru