From c72f60088fb1cd19a091400794578bdb08de9a1d Mon Sep 17 00:00:00 2001 From: mse <42069+mse@users.noreply.github.com> Date: Wed, 27 May 2020 17:18:54 -0400 Subject: [PATCH] begin sorter implementation --- res_raw/sprites/buildings/sorter.png | Bin 0 -> 18108 bytes src/js/core/config.js | 1 + src/js/game/buildings/sorter.js | 85 +++++++++++++++++++++++ src/js/game/components/item_processor.js | 1 + src/js/game/systems/item_processor.js | 26 +++++++ src/js/game/tutorial_goals.js | 3 +- 6 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 res_raw/sprites/buildings/sorter.png create mode 100644 src/js/game/buildings/sorter.js diff --git a/res_raw/sprites/buildings/sorter.png b/res_raw/sprites/buildings/sorter.png new file mode 100644 index 0000000000000000000000000000000000000000..c207da442cede029d7fed3a17d8d6123e4b39254 GIT binary patch literal 18108 zcmV*xKt8{TP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DMo~#bK~#8N?VSgB z9M!eQk9zOTDwZwFmMiYY#@&GF1PBBS2`v!vfIJ8Zgp?Oj;U(}034{>9K&YmJ!N$hM zxc4SomMvMbdhflj{OE?lc$dA^O^M;HV~1YnS06F-C9?q}CM>r27aif=&KM+3iJk`SKU^Su5%a{<9Fd@j4#v?e95f#Wqu*pA(-Hx%# zpTFQ3-Rzpd)S+DCa0F-JE!{_OKF_dAIQhN2yeTFomd2%zr-_p$^E<{~UYhGs0K1+x zK91l_+a1%B=e#>evq zw)35p9-WR`O)xg$FJ(7#AGtHs2e-l7+ndtIX9y?12?)WN{5hZ%AKV3R(G-ELslL+qN5*M=)e$thgbu||D;9aWSgHa3CQ<4`|CA^>dS zr?cDd+4Ted!Z63z*Ow+_OyYOF^f5c&^yyqO82Y4FMz8`_3j_||GY<7J=y3ox`EO^p zb?lnUUpNmKojQhsf`X-yKD>Q=C?Ft!nwy)XS4OY`JY_e|o-@Dp$l?9ERiZ%^05N0a#Yc)E1uWi)o| zSm_n_r>?G!R=@g+&}E6B76M$s!6DKs_S4bPP6cQ3>FimxI~)TE#3zhmzfZI@atuE|fBr?|i&uizo12?y>eOk{E5jdue}5W3emte7rc!=h zp4M&vo1llOLYs|4F)kGVHu?XD-F{~rsR;`Yr&X(NWnbP@OKAXZ$$|a*>F{C1Wz+-* z2UE)ERHyzCQXv^2jf(tgMW_`9{33U`I&2Lc`KVq+Ak6o@K|sIID_9Xqy5qw|Z!io1AOy*kLYyi9Ow#UPw_g}Xafi`QVH+)t z)IddRYC8WS$Qcom9EP_UD&tXjb+s6B%%*x}(3 zJjyHr?^A218qOrApu&uhh05qLr)tL=HZWBP@Be(EyBkNRg)~cd70&wRkmsWUVfyQ?zhTgHV^;wGy4LBe z`1k}K^cqT#Y7xiYhX}myEgJEP;mD~|r=%wpI7KGJVF6&P|BdXn$T*TSf58HZi;I&+ zp2zC*?KpM%hH1P%-2x5?iAf7pMh7KG!AdQAMxj8w~lbo|>&uSV(4haC8{79t` zuKp1bk=!@ysbptoYp$NwRFA=iM~N+{V&AY`tbCXsvFzyRpwiM3X(XqizV0Zy3BN2y zcL1E_onm~HvwX!0k5zq;TxK!aYr*&&Dy$jf8!WhRhXZ-1PYW|cnHqTTvrpF`FoL4Q zDjXGnC#1WK#H1vi;O40uIeb{tpo04`TEqP~)L3%I)>K#1_U+rG(eNWTSFHXR`ug@s zk0>>%D#u~B05J9EDt5cTIFhq$=`!ib^T^IVL3{U#OL6-8`dJJ>xdWC0a=Ul!;;P+n z196YSLUG!Eb92)d(j$NX$W$Rmc7Xe&yNo2Z`j68NNxL;Te`_(?J9@O+t98aGv35!Z zR6D46!-@IDvBY0z9LZU{WU2Jzc^tN& z`dCUrb2oTWo`#x+-w!I@a3cRqzVsxAsXwC3K*t4uaf@`95gi@PPwIFoIj6*Wq_s3; zcf^vRjx)8xiTpgV0JOHXh_-Xt7H+cuu+<;VZ{+){m^*i#^yGPzmX`8_HxbCb9I9xq zy>M48d*31&8yl#s429J^A4IxaT7)WH%cmc|C-VQxzDRq%Riu_i8XpJ1Dmi_|3~A(f zlraGi5fK^bl!NUw{BJ(UuT zAWBrE=Vq`1tqk1K67lcrX=tfG-Q8W^N{>opDZMrc08@V^vm4x>DrU^|?AkQ-b@kGd zoPa>jJiKE<>;2bh{Jx$9>IG@3aTBz0U z5oo=Ct>4#^C}F#phWqo#H=Eas3gtrmk(H0IRRDzEpW#rGM$2HVsjjkAe95iB`^Nhh zq4oQE5=9!pFSF>c64i+&-2%YWAADk$7)Np@Pl0CS*`Oq&h_<#ire~g}hK71xqZ73{ z9l0za`t$Z&c%O~z{o;M&{fp50eLac7BC!CpwYP4R9+jxR0Nv?~OaN|UH&v}gV%|%7J2SZ@tNf(6nmM&Koa5O^A$ot;!$TPuy^e7j|% z$dH1R3lDbdGJ@F-fCTxAjH3Z=`rggFk;QPPv9Xb-Nnp#Ztf-)_E>X7VS?X7~O50jd zo?eYTMsTQhxep-$%%0(~nWQ8hpNWVN7V0|(s;Z#`yQh$smq#Cc_<=MUfa(7SUSIvs zE2W`1UF;G{x>W&SlONf0s_g^kP#^i(&n@=6Jzr>VZ&L-F{`KOE(vuu}1mJ-OQE1zB zpm{gSuX_sLe!GSC?cFPl2I%eSdH&7+{QD2m&>XBrcB?=aN_QEfMvWSo{1Tq3N1O1p z_pen3zO}988|l#;Y|WZ3FFgVv^bL;jpjJk%#?w-zm3Y$ohp<*KRa8XQ@uTLazf4$c zCZ^{%7v}#Ahfun+@bsO~liq)Ib+xb?4AcLQ<()nyYNx5W`U5=zFkiaMz}epsjNq_5 zj!WVM7OLU7az(|@cE*MGiT8{5jrZ>U_%87XW;2+=FSGaf<-hnHKO{P5{s)puqFUv^=AkKptz)mp7>KG z{q(VNdi2*7bo_*ScTabgjRar*2u4uRqP|{ykZ1e0&1a-Xb1WLbz?uLEoz@8ngI^SO z&4-OtT4ogJ`uaY4`#p<0+mM6m7>=e?Aa!BP7_?j)0cfrM782kb-T{P}VTb_?Hbra) zFsF_QK})N9t3ybsuvZ8$`IV^)=Q~wZVgWGp^&ONR&4K=Jb%JOL05gEG^avB+h9ZyL z&sS})_x8%u58M%+S9HrNx@h4-tA|kV|MBOpzUG>d$uFQvV+ZK&={_bsnqyV{0h(SQ zCICo({?a%a09!l0(81=B$IF?aBNynu{3(eN;ytqhwI#Ib6M^C41=_f&h4vrnpztss zy6TE>nmEDwqWbc`UlQ5?y8fO>O)*fdG_9UZD}(lYhKeOHco;hMs-ChW_-IDypgNqqo;IP-CNd zZpK8T*^oB18r}K(`wb_hM{}_H>oO2+-vNfG*KcZyI$!-vq2*P>oxmXu6mdF{l|_dS zAL8k}J9ccR-Me?u!2<{A__1TWpBMChwyH^g%X2xv^!v=?1F@Qd!XEm=lU4k6C39v4 zQ|f5T=MidZ#RAaR*QX@_x)2({%mBs-3RQUocz=HW=ws4oaKY;F`2VQ00H6GQA|)ld zS1t>->aw!3a|daVz6$}c1;kp=hYX&f(J7;CJ`^(;bawVrP>^^H-MYPv-g-~0vzrqd z>P>(AZ6ZZQTHXQHy!Rdz7OGW!wqV@!@rQ43m4+rz3r5$0XW_p(d(M3HH&XTejg5<= z*|TR$qroL4#G9`k&>_ujqDPGs?`xv7Z)0t0!C zA6vjAa-_=*VlPiUQ_Td_xDeIW_0f)9ZPeA(PZ=43B|))Iir*iCh|5{Jao(}%7MN+A1C@nM_O+SnwL?E?f{o{{90yL4dzE9my1b zR><#yx|B9X+XyZ$E)q7uHW&=MGLIfq25aFO)a@SB@&XA{8IcAt)Lgt=eRvxJ@cEan zZTtrHO0F=>RV3Wb6wF5lLZmOK;1@jkZ_Msgt;PELa>{flKxu?5n(!>CYjd6Zz z#6hO!eDd)}yhMs#0)v9sWRK<(9O>f;35mRM9S#%WGlW+sgsr}zp<#UDhck5q!huM8 z9Q!-r?9V~R_x8eS+ow5+mB1#+%R|v918vY~_TAVrm73cov1=l~PUTcFLpGMZSM8&b zYuB}Kb;X>UZiu9u(_QSnNiRr1O;q~q4?AKI(mcHzs>w`HfW9G>2N-)2O2>k-EC$sJd<5K>0Lt=knE1LPz$UalO`%cnJ#O2bBWuOlx2zPfJUujER%^itp#-R#6ZLsGq50#&SC>o~ceysg%?=&!n~vW3`U{ zem|;hoJZX~MlVZ!(=4iKm`{BM?L`c$`Jew%O?hYJlN~B%cei{|4Gr<8Q3<{j7wbzi zrUgl_4p3P&Frim08`urN^b3MiZqtbw+OE(h4VAOLu2v}kHcft@5&$U(rg}G6-Q1~3 zG`8RI>FN({(-v_>Hd{D$ER&x-wN^YfI5?QbrH`j^dz@EYGAI6Wd`n3zfa^Y&-;HA zOON~{j(&VkEcgFo_gK0ply19O9NU2U*DmgH(7kiVmTKwQgyRCh5FYok)m`Q);D0`O zs*BcdY@zTl_1i~=p~**W4=^0puUjXL#9;MJP99C^<1>b=q8cVXcAE(qlg>FO0t1xu zfvA=32z5bhT`ZAf>W9CFf`Opex7hE{k zsOMwF|IOnG^un_#boU+Fu>dXgr@y~nR36%90Z=JtYzIIgtR2SD00_z7e#f2C$oU}G zzm|RIbxa3EzzaU&R`$X7^ql2J5&~Y(PnBl^L_G6Ul3m6y_nK%JjwWEVB1OU7N{Jva zR$g98XG*_Ay?xeqqp*+y3JWe|Dp4@oAueElM=r>B+!oDM7qD@23w`jhe)|f!{l9$F zImc#U)WiFx#9%ONdE>Pg;jTAFvjn0RDn)YkocUNTRK399E1ojN_9!rPM@(V_>u@zR z8u$Ts1hhU`+r+oq4?k^UA95@0+}%!xk9P7E9wBxZM$kXuRcL51a6hv(E|?lfm#nZ| z9f2Eh{d(<{A9^@c4`b78q4R7=L2;{y$S7)UX5SxQOVEOs#R;c~` zhV7Y04=H;A+vEWPA^|`EOjQm&IVFWMGA2qReZ2H)9liWoJ$?0c%em{Dt*x|&eV7Pn zVWr2U*6HE1%A|}ydicROrlQ#PA)|9Tf<;M?BDmI^fc?aKPE8wOG?ze0D61-HXlEB*t`=wW|7U2Ns$d8^fB66KJT+H znuV#at^zC8PnmILia^@J*BifPAE3t-LslFF@ONwDXl-Vg;?g`@}JG-3XIScMgyV)r?_A@ITn?A>(L(l`Ai!c^3*Rr3=}x zsf9lL#J0c`JPXlL?27i~er9~&!NJ}X7+`!(9OcVbCVM8ji0o`*LYoNa{A1I`aiiB0 z>Fe{RFE(oTZ%&Ne#`Xaps;W~L|NhM{5`->h5n0(?{JTDtWA*&GiiaMEqggX73&9(2 zyv`ewD5A@0(}HVau~w1riCso9uRnaWufS*M5gCm_A(^>Er#68fh=n0S#t} zQ^@EHV_PiF_`(mI&aQ|EZ$9~L)!iMTxw)AKxZ z)ZHuhzfYMINRK^Yz3&^&`EJ_M!Ue!y(#HDJ6Th-tW9o$$o@a)=I>kIcKX>}JZ@)Hg z6rlSMj5#6!Sj%qTF^&cpZtak^e)}!$-HXmoYLJsNdbDdRvLUy}WOR$7y3Szh&I#1m zY+cPT=VuSab5EKUh!%gb-o6!I1Oj8G*no(?{O?mj=fwJTpC(pTl$lR>NQuolx5x+< z#_?VCB@G40rPrGL0Re$L$mL8h*;`v%cnWgCnLIjm@&uj8Iz}h6v-pM9NO-NFAfKw( zpJ`);pWfs*OU#*B%63-$S^@NaOn%Y7jfsy#?#LH%*5n7TI4~;0QfE-BeLt#wT}CVFC13o{KL!B54ZwBkQrS;0)!Q z%I3o0NJH!Jur6A@D4!Xt`fRalt_k#sCOiHb_po)&|l4`)^BbZ!pS z*ViFxDg7V)Kp-FtxjCnJO-!vAg*Cjr&(geEB{XHCI!(fyh|pYSkNNY-kAHj1wpRL| zKUC6-FW1pYC$9J+Oy>-gbasmWT_ylZiMH>#RXfFpAq?+m~YH3fW%Gwpw(KU4KuFUCU!iUJd zIVdxukqCD{kq8G#u}gfNv#jgjoiz{U-(X>gK6zs3=T5itFS+nStRjX*(^5s0O z9LF7%U}Be+l<=w(THw#%6$=~XpQZ&qG*87*Y1y|rp?r`W_lX5sjyvnKzZ18LOKHgvU}ECH9OIsFFB zd99QTyNwo?3jp+el+d#UBvd{3LM{F5m*u>awz3?eJrorcNl$W6Pzna_rfm}`zrb?3 zb8K`wEu2?GOBNK+sQ6ay>eTY|q>dTGSN#bSgf)g`pxVUt?c1f18fQ)ZgGW=DP2;|~ zP5A}#MY6j`ylD2HJ?l~gOQqc)I z_Il+sZs2xwXzTe1D8ZM$bm18qm0&bLQN_8VL+rjo8`*2FxrV}Yo)d;^wqL^nb=KsE z`?j=PyLy~EfJ0E`XuFZmDkqe41mNEL9)cw*_5#`Q1)wB0sst-R&6xXs7(*A$58+v# z)<6sh`Q<-nI|2m4RuEE0c|CJbHKC$*B^8xwS4G3&kr~q}=+b4URngR%8gXC=3&nD# z>)V1>_d{n*egLE1-GPnRBP;W%3x|BRE>(d1xgJxd<4S<{0_|sjTKQYVXvZ{1eC5&=nWwQ2JQ4M+OFUHxnum%a$#p z2n%&Ol^{y26ixuI5&D5Ow>0w;YmQ!3wYDY24HZRZjuM@?uK*lAs#X!MyEa0#>Z6MA z?YBnLi_fLdkM544DU&UqK11CaR47KCiXN11#j3hROurPTIwvv}2P^*6NmXpu6Ys2z z8cpob)OzBifyO!=9cRy7ot^UU32^|VUBCq^YC8*`e?>((l`+-L8CQ3gdmZA}0_VSN z#BTKmxJ&?$KY}yAN|r3t&b484f)`eO?5FYc$KQ_PCylhgL2bBD(QwTgb@c-RfMQWv zzVGQ%D(E6+u3!JYjsCs5 zliJ(QlE0rnKVoSLf>~>y>J0q+oD)2AHFgMqLpy*>xjb@sKLTNovq#l(fdGyzcEH!0 zTV;NKFnwAOEnTcn7mWz_;Ya3{u|E&{us~yLJa)X3ACbhR1=4{Bh&|&fD2}4qhOxZtU_;9c9!YI#okA_`>*by9v zXKLeqvjg#1Wo_1*Oo(;>p$OWVjd&zet)5K3z_x?+00ou4zbcA;@kl(4Nfmo){=K?R zRk+n0cx&MM?&uOHyBQ4L)Y2NLx)2mIUP08<9K;WoG`EECa)Uj+5$x~b_pvR4U0$Ky z6=Pyz=!z?^w9C<;7at$XyPCTYA3NY})bc!fdwH2>D!88wfVz+(^=GEyptUVbo)k#G zdNe_Jh7_{7cAd6&2zmL2e)mY`)2e|vW5!In_eb|p#zfmn&*;U++d~9kkQ<+?mK>%6 z{fgaG-_pW`i*&~Vjveo!qsQctTohSCM{q|#zR>)6A#^&wn^%xC2Sv27b>cw15>$S` zd1;gcA521my_mj_q&II04D{laD`4zv0kijR-usU5Lw zSBZ^{J$LmPqNuLHy-T}HNDts1LKD^1RlG8slKy@}_OZ-Eo24Npg3X453Dy36?|lzp zDOJr>bcfWN5{=bZ*|6fWOT*~a?>VQrn^woj%h|uNO7L$y{nx+nEYQyGc%JoWs-WyF zpk72pcu{I6wKOjIBN{*Y9d`eaR<0;ut9u|V zUF1(=$N2Ec4}yaRC*jP}7+nqB7oS zapY?BOnwt7$?mlapoS=#WQ!(02nZCb+)MzRrc>$`fIeFUphxX8wRN@CLxR9#AWE1+ z13D2tJ}oqNRw*rBP(X1p)&puL&{{|d4%?f$Fake6Kd%3~5={CY_Pt<-^Y;(1dS#4v z4^Nn%pBJ|WAOCs0#rO?M)M(%|YhJ$!)URI!64?N*KqOS6lV$L;i!j+W@v&{RH23Z>Q(4T3iEgLaGs@`li*x9*6}hzV!XjEUzmP6jdYb0U zDCO->Mc`n|$?R;d`Z%k&ma{=DVlcsEM}i~jjY0rz0d9AV&oMMH>6`)Rka8{h>B71j zT^co7M5LsM^}1bq+UZwMRPg%n$~+-k*|ED#)h-Feb!gd9yhd%h=eSX(E=4pw+6o4x(3#Y&Q zDUl~Q+KX0ix``8~n6`C?1V9uCMsEOgiII_-I)+Vb@k**BI?9&^tF)RUqdxrhU2VL% zHS~BiS1@m*X$hPfTDP%9cra$>^dNrDKtyF#CDqiZ%a*`X1O3=m;NrxoFcCO?Hg)PW z_B%Pp3shEC$~)L#(iasK^2!#tqlIg3ZVqp<9c^~7-x5eNY;HDCQHk~fghf|}Q%Mul z7e&$A#TSLJpXJc}{Z!8WJ_@sC@6^fc~@nnqDGH__OV~tFuG6gTNq01qw735mkV&g+qr9(x;z%BJ(hrgV(dO zPjDy2*s*EStCkrv+Ml;8(#mhNck-kC(QP+J(`~mzu^rbrwnlzlp0Ghizrpae)F8v@ z0x*-^&?QC&@=VgxZL21Lve!7}g##?s;%G>ogIaX_L>E64kA``u9far1W1W1(vQ#n! zY1Y?XrEMD_8Vn;<~#%U{&4<2Oq@)_}jN_ zlU}h5)FHh>fbRrdG_m+N3+%jTcmZSAnG_clQ&p9+8xmh+c4ZwuiZU9QSxyxIWQ<*J z91Vb^tciAHDxwL-;)S6+UU#OzF}+_4gwV0&T8cGbB`zp9L#?gqo>Pd{+SBhBLIV{_ zt6U*GLfCa`>uR~pAhJW0;P0F~d6KC-?`u}F(83lWz)p#xWJoM@1Z20~_5B#S^73$g z+|}7YbuCdGX$AfLXOBr|0SDlZy53lL31&(B99Y4-1oxz*d z)7yhDkWY4$|AUTORawcCzrNYLiH;sU!qq5yutf;4T89LC+tuX-6Cc5>o4*_7(iGqzVfm(l9QC2!go1)LAgPs@46bq7gADEnOac6t6gZZaM2=K zzFcL>34x8ZWow(&Gu8+)E@Z0CB4*s;I~WWw`LP=+VGG3OH(q-Y3pH#2yU%-y1R$N= zR3e9Cdk;MLpfqwGFvN26y12&(IsT{=4CD7KR!Aln2%AG+jgI!Av@!lXXB=K56Q;_- z$PG$K)()$i_~MJTbRtV#%?**;iIXPVwF{VlJy6b8`Ln9BHO>LM4IB};BfYz@Am3?1 z0Pr20$nNAGylQsgvkzqpOhkkaS2M9=IPmede+bWGb4Nawy0hq5PMVHp9n?o1`}+zg#ZApd2AJ} zzbIS=o15)6wq1fK^HW)4UW)|_E>fu!CQ$d&*}EMkJoI=p;2xJgo(lvf`s687DP!Vf zHi6SAk?HtY`RxhH=@Eh>hYv|lo`qIvc|SjYQ)+_K1wdVmh|$t)x3TRKM46vxyrBp9 z{ZWfY1R}e|MMYK<<=hQxLVz8>l&fh#(pL4~P zS4kr^5P~!Lc}yL0u3z7kps}`A|ANt@O?IQ_fCUO?Is}9)zxZ-gI(E7MsLOFNaN^0G zNJ{kM`Rz(<&25=BZ5myExhetn9KF3gTnNwv+ns@aUs6)U8*6JZ7?r49K}@uG7l@6G z!!F=l0a*RY^YC|;8Ak&^6>zs*KvZkO4PKw6fj!bZ!pMLbbFjVfDQGhxa&? z=r`2F$Hz-ga=g8LAOQHq>=FV?e@Njdd0?a<&eJ8Rqv)QA~ z`l#kNbL8;;7A6G$%^qdTE7FDGF~NuEE(8X6^8@wjLRnt?V7?3tN(c!d$id{Z%qLHkKKN591U>EC706t1&*shI1~Kr^Xg(%&g7B*juW~{ z9RWpfQH$r`fdkSjLkHZOv**mA^mLqLwGABJv6MaPZeX|k+q0OGYSz5_dMw*5ZT8Su z6n~}yA)(}Z#?b(%+dg?Ryibnt*_X|l)#IGSs02S=hu)clg@y46mywadb{RjWrnFo1 z!Mg%@cW~Shm)@#y=HQTyCry3;+Xf2{YAz{>ii-X?KR*`-Ic)MkSW^P`Np~4~3_?Ay z-^bSAN@e} z!3i_H{odRSdkj1DZK=ro$g%RHQHMJJ`+)OX&qC zgF>)3e8*{(v^Bw`LT5&_I7JKrl^en%!pYCypL>JsjS;{LHGcefns?!aJWXTjv}rt- z$6g_WzK_#rIECh^;80d!L4h<-?|W(zoDwW7&;H*t!W5L9JGP9<&B@kIg%zOZQ`srqWfT<) zPfZRQ_&(tx#ftCF-z_4TIGi%rlMvE zSDuH7y2m&g09!f^j*nm)D8YzT8Nz^~S6HbXS)pM+@JY{Bd;Co3`JNQqvWJvpag>`0 zJc3is6#$7{(p^ST@rVG}3no3(BdpYzxVS4)iRFG6bvV4vyysHhm5lE3r{z-Q83hN$Dp2=)PiFcrx<*ZP!A^m7**<8@4S z>>|T`mA3>w3q-(0T(a`Y+0vsfbO``cgAfo?9f*Z{Pt?6*gb`d#szwknBsf&%vbTgS z%I8|?E+ao*cye-t5nM`Ys<^s^t#*LbIDm^hN^ zDJ<=yM7IjW?0`yk``S2?bL!+t>1hOWF!}fFK_55U!QaE*A3+dwa4DcZvubcQ%jl;24mC4Nl$XTy}i*oNtb$Ws{jb&0qEo8tQ2W? z1bIhjzF`Z_s=?`rwLAw47{a0;B71Gls@v|?r9bL6f=w`E_zQNs);JmfRmZNnO83rV z7hitWOeaou@yUqnQRG9R-6-k+BJMNT5BPe*bI!U&*_w#h=4tAj!7E-0rAOruerA2+A zebUimoir}ZpAzD&=i|KhK_hM0gfb__G0rXE-_rAQ)~{P9J;}LX`b^%8Pjrbo)4(uZ zvUI65Qj>qCoAL{KC^XcY7Y8`sK;;aa6;{F)z@DQ=4t^{RHL>RtgBqkddx^B)y0mV?rx*a-)c9%26}#uD|!E;Mtbt;YI^C_I(qEa6_kC-b1GPyzyjt7 zsMsOG+uKLG+OZin3&84Ep2y@@cP?feJb2J$dGF3V+87&SeU~aMwq9XF&(Coc=#TvM zHvg zRHP4GerY&On-a*&oS-avQj$Lf272+%=H{%tB#iF9J%%n`7ACv!_g5^_X8<2R(IsrR zG&;qP?)pItedlWVs?*YHppvp)%E|4f!$&(Q_jE7$`gAdyNWQW`*VjU;JEh15zz%ir zusjHaZuv_V>NoJM@#-55+}U6PpY!D_!^qFq=wbL|Z4+gm9QggvoduI3)d%h4e3pumACQ(v#%aYSm8h{+S>=abXN1;~E3Eg)hpa=tJDxZvLV9-1c&h1e|s%ofGLm*ZrM#{y0|%K&-zenyJdHDPF_46 zIFd^Fg|SrKu#jpR=JVG(yA!CcaW0kBT*ig#L9Q!T(y3hIid$Zx-ks9ZoL2;(u3mlS zHYG{!@e&!ZsK%#m=Lsik0DX(+%1}0ON1(e#=D&yu2*y<%Pxa)<4Z{6RD`; zdMc~FoElrFP-oXDu3mwv>fUp@vS{^9Vd|NqU{b@STv4gsVG#c?2Y*h9pH2aQ+xEd9 z$I=UbOQD}X9M20GI|6E=YOqAQ3vptke_cGwRNUa6Pw81Ob`MC>QpvBZhkx&4DxlT zzh8SLhl+uThn)wio*XYamD9z0q?xYVyly^mMLm_xfy(pT3$;A<@zvKYLYFGy9}sxh zM={a9v}a#Cbt``NOIL)c1VxL@TUvP;d;A`#;Ab!Jh{eZ6(!m4!rB?=EYETNBr(ZC; zRcK&2G&|W3g%IEe-(q}a0N!MpeKxMnXxz4=je8NynKwIx(#G0f7F`J%@lBZ=s4Bq@ zM3euj%fqR@?jW^y8jtQl73%0pCLiw}8j~v5)AI{rsn1~B*8qW6Pkv*Mp2 zNlDH#22FhVmD;l zk|;kaK!*whRSuDKb9U~wt>@bAz3n^@Xex;hgZ*UQBx-C?*Q{lBfMzJ&VF8f%ophIh zoc6V!eNQjza{~OeKbzpdN=k^? zL%)73gr0dal&N+0e_aqDOH7{R9F-CIQUK~E|wB(DG4IFeISQ$t&}pv}PGVeQM-3v_KnLUAdAr{ifE*)Yq>L)P;l$tcaoP zc}$9WhtYDMA{_+({;fAhQM@3qhqQ%?ieCQya4lUNO6ag-3!=Q7sgncwPLiDD$Aw8` zgkyJ7IwSzpq4j2YO4Wit6BFYr+!>U-`g%Q0n-avmP+Axaa&^vN=z{?))Qg?D13(Dg zVz;M_BRM#``Tm;s`P~sK!{)fxxzaA>32Yy;cKmJK6z4fkj z;e(+F-@YZ#a||mmfa^}AlE80|$qylbA74pSg#6!_I6-YMz=dj!8?O`Z>|1xBub6(J zS0ai5zzb%M!Jz*6qRDRps*EX0+|a20b6MG)DwnDVxMDx}q>=8n5IFPplK=dko*wkH za=idZ{EJ<}eH}Z%`|qzYx=8Kh;Gqs)Qr%WCDR!_g!4jgtjtN9KZ@w{-?*EazW&icp z+SY#{IJk$cUUH8Ic7bV=u}d5A_U@tR@GNPh4TSNYJLO&_0A1V>J7~gqwQY030s936 z`c(N&rYGM=iRtr4I*StQ>R8b9fYw^+Y5sKEE#kJR%H6ZEp&oUugaTlnU(EtX4)1TC zJ!d{jM~NTnATVPQB$7D^8= z{aEyO@nyn*)0@t_U~VymFdvPY~4SUF{@oYMsWFd;a>gaGeA z*lr!CoKR3JBV!`_Ahn~OBJhQ0F(VbOFk89o(r~WBY7rcayp$m7XWuFQ+;!JP@D&!3 zWlMTAqQzs!_;bTi`K6k`wj3X`mnLOsugrC|#Z2{SWh{+ce1$cL~)E+b_LF-y`%ricbYqfose6hiiR?%@1WSGK^Gr3O@e}I<= z4hrnr__^jpgq}XPfb{kCesnDJ&=x*0BKv||A^-r9Hzox5^)5EPA_um>sZ*yYIXOw| zK!YZ5>BYtQ^5%C_*@T6Dnvmejw|#V%!3T^F6ImEI2aE_PqO*EZp^wnH6kP zehTb?d2@p4(u>1rY^pyM7VKv4qn&~SD<~%77$wB)qX7Q~yV9Yp2>?K|@NsOFhM_uG z^s#SObW#uQ;Rk;l$9HS2^d^w;i7Z}#cDErRJ~EpNpBc>d#MpRwnb7A?^IJpW>934^NwT>%9h^!J5W) zNO-Q4i^`dTZhp1_uTPm2NPqroHGj6A z|Ng!7zf53jIJa%NYzHvGc7n}pCxGQRu#B03Ba}GRk1Ag=v9Y{2)^K3w&K=T|99QiC zLjiVNxG#}#ht(J>|9{;ZOVN^x5_SR%b?m+i7oeoOdb+`wHs86XGSv&k4Sc-4XwgL> zwCa0CfrovjRGCDC1s79T2=89hR#H;g z#JfcHbazsJKeM?MPR!uIa!QEa$L38RwY9ZA^yS)*RE=F2GBwEMDv&u$9fB$Zm1qQ= z^!Kx^ymvq^Mw5&Yj3DRd>{)NNTXb{RvB`PR)z$gSciwvSRX$LI9pIcUH7GlP3APjL zVLJhemZH6+^YWF4G5!4pE(9j*aUBm=kY4WNgUR2=Ccn`R>FntE#k+5>Ud;z$@L`@a zG6q!u026}aOb9+;k5KMr@E1qW#9-*-c9Mw^0nnrkYR{T?Uw=m$YXSZLoDDFjDv%PU z5}|m}3+x&xhA#k?|#8m00000NkvXXu0mjf0s$sk literal 0 HcmV?d00001 diff --git a/src/js/core/config.js b/src/js/core/config.js index 953af4e7..cc8ad817 100644 --- a/src/js/core/config.js +++ b/src/js/core/config.js @@ -58,6 +58,7 @@ export const globalConfig = { rotaterCCW: 1 / 1, painter: 1 / 6, painterDouble: 1 / 8, + sorter: 1 / 1, painterQuad: 1 / 8, mixer: 1 / 5, stacker: 1 / 6, diff --git a/src/js/game/buildings/sorter.js b/src/js/game/buildings/sorter.js new file mode 100644 index 00000000..3905b75e --- /dev/null +++ b/src/js/game/buildings/sorter.js @@ -0,0 +1,85 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { ItemAcceptorComponent, enumItemAcceptorItemFilter } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; +import { T } from "../../translations"; +import { formatItemsPerSecond } from "../../core/utils"; + +export class MetaMixerBuilding extends MetaBuilding { + constructor() { + super("sorter"); + } + + getDimensions() { + return new Vector(2, 1); + } + + getSilhouetteColor() { + return "#ff6000"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return true;//root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_sorter); + } + + /** + * @param {GameRoot} root + * @param {string} variant + * @returns {Array<[string, string]>} + */ + getAdditionalStatistics(root, variant) { + const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.sorter); + return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]]; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.sorter, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.left, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + //{ + // pos: new Vector(0, 0), + // direction: enumDirection.right, + //}, + ], + }) + ); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + ], + }) + ); + } +} diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js index eab51ae2..d27d18d5 100644 --- a/src/js/game/components/item_processor.js +++ b/src/js/game/components/item_processor.js @@ -7,6 +7,7 @@ import { gItemRegistry } from "../../core/global_registries"; /** @enum {string} */ export const enumItemProcessorTypes = { splitter: "splitter", + sorter: "sorter", cutter: "cutter", cutterQuad: "cutterQuad", rotater: "rotater", diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index d3f68c04..1c291cb5 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -117,6 +117,32 @@ export class ItemProcessorSystem extends GameSystemWithFilter { break; } + // SORTER + case enumItemProcessorTypes.sorter: { + const inputItem = /** @type {ShapeItem} */ (items[0].item); + trackProduction = false; + const availableSlots = entity.components.ItemEjector.slots.length - 1; + assert(inputItem instanceof ShapeItem, "Input for sorting is not a shape"); + console.log(inputItem.serialize) + if (inputItem.serialize() == "CuCuCuCu") { + let nextSlot = processorComp.nextOutputSlot++ % availableSlots; + for (let i = 0; i < items.length; ++i) { + outItems.push({ + item: items[i].item, + requiredSlot: 1, + }); + } + } else { + for (let i = 0; i < items.length; ++i) { + outItems.push({ + item: items[i].item, + requiredSlot: 0, + }); + } + } + break; + } + // CUTTER case enumItemProcessorTypes.cutter: { const inputItem = /** @type {ShapeItem} */ (items[0].item); diff --git a/src/js/game/tutorial_goals.js b/src/js/game/tutorial_goals.js index b2f5b0ef..1ef5817a 100644 --- a/src/js/game/tutorial_goals.js +++ b/src/js/game/tutorial_goals.js @@ -17,11 +17,12 @@ export const enumHubGoalRewards = { reward_rotater_ccw: "reward_rotater_ccw", reward_miner_chainable: "reward_miner_chainable", reward_underground_belt_tier_2: "reward_underground_belt_tier_2", + reward_storage: "reward_storage", reward_splitter_compact: "reward_splitter_compact", reward_cutter_quad: "reward_cutter_quad", reward_painter_double: "reward_painter_double", + reward_sorter: "reward_sorter", reward_painter_quad: "reward_painter_quad", - reward_storage: "reward_storage", reward_freeplay: "reward_freeplay",