From b371dfc7771a6b71e95931bb5143760645e0a003 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:19:22 +0000 Subject: [PATCH 01/16] Added release workflow --- .github/workflows/release.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/release.yaml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..dc6c7bf --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,19 @@ +name: Release + +on: + release: + types: [created] + +jobs: + package: + name: Package src to release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Package source + run: cd src + zip -r RobloxStateMachine.zip StateMachine/ + + - name: Upload source to release + run: gh release upload $GITHUB_REF RobloxStateMachine.zip From 676c8f1c6c72afbb504bfe52ef4d663f001223c2 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:30:01 +0000 Subject: [PATCH 02/16] Update 1 --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index dc6c7bf..dd339d2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -2,7 +2,7 @@ name: Release on: release: - types: [created] + types: [created, published] jobs: package: From 870ee861fa05ba4c3c0b17047953e703b027357b Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:36:13 +0000 Subject: [PATCH 03/16] update 2 --- .github/workflows/release.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index dd339d2..48eaf6b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,8 +12,7 @@ jobs: - uses: actions/checkout@v4 - name: Package source - run: cd src - zip -r RobloxStateMachine.zip StateMachine/ + run: cd src; zip -r RobloxStateMachine.zip StateMachine/ - name: Upload source to release run: gh release upload $GITHUB_REF RobloxStateMachine.zip From 809c9cccf87d039bebee72005b28653f0f485dd1 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:37:49 +0000 Subject: [PATCH 04/16] Update 3 --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 48eaf6b..acc4693 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v4 - name: Package source - run: cd src; zip -r RobloxStateMachine.zip StateMachine/ + run: cd src && zip -r RobloxStateMachine.zip StateMachine/ - name: Upload source to release run: gh release upload $GITHUB_REF RobloxStateMachine.zip From bd387069d0deb375146f7dbfee9825ef4efb20b6 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:41:45 +0000 Subject: [PATCH 05/16] Fix github token in release action --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index acc4693..1e5ab3d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -15,4 +15,4 @@ jobs: run: cd src && zip -r RobloxStateMachine.zip StateMachine/ - name: Upload source to release - run: gh release upload $GITHUB_REF RobloxStateMachine.zip + run: gh release upload ${{ github.token }} RobloxStateMachine.zip From 6a3bc6b5e49b2c6430f2b1813e856dcaf55b8450 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:44:07 +0000 Subject: [PATCH 06/16] update 4 --- .github/workflows/release.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 1e5ab3d..d8ba13a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -15,4 +15,6 @@ jobs: run: cd src && zip -r RobloxStateMachine.zip StateMachine/ - name: Upload source to release - run: gh release upload ${{ github.token }} RobloxStateMachine.zip + env: + GH_TOKEN: ${{ github.token }} + run: gh release upload $GITHUB_REF RobloxStateMachine.zip From f3400f6935c576fc1f04930f492e7b9dde6ab822 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:46:06 +0000 Subject: [PATCH 07/16] update 5 --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d8ba13a..823c71a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -17,4 +17,4 @@ jobs: - name: Upload source to release env: GH_TOKEN: ${{ github.token }} - run: gh release upload $GITHUB_REF RobloxStateMachine.zip + run: gh release upload $GITHUB_REF src/RobloxStateMachine.zip From eee842c959489809dd91c3561d714caa42256b57 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 4 Feb 2025 21:49:38 +0000 Subject: [PATCH 08/16] update 6 --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 823c71a..035816b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -17,4 +17,4 @@ jobs: - name: Upload source to release env: GH_TOKEN: ${{ github.token }} - run: gh release upload $GITHUB_REF src/RobloxStateMachine.zip + run: gh release upload ${{ github.ref_name }} src/RobloxStateMachine.zip From dc00068c9ba668a433faee7c1034f48a40b02889 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Wed, 5 Feb 2025 16:34:15 -0800 Subject: [PATCH 09/16] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 051768b..ce540f8 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ robloxstatemachine = "prooheckcp/robloxstatemachine@>0.0.0, <10.0.0" You can start learning in the docs page! https://prooheckcp.github.io/RobloxStateMachine/docs/intro ## 📷Tutorial -[RobloxStateMachine Tutorial (Studio) - YouTube](https://www.youtube.com/watch?v=7M1LkjPaEFE&ab_channel=Prooheckcp) +![[RobloxStateMachine Tutorial (Studio) - YouTube]](https://www.youtube.com/watch?v=7M1LkjPaEFE&ab_channel=Prooheckcp) # ⭐ Contributing Please leave a star on [GitHub](https://github.com/prooheckcp/RobloxStateMachine), it helps a lot! @@ -39,4 +39,4 @@ to discuss what you would like to change. Please make sure to update tests as appropriate. # 📄 License -[MIT](https://choosealicense.com/licenses/mit/) \ No newline at end of file +[MIT](https://choosealicense.com/licenses/mit/) From 891d5ebefe77c2b4c733076f0b11aad23532a2c2 Mon Sep 17 00:00:00 2001 From: Errorbot Date: Thu, 6 Feb 2025 00:43:12 +0000 Subject: [PATCH 10/16] Change tutorial link to (fake) embed --- README.md | 2 +- gh-assets/tut-embed.png | Bin 0 -> 82402 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 gh-assets/tut-embed.png diff --git a/README.md b/README.md index ce540f8..602b2b9 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ robloxstatemachine = "prooheckcp/robloxstatemachine@>0.0.0, <10.0.0" You can start learning in the docs page! https://prooheckcp.github.io/RobloxStateMachine/docs/intro ## 📷Tutorial -![[RobloxStateMachine Tutorial (Studio) - YouTube]](https://www.youtube.com/watch?v=7M1LkjPaEFE&ab_channel=Prooheckcp) +[![[RobloxStateMachine Tutorial (Studio) - YouTube]](gh-assets/tut-embed.png)](https://www.youtube.com/watch?v=7M1LkjPaEFE&ab_channel=Prooheckcp) # ⭐ Contributing Please leave a star on [GitHub](https://github.com/prooheckcp/RobloxStateMachine), it helps a lot! diff --git a/gh-assets/tut-embed.png b/gh-assets/tut-embed.png new file mode 100644 index 0000000000000000000000000000000000000000..b51758766006eaeb3de864bc99cf45eb978d55b5 GIT binary patch literal 82402 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 Sh&u*8AA|%t#rjhLO zhsXK-k-qP-SffqhpEDOWI`7nNy^VfVEr<}%IFhrjsoh0?VLCWCPf*QbQutRx-A~Uz z2dvzk;#GsHCe$k5XwLE&;iV!aY4SNKECyf&Q0bUkS$OI1ruj^D_mqsNqR8pH&U z0E@LxNEp0|*Lpi69*~J|ntJt~IQN$B7k0;m-Enc3E^PFbT!H;EvCmI@%Ab3mjQ?5d z(qm&KtGvv*O3{{wedrCZ_4UdXQg2-Txkf;2s0B5;)5g;p)z~mI3o-VbWTYFL)b>~u z7E4R$_Y82P7|l%U@;A&I%i;rFeiW^lwSI(q|jBN5uw3&dlRZCqb*@nfPqJoFoS6T8iOIVH{&yys%mW3!vdu5GNS^fFtbQd>y>N@ zm^gxjBT+{N>lL{H>Y8emdR9!wTCZzYL}k|BbI(k*o>WsEkz(1r4exHFQ8YI&!jw=% zr76r)j3#C@bAU6z7%3@}q`=*7oQ8Ydc+}{#a|u*gR6v|$PNb?t+(5N5k-S}rUl@c? z8K$y2e2@Gw8A*6tmzQ;JWPzm$gdOYH6Y9EeXs~5Ou)xRW+G-6^~{) zK&Q>;bRNfApS1*jqSj|rH$_Dqe_AX2c=kf*4N%pU%ZsnUHruM@;3HsN>&{J6beh73 zK=Ok`#F^2^V9C)jXGSw=rYI6kdY7gQ##n!dKdV`Qh9;6GaFb(d6N25CLG)l<_W`BG6E#^jK4Ak~kX%KtV|-n3QJ- zZ88T?&RnVp#8iI95JC$KI{;b)sB7Ow6PQfRf*Z|$8DLP#dLY1Z~05Qh0 z8mN|ru39i9;GE>n6;84&%Pl>k8dcRy!4NSpi+~6n;7qA%&W2BQvO`8fHG(7@krRc8 z0E8ri7otV8Xb3RS3c}TPQAi5Os;Y*^+)NUtx~}fuMnc5u+*0iq0TwLa74*=<&9W?2M<&8da*t>v)%$#MCeJ$u%BppA7X9ux zq7Q0@zPKpX0kV~(zS@JX1|^8$9U~%y#W+|Y$&q~jV=4tK*RW zVGSR37_49ODSS-nqV-_Y6rCa9vLc58Ot+N6ErBJegTZ32KVOAz)H3Lx)J{^sREj09A%l}m1ZQ>y775N=9zDgb+!>(Xfy`E0p83RL@YG^ff&RX z0r)(R!PLx2FX&vaH{0zWHL6gZD5HaUO0>S4nB47T1|jp#JD8b?Kzun^x@Y!ZzF_~{ zL)&9&9Mh8kz#MEZP4BqmiC67@!nyYzd@zg9haWB%`V;X;u*1D@cu*aU)-#xh2SH&W zGvlqDL4` zh5#~IEa%ukdn$JNOZ|rr95`}#pw$@BHuXSsUNYbAw6`iIO$+C8uv>-MGR}s$RQ7{V zoO6IWp?955XMCZ17#7t=^*T+Dty(jhC1MyvBriH+#YNCb)SA=Qa7IrrGQ+W{P^fB_ z`_cF9v9{gga!k$4XhxAW+?ut_cv=7@d2dxstIQ@*yn?M5WANT5c_CXqRNW+VpBYGc zH!0v`fRLIO{cZqjL6pAl;L_sJGR%cI2N~?%bKZp)UOF=~O$q&e|K5A|-*)T1exHN6 zPOF&ev?i-CSnSOy`kA*X^aulj!9>KYf}ji#0U^*_EfcC*Fc{RtnHl?4PK1eeA+ZDP zE-u|t#W``%=*(!sPzEn8k0SRw#l^wkaCdN*VG*bRPk3O_(mh<4K7kOJGYAv=9I4ZU z3B4H*J%D6~(&VBVMHpiwm&XQ3u{%_W42XSK_d-qXbxsVnpmTH z;kn{1pGmvjS`M+28sp<7dc@`tld>$!GK!cD+x3oY1sDZ+?z7wvGrL${Qfku_ogQeW zT_wyA)yn?T(fNf#Wmw8Hd*uzUeC;>9{OYG&H8wsyHr4@yM$FAE-E;T;4}9S7e*3q6 zt5+@sJEUrg>IZ)C|9a_5uP5L{LadqvPGwLL7h`lTg9_mC!uNVhS)NA?fWGIwfBw#Q z{8(7Q*z2X%w|F_@vEmIRav#c0Y3;+1Re|-Dff2%(@TKFTm_hoM&jF(+; z$sho+{c z%Bm7d2!UjlCjo{p!a*{<(61j?ba_vI-}4Wg+A;(o!+RicSZE zf%ooBKk%08U;Hw0u?k1XPUa_WyYpXv^v8a(yLhxWn49dJ7eWwcY6Pv){zC6)u)#OK z;q~A8EnnYhJ5>dXUS;9)@=eRRz4a->FePSnDnoDZ>l{tKS}Q$P6= z{a#NTD17HT-tiaj{oqpf@K~n@0j)473?d1-cp4{EBbVRMdM<>oORA#_3GDr_ji4_&$5)vdB-2U;~npO=i<@= zDOX+fPAQ)9iu1I|uYgZfb@a%#A{ky;WiI0CqEh_*|HQ?u=Q56oq|X~ z?~&>;n26AQ&0qYeAb`wgiKP-_B$-Gn9QE58d+(&iV`W8bnxfMN24k%_X=>%6BM&MT zF1_fYpZb~q^y=5#Ffmy;FJ?l*5COM)7p}Pc%9p(4CExxX-~8i0@nawT@JEw0!PBpK z^2=ZGA~R$@Z&ZP5Mw_ZO_mG*XI06<`DPpEK-E!woMs7~PUtt}(mrIoJH&@BQJIzIa<%&6@@hm_?0n zqI9tg-CcXmf7NSV^~zVj$~z;_?Zvzp``24;|MNfp>zm7gD+kU>FSG~)qLv{p0^vXY z$NzZ!^)Dd+hSbLJ)1SQQu6qvk%fsGnhr0TqW=R*B^$r}mtBObR!rtXN3Hw>cMst3%>R#kMYiA_=4 z(*X5ko%~-K5Tf=KgC|^c!LR+VU-_1A{l%C}&qx6&&b(K(0U5oM#Lg1uMZEW!qMBR0e_)3$zx)X= zc;WM%a};+4Vm?rDu=wt zd;MOFaWLo`Ec2O0rPTCg5m0n&tn)qJ^Trq#LYNPspOhv@Bg5j-Vd&DHi*`Nz+NU|6 zMZhTScE<@EEr*GqV^PW;H2BPW$EsSa;=;uj?|sg5o+E-7HL;MNb=`BeZJz;pbBp&w zmVg0iLZ{XjzjS1NUlnI}o-_H&zx)e7{WCwlYu7o>BWh))Aygp_f(}5aA8x)X@_SI%*`JXW+~4Ph^iev zw5TC7VU{uIoR{j7Cti5P6_-2l$rFz;&P>ld=ef^*?|c8cibp6rMQF%E;Jy1F$b257 ziA1wV7Mag?@4CQ@q&Y7O3r8P(=%GaCBbk_f4?J*CBv)09Bpi%t3Sx0_@qq^($g(`e z_ndQy`w+FFRG=)(F9J@OHRh)=JUnhSe##k%(80wRt62KX)t!AP(SkUM5!YY;;_=B= zcVV##N5oANne(RB@Ar=|x67}1!k)dmgGHDLnX)O4hFCF{vA@(RqG<@G&c{Kys5W@@ zYhSf>>lRq8g&$2uQRgEG7 z!nu0w>>Ymkr+?z(AOH02w?90$@PK!cWhzb)VTurtd59o{sELqgDOPN15TL4}_wJzw z5A^$e0LvDoDdMKsfdlvTx)o7)mpR9}*xCfide^)Dbl<+aA#r9)=M}Gd@lXEbPh58C6+i)GPkZ`RFMjcJ?zrn;fAcqg z?N9#r-PAUjnVO+g8@%aF|LF~{e*=Il^Gi$JcfIRffAXjAFfA|Ki}gqaytL$B9WCE)=fT#|So@v)D7 z;%#qxTS^0v&N-jt?!_4xLcra3KL8ZobpQa`^bD+PE7qKj%*o)tKbW7MnY{k`7dl^4Cp6YVudjH;%l_Mc|8M=lQWfT%+d^h$A}%g2Jxu9e zbL~^!^ycqxwY_REi}yeH(69dTZ@l-<{_5WQ9stTMTgIRDtY`kzPrdc&S3lDU5b=WN zUjNdUy!7|?|4|G*Rn0P&f+%7F1DUA_kQ z0&uDbRZN==DzUxn~1hxT-6&KU_{j_isU`m@{(2-7y6&Q@yo(YO#sJ6PA1JtKmoK0IcKbO zJ}e&=$_xv9(>|Bwl$w>GYV_hoXthF+nWd$@OPN~IobdIpf5W@q`B!CpSZ$}{v{|n# zk2q9&&OPUO*Ig%RDc`IgNkTwDK#WjNqo{MC*F6%^yXKl}ue|aK=Q%95X&GuK{w?O*@(-_0Iem>552>&yk+-WHW5i!Epe z?05SQb_Ywt)fMWpAds1`JvFh5)-lZiqw7}ju70Ut#k!}T08piuwn%$wa+|QIO7lJ+ zS+BK#j^kFbaai&rM{AYVT=$uoIp@sOOkt*osQXWV;^!CUoVQN95c0a~p1t?N-TUu- zs4S0W`8i~{wDj;;E-!o03$}0B3WEZNW)IJ7*)miUPbx$TGcht&VXGSpIdddPTY~g#Pwh z@BEAR{xwjHwRViP&Ua1+)zPDicYNwopZemLKJ&ciy-*{Z$5Wnq^*QIBbMO9r0Q0;^ z)0uOOnhdf*O1hqarry{y3@Ej@RMTVxW~v&!_f7Hf@&IzBm{To+XN_7b5kl2&=Wl!4 z&)jk<0eG)1QaYIT;RZkIgCqF66WKi}Ny9e8aIzMoJaO-V1 zz5JCg_A-_vZ@Npp`|mq!I@W1zCB^}S*sJ1URDfy2i6ALvgi7Wn$BJ{zauI?h(Guo! ziw7%RXlL#mZ8eB zqE$=~Ez?|(MeEhf1rANoadb^aztwRUUo;8o%+$=QU;WCrzx{uf z)!cZ|9aOWGE=*+Zb>H+&fI+diuz2TfcRcMG&+u7V!Pe`3r6>XGm2qxR9lhkz3$MBM zneBFm3^7)p|H9|~=CA(ozy7!X;xlUGi(hp8?mfHj+czJ>VxEr!S-)H`44(Ytr|!LQ zuc|tF0w4d_r@GzByUx_qxs2P*w8$q!X3Nn1)Qz8f_VccT^MjzBvGEJ`?z!=^H=0V> z50d(c(20OzxI0)VnCRdrC7tg~50t}Bwb zX^Kt@nAHI#XE2&`l7IfQUpRDV_MCIJ31P68zVxNP@Lzx7M}O=m`n{w5K@Tj!ejLQF zeB~>qxkb-fKp`K?wp#4OkUJ+ZGj%DLOCnlu^r_Ma#t?j{axWcI7#&P1E&JsnFnH3F zpZ3gap9y4u#2EhiZ~ppopZ(mM-}Dv=0K4d-3$MKL@=t&IOLOyw#&_&d%`CQnLM@{+ zac$IH99GV86f+k?M#*7q&_oQ@0&-Z^B%guAXG09Je`xkWA~T4=fKoufDUM8!T`72XaWiS1;xBu#(JW|EO zi%SQ9{@#l&yW+|#0fG20-}KK%=Z{LQ&xfXdoeF0_Uc~v{T!@R;TzmE9mtU4bTv5Zv zKk<>9Zu%(ZO|`g z`{feg0Y~-?gCch!1T+-?#OHp5TXfZGnv&T0TwGjq&W(+a#Tc^8z3z2i|FI8$;&0yf zet_PKtgv&-`pu?7q$HNapw1zLV2IuRe7E0C$C>PwfQslB-Q-xiN{|5F%Dk{83#O5S!e@+TG}5{1o^lBAyMr9oK->HKtI zH=gAf#-1F^6S& zF)_YlqO*JJ~g0`eaDHk@cYfEu z>2$_4W@d8#1NVOJb2onZ%m4hZ|9VTP0?dlSzvN{vI`_P-Wt{I0jv4@rnR&AqVpWB* z-rs1E91N;zh?-i;=0IkaLEAtF)`I2BPK%3EGp*?@`IfE4n=59ek?|D z-aB82w8z@#6xq2;3;EJQK6?nWhwR9#Rf7!H(&$wQnrbCUYl7Umb!KL!Gd<&Gwz%mT znVin1w~S3rO?dCivP}7&)S-2K;|2_C(^MaR_~3iq^WF#Ue;`%AUa)J|w}1P;*|u$q zA;wUJP$9Jg29}j<0a!t_1kRM=90^iqraRNq?dj=!dfHD<$#i|)IXP*;j+E5`1^s@v z({gi^OVcLhSsG6*?YEl8@34PVOXkImH<;l@QJWl>ch8?aN;r4YN zX2@|d?z8zI#NM3(-@Vipfh-| zs=~scT-dU8{1vZyiE0!$Rett!pPoHDOXA({e%H_a+|L4$)aO3;ndhFjZQs6!7P|+h zCugWF!+bmyJ-Tzv7xAr7{0 z-}=HAy!4YF|AJz+sunw))~jCoS|b5I@X&$Jef|qixa0|v+!i8wdpj>$J zQ?7i$3!k6mDflY4-+sqUU;Y>G@Uf47>_snpS*tB-xbVWg&wAD~KKKtGFRQsc8>3XP zFgZEy#Hp!StV)eB0wU6hk&3>VH}hFGIo{bd>9$s()XWP7P**I@9@$TNlCUVk7=j@G z<9GiV7@IOIrzU2Rq<7xb@;p!D;+!kX@;Eo>s$Q`MAcWw(k1=}h-|>!j3guh>&9`{( zV0hsRU+}Hp@`m5~?cXto)sl(BOWXwLgfT`nP!MB;@OS?AZzPc_QcRPJK$2?V-S2+) z|Mh*}ALF2^%A(a8lzm~VE|jVX#}U*KqROd{)#5)QDOEGnF~=%fb>gtb5H%Wv9NHjq z?Y-AsJZpQD$VBU6&~17}rv)09In_zP3w`ce_uY5@&-~1P{=@(CNB7_Vz_8h=^SWdE z)T>|hb-(uZ-}#ew|HYf$^uyO)_oOl&K791(46s-}p_hIsd#JA_7CdUwz~wA38jHSm@sW{=b=@p95gft=lGF`mz`0h4coq zY6F@FETU^1h|@+XakPU(1fp7u8l%Qouc|b?4+JoP00I!QOvc7qt#&pwH8DQk9_zHG zrY5H*x3$}ooz7U)y3tMy221PW9F_sDVZ*N*1ZX1gJ~x#Qf9RuCRXJzvcKc~hdFIX? zTl&?3Xua!S@{%3rpBsPxeBq{>?z($lr_*U3$E18GfY1bBuRrI#U4Ho$mtOJ&G?mMTSQW5=Qn=yx9+>|{`A?_ty^CI`qy1~`Q=qv z7Dc{Xcic=~01N@FD5_RDry@E&(VCcOkBt?bPChnXOiZ-L(?7@Z@$nWIK{)5F4hPj` z4?qQ0UKjSi^e@AvEq9>MddG+3%() zIvqfY_|&~dQpW>wdU|J3%-nLz-EaNbpZm$5{PB0a`<(|5J}d;3W(6Qc&dV;}`_n)D z<8Oca|N6FX`?up0*<%0xrNO;boP%ftf?CbrHjoC3LSfC06&Q`qh+tJ@Wuk+yQ0Xk$ zf5RKTsqUdi+_(SkFW>Z)UawNbyYAZeg)e-;*auWB|JFDB+o_2OwWWUVpm9OO#Ktrf zrY)cac;m3nBh?`qK|xF4U=bFV8y+z>vy}%jGe=}j+Axp0u|;f1uI5BwjIs1Sg~ep0 z1ew(dq@l}|svuLKlEVfHbwUP!2-@u;&+_;F`JW#-vH;{+)_U?)S3cvKYoY?Q@BZ%Z z%m^B~i;JK6%qREnzsu)hHFsQ03zz`Gxn7J%7nTlh+qUH;*Iz$5F_8*278VxX{jNXN z2pVp@@iVvG`Oj%kgz}tcJ^P85UJ`Y&3P?PqHT}JrfJ|V1D1O>(P_Kh&{^O?`Q;f7aSddcOJQ@J6)%saXIsn`D8&;7#0_~dW? z`X4Uz?k@6;|W*V&Omq(+`UHifP63GL9AL>nk9nW7pg z4VFB+944>`YEzGp0xWfm9FVVk`Q|_W^FQ~loub>$2h|dApx%4$od*vd5*8FX&rmhB zjcEGFF@4)`_9W<kBbeB<+<|ID$mwiDTP{`s$b`73_q=3lL1>c;Cs2x^hksHJKYF(5jx zplS5p=cWo)RduxN&6@>*kO;99RzyYi)dr@iWYVjKKYGU>-hIyg!(cg6loeY8Bu4UElFn zfAbfl8~Xf2AO|&V%bck+VJeno{L8=ii+}yse--Cy1wtiBI;pDi*4u7Vb@ZSNq86%| zaHz5ofk11)GO&DXKJkWOjSyMWB(oWDA{B0>!D{}>02D}pP+PzGj!XsMZMS@zqV z)(-EA!Ju?5Yo12ectvaVXc;CsXc&n+7&JBK&T{(9$nb}M^n0&# zp7#yk_}cM_jsg9C`QBm0y(Tgv>#5)f%#`wU456sOU85?g2F)=aztY=^M2Y>K~M~}{@sb+p|iSQ}HSrjcI z7v`agrl5HZ04?gmLU-RF95fxIQc%KsuQB#AM|-DQu&KA$N!6ot zi(u(p_MPAUoj2U@$}~Vs4St)d(q$sRC=c7Du8}sUF%=%sN$#X&>W&_nfAd>@=wl!I z_{8|MS=_bz+#mhXA1QJ_y7aG29pH0Q>r(25_dc_~_{%^2o4@&+Wp|< z^W#JT%e-r8s!^tmq#HMJN@LR$od$>+gu=S5oR(D(L0K&T^Wsg2)bS-o=`HcLTkgC4 zwtGMRiH|<#c~AePU;6KtU4CU+a$a%ymDgPJj1Pb4lZJl1JY4oUMyqOcS#A;$Fo6dK zWti=kN2X^cuf6t~EX!jR9bLP{AN;`|{tw^(Mw0+jT28Rt&df3jsw%$t#V>fmC426; z{lQ-UV3E&I+LY4J2Zn`*4PkVoBxRI1P#4KFnWYFgfJ;kD-KD;2DEv5)SE2M-I|eUw zYFR7a-p+Rv*-T|_`COLkX{FK1L}S~I-Q%dOGD9p1?=vCscYptZyY9N<2^T+sv}Ziy z>Pw&aglAoMUAx^fU{H3y@Ws#1&d!^`IZ0JDW*}9>fY2YzmD-=4ZhhOgeTz6+Dx48{ z^PAuN<{y3wMUoJEEH3nf9WhZA z1L+asAkRZoRW;WzahGWetBdh5Qbb&DG0ZEa#0JF!dh4yXzWvvJ^(TMgr&TK`Ui;eD z%+D>1uU;DM+ zIP~!1xjU}x^~$C0p~Z!VKk)v4*n8ox{n9V}Vo^-SsCnU^{){VjU$AB0z5|n!+h9}m zGB&ZCZPns&xnj{tK^GQ!hYa28uYdW)7hg<>^9~Ve7#ovl<8+ZgRfRlj55?ZH+yQvw z8^7yEfAnXouuz4bml-nkxU*)aXu>@8&yh~ z!Et(e(qL6pdhZfFjFLJl8Nmzo?0WK5SAOsx|1pG$;AcL4BTT$=F(O90>Z+?-t-t7Y z9|pH5=rSMTAn4&%t9;wre){|W!}qJ@7Bhi-=XZa{yWaJGqV~nropLECODjt?%iFE( z6P*j4bO0B5cwupWZ*V|dG?ZYLLZ?{{AT;sJ2qvNiK!KEC30CzmvI1j6go$QRH9F^1 z?e~BG4`2M^>!1Ggr;#qpTGP|MiKL0a!*aj@iiYw4I44=G5X*65+jwi+^yCijIx&c; zP@F+2rWUmtkCk^WZ@03j6&S!iqz4&*16Tnq>h|hq4vuGBkEtL(<#8J2@y=qH6UodF zBOG%lMXx(}!3&=C(wDyY>t6NBm%Z$USHJq}r>D0lY;kch&$6vsw~mjGi{OL*@WH`g z0H|{kVmY&AYGQKC3sqwis&Y-F#Wk^hHyO0?UAGmE=!t zbdRAUr}$4Iza{z*03m<(cYnXv?NeNqWiP+smFJ(k8^##*OJBO_#?O2q224+HbuKrR zCjVbc?Dq#tmG*z^M}OS8f^@3lT>)bVRathOH?=Cp(x5R$Cyo#`?R47DdCs%;?%ACj zjL+P7Z+##UQjs7k=gETx87z3 zP^F2h#fU5;Af}ndHfY4U{q7%hy8}>SH0QHrg;Vo}%<2H3gkYdc`H|EF1gN5RdxN9h{%pUT z?Ujdn{X_k7wl|oq!a~11B7OjtQOo*rC);MN)2&Iw3Bd}{*i-+t=@p&&kg9}t1rPvd z=1lG8n{U7Su6r-L@*F3C;ey>4KJDtK-+BAJM;Gs};<#BksOBlS{PN4QtPuJT)w#U8 z)Eo4xpeB;Rh8D;#R|3}aupg}n714fwzN{9me$o@Ke(F_u))pEV4m^DS``-6Y0O@E_ zkx^q5da8fQQ=WSDQ?5$iwtLqFFTdgCfA(kpP*r`)17dEmo#Je@uTzKUnmWYcfepEB z_2FfW6R%Nw;=A4QzFzq-;E4(}GfCYA4K2qBFI%VmuFQ`CzTwCfumZrcC|QkT$*bw@ zMzJS}A*E-V{?0r1eeQE#dhT~De;1=CEbVTXkT|py!)Oz%~+L# zzx(^Yd*d6whoBms`qU@A^kpyj<3E1a-26R*{sJIXRYqO7_L z?&u;3idC`H6rGCzU`iqvj!~ynJA#~9g*axE7-FsV4+R)ws3$lcOQl=AJhx^dR5d`% zB=h52r*|GWeE;A7-AA7P{11HdH@_~=G8C1J>V$&3z`k>I& zo$x4T5TSGKH-7Wi|Hs?kN(eotmvyj?_se2)Tdo>>7{#x1QCb%Pd*1l%KnLgm14vB8E@svL?+1VA(x3Z<@$nXjR;zf`t6uR}fAJ4xb)<}kT5h`O zf^6bw!-^@>bgC(}V+t_RMMzK3XNvzI0yNX@+qb>)l{bXS$P6Zs0T6{nh=Eiy`O=qe zdFa6hyMt^h+Xa(Et^=y&(3~A3|C0(O%*1)p10IkxAf`zpRY|9cLBIOrKmOzAJm*?* zb>$F%0}nm)4}bqb!UHN4Ct`KWB9K}u?lIo*iWgt}ggwK({^ei&N5Hfet89Ut>?s(3rs=dCyKX%m_?mf5rbmw;8o20(E zpY*+T>g?K8r_Nrr*7~mRG6XUZCSs64x%-8j0>Q}!6LF%Wx92?LPExbdp z#dde!wbxy9>utB4dFE*VoYQlkaL!q0J>rThZl>HzOsEJz=Rn534^q{T6Eq@-Qe$0+ z7HKoE-G+2184w61aPGP1zTpjTbS^0~@Y(@P(J&e$GxC4G{FR@$=qp)12YFakOKWBB zI>vuSB;I4&SZ@XkA}9;FNI(J+>y|Llnr^q-U%&JlH{X2osi!_XSf)q;eBzUzyzTZo z944TlC;}^OSqO;2V)tk$#?#;Z?sv{F%z^li|G4b0|N5_9^{Q7+Pfr1M>Zzx^;q`C6@`~@= zeDh63$WA!nVP~KH=v})`EKkkhOJBX@{S8qX{cNm5eTy7bH%b7DxuC4VqToQ)0mbDXb-&*|sI!d-vQ| zzVeNK`_!jSKIz1Xi3wCa21OVPnPZP%v(h>l=~RFAXMgT_&->}}1FKS-M1X5UaOWNS z|KFS5@~Sel{Wl7@9a?wa;3&C=a*a?^#yN$p^^1Rqj&YgAUW1sY2 zpXj`c34*1i?4pYY&B;g9iT84ssIAvARq(83^`B`nL1AvWaxGToDjCGNQ^FeRI@YNw#;sq zGQAXYOoWLD3?W!CJF^39dN+eG4VwbfvYe>QT4$>SQ3XIzSmISRNs?9;yqT6Yn#ci5 zy!XB#NCf%bz5Bm;`8OYa>WQipFwgk@_rG7@(sU9MRmVe7bd#hBQeEl)J?61zopa8k zy4hkQO#$A#=lUCWUtbiueap$sCB^iIm&;zSln z-s-516+I*rp{=d}P!uFGAQu>f0&l@@nLX~Fxf}odFaGLj-}k+bfBa(w3Xxz^SjTzu z9y4sieeyI=j9-~Yqcy?J3SpP4#7)$L-_BEATj zSzf8LnD;&|y{cZ-f#RJ9xV(H{Yr;R_@sB_A%(DeP6aaA5Ro7j6%`J)FmbhcQY!hyc zKdt6*QxnJDe%t=bFaP%PQd?aD_^HY1r#E5f_CA!f&i86>PVu3zMP~OZI zLT*+NfwaUo31{Y8l~6dR4bVB)pedMw4KN+(F(CuQx#|J~ zBAWO{2vQU%auP1}Euains=5$R6p|*>6RmBx-?r}~AO6_#a_n!78+Y&i#@GMDX=|dj z4NO$MQ|A*OERdGxc~mj@`Jemw+1c4f+6W8)FTea-yKmf+`k6*@48m3v+w+C5EGa_k{cuHaD8ZyF?G?LcD$SCp#YMuoE-lKPq{)&(yJbNlVLfA*3u{Mn!V-TwXa zf{Cft@l(x{)s7RJaXLpBC8dc4{pMv?eCm^*^)4m2xV(7%b$fs&*mT-jTF!Rt*yi2j z7eD`vtdqmiG;O`}UGE?#6W!@#HWZ1$Xiks@GbcNY%U}G$S57+d#N!{fGs`lcq?bg`X22wz}vB(rsRJ`z2il~$#SmK>? zsY**FZTjiUF8g+?HA!UR@~mU~_AUUEmQTz~PAs>(-@g2s_q_WbPCn%XC#`?@z(<6W ziJS4V#fqg+@H3zO(k-{#Ch%z^z4_*w_U~Jmn%sHsJ)KKF^OZalBFOUYMgM%sop;Pl zq$eeACd<;)PYR(>=R>QpbFq`X^PTTK=bXo+4X=tU>vX$CC^Y1H%+}*No&4T=7hnCF zH+}4*pZw)t`NgL^`M+-8v9&dk#>HUoU3Y)`+gHB-{U7-F$3LZ-I5}qP%n5=mBFwY- zE5CEyr$7DKyvRkwx#X6c_r|`r436|FiO8g2f=F(>@#c#z`d6Po)GWwNyZ0Ey!8vvJ z-8cWGFMj3L+jff>>94zHcTvECk|5j{zxd^Q?!7C^x`5t#%l`fQ?-n>volo-2n(6ku zXlIMu>tkkN;aKxF-mqaLx^QMe(VE zfrX0OyZ4^Gch0FaoHSLMA@USTuc&8}HXXrvSnPbf&QL2Bhk>`pe@00Kt`t`tYg`Vh zH;quKkYQI&4)+|&0Z!Qd;=_AqjiUns#vme29FYTs(2Jn3d%X|)_uo~7dku4jjv(wj z_LwbOX9a-Rz4z_kch|ikc)_&Ssi}!A6RjPI+lpd)r>#lT0+%7}EbO^&;kzJ$1+R_5 z3L*eV($?0g$ESYFy>nM}yL-j8i;xSVNF7AHaAtb)w29X7;1sk_6)VKJT-g4(#T&EY zP6rx-mo#cc2wDw4yZx9`vTkSpeOCh=z-*u=Gz3$vhi{p9yhzh5)}}0p+_m?vYXcU6 z5L3Owff=9@d3P~ngk!eMoH~)73^oZsa!5|3pi>lp5RLcmV2*| z`Gti&i|t#0C4h!5(N$@JO<>D$+fMb)-M;Sz;$BEQup?*?4Ts6uiQ`+1oeRsiFLiH& zbc~%C09O?=2P9rYVL1Wkd}l>nRw^g?arQCZqG9V8iH1%v2|u@XX*<$v|eJEJurN?-SSBHhZ?0ox&*qkS?Ps z(k@_|o6p@}!w)6%&jB+tk~kp4yB*3r21Yx8fm!j=NTW3lYOm;l04m@JM;gS04T1CG zEYG%Y*|OZZvzzZFxHqm~%<9C=#Dc zn8EARM00zQ=OAeDxsxt&K500aR!q-Mp0upKoA39Is!k*$0wifQj&1s#g2bdS<{^l3 z0-SWh>B*%|-mxNAaSVy05R&L@v$0({(`>Z1Og}6Si$#%xN-C5T^WIHQ9IG}7q_iOF zKzMh;bPHLrKX4h6ML8lOS4m>gqM%{SfgIWuftdpo;-@B#pJ*OySqn(2@TMX5XDVYg zLywA~Fy|9mATTvKt8OvNg;X+!X2OPWGIhr~Y*DzKTTh)|x;bDG(iJuY6RF=iHF2C` z%S5w)WQENWEm8#vLELHRMOi#6r%Qz2( z^Ak=Z1)`zS+PVG2>B(c}<~mL~iJQ*yPB&X9Z0_cp@36>16jf~`Nz2JhtFdFEwNoUu zfM8)}cAL)SMVNyw88dZ^oPw#Tor!J{CQwfkGc+4BTc=L$bnY{Bd=k64CotbgXQrpO zX5Av`%;#YV=nx_CjVa9~8~^}7ok>JNRMSvqjR^^N_ z5v0n7bLq?!k|gP5`^j7+h#2TqTTTD4$<~(C-O=gH8$*%+VrBv8H71artUDpj`yx>2 zed1fKNhd9pCM^YGIm8q6ppj5X%t#8DcsD@^q#*7y<{}BK0j7{Z$)IiTW|(g!Q<_3^L7_0!kcUM`APdph zb|~fp)Pjh3Fia%pIPZNZ5DK?2XYD0NOD!NP=JTQx zy$4Y^mx_3&Q(h;`Qcwv|m0-C_Q4~w+gIOU$Q4c!rnzR(wf_M;ywrU}g7ezQyfBr4Q1BEWpvvsH2tlSnrhRO>0hzKW~FhqsMfXetr$p-cv2d$&kwBLNx;NeU9A zhdEd*tqRWN>N=XV(==~1L)xHAAl{1xO2-1sqJTQpbwvUCrMZduds?A8BbYMF%BxXc zlT`|^RUH*2Y)Ve^LliN3!SX@Sn$2d~NL6hE85X_%@$pVJx55hJ<-EpT;xbx>SE_vHWs3_fVE;0f;T?(Py?gF|q48{FL?kimi^ zxFuL{*Wkh3A=pm7@3&jEwY7iERL$$@_io?rd%NE~=UBGTUPE973mEP)Zk204@7laEHzXL-&S1`D8@$?mP&CHQT zVna(1K5I(^PGT0fF&$?H&CY+kviKPjSZZObp|eGnEm+AT&7B}Xmwrz_JRrA|$%+j@ zMS)~dz~LWbdN_iK67b~;ar@(qY@*&I5^|RHGm)EFnh{X=TM?(nus> zm_rhG7KoMi>bZwLg#iB&KpY~GRx%H9yfsH7;+8=2C-cap*z6B^6B3&cA$nAD33%TS zMMI4YCYgmKJ1)5fwguOCF2_I6huLa8pL(u^8mTcWd=sBw!}bCN8}0;jzT3e*aOBCPseL`W>$%VT=gNU8*))!6D4K_KH#-DtYq>-w^fQ6R9?-p1VA(P7 zYqcwt^nM2q$w6Nk_G9(OC<>np%j}7E`5_X@(P@q858W0KksT<1wg_guD2&iB=<|xE z9BK3WKWom>w9w?{$!8F>f#m63)~+Dor5pn!WY1sfjrUOq6PvGE+TVIl6lAPY@>`bf z@(YPMLSX)Ty*zVcZm*I4d3W5+e43l+-Ca)@>0Z_-M3klT$vhd_A^&M+W55-ism!aM5Nd1&pHnz-Z zi=_TG^Rbva+moO@S|PB+lEwk_1;dS0e}Wmtq|6t(@Ev}JiJZ^# zEmzJ5#k@w~^n*0};C@cM5)P*GfWHvG$9&=R9Ys*a+vhYl&t=hnI6UM{lwPg==Y@%c zZj!1Oh#K5SGi5`+FF$paA6Pg0CXfGqDK~vzQXiir4So9!%4mLr#$y6!;SZjJ3pC-% zehbmsQA>ym2=+fFe7B!MRL0mPER1WN5b`;et3HXKwa-%=-WhJyGufsq`*Y+@8Fmh{ z{-_`oiyl3hK!=KUJU-7HK2$x_ikl5UF>zII^mNflMdCZLe43U}t!{)J1yHknilcqf z%q=0##jAy?e4~3J`H9E%jmnnQCjPVXMB9PBO#};TQ>=s*Nidws9M)t@E5D?hq)dI2 zOmdC*NBkqYQ~~ya&lLG@)X^NOJU^s9WLSjWTXFE(Gc%jI76U5e@m(nzS(an3G3wSH zXAM%95Ab}N(JpWh1(0ZQ^<&xXOs-masUxeW4x^xJBkI4!6mVVS`rs(#ED|NyK8>2i z7vjInOk$4^r5VKzw+ixV-0y8%xpU&G@+~iP3`oB1R8V4kWh$JP&w`dl2u(;yHtwWK z&3sPL=e5txhLrYylw^fYe)zzv-j);)?F4XE$XE3kyBvp{U$4C`C!of18xcrf?xh$b3 zX8saKa-oFdp$8JFPIE?_3(r_qCtq7kH%#W!o|5`z&h^*tFu3m_^Zr$Xr0A13-4)dR zKcw*`)8#HA>)Ko9y#d8aSD^h~8iF>QRyUU0cFl3ilZV#Fj9IUI3k&lftr>T~ERvC(5Zy=Qn(z6o-`LJxC4l1A1m*NV(tiQ+%2MN@!XCx?JHUe`{z%LPcUu)pD3IieZ732RL_P%pgCg zY?XMf!BfbLSL2{AQIYE*pxNl-27``{4A2;bItl)9jQl}J3>_C-XI`GuMPn)#BhmwD zH95RfiM1jP`z(jaGx1H~imxMcU{57&{V(B2MKrE@G;VY<1-^LyREHP{dqHQtU@e1} zmLt=WYHf0~J$|R(^5slnDOpBSEPE6hBt}6m(Poc!_vH*p=N$1BkG8F#Qn!r zWSUWSJxxQ4pX^;9aO0(}KbGj@P?}j>wxSF;oeh}M5FK5qWq`9{`bhsUeBg+*+VpOJ zOZbf*TK|jEho!#*Edt-i%^V_6{JFV_wn8x9v$-?N^5ioU*?IFrHul{Ous>oMXiiokzg>LYTrI;~>kfDP|&*X~X70Z!5`!N zzT(qt^hbX%w1S@#)X@`5w`l*(uGBJ8mNcMf^T+wE_TLAp&hcEUBsH4o&{646drb1* zrsVt~UzThwqG*`KKf14EeXy>m@zJ$4ey8oK(ZD#sC|f=)v_Z|B2}7It@z12|*Dq5D zNB6MLC|6;O4ujktUbCXAJ4=YUBgNia-KK}ysa;T|TGvee64Y0BZyS-PwY9Vjip0D9QC`#Js9S^Z5y}PUa=-=<(Z=;>MEJDz3(CED`y#uq2K2cgmGcnyaY~_iM?= zDh-Mf7gTi!@Fqf)$uYdlOauceo|ZO?I>wplk>WJyk!h6dH;JGkji@l)^D$(w9ma6W z7Mnk&)CU*Brk_2(Jj$)djfrK!({O~JZgEfP&?BNg5-@Pxzd-U|V^X1rQAw@YwMxVS z$j&Lfd`<;Ul(@_2r=_MN?@;mvwPLeOzpDMA9La#>6@$^(G%MDW7GFQO3WqGx`93BldKS0P~7rGfjpH6{@E9n=x`ZM^*4;%Tv-I!1c(Agc&)qHXsyju zh`2p55@ON)pT83B&cSOMyu2R3L|R(K3=%qpt&5Nl=5dpOEtM9*K+{X>10h z)kP~5sv`ZbmF;4fcy%fI1^D8K9Jg7eX4ah$+JQeO-dw%^lDJvZCD9UxPDwCm$}~yA z*9G33pgPrqqd1yxqKVR$+RK*LF|usRQ3;4GE2+*l!3DGlq12-@eb1hkZUyIFzpm<| zCKEx4^S<1$AO`QS((Z7hlds}X3V+<^EKIdhWEnXcFsPL*%KTcs!Yl7qi%IUA(uR&pOzT~Vq274xSMnz zU>i{WJMmXP^ckIhSs)3=J`s8fNUzi2FPwU+;>Zv{0#GTPptP;9ifuv@^T0(D|J#oy z<}OB)_E66j+ThM)-eNeKRXly1LfFno&K41uO+(3qGZ;(iW4(&mh#6~GQ?x)-I$5$W z*<^<4pv8%WuitUFG5LXM>(+HdoiSCYr3GEyu4Mkv2T+VYfg;sM39*jVCu}_{K8U<_ z%L~gM7w;yr;H5XQzchfN-jEUM%6BD5!L}_9*4J$@vVN&pXhyn;-sb8uDRDAVKm(`% zBnEUa_8y`_eO9RnIf5d29O4~<*r(XI=R$$lxW#nk?%yw=hI3Ou_wYB~Xc~A-pGF$h z@F;=A>F=!>l%zD$WlH2h?1h$8A#~BEWf?Op6mX#E5)>r>GAd0Jo*10j+>#lo6z|7~ z6Yw+u6IRK!h8k%NDp@HPdf zS`Dv!xBg?DM&;-YhgMA_a8_fbK!K(#=>l7=SR$+VaDWEPhmV}xAo|zTw9F7~3q^n; zP3cq;YDVfFhV;`ltZicl+up&BZ;zq%R3oox0muB^03POHcJ_3LvG%<1_49PS$BE1z zj@XX#HNiK|Hx11N@svus|2%?-iG1$>nl5no7tczrrrBSULM8;2QYI1{nq6*dCqpa^ zOwok&(7mYuA{rbjX{0FwDY;~%%pF9+#ce{hgX$NLDF-gMolCkX;jP5+lJX=_(cgnZ z5J)%W5w*=}Z!{XYwJN~a)E-@S41AxL2+#3GrjVv>kNZ!zeyH0|ItHfUEXi-B(!?0| zn=u;ePQqzg{!Dz&xb<^8rFCy_Psdp)rD@6Gvn?ux%%Rqx9nC*4#sYmM*9Pl2^@%~W z=>Ty$yM9vpd3=$TS_TonFt{|Q?njrZuy9bJp8m;|x;M_rm%kbrrm+vYH7+VpKtv3+ zN$@*v)p}|2@px4516@yWRp%C}{OuL3KOjZyB1ry498;^fB4;&x9^EDJ{VfAD)&%m9 zdt=u{hJ+qdInOxBO#NR4VTop}J{uQS<;3%p`9}U?XjXT)G3rr6>cT@=|8asTMUU#m zmJ;`l-&o}#gnAIa_OwW=K8T_I=NFS5vq%N~kf{-Qe+xqI8liAZD;tM>3dV7XA5eCz z5j->IkjNbIW+Ju%?i6SV9Rra8I|JsM&O>%`))r5}7<_@>92yTUvo(zd?I8eZ={YHQ zdG)kF{@>yi1~BVz+s*Q!!U$xGJ`GsJQbjjOqSZY=0Ivmt6VL?B$3d(R?8i zY6jdyu~PpW=fB;kvZ{a;C&i|jZUM*)3VXx(gSsCG+hrVQvykc0iO=IlKN6%$S~+6# zXE6Mm)U%c9+d~#g0%8s|1{|&V(AYMzVo=rESiOalY*C(rR2?e-R{V9WJ2K$eh>S%8 zJ4um=C+6nC2L=;KfT%!}0IFpRT`~f`TR&M%Je}@L{2&;16rLhWdazRH^Vf0MS*ZirR{;Dz^#xdt_Fh7OzSC64M>5$YJmVXcI=;)Ly!%I&tj zccOUCzZeJmgK9yLTndeRN|w5IG}~ugnsWlZa4J0M34IhwhHC}-8qMFOWsTzN5_L4YyL89LNhgWGFJn+ELBLf-x-Y)E{B2D7 zQz!mXQLod;X3^EZ6ByWilJdxK(Hyg5GBk%FD_qtQC!t?3Q>jVI(1hR=Qd9 z6wFbeK&0V$ZOaw4l&ev%FD8erbql80ZfX}?6p?m%7XG)Fy3~7$O2pLE0jU%S_2cXz z!|y9)`kb(>b-qs?5w$ibAGY}94<#}Z`M8c6KcZ;khd|Q?2}O0AYR$1=(_bC-oHr5I zImns$1iuI|NcKAMn}Y*h?$k!B{Z|=ciY^B5@XG;3(Eh(=U2V6fjDM-870aCRb^mJ~ zs%W5XY|3Y;uSxF%t2;2?d45i$?*B_(L9F1X<3wxLt2OBO@)q90UM2)m8GXbpT~d^C z$PQRboOAbBh1Ko-8*@F?NrlL!zVkf5`L;VpyqX6)NkMv9PRCE&RcuOtM z=VgRKRPv=U!Aw5`d6+0J*Y{&)D=&J0e&w8uCVJ&k z6rIxxpRh{fNX$N5oo{=(3Ine+_FxA(9^gB~)`^9G%StJxx>0H8LGkQS+~BYvmnK(N z%Wu8yc#nNpl3S@>I)E+PePo1B=cXd74#fQCgY}jUtK}96)EDifQ#bsIyK}mpHZMJKe4aih-YFM52GYa(dI0HsK@jw{^h;IBNk4Y$N1e` zW&IjOeA*%%GZ?;-kRqH>Fq|W;0YD;t5YQt&5G2mvfuNHnI7O$VoAHCpe^N51cQaJh zbkrd1G`LcVbIY;bU?~5&(^uhKL&pDcNmxTlfw4)ZxaWP;{Owh7h;bbWrvM23d|XNn zcM@BjbbwTu;x{3412Qq@`HsHpO&)4o2(YMVQcvV2#FO&{y)nG2=azx$>W|A-;1XwlkQyS%?8){^v9T8!4j6~+s~TSxm`xl&x`7V=k*G+rn7i&% zK6dN3`ZFU#EAx>^ZN;Fu)XLZQz{XOkv3E#VTHly55ty(M5>^e?RPhxADC{)D)881R z0h=J%8C~ky>_SSpjJ6w7+XPt~A#%am^Ht-Lh^UB_^%!(xVy+Bu3Ur$_P4W>XlNbS9 zL6gPJeT|S@^x0-iqmMb_c*)rKN2X&Pf($|_(1^YsOQ^OB{zoR|BQfleN@2fpHe?By z!5pFhgl6IWEKwTuY`QiC7Qw=6$`TAk;V!?)x^t1aKO9oRhw_I;r=Zp`K!LHL=kJSp zfF;pb+T00jnC>y}WK0#zkPZoLUp;a&&|Mq#4)G5Th3Dx1eoOlkQt%PWxau0rD_vTb zfNI;1J09>b7eAJOpQ^8GHrtWB0e{}@DXl*2=su0w zccTFA%bN|K@?8#e3mx`a_d?zG|&F-Z-fgni3APq09b@xeglszAP)IT2Jy<6l(aM$14?s5 z#Jf4;s%7%xdJjxY0Aj?qzmW61x|i5%n|xPTlpuBX#_HUi z2hcm92UW@1qfF^$$A@GaVv!4Wr71rBTdXzT2}LrPK+7QYs0bQBRdlb69x(X!PHNE# zaK5f0g4rX?8?=3k5P#d?<-e;>%N%%ABYJxoByc`Qhww!<3yz`(QVxr~f_1(R#mkfc z+Z>UTgY~=awQESX_gpTeZ*QWo{p0vsUSqFq?M#y!duRV0)z15fg@C)|jdvd&G12>8 z{rl^j)>|!HwlhVZBZ7R+WRZD>miF>zKJqj;@#?zdGY!Qz${rFgEE-baqyvC+f;nbp zAtTacsI-S%B7TaaLG$t@)Zqw>^lAL~8CEm_GGa;uq%}keRvL6v6k+((2y)iey|ePy z-z~ybWTpxFF#j5E-<=hjJeFwPFV{Qyd#;Dzdh!b{7U4xRkgBJ9M zs4igVNb3*o>(j5ohls+5i#N}+e(N`hMo56>Ro};sML04pjN3QPFNy%x=XKWAdbhzn z(dUN=qo>xhmp!jDX_5N_7AgP*Thv!$vu{DkowAo43yVxeU)2zTd;Hp4I5GHfu=#K) zL4Oj&qc`uB;!8szJ#XE(sW^Hl_#moC@L&H>0jR(S@_%Z=p-F1^+SrIE0408Y@7n!@ zl~aNH>owm8a$1h&)2~Z zYc~z#BAvgl6wd-~RG(h<;F#V376pzHUv?N(`E7CbPuq`S?Dk9DuMgTYzO&99N2-B4 zKV(OFg3SXb%E|qoM_$f|xcKL3jsTOu0hpqp97(ElTC7|1_^WLj7IfqUp3N-gJ z%5ng-+aADw->e*uJcH}B==krOB$yziO6^@s&^#T1v6bw!w@{;@d!i*U7ScZtzLg zW!Vu~>nRNcsmOxYAHCBp<5pjumOljEba2`vK5uHhULx-0FZUQ_8h=`tDY)9lErcG( zcHecRT8H>KwI6@hy4e%CPGl7f`fyk49I!b8;}YHoof!{0$XyFseF$>!45f^#^DFbzS3DKNp4ez=xkfuftb1Y+gqm?d|bV`JU4ctS>Wn4oi1U z>kprN#;nKv)>8k|eAg>4aBI{eaMSDM`ozR%=`^gscIsoCgLMRq(ZLPC(sBNX_4H!+ zuF~-DnDg06bC9R!doR9|>lr}DvoN{$Gl|Lb)|*#{<`u;A^}y?gOq0N!y{`Lg2Uh+c*;XA$|0sHh>p!-)r*>>pHgT#>Kim zV0}GWN))JCIVos4a=^Z86Mb5RRl3^1xwo&bKd*{g>5%0|ubX57a3e6~XPv0LaW-lRZsd-Uva zXYbCdb<5E;ocwjj3D7?7y|!sog2TJowAbBz{wC;LU)1NkUJolfuo#En=aN0Nd7;AIVrkbCpW!2cK|`p>vPyE!bX+JLu4>w3#+nWuBVx<($00?Cm&j5 zOdP-KPRlz#)k;hf_Sjlm9S*H3BZB3lIhowWFeJeRyZN8B!4Hmo(d)>V?khE3c^>oGgQCYRxt{BWPFx5{pATA9`SvbH z>i8CybU?XUm~-K+)Z*NbULtgfbe*c?Z-O!Wtnx##Do}^Aq4rvp?+bj(gzKYmg9({> zI?JV_{TmC*nLdTir9C{s$Z32O>o=*Q0c2WWduFjNP6xB0hzR#!mHuwHwCAi=i%bE~TqlY~T>*kYD zgPn4p-C82R>iA3byY0lUmy`BU-$v!<`+W9| zmvY_73j(H!Qs(CI>+H5jU^vn@BleTjPfT_!LxkZ$Yu(R4p)zJ52d`3_#?O=YgokY} zKp0=NA=w?L->o|=aZ1S7yT7zDS(tb2p{?sW=}+W08)W+W80keMeeU)qPZ(|V`SJ1f z@n}tT6LBKY%I6dQI!excYBTM|`r4;G`$8eNOMX`WdHRJwB))^a*V_@%$E<@Cv)}d-a|$Hb@bKihTqF6cQYJq#|BYiHr(mU#7Nhc>Jra9 zsMPc!=Oskt{ps! zlD)6>j}pL4dDMA&IO+BqY%aLWaT~wi>3$wUd~6>(smSAsI8`=zJes)n6kG(AvJ$rI z&&$cO4I4jcBAe9hy&*{Qg=r@y;a`NW)mIZC77oe9_7SBXCN9KG&;UU9NI^tB+vdqA17IQ2=RlrmkiW}-tYk3lt3 zr`t6M{D7M2hg?r}BX5MNX@M}Q871f~Tfi<}0cp7N?vE!M`#_i<0r@6Ehw!Q{?!OsI6x~iv6ufc(v^#g-KvowJU_IQ@=6T%Cbnkru1U}Zix<3&FDjs}x zbP$KYy)R1d&_K+i32dzy-$^P$$0RG?2z*;!<=TYZiCn7fyW)Nt7;`O^J=K*i*aI&* zOdESxuKttXfI9hGoQ{49ufNF8m1u44@9A7k=-GwCDREjKdc?bPw~aaA&U-UO&cY<2 zj(_|DpRezJ+b^v`IBX+6tlvzN`|c^K>j+^?Jg2-~<)yxUYD;QRMs|8VXYKkUS(SM6 z`aDtb6lDL(A8h|}e`j(&SZYk@7p`6L<$loyCL`ijD7tpacyXKfoa%jYv$q(qQqzg% zGFPzbwHk0YezL+Ec+?K)I3BA@?F%}zHwpZ!S@5@VW@544W5o!jfWgVl&6StodGQWL zx>?cvx4gnR$nMNwoSDh+I@8&aCuf!E@qAC@`E0>|kJIFFI70QMfbSl5;k*6bk=)0^ z1W&9p|3t2EoX7Shwd!oGtY`>K3j`#*PxGC%T78>Nq6}R==C+gix9Y((_bi4Exqlf1 zZfq1&PjN*wp*S=A#KVV>*sbW$VIu&cu6Bj!ZNkmzMD3g4!?D=TpuZ#VjPhs+^Qh}e zBT*ap&JWv~Uit2usoi^O>wgdG0uPJ|@3Uy075}Qf34-64<6Q-vuh(^520g8fkOv&v zCJG&-+28)Yu2p@G3g0>e~ zPP@o0ZzlEM(g?62{s1qG?0}8pnB#uex-lm3E;pr$g0by)^{2K-W0D#3g!)4N*YAU5 z{?#vO3W*8o#1ds{zegOpcft4>7$9Xj%O#@^3O@bt8OK@Qw?Bt1?sAA$i5GbN)u$kT zj-G*=JRa3lG3s34_H%-C8~QwZyawKQ6)~K`>09|sbU#nYsG4!5r69rSRpPS%c9rv5 zDGsPlZQqf1TtayLO?4j$ot4$lGSzv$DA!z2Ai{BS$on@=xv!zY-Z%W%&tF)uuQ1iB zQb`&ALL`rbrq9dC*%)Xmcb0i@FqA=@P*`J$RW0n8K!ihn)Q8o}Xx`20aPSxhLcPuF z(B9X+#%!0#i0F}c-8GgY;g*YH=AW9HCKTUrp zG50)v85~|junc607%@(^1bMcSO%p#e6x?Jgtq#=vUa>j(irgR+px7ipI+#3&ShOvG zZ^4FxX$AMTG8(EAx!By~tfN2GjkHJVVLak>$D;X~c4%e!lik{NX$nc21y zU{ga4SW5hz%yiiz@C36fSCsCH!_FKL-FI&B;;$6r!yMBe4Pg8tw5}7erPTf`5l|Gy zElJWZy1H@c;R(Zyg0KQN*4O!}W=O|SvOLrm4#AU&=j@e2qUBOTH&H1$+=$^rx=_YP zc08z7F~P6|Jtzrms&FBW58vQ|M1i6pS8R8PQYN0dVYr!SVmEGuDOM|u(}q*DR?~co zg>{(|*XkUP%rAvB{bGMZKrAZ2%i>r}>eYW%PZ-@)xn)86+i~diivapfKFz0&r$nt^ zuQ%;y&zIgMd7*Oi83pp?J;7psxR8TE@S&)5;yrlPz*|5xYCGbtz%F4^hcz9p>Kx)B zT7_A}jR;LzyeMA}VlrG%Q}ar(7Ncl%{e3IR=_`f8y@qaAlfXEI7#LRqCAHvBBVQ%j zc=nmMXUawrob={sHjmqx67ZOYzdxrH*G`RIN@+G*5si1%_3pdJXr3AoK(OC;QL6x?L-`cUz)0cu;wGfiJpfHTc-cxgezhKyQObJ`!11R_ZPH?e z*J0piyK#?f0;&^poEY9I4N|MlZYq1xUm0FDXI%O=)nuU*ro9q5?`w2MzHnX!ON+@a zdl9IOj`}!j*q9dk8o+0`_X!DNZ2~>5l}qA_axgCLSDk5(QU+9;b<|zKHz~qrtoP z>F^~W@y<8vLz3V#0cqYTk5|ufY_h`g2F16y45_2=48}X4zXs5sq zn8;tfzko(ETB)s|l+#`GZfJ#3<)b7^DS7h+PRY_n(NB0l2}KzL3lqjjaKM2LNKSmI z%Y7D?2^mYriIAdfWk|8xw}7-3mn=GLxCgY83Me-g1ym~zi>|$OJxIvpjiyrrGN=P| z)`S(L`t=Yyu+C|u>EGi`B9|eRg9w4Wij@*1=yM1Wy)>?AJ!;WnT6tcSm88iT(n39q zoir6XSJfA4l1i96K4cPn8ytZ&1i4egpIDO0h+<2MrsAH@*&ne~e8?!mx(v{nos^{e zyhYSsr5@o1?YI+FG?=DN=%vs_8FfT(J{Gwosq^B^5`Lch1>y`;>*FgH3rFZJSz`-h zpDU&oDHHD&;VtYnzr(Ro%0i`xuz0XfcV+4{f~ckR^tI$Qxa@|4;0dX)wQVIBhSN$> z^q=`WEWuPFOW`{S5Zt|m*Ofp(R7acFu&-d`GOI60LQ1^RbTtXC{!jW^o%Q4|Y?L1K zfmEm;cX$zTJI0hlS(@F0O~p(M<30GwEG(rU@YuLS!`H3414F+Ce(}mPk}>M<)6Mjo zFA`p1hN){G7^0F58U&>#y__-O;opPRka^_`qj{SeBVjaN5&Gl=`?0qq`R+MS#B|?GHzx#VABsDiNV{K!J(} zAcBk~-=G-FeHOCC1pLpS^Kbi;l3@0?>hv0oR9=aCnu(LE^;CPxQW~xGOx>|xu&1~a z>Mqc<^Of_S27V6(I&5~OaB;cdz~rcr>wvl~lGL>XQG=xZ^-o;3px$9Ua{5qqa&N?Q z8LSH{4aiT~Onl^8xQ*(^`7a{6py~cJ>^}9~JR?s0>Vt1wR2pr33H)x}V_Z$Kw`v-zZ3YKbYJ_c)%8y>J;Jsck0PgfvBdtGt>cVjwQ-J?aDS~MjR_qf z&c%EetI<^UXNcH?HthF?hotmURmyF7d(m>{eC=(F+uJNp?nk)#nUK-FsVLElzNmPw z>2ehPi#$4f8{)9QvGXNTx_RRQ-?$~cvzf!Ds}<*UUGAB;qpfcpa>{s>9-D|_I+M*4 zQyA5sHB<2;&!4``z#;&!h^rKrJ(-T&t9`=R;NEFoDKCZ)NbD%1#*q#<3h!XfPc3v4 zzptakJFbl3bf$_($w3fzqRuJ&E+Jw7-rdi3|0 zbLSI6c|Y^!>!s?x)V%u-V#}D zuVJ7KG~Ci?g3u!9EQvpR_6mnGJsvw-?J0)0m|7O#q{Ht=sfr<=v+gv7c(I1KY^ou+ z2^#&rPYQ{625nf*G;xV&o_Cu8Y_^`yV|uO=R~}{#mb0(xAz|R3cRd2y3lXw?|J{S# zLM;b@-Z`13Ti{db9eFo=Za0bdwPal+)}!X2ws+iy^CY9GtSdu_BlC&Cox6j`;c9E) z0k0ij#lbQ93GUXl$E35=dQv)flsJ@R@O+-OZ@FqBuGxZ7$0#G9YG*RZdf=RBJ$!cj zkNZf}xM$K@8ocX&@^SU$5F(0z$Z||P95z(5)0pW`nIRn13ZiH&ryT9cd?NcHH>iiy z++k{^kfFRE*w0noG(RG^d6)+ts&zFI7k0jm^J_cu5G46YVyVSU1U1-u`Zh0VSw0;^cQOM8*?k4B6L5VPKm-^sUEcp)w*}hhr|sk zrIS@XZ)x^wywxfVm!fz?&KB*yj-64MEWO-hByiG!qxj6h&$u$r)xRJ#sW zz;w7`C+j7tT@qxH9O{6l>jt1{g!JWQwsi@|I^|HRI(SzFZ73yugmx8cBfwxjQJrB*8`X^;o@qAO zNg17nugAPdt*=$Qoe!Gwulz~YL70WA3H;y(&u(B9PZdeS#Wg}RD?|z&JS09J5px7&7M1$-R-SGQmwwhX zGAY{ay?Kft#t%b6U<48^B^u&rng$&R0aY3>3itu{{-=&LA50PJrzZ`e0%OTO6SriC zCUFFK&Xh9kDd+OD4t`@69kFo5-vU3d*|vxh9JUmN0Tf|G&u6q02> zE%YG@__DbjP;j&_2XI7UAIjx>iD{9q+Qa1DP|DDil$4r1IYeN1Tq^~DYXy{5F;D#s z5tAKmBd3g;zL~y-o>SEx!6XyZlf{WkGIDjtq7zh$Fl>}j6qLg$aVm-d=%7#!Q*F|5 zA`Ak`zE?%o;x9NqC$@kQ&@hD?He&j{l2V9Li_B=9OuQtL_`n}EX??a@qs68r-L_Zq z6zXZ(@OW$!008jLU0ToG(#+jTz~Yk?>;u5T#=*_Z#=*?Sqs7JsQ;`?o;9-P)VPoS2 zW1Ih94IG^@@%Y literal 0 HcmV?d00001 From 5f58789d7865a6408d75bcf67d4f723f4e07c73f Mon Sep 17 00:00:00 2001 From: Error Date: Mon, 10 Feb 2025 20:50:18 -0800 Subject: [PATCH 11/16] fix(StateMachine/init): Added `state.OnHeartbeat` to `_stateTrove` --- src/StateMachine/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/StateMachine/init.lua b/src/StateMachine/init.lua index 8e47c7b..518013b 100644 --- a/src/StateMachine/init.lua +++ b/src/StateMachine/init.lua @@ -271,7 +271,9 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ return end - task.spawn(state.OnHeartbeat, state, self:GetData(), deltaTime) + self._stateTrove:Add( + task.spawn(state.OnHeartbeat, state, self:GetData(), deltaTime) + ) end)) self._trove:Add(self.StateChanged) From 3385cc128fa7f34a1b2086027b0116bc782a40ad Mon Sep 17 00:00:00 2001 From: Error Date: Mon, 10 Feb 2025 22:01:06 -0800 Subject: [PATCH 12/16] feat(StateMachine/init): Added most `state` methods to `_stateTrove` --- src/StateMachine/init.lua | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/StateMachine/init.lua b/src/StateMachine/init.lua index 518013b..843fe62 100644 --- a/src/StateMachine/init.lua +++ b/src/StateMachine/init.lua @@ -271,9 +271,7 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ return end - self._stateTrove:Add( - task.spawn(state.OnHeartbeat, state, self:GetData(), deltaTime) - ) + self:_CallMethod(state, false, "OnHeartbeat", self:GetData(), deltaTime) end)) self._trove:Add(self.StateChanged) @@ -337,7 +335,7 @@ function StateMachine:ChangeData(index: string, newValue: any): () self.Data[index] = newValue local state: State = self._States[self:GetCurrentState()] - task.spawn(state.OnDataChanged, state, self.Data, index, newValue, oldValue) + self:_CallMethod(state, false, "OnDataChanged", self.Data, index, newValue, oldValue) self.DataChanged:Fire(self.Data, index, newValue, oldValue) end @@ -527,7 +525,7 @@ function StateMachine:_ChangeState(newState: string): () task.defer(function() self:_CallTransitions(state, "OnEnter", self:GetData()) end) - self._stateTrove:Add(task.defer(state.OnEnter, state, self:GetData())) + self:_CallMethod(state, true, "OnEnter", self:GetData()) self._CurrentState = newState @@ -582,6 +580,25 @@ function StateMachine:_CallTransitions(state: State, methodName: string, ...: an end end +--[=[ + Calls the corresponding method for the given state. (to be cleaned up later) + + @param state State + @param methodName string + @param shouldDefer boolean? + @param ... any + + @private + + @return () +]=] +function StateMachine:_CallMethod(state: State, shouldDefer: boolean, methodName: string, ...: any): () + local action = shouldDefer and "defer" or "spawn" + + self._stateTrove:Add( + task[action](state[methodName], state, ...) + ) +end export type RobloxStateMachine = typeof(StateMachine) export type State = State.State export type Transition = Transition.Transition From 7157fb2c94d6b9d5460a9078ed7fce69774b017c Mon Sep 17 00:00:00 2001 From: Error Date: Mon, 10 Feb 2025 22:08:06 -0800 Subject: [PATCH 13/16] style(StateMachine/init): Nitpicked `_trove:Connect` instead of `_trove:Add` --- src/StateMachine/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/StateMachine/init.lua b/src/StateMachine/init.lua index 843fe62..0656d67 100644 --- a/src/StateMachine/init.lua +++ b/src/StateMachine/init.lua @@ -253,7 +253,7 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ end local previousState: State = nil - self._trove:Add(RunService.Heartbeat:Connect(function(deltaTime: number) + self._trove:Connect(RunService.Heartbeat, function(deltaTime: number) if self._Destroyed then return end @@ -272,7 +272,7 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ end self:_CallMethod(state, false, "OnHeartbeat", self:GetData(), deltaTime) - end)) + end) self._trove:Add(self.StateChanged) self._trove:Add(self.DataChanged) From e277e4fb66afe82b630164bb1fbb62d7f80e88fa Mon Sep 17 00:00:00 2001 From: Errorbot Date: Tue, 11 Feb 2025 22:44:45 +0000 Subject: [PATCH 14/16] docs: Fixed small spelling errors --- src/StateMachine/Classes/State.lua | 2 +- src/StateMachine/Classes/Transition.lua | 6 +++--- src/StateMachine/init.lua | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/StateMachine/Classes/State.lua b/src/StateMachine/Classes/State.lua index b78b468..22c28b5 100644 --- a/src/StateMachine/Classes/State.lua +++ b/src/StateMachine/Classes/State.lua @@ -146,7 +146,7 @@ function State:Extend(stateName: string): State end --[=[ - Forcelly changes the current state of our state machine to a new one + Forcefully changes the current state of our state machine to a new one @param newState string -- The name of the new state diff --git a/src/StateMachine/Classes/Transition.lua b/src/StateMachine/Classes/Transition.lua index 063633e..39041d1 100644 --- a/src/StateMachine/Classes/Transition.lua +++ b/src/StateMachine/Classes/Transition.lua @@ -97,7 +97,7 @@ Transition._getPreviousState = nil :: ()-> string? local Transition = StateMachine.Transition local GoToBlue = Transition.new("Blue") - GoToBlue.OnHearbeat = false + GoToBlue.OnHeartbeat = false function GoToBlue:OnDataChanged(data) return tick() - data.time > 10 -- Will change to blue after 10 seconds @@ -211,7 +211,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - @deprecated v1.1.7 -- This function is redundant since it essencially just works as a blocker for OnDataChanged + @deprecated v1.1.7 -- This function is redundant since it essentially just works as a blocker for OnDataChanged Whether it can change to this state or not. It's a good way to lock the current state @@ -225,7 +225,7 @@ function Transition:CanChangeState(data: {[string]: any}): boolean end --[=[ - Forcelly changes the current state of our state machine to a new one + Forcefully changes the current state of our state machine to a new one @param newState string -- The name of the new state diff --git a/src/StateMachine/init.lua b/src/StateMachine/init.lua index 8e47c7b..4eec9eb 100644 --- a/src/StateMachine/init.lua +++ b/src/StateMachine/init.lua @@ -30,7 +30,7 @@ StateMachine.__index = StateMachine @prop Data {[string]: any} @within StateMachine - Contains the data that is shared accross all states and transitions of this state machine. Should be accessed with :GetData + Contains the data that is shared across all states and transitions of this state machine. Should be accessed with :GetData E.g ```lua @@ -38,7 +38,7 @@ StateMachine.__index = StateMachine stateMachine:GetData().health = 50 ``` - The data is shared accross all states and transitions. It can be access in 2 different ways + The data is shared across all states and transitions. It can be access in 2 different ways ```lua --transition.lua @@ -62,7 +62,7 @@ StateMachine.Data = {} :: {[string]: any} @prop StateChanged⚡ Signal<(string, string)>? @within StateMachine - Called whenever the state of this state machinse changes. The first argument + Called whenever the state of this state machine changes. The first argument is the new state and the second one is the previous state. If there was no previous state then it will be an empty string @@ -460,7 +460,7 @@ function StateMachine:Destroy(): () end --[=[ - Forcelly changes the current state of our state machine to a new one + Forcefully changes the current state of our state machine to a new one @param newState string -- The name of the new state From 237ece409e94ea8b073239ba3c39f656077cc9b7 Mon Sep 17 00:00:00 2001 From: Error Date: Tue, 11 Feb 2025 18:15:05 -0800 Subject: [PATCH 15/16] doc: Added comments --- src/StateMachine/Classes/State.lua | 4 ++ src/StateMachine/Classes/Transition.lua | 4 ++ src/StateMachine/init.lua | 75 +++++++++++++++++++------ 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/StateMachine/Classes/State.lua b/src/StateMachine/Classes/State.lua index 22c28b5..b458838 100644 --- a/src/StateMachine/Classes/State.lua +++ b/src/StateMachine/Classes/State.lua @@ -157,6 +157,7 @@ function State:ChangeState(newState: string): () return end + -- Call the "parent" StateMachine Method self._changeState(newState) end @@ -170,6 +171,7 @@ function State:GetState(): string return "" end + -- Call the "parent" StateMachine Method return self._getState() end @@ -183,6 +185,7 @@ function State:GetPreviousState(): string return "" end + -- Call the "parent" StateMachine Method return self._getPreviousState() end @@ -209,6 +212,7 @@ function State:ChangeData(index: string, newValue: any): () return end + -- Call the "parent" StateMachine Method self._changeData(index, newValue) end diff --git a/src/StateMachine/Classes/Transition.lua b/src/StateMachine/Classes/Transition.lua index 39041d1..cffdfa6 100644 --- a/src/StateMachine/Classes/Transition.lua +++ b/src/StateMachine/Classes/Transition.lua @@ -236,6 +236,7 @@ function Transition:ChangeState(newState: string): () return end + -- Call the "parent" StateMachine Method self._changeState(newState) end @@ -266,6 +267,7 @@ function Transition:GetState(): string return "" end + -- Call the "parent" StateMachine Method return self._getState() end @@ -279,6 +281,7 @@ function Transition:GetPreviousState(): string return "" end + -- Call the "parent" StateMachine Method return self._getPreviousState() end @@ -305,6 +308,7 @@ function Transition:ChangeData(index: string, newValue: any): () return end + -- Call the "parent" StateMachine Method self._changeData(index, newValue) end diff --git a/src/StateMachine/init.lua b/src/StateMachine/init.lua index 4eec9eb..2814462 100644 --- a/src/StateMachine/init.lua +++ b/src/StateMachine/init.lua @@ -172,8 +172,8 @@ StateMachine._Destroyed = false :: boolean ) ``` - @param initialState string -- The name of the state at which it should start - @param states {State.State} -- An array of the states this state machine should have + @param initialState string -- The name of the State at which it should start + @param states {State.State} -- An array of the states this State machine should have @param initialData {[string]: any}? -- The starting data to be used by the states @return RobloxStateMachine @@ -191,13 +191,17 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ self.StateChanged = Signal.new() :: Signal.Signal<(string, string)> self.DataChanged = Signal.new() :: Signal.Signal<({[string]: any}, any, any, any)>? - for _, state: State.State in states do -- Load the states + -- Load all the states + for _, state: State.State in states do if self._States[state.Name] then error(DUPLICATE_ERROR.." \""..state.Name.."\"", 2) end + -- Create a copy of the State "parented" to this StateMachine local stateClone: State.State = Copy(state) stateClone.Data = self.Data + + -- Fill up the necessary "parent" accessing methods with our methods stateClone._changeState = function(newState: string) self:ChangeState(newState) end @@ -211,14 +215,22 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ return self:GetPreviousState() end + -- Load all the Transitions stateClone._transitions = {} - for _, transition: Transition in stateClone.Transitions do - if #transition.Name == 0 then + if #transition.Name == 0 then -- (Transitions don't need names, but must have one for HashTable) transition.Name = HttpService:GenerateGUID(false) end + -- Create a copy of the Transition "parented" to this StateMachine local transitionClone: Transition = Copy(transition) + + if transitionClone.Type ~= Transition.Type then -- (must be a Transition) + error(WRONG_TRANSITION, 2) + end + + -- Fill up the necessary "parent" accessing methods with our methods + transitionClone.Data = stateClone.Data transitionClone._changeData = function(index: string, newValue: any) self:ChangeData(index, newValue) end @@ -228,55 +240,61 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ transitionClone._getPreviousState = function() return self:GetPreviousState() end - - if transitionClone.Type ~= Transition.Type then - error(WRONG_TRANSITION, 2) - end - - transitionClone.Data = stateClone.Data transitionClone._changeState = function(newState: string) self:ChangeState(newState) end + -- Add the Transition to the list of initialized Transitions stateClone._transitions[transitionClone.Name] = transitionClone + + -- Run its own initialization method and add it to be cleaned up on destruction task.spawn(transitionClone.OnInit, transitionClone, self.Data) self._trove:Add(transitionClone, "OnDestroy") end + -- Add the State to the list of initialized States self._States[state.Name] = stateClone + + -- Run its own initialization method and add it to be cleaned up on destruction task.spawn(stateClone.OnInit, stateClone, self.Data) self._trove:Add(stateClone, "OnDestroy") end - if not self._States[initialState] then + if not self._States[initialState] then -- (Make sure the staring State is valid) error(STATE_NOT_FOUND:format("create a state machine", initialState), 2) end local previousState: State = nil self._trove:Add(RunService.Heartbeat:Connect(function(deltaTime: number) - if self._Destroyed then + if self._Destroyed then -- (Don't run if destroyed) return end self:_CheckTransitions() local state = self:_GetCurrentStateObject() + + -- Skip the first frame of a State change local firstFrame: boolean = state ~= previousState previousState = state if firstFrame then return end + -- Don't run if nothing was changed if not state or getmetatable(state).OnHeartbeat == state.OnHeartbeat then return end + -- Run the heartbeat method for the state task.spawn(state.OnHeartbeat, state, self:GetData(), deltaTime) end)) + -- Add the Events to be cleaned on destruction self._trove:Add(self.StateChanged) self._trove:Add(self.DataChanged) + -- Start on the starting state self:_ChangeState(initialState) return self @@ -331,10 +349,13 @@ function StateMachine:ChangeData(index: string, newValue: any): () return end + -- Change the data local oldValue: any = self.Data[index] self.Data[index] = newValue - local state: State = self._States[self:GetCurrentState()] + local state: State = self:_GetCurrentStateObject() + + -- Call DataChanged Events task.spawn(state.OnDataChanged, state, self.Data, index, newValue, oldValue) self.DataChanged:Fire(self.Data, index, newValue, oldValue) end @@ -351,6 +372,7 @@ end @return {[string]: any} ]=] function StateMachine:GetData(): {[string]: any} + -- Clear the data if it is not a table if typeof(self.Data) ~= "table" then warn(DATA_WARNING) self.Data = {} @@ -382,6 +404,7 @@ end @return {any} ]=] function StateMachine:LoadDirectory(directory: Instance, names: {string}?): {any} + -- Load from scratch if not already loaded in the past if not cacheDirectories[directory] then cacheDirectories[directory] = {} @@ -390,10 +413,12 @@ function StateMachine:LoadDirectory(directory: Instance, names: {string}?): {any continue end + -- Load the ModuleScript local success: boolean, result: any = pcall(function() return require(child) end) + -- Make sure it's actually a table if not success or typeof(result) ~= "table" @@ -401,24 +426,28 @@ function StateMachine:LoadDirectory(directory: Instance, names: {string}?): {any continue end + -- Make sure its a valid State or Transition if result.Type ~= State.Type and result.Type ~= Transition.Type then continue end + -- Use the name of the Script if no name found if not result.Name or result.Name == "" then result.Name = child.Name end + -- Save the result to be loaded quickly in the future table.insert(cacheDirectories[directory], result) end end + -- If there is nothing left to do, then return the saved Modules if not names then return cacheDirectories[directory] end + -- Only return the modules with the same name as in `names` local filteredFiles = {} - for _, file in cacheDirectories[directory] do if table.find(names, file.Name) then table.insert(filteredFiles, file) @@ -449,12 +478,13 @@ function StateMachine:Destroy(): () self._Destroyed = true + -- Run the Leave method on the State before destroying local state: State? = self:_GetCurrentStateObject() - if state then task.spawn(state.OnLeave, state, self:GetData()) end + -- Clean up everything to save memory self._trove:Destroy() self._stateTrove:Destroy() end @@ -467,8 +497,8 @@ end @return () ]=] function StateMachine:ChangeState(newState: string): () + --Make sure we are allowed to change states local currentState: State? = self:_GetCurrentStateObject() - if currentState and not currentState:CanChangeState(newState) then return end @@ -503,12 +533,15 @@ function StateMachine:_ChangeState(newState: string): () return end + -- Make sure the State even exists to begin with assert(self:_StateExists(newState), STATE_NOT_FOUND:format(`change to {newState}`, newState)) + -- Only swap if it's not the same if self._CurrentState == newState then return end + -- Get the updated State classes local previousState: State? = self:_GetCurrentStateObject() local state: State? = self._States[newState] @@ -516,19 +549,23 @@ function StateMachine:_ChangeState(newState: string): () return end - self._stateTrove:Clean() + -- Clean up the previous state if previousState then task.spawn(previousState.OnLeave, previousState, self:GetData()) self:_CallTransitions(previousState, "OnLeave", self:GetData()) end + self._stateTrove:Clean() + -- Switch to the new state task.defer(function() self:_CallTransitions(state, "OnEnter", self:GetData()) end) self._stateTrove:Add(task.defer(state.OnEnter, state, self:GetData())) + -- Update the current state self._CurrentState = newState + -- Fire StateChanged Event if previousState then self._PreviousState = previousState.Name self.StateChanged:Fire(newState, previousState.Name or "") @@ -555,6 +592,7 @@ end @return () ]=] function StateMachine:_CheckTransitions(): () + -- Check every Transition for a possible State change (prioritizing the first found) for _, transition: Transition in self:_GetCurrentStateObject()._transitions do if transition:CanChangeState(self:GetData()) and transition:OnDataChanged(self:GetData()) then self:ChangeState(transition.TargetState) @@ -575,6 +613,7 @@ end @return () ]=] function StateMachine:_CallTransitions(state: State, methodName: string, ...: any): () + -- Call the method for each Transition for _, transition: Transition in state._transitions do task.spawn(transition[methodName], transition, ...) end From 99a1d7f9933893da150ac96b881c4a2b45241ed8 Mon Sep 17 00:00:00 2001 From: Error Date: Tue, 11 Feb 2025 19:08:04 -0800 Subject: [PATCH 16/16] doc: Made docs slightly more descriptive --- src/StateMachine/Classes/State.lua | 59 +++++++++++++++---------- src/StateMachine/Classes/Transition.lua | 49 +++++++++++--------- src/StateMachine/init.lua | 30 ++++++++----- 3 files changed, 81 insertions(+), 57 deletions(-) diff --git a/src/StateMachine/Classes/State.lua b/src/StateMachine/Classes/State.lua index b458838..3a6f621 100644 --- a/src/StateMachine/Classes/State.lua +++ b/src/StateMachine/Classes/State.lua @@ -5,7 +5,7 @@ local mergeTables = require(script.Parent.Parent.Functions.mergeTables) @class State Describes one of the many states an object can have. It also declares - how it should behave when it enters, is and leaves the given state + how it should behave when it enters, runs and leaves the given state ]=] local State = {} State.__index = State @@ -14,7 +14,7 @@ State.Type = "State" @prop Name string @within State - The name of the state. This is used to identify the state. Usually set while creating the state + The name of the state. This is used to identify the state. (Usually set while creating the state) ```lua local Blue: State = State.new("Blue") @@ -25,7 +25,7 @@ State.Name = "" :: string @prop Transitions string @within State - A reference for the transitions of this state. This is usually set while creating the state + A reference for the transitions of this state. This is (usually set while creating the state) ```lua local GoToBlue = require(script.Parent.Parent.Transitions.GoToBlue) @@ -41,7 +41,7 @@ State.Transitions = {} :: {Transition.Transition} @prop Data {[string]: any} @within State - Contains the state machine data, it can be accessed from within the class + Contains the custom state machine data. It can be accessed from within the class ]=] State.Data = {} :: {[string]: any} --[=[ @@ -57,7 +57,7 @@ State._transitions = {} :: {[string]: Transition.Transition} @within State @private - This is used to change the state of the state machine. This is set by the state machine itself + This is used to change the state of the state machine. (This is set by the state machine itself) ]=] State._changeState = nil :: (newState: string)->()? --[=[ @@ -65,7 +65,7 @@ State._changeState = nil :: (newState: string)->()? @within State @private - This is used to change the data of the state machine. This is set by the state machine itself + This is used to change the custom data of the state machine. (This is set by the state machine itself) ]=] State._changeData = nil :: (index: string, newValue: any)-> ()? --[=[ @@ -73,7 +73,7 @@ State._changeData = nil :: (index: string, newValue: any)-> ()? @within State @private - Gets the current state of our state machine + Gets the current state of our state machine. (This is set by the state machine itself) ]=] State._getState = nil :: (index: string, newValue: any)-> string --[=[ @@ -81,13 +81,14 @@ State._getState = nil :: (index: string, newValue: any)-> string @within State @private - Gets the previous state of our state machine + Gets the previous state of our state machine. (This is set by the state machine itself) ]=] State._getPreviousState = nil :: ()-> string? --[=[ Used to create a new State. The state should manage how the object should behave during - that given state. I personally recommend having your states in their own files for organizational - purposes + that given state. + + (I personally recommend having your states in their own files for organizational purposes) ```lua local ReplicatedStorage = game:GetService("ReplicatedStorage") @@ -121,7 +122,7 @@ function State.new(stateName: string?): State end --[=[ - Extends a state inheriting the behavior from the parent state + Extends a state, inheriting the behavior from the parent state ```lua local state = State.new("Blue") @@ -146,7 +147,9 @@ function State:Extend(stateName: string): State end --[=[ - Forcefully changes the current state of our state machine to a new one + Changes the current state of our state machine to a new one. + + _(**currentState:CanChangeState** must be satisfied before it can change!)_ @param newState string -- The name of the new state @@ -190,7 +193,9 @@ function State:GetPreviousState(): string end --[=[ - Changing data request. You can also just Get the data and change the data at run time. + Changing the custom data, while firing **DataChanged** Event + + (You can also just use the date argument and change the data at runtime, _**However** this dose not fire **DataChanged** event!_) ```lua local example: State = State.new("Blue") @@ -221,7 +226,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever a state machine is created with this state. + Called whenever a state machine is newly created with this state ```lua function State:OnInit(data) @@ -230,7 +235,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @return () ]=] @@ -243,6 +248,10 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: + _(Forcefully)_ Determines if the state machine is allowed to switch states or not. + + _(It's a good way to lock the current state)_ + ```lua function State:CanChangeState(targetState: string) return targetState == "Blue" -- If the target state is blue, we can change to it @@ -266,7 +275,7 @@ end **OnDataChanged** only gets called when the data is changed by a **ChangeData** call ::: - Called whenever the data of the state machine changes. + Called whenever the data of the state machine changes ```lua function State:OnDataChanged(data, index, newValue, oldValue) @@ -276,7 +285,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @param _index any -- The index of the data that changed @param _value any -- The new value of the data @param _oldValue any -- The old value of the data @@ -292,7 +301,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever you enter this state + Called whenever you first enter this state ```lua function State:OnEnter(data) @@ -300,7 +309,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @return () ]=] @@ -313,7 +322,9 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called every frame after the physics simulation while in this state + Called every frame (after the physics simulation) while in this state. + + (See [`RunService.Heartbeat`](https://create.roblox.com/docs/reference/engine/classes/RunService#Heartbeat) for more information) ```lua function Default:OnHeartbeat(data, deltaTime: number) @@ -321,7 +332,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @param _deltaTime number @return () @@ -335,7 +346,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever you leave this state + Called whenever your about leave this state. _(and before **OnDestroy**)_ ```lua function State:OnLeave(data) @@ -343,7 +354,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @return () ]=] @@ -356,7 +367,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever the state machine is destroyed + Called whenever the state machine is being destroyed ```lua function State:OnDestroy() diff --git a/src/StateMachine/Classes/Transition.lua b/src/StateMachine/Classes/Transition.lua index cffdfa6..d9182fd 100644 --- a/src/StateMachine/Classes/Transition.lua +++ b/src/StateMachine/Classes/Transition.lua @@ -12,7 +12,7 @@ Transition.Type = "Transition" @prop Name string @within Transition - The name of the state. This is used to identify the state. Usually set while creating the state + The name of the transition. This is used to identify this transition. _(Not required)_ ```lua local Transition = StateMachine.Transition @@ -26,7 +26,7 @@ Transition.Name = "" :: string @prop TargetState string @within Transition - The name of the state. This is used to identify the state. Usually set while creating the state + The name of the state to change to when transitioning. (Usually set while creating the transition) ```lua local Transition = StateMachine.Transition @@ -40,10 +40,10 @@ Transition.TargetState = "" :: string @prop Data {[string]: any} @within Transition - Contains the state machine data, it can be accessed from within the class + Contains the custom state machine data. It can be accessed from within the class ```lua - local Default: State = State.new("Blue") + local Default: State = Transition.new("Blue") function Default:OnInit(data) print(self.Data) @@ -56,7 +56,7 @@ Transition.Data = {} :: {[string]: any} @within Transition @private - This is used to change the state of the state machine. This is set by the state machine itself + Gets the current state of our state machine. (This is set by the state machine itself) ]=] Transition._changeState = nil :: (newState: string)->()? --[=[ @@ -64,7 +64,7 @@ Transition._changeState = nil :: (newState: string)->()? @within Transition @private - This is used to change the data of the state machine. This is set by the state machine itself + This is used to change the custom data of the state machine. (This is set by the state machine itself) ]=] Transition._changeData = nil :: (index: string, newValue: any)-> ()? --[=[ @@ -72,7 +72,7 @@ Transition._changeData = nil :: (index: string, newValue: any)-> ()? @within Transition @private - Gets the current state of our state machine + Gets the current state of our state machine. (This is set by the state machine itself) ]=] Transition._getState = nil :: (index: string, newValue: any)-> string --[=[ @@ -80,15 +80,16 @@ Transition._getState = nil :: (index: string, newValue: any)-> string @within Transition @private - Gets the previous state of our state machine + Gets the previous state of our state machine. (This is set by the state machine itself) ]=] Transition._getPreviousState = nil :: ()-> string? --[=[ - Creates a new transition. Transitions are used to tell our state - when and how should it move from the current state to a different one. - They are meant to be reusable and allow us to easily add and reuse transitions - between states and objects + Creates a new transition. + + Transitions are used to tell our state when and how should it move from the + current state to a different one. They are meant to be reusable and allow us + to easily add and reuse transitions between states and objects. ```lua local ReplicatedStorage = game:GetService("ReplicatedStorage") @@ -118,7 +119,7 @@ function Transition.new(targetState: string?): Transition end --[=[ - Extends a state inheriting the behavior from the parent state + Extends a state, inheriting the behavior from the parent state ```lua local transition = Transition.new("Blue") @@ -147,7 +148,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever the state machine is created + Called whenever a state machine is newly created with this transition ```lua function Transition:OnInit() @@ -155,7 +156,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @return () ]=] @@ -168,7 +169,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever you enter this transition object + Called whenever you first enter this transition object ```lua function State:OnEnter(data) @@ -176,7 +177,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @return () ]=] @@ -189,7 +190,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever you leave this transition object + Called whenever your about leave this transition. _(and before **OnDestroy**)_ ```lua function State:OnLeave(data) @@ -197,7 +198,7 @@ end end ``` - @param _data {[string]: any} -- This is the data from the StateMachine itself! + @param _data {[string]: any} -- This is the custom data from the parent StateMachine @return () ]=] @@ -225,7 +226,7 @@ function Transition:CanChangeState(data: {[string]: any}): boolean end --[=[ - Forcefully changes the current state of our state machine to a new one + Changes the current state of our state machine to a new one. @param newState string -- The name of the new state @@ -245,6 +246,8 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: + Determines wether the transition should should change yet. + Should return true if it should change to the target state and false if it shouldn't @@ -286,7 +289,9 @@ function Transition:GetPreviousState(): string end --[=[ - Changing data request. You can also just Get the data and change the data at run time. + Changing the custom data, while firing **DataChanged** Event + + (You can also just use the date argument and change the data at runtime, _**However** this dose not fire **DataChanged** event!_) ```lua local example: State = State.new("Blue") @@ -317,7 +322,7 @@ end This is a **Virtual Method**. Virtual Methods are meant to be overwritten ::: - Called whenever the state machine is destroyed + Called whenever the state machine is being destroyed ```lua function Transition:OnDestroy() diff --git a/src/StateMachine/init.lua b/src/StateMachine/init.lua index 2814462..0ba31fb 100644 --- a/src/StateMachine/init.lua +++ b/src/StateMachine/init.lua @@ -301,7 +301,7 @@ function StateMachine.new(initialState: string, states: {State}, initialData: {[ end --[=[ - Returns the current state of the State Machine + Returns the current state of the State Machine (in string form) ```lua local exampleStateMachine = RobloxStateMachine.new("Default", {}, {}) @@ -315,7 +315,7 @@ function StateMachine:GetCurrentState(): string end --[=[ - Returns the previous state of the State Machine + Returns the previous state of the State Machine (in string form) ```lua local exampleStateMachine = RobloxStateMachine.new("Default", {...BlueStateHere}, {}) @@ -330,7 +330,9 @@ function StateMachine:GetPreviousState(): string end --[=[ - Changing data request. You can also just Get the data and change the data at run time. + Changing the custom data, while firing **DataChanged** Event + + (You can also just use **GetData** and change the data at runtime, _**However** this dose not fire **DataChanged** event!_) ```lua local stateMachine = RobloxStateMachine.new("state", states, {health = 0}) @@ -361,7 +363,7 @@ function StateMachine:ChangeData(index: string, newValue: any): () end --[=[ - Gets the custom data of this state machine object. + Gets the custom data of this state machine ```lua local stateMachine = RobloxStateMachine.new("Start", {state1, state2}, {health = 20}) @@ -382,7 +384,9 @@ function StateMachine:GetData(): {[string]: any} end --[=[ - Used to load thru a directory. It's specially useful to load states and or transitions! + Used to load thru an entire directory (and its sub-directories). + + _**(Especially useful to load states and or transitions!)**_ ```lua local exampleStateMachine: RobloxStateMachine.RobloxStateMachine = RobloxStateMachine.new( @@ -395,7 +399,7 @@ end ) ``` - You can also use it to load specific files by feeding the names you wish to load + (You can also use it to load specific files by feeding the names you wish to load) @param directory Instance @@ -458,8 +462,9 @@ function StateMachine:LoadDirectory(directory: Instance, names: {string}?): {any end --[=[ - If you wish to stop using the state machine at any point you should then clear - it from the memory. Call Destroy whenever you are done with the state machine. + Clears all the memory used by the state machine + + (Use if you wish to stop using the state machine at any point) ```lua local stateMachine = RobloxStateMachine.new(...) @@ -490,7 +495,9 @@ function StateMachine:Destroy(): () end --[=[ - Forcefully changes the current state of our state machine to a new one + Changes the current state of our state machine to a new one. + + _(**currentState:CanChangeState** must be satisfied before it can change!)_ @param newState string -- The name of the new state @@ -520,7 +527,7 @@ function StateMachine:_StateExists(stateName: string): boolean end --[=[ - Called to change the current state of the state machine + Called to _truly_ change the current state of the state machine @private @@ -585,7 +592,8 @@ end --[=[ Checks if we meet any condition to change the current state. - If any of the transitions returns true then we should change the current state + + The first transition to return true then will change the current state @private