From 9f5ceff0bb6db5745f1b47ef8bb8ae36668efa41 Mon Sep 17 00:00:00 2001 From: DJ1TJOO Date: Fri, 26 Feb 2021 16:29:37 +0100 Subject: [PATCH] Prettier and readded shapez.io logo --- res/logo.png | Bin 25751 -> 26710 bytes res/logo_orgiginal.png | Bin 26710 -> 0 bytes src/css/dynamic_ui.scss | 10 +- src/css/resources.scss | 104 +------- src/css/states/main_menu.scss | 18 +- src/html/index.html | 70 ++--- src/js/application.js | 2 +- src/js/changelog.js | 5 +- src/js/core/animation_frame.js | 2 +- src/js/core/assert.js | 4 +- src/js/core/async_compression.js | 2 +- src/js/core/atlas_definitions.js | 2 +- src/js/core/background_resources_loader.js | 68 ++--- src/js/core/buffer_maintainer.js | 2 +- src/js/core/draw_parameters.js | 2 +- src/js/core/draw_utils.js | 6 +- src/js/core/global_registries.js | 2 +- src/js/core/input_distributor.js | 2 +- src/js/core/loader.js | 2 +- src/js/core/read_write_proxy.js | 250 +++++++++--------- src/js/core/singleton_factory.js | 2 +- src/js/core/state_manager.js | 5 +- src/js/core/textual_game_state.js | 2 +- src/js/core/utils.js | 20 +- src/js/game/base_item.js | 2 +- src/js/game/blueprint.js | 2 +- src/js/game/building_codes.js | 4 +- src/js/game/buildings/analyzer.js | 56 ++-- src/js/game/buildings/balancer.js | 71 ++--- src/js/game/buildings/belt.js | 68 +++-- src/js/game/buildings/comparator.js | 56 ++-- src/js/game/buildings/constant_signal.js | 34 +-- src/js/game/buildings/cutter.js | 34 +-- src/js/game/buildings/display.js | 34 +-- src/js/game/buildings/filter.js | 92 ++++--- src/js/game/buildings/hub.js | 200 +++++++------- src/js/game/buildings/item_producer.js | 44 +-- src/js/game/buildings/lever.js | 34 +-- src/js/game/buildings/logic_gate.js | 24 +- src/js/game/buildings/miner.js | 12 +- src/js/game/buildings/mixer.js | 58 ++-- src/js/game/buildings/painter.js | 58 ++-- src/js/game/buildings/reader.js | 129 +++++---- src/js/game/buildings/rotater.js | 44 +-- src/js/game/buildings/stacker.js | 58 ++-- src/js/game/buildings/storage.js | 108 ++++---- src/js/game/buildings/transistor.js | 53 ++-- src/js/game/buildings/trash.js | 60 +++-- src/js/game/buildings/underground_belt.js | 45 ++-- src/js/game/buildings/virtual_processor.js | 27 +- src/js/game/buildings/wire.js | 37 ++- src/js/game/buildings/wire_tunnel.js | 2 +- src/js/game/component_registry.js | 2 +- src/js/game/components/belt.js | 24 +- src/js/game/components/belt_reader.js | 2 +- src/js/game/components/static_map_entity.js | 66 +++-- src/js/game/components/wire.js | 2 +- src/js/game/core.js | 54 ++-- src/js/game/entity.js | 2 +- src/js/game/entity_manager.js | 2 +- src/js/game/game_mode.js | 2 +- src/js/game/game_mode_registry.js | 2 +- src/js/game/game_speed_registry.js | 2 +- src/js/game/game_system.js | 2 +- src/js/game/game_system_manager.js | 2 +- src/js/game/game_system_with_filter.js | 2 +- src/js/game/hub_goals.js | 29 +- src/js/game/hud/base_hud_part.js | 2 +- src/js/game/hud/hud.js | 2 +- src/js/game/hud/parts/base_toolbar.js | 14 +- src/js/game/hud/parts/building_placer.js | 37 +-- .../game/hud/parts/building_placer_logic.js | 35 +-- src/js/game/hud/parts/buildings_toolbar.js | 2 +- src/js/game/hud/parts/miner_highlight.js | 8 +- src/js/game/hud/parts/settings_menu.js | 10 +- src/js/game/hud/parts/shop.js | 2 +- src/js/game/hud/parts/waypoints.js | 15 +- src/js/game/hud/parts/wire_info.js | 5 +- src/js/game/hud/parts/wires_overlay.js | 8 +- src/js/game/hud/parts/wires_toolbar.js | 2 +- src/js/game/item_registry.js | 2 +- src/js/game/item_resolver.js | 2 +- src/js/game/items/boolean_item.js | 6 +- src/js/game/items/color_item.js | 2 +- src/js/game/items/shape_item.js | 2 +- src/js/game/key_action_mapper.js | 8 +- src/js/game/logic.js | 2 +- src/js/game/map_chunk_view.js | 8 +- src/js/game/map_view.js | 2 +- src/js/game/meta_building.js | 20 +- src/js/game/meta_building_registry.js | 2 +- src/js/game/modes/regular.js | 222 ++++++++-------- src/js/game/production_analytics.js | 2 +- src/js/game/root.js | 2 +- src/js/game/shape_definition.js | 8 +- src/js/game/systems/belt.js | 4 +- src/js/game/systems/belt_reader.js | 8 +- src/js/game/systems/belt_underlays.js | 14 +- src/js/game/systems/constant_signal.js | 2 +- src/js/game/systems/display.js | 4 +- src/js/game/systems/filter.js | 6 +- src/js/game/systems/hub.js | 34 +-- src/js/game/systems/item_acceptor.js | 2 +- src/js/game/systems/item_processor.js | 2 +- .../game/systems/item_processor_overlays.js | 4 +- src/js/game/systems/item_producer.js | 2 +- src/js/game/systems/lever.js | 2 +- src/js/game/systems/logic_gate.js | 82 +++--- src/js/game/systems/map_resources.js | 2 +- src/js/game/systems/static_map_entity.js | 2 +- src/js/game/systems/storage.js | 2 +- src/js/game/systems/underground_belt.js | 5 +- src/js/game/systems/wire.js | 34 +-- src/js/game/systems/wired_pins.js | 12 +- src/js/game/theme.js | 2 +- src/js/game/time/game_time.js | 2 +- src/js/game/tutorial_goals_mappings.js | 62 ++--- src/js/languages.js | 2 +- src/js/main.js | 4 +- src/js/modloader/mod.js | 5 +- src/js/modloader/modmanager.js | 24 +- src/js/modloader/overwrite.js | 2 +- src/js/platform/game_analytics.js | 2 +- src/js/profile/application_settings.js | 86 +++--- src/js/profile/setting_types.js | 9 +- src/js/savegame/savegame.js | 14 +- .../savegame/savegame_interface_registry.js | 2 +- src/js/savegame/savegame_manager.js | 5 +- src/js/savegame/savegame_serializer.js | 2 +- src/js/savegame/savegame_typedefs.js | 2 +- src/js/savegame/schemas/1006.js | 2 +- src/js/savegame/schemas/ML01.js | 2 +- src/js/savegame/serialization.js | 2 +- src/js/savegame/serialization_data_types.js | 7 +- src/js/states/ingame.js | 2 +- src/js/states/keybindings.js | 5 +- src/js/states/main_menu.js | 8 +- src/js/states/preload.js | 172 ++++++------ src/js/states/settings.js | 4 +- src/js/translations.js | 2 +- src/js/tslint.json | 2 +- src/js/webworkers/tsconfig.json | 2 +- 142 files changed, 1668 insertions(+), 1645 deletions(-) delete mode 100644 res/logo_orgiginal.png diff --git a/res/logo.png b/res/logo.png index 02f3e540c11c44419ec94b9c323f07028715ca6a..75dd3a3504af525215ea84e6e8474ae1a342681f 100644 GIT binary patch delta 24144 zcmZ^KWmsKH&uDRXcXyW}8+UhyQmnYUvv7w(H(IQ?yL)kpyA_uL-DuGkyY!s*{l0sD z-2JR)?IoFHCM%g_l1%zHsHGXGB-&&NTxgW_WIZ(~%H%RfFd>v=qX`rREET1&i;c5~ zv%8J63rO42$3xl7*V4^hlv3F3gB3{9%vu!O0VfH~Aqqx@S7qRMea`XU7q6H9pQd0o z1XASx3&SkDD9ZoU5X_7~K};#^#r zi-)bV(|?DjDJ}a?E6{5@M@tX0*Bdb(7c&ccOAks*rw=03Zq#C;6s!B0Z{ED4RFIa? z_E|g4K?%TJTz#>={q&IF61T3CVpolX97}+#Yu}9@`=!a5zC<+mzS1?hJvP|3R&m-=H%7b`r^xH-CsB1;N?9vF*PB&^>HM8 z< zdmXK_{g|*4e~%w4b+3$*R$>O2m|c_Uj2?dw zmX<$gg;;PMzcoC%vDBD_2`vRfjJN(5LK#{uCkRuZT=^p@Y9uxaZ2NZ1AZ%aTCtO5p zV&O}ctp}lLmds?RS+G=G6ml**y0!0rMvn`M98x5EbokS04rt(D^D2fb_inlFt_1Ef z5eh3HM!>2E>@uXLL1|xjxMXyr{lhU>iF}K)tLZ&IYu8pAuf{%RdeDp zh$k~)I_EOWpXGOs7k9bE#dwZ1%Q%u_WN!CCd=<4Txl9N@oiX`!4SD*obGL^ z8$9gDg06-%Qp;`3d0D?tmOJ}Hu zep0I)pXy^{W9bWW21ndfgYX$Xt%OWZ4*mT5Et}4^Dl3@l%+-%ZuXcdV#N+eYo}fs~ ziZq;6D*jb+0T7-rxBul=5#os(t6uwq(2y0q^GhGdr?KqNKCbQ#bOD!2Cvr1EtqnHcN|d_7%i|LegB;ZfYTgxYPY$v(fUz)Qpe@peGF35 z?yFnh!(7j$OoDxk(X6DjG_RUPJ2LWAdPI2tnRv{7+SvbT?ihiNB}lYCf~m@W930sw zpa;B+bsdX!J;#QIQh^(}c^IyQ^AdgpQ^rI!LBZ7F|DzXN@iSD^3~p9$(WIvU-z`yw zr*!Y9M}&bWv`#J&5l3t+{H0dhyvMi_M^&5kXi}dy7%;rJJ?|ri4+yh@PhKUN=g?Y=+;zN) zh-2;amIt^@Bf_r3z+ie`h5RqQqog4Z6X{a-B9?QgG$eJeM(}@~q%7A7{ zrcd^t?rug*z0uU{H~B#47W;Cs9j?UDepD+wZE*y?RLH-bi`Dr@1`tEb60jvcsg5zB zOooNL0iy{~7&IK2Q@cH5$Rw5nqs3nTohdtTL71@~ii`$~3A`}mZ107SKgBWhE33k9 zQt#nd5rhdSk0ksfD4|E%N8*T|*e0?pKgs&do}aU1d(4I(#*FqQ1M`ez<^-k`-795J z|H4v6*MzGw6OcCyGyeWM?VQJBH?}|i{;SJd96PeQj{uH2L;4!le?Hcc>=EiG4|6=X zZ$)tpR?3|_FRb`VqMP_QaXE-y;s3!GgAH1Jr=Ru~AL8~40ln_|+54`h>HDe0MOudO z$@Qudax=q!xUNt(6VgkD`J+MgbU4z>Z!`1t`-LuT@{*t#zpkC$zg$QBgqaV6ZaejDs^V8tvys)4 z&C#n0dlN++M}pN~$*ZZV_Q|s>{TCQ9AME{!& z!l4VGi|{Xfvv{_#UP0Sgfw-h*f?WR}05|s>N1svBpkdSs7FI`4U2S$~a$@2zh++x( zA8yI^ovNKd)aHGaRe3|{KH^ONs6#Y(xMbtUizgP`<-hl#T*!6#AMA<%59rIh>Sh;M zBJH);lRnXhzfr4#Xn_xE-T0}gTAU5lh4t*^BeJ1=+l0Sh#4*Zk%iOhCap&O8f8ky;OrrA2OsJ`!w^1wIR;*gYK>Gyn0Qu2a1 zDQ4H+E0x#jz13`nbdf(B6B84ab>E~1 zy@syR-ZZzi&_Z}i=QL?|0_4VdV=RPhN)6c`c{^#OAnqMys&XS2m$PPon2N`{`%AiN zrLvI*TJPJENMO~m20F`_T4Tht*7C?_dTW>& z^K(nOyDgJ)s6UbzY134CC2asa_!o+1B#MdB*kREl__+p-Q{vLmuJ+K)EM}0}28smF z8cw^+l^UxlFQrzY{EMdzasGh&4he`kdomrR8S_goVqhJ==M zFKlWw9ycj#TvoarUzSGqJdmx8rhonxL%aMoed&-FueT&A4X$b6k;GH|ljL=heJ*>$ z_jjofLPn}Br2f*BC3iN^dba6dq0S#-i4!#(B#QiQMzw;DTy|nkjmp=tTwyZ@j5Sr* z+o=_Q11Mc+f0CW}6PJfs$HmgKe+YP7rB0@~pG{Bxg~lYL-P00arr-eTgG{qUXEC4{ZxAvKIjY(?|iNf!d&?F}Ej$PQ&EwPEM*%u-HJ)09=?6bLuEj5+etaa`?&GSZ(|zuhi<0$;+HPV``c3q`$CEi84yXkPkU2Yu!Y^x>>4e~ zz8Xx^Sq;x>-&TkZN_EzYNAa=0*(I=AO(W4+neTYdj(z1PZKG8|IBoUW?+axj2*|bj zdKEbc%~|+s0C885Ws2qiL;6H{$=>o?^{g2vizi^k_BNR&aw}vS7rXsVFgYXvGWo`Q z6g>q(W@cbor$s<2e*}B@(^dtROoV;0{)%kV^=AXQidCbzzp>4A#MMGF+hToNGV}?Y zRaO485}Nk1DbM)dGlVm%JwyY@;*O9S#C7e46vjhW^<_@Vv|^M5m%jd{X3uPF92^|% zZOYD_L^n@FmKGM~H%`%?`bLv!<|5H3az*W~j~*q$;L#_?#)!?;6k@ze;OXUpln19) z_YcMBjRiFH4AzR6V-KYvwE7c2Sc5KFmyKA{paXJ~o`v$&;rZm>ZUA;oMX>Y++ekT- z@s#*rbWcH0a4bY)S(S3~i|*L5|5AOgUk&Z@C1UxZc^GmXj@>gwv_-@kt=V!-tLRw)YLQ1m}{ZE8J#er%k+6MZ>}E!-#l^SwiAv}EZH)dbi> z6Xbuqh_cQVIXiLZ;Q@FGV@5lYQu3uQgw+OBqu&2CQ5-DFxdw#=y32kf_GS4D!Zvos zZQw`orta-bmR1$CPF%5ed7qnKfA5P_rG;tu!uMqq$s0NyvS78-wM3%7A00BGqa$l5 zBqEnzH`^~<@tg(;esy_6?H;8_uyEd)^GWgt$*L4;j@u(xYj z4;;yPIsaT)^L#x^HzZepDfsEpdeWcFd+Rc8jHOrTW)bNAGrj0oT|JBXA)fL;RHXWQ zGBzlaff(VSQE&+GagkJ19Ba4vDSw@#IeOL*@7|L?JD~_8wC^T9V3>@X>V` z3S4vee_Y%u`JFy_$Kyn&4aca^n&2r`}D)exozWYDd?H> z7U%OTQ*+7B>SYQf)rv|iIJ2&DuBLKAK4N1VP2)Cn#sjZbwd+i+*_*y}aL~I@-M${2 znW>Qi246`v#>k2Y&@a5V7re4EhPL+VevgBvo@`(xnM`yRp3VT$fU1UQ;w;~gg5rqm zMSvL9VWdO~=SW932au@D5ekFM9~f%kHATJd$J$jM=gqdOagGhU+zIgbvp)YriNTA2 zwvo{{KxPvbZ*WRP`lRScXa)L|DWB zZt}#2-Anl-BZdAf89CxS#r;Q?Z%To*GtK7p?~p%vX|Ok9bjgm9Wi^KxUAZWGM`54x zr(-{RLY4wc_V}=tx*jR#D0un#m)Cw514fSppiti6jAcR(oDy9^wy4yBne0A5{nWQ36;)XR z7<&(NKHQz($+~vEVPdcGo@T_9xhW#0I!G$}+WYa-oTMTF6V}JhqmZq0|C{p{pZW7U zxz94hc}ENLJM*4I)M{GwGell%GnJPblDpcVBs-9CZK<5MwrY#YGO{gSi#e~ljJS|0Ktr`%+Fbto#&IX>Zhez8{dU92J7Hwc_T=bj<wnfja&!4b-OMB9nfNY-#RisuVZ9n1kTCHdF!xZOZENLo!-wAw3wft zpL(@InZ$x2I!MatHJPJWC*94>#hO0V9e&QKZPl13qI5&=#m^$}zl++?dmT*-(c_kFw+JB|C{t|oFba%nLfPbB1X@#S*xex&llol;p&I&gCrCH8dO z)y&b;)&L1b8GbROA(V9x+e^JQOp z^ibka{HHAf7Bgknul70{62vT$q`a52CJL3_n3cSgpf^yk{x8CLHu(d*4yUDJ?FXIv zep&*sF}?E*m?Y4hCkw0PlfVIC)Eg{`#`c;Tr}+w<;;g0Gtr@%lIhLW9w%u4JgGTEu z;h^gyjXeZ(QlECkoD~n%(jAOYng;vj<*cBG?^}AZm&rYui9%-?dYoqc;f=$IBJSK+ zi89PWZ%oCulW@!LA8}ooYrjE_bQBj`x~JT9Gd;qUT`_6(2nFqrCIeu1cXtlG`W`A{ zzs@CpVvP}_x5+StbB>OVS$1}}&W7E8ZpMPv631LR3D!{RenY{)E9+|b;A{HlRhS!d z>}%^|ym1^$rn#{fyWb8|xdaVguLl2ue|$*QQ>+nry5_0TF$;!kfhELA_|kPX<-hH_ z4oj`f8hSHvu`}RoWd;-$)w0Dj0P?Vu^iC=M^9OFtuj_JSiuiP4obY-5$k{}c-u#>@HND=rrPE_yo=dF6&(Cn%T+q|AC89z^i)O9yRNLb&eZvn5`@=Q(Du{Qvr zYyOhE#hd8j z{d9g|<0=+y8iIti!or~D!zMx#2HZW}Sy@|K=h0tr>BBU|2k?~@b1>x2DiptcT|YVN zTG2;VQ?dGS8e6_E%v{11`ZyCK8Bn*Tb=Y4h<0>5PPBAC8ad)FE?*5lu`PaT2*QnVpdSU zl}=onYV}DmfkPnG7nkB2Cye`}sXG#8Fos6L$3Aa9XkugWB`{aOwVzs+$8Mf-z+B98 z-HA58(dQDzx*k)|#W^mH0&JK*UjSBu6MN^CHOFf4S|+YF)iLQtk;pbhK!&$9TA~t5Nb&;mK zgG$bkm^i~x@Rxd34Wm#ao$&`;5(~iP5I`W+nV$-SzSV5MTw{5$5szUqCV)e-K0V8d z4toplRqCma(=j9Wwwm>l>HybrPW#=Pl%iW%=mrJ&=HNU8$eMiE#VL z$Cre<-YEgMso#dV*_a)}ytZGr`(UQ!Fv!dhS4ziGB@f3ryk);9gKYPx9^-j;Q{(_i zMoHpjHF;Zj|Hc*rfF$~40G`^^IX2l`kG4Dk?3o^y`LyT>RQR2=-TRgzc`Og`dYmu`3juEoIj5w z&RsiwHd>kkzr&=&Uj&m9w~sXT5fc#?3Te{Lp`he)oXwIgE3)-z&7&+By-Efg;;~1v z5}nkP!~>-emPsuGf!5IlU-s&&5Vt8lrnqRBw&+f6VBO&A{&sz@SSh_a z$p^woFc6;wpUrSL{OX|gI5|4rL^ZdoWIrF3oX&i?Tkg7B-01C)WAA`Gh9i;To7oEr zt}dnEJ`gGFg(HNCFv@7xT8bp_4Q48xsNvksk^?`Q{jdKGh7PP6{fF{f2CaKEfscXFKbBgG+?nJo#2MX?MosCQ?qNPpK}3U9-su-E&3BFb2XmEW}NTh%v)AC zM<|`~{;}dUZxhG5#!Z+FZX2Q0$4Ks21{b;~u9Hv%UgQh7bI?Kw;1B)Ci-A62ggDa` zPr5s0Eq_W*rh4n+2@-r+P#{oUpp_!^U>06hI}&Go+)v9alpjeRrb6WL@qdkw_Pjr3&#(sa*fb` zP_N&6eWx+`8{M9Rmds_?+?uL>Kv{H$*$ht?yLVQy*`E8ET|ae~J{-f_hfHxx^4c5!A6jk`(^s`rwn*tkS7r zaZ;jQX(%R*<^F7B_cTFI!==z+pYsM zz=>UBYk`7}daO*gU`9dyEb8&6s4C%?izwSvdtSnZB#*9P6&^PJxn`exOB+sPT{J`9 zyJ7RNS;>x76UTz=lOX9tFbGghIMKlrE^Mz`@hrQt98XKs5m-YLr;au+ZUnKCI`?hT zM3YjG5!%j{J-^y+*h8Xh8*$tz*NqO~tu-Dl?u7RJ+Y3^*_<s=4yOX@38oF*C^zSsI2&WJ)G`LpCqj>)F|6M_`%>lHOo38HQ49Zv;d@m8fV8 zHcG=jndYZ*VA0nfHj2F_p4KS0!b#skX$1m0n^mLVY{`wO*6{ZT!Nzx;t!VrvEv(HT zkFwxQjR2EHT(wHEB;)8FUQC>BtJ3l#E((T|aVZ9Nsbh=;U(6sH^ltlB&M5B7BdV^< zo)@j6jc$)Jl59${os#`DpznhLnplKzsNDM32igBi85i78I7 zPqcQcyJKty3QWt^Nzl-4cKx?1_L7=i)|Q?R16O%}h~}O1R;w1N9o4OfA≧5QaDj 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 u!fopnlWt*HtA6cFMQ$;%VgCo&VNlWl delta 23152 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 diff --git a/res/logo_orgiginal.png b/res/logo_orgiginal.png deleted file mode 100644 index 75dd3a3504af525215ea84e6e8474ae1a342681f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26710 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

Sq9J-@mtAks2TjwB3IhAii5 zK)t>uTzuH3LX+cI7X-X#m6BQwRgpw^*O-WVWuIFVCJG|xiY37Rnt&iuT}KF_I#1E< zK%2;lk>_5i^jo){TQG%&N)g4?GoWAH35{buU#z*zL>G9opEzwSUHkz=*#0>wAh^*f zvO{bgw@Odd)r+w>Az!NmDgaKs3^aVTJdR*^2qz%_jM|v`Qm>j4$1psOx!@xoElI$Q zQobXn&*hH^JhFOJRTF*pf?w5yzhgB;VAMg(+e zKw~I3-zK)bH*2Fe44?iNac~#o@Qk&k^_-aUUKu%EQCe`5i^wm@zof$7rQDSuN~P9J z{ZCntfiyQCq}|{-$jQ^w=4l?DKArwX2wxzut^eK2>307qDp}1{@adPYb9TMc{L0}) zuKyW{h&47+M>?GpgAbOTF;!&^RT5^!G2$i4e~p_o33MjUz;eYlcTsTJ|G%ELk4$z} zxn&kGDa0hlRJ?v}eAXpTR*>M2) zEm#_Qfl>p&6<49t(GB};LQ6!EgYVw8VeySopIj*{!jLvMr3uPA4lD<6ft?k99s6_9 zW@8ZpJe?nmQ%C&@nWXC6JHFI^3UiUeHgOlIm}T+$wib8{ZNw$C790BwKs3Gr6CV3( z*^xEiv6_TCCf~6mRQWC#XOzAC{QPoj=_qm3fSib!&3gd*hL9~>{z}*^_@SGt87QaU z^#^A$U#~$iG=bT?3$=Fy_WRx*hO#La4`kqqbK+H-U@&hUBDlVho&l)pLh7} zePo^h%IJZk7FGqp0;|r~*s;}s#;kLA5&c0F97ObjGV!|$y=F4JrLJ-Be4IJ#tf;!SUSyRPmQw6ZL~XlZ8U8YJjdR~r3}@sQ=>n^mKp4QYh4nhO0! zkoq?qtO&M(vUzHariNRf9l{K}8jvq`j*b(h-(X7^Xsww(C6g>3iKjE=rI z@-sDsX40%^!`}`E3g~deea4Ao_p$EjSF!z)na*3Kj-w~ii8W3KCk|)#ySCf->1DsA zqFXb{M@F_K)V5g!FsX*1E%!BCA90XIoxD(|2h?>bX6q9Dlt0nVB-beQ%`Xw5^5QK zN8q0)#3af{_Lq_Z8hU!~FBI@+6w=oF1pg)iMQOUFII-#5saNePlw4;D2~2>k9em<4 ptWD}QZ`|lmx`G3j+Va@;m diff --git a/src/css/dynamic_ui.scss b/src/css/dynamic_ui.scss index 9b7374fa..f5d81baf 100644 --- a/src/css/dynamic_ui.scss +++ b/src/css/dynamic_ui.scss @@ -1,6 +1,6 @@ // Removes the unit (px, %, etc) from a value @function strip-unit($number) { - @if type-of($number)=="number" and not unitless($number) { + @if type-of($number) == "number" and not unitless($number) { @return $number / ($number * 0 + 1); } @return $number; @@ -25,14 +25,14 @@ $impSuffix: "!important"; } $v1: D($v1); - @if $v2 !="" { + @if $v2 != "" { $v2: D($v2); } - @if $v3 !="" { + @if $v3 != "" { $v3: D($v3); } - @if $v4 !="" { + @if $v4 != "" { $v4: D($v4); } #{$propName}: #{$v1} #{$v2} #{$v3} #{$v4} #{$impSuffix}; -} \ No newline at end of file +} diff --git a/src/css/resources.scss b/src/css/resources.scss index 8b24db98..93f4092d 100644 --- a/src/css/resources.scss +++ b/src/css/resources.scss @@ -1,27 +1,6 @@ -$buildings: belt, -cutter, -miner, -mixer, -painter, -rotater, -balancer, -stacker, -trash, -underground_belt, -wire, -constant_signal, -logic_gate, -lever, -filter, -wire_tunnel, -display, -virtual_processor, -reader, -storage, -transistor, -analyzer, -comparator, -item_producer; +$buildings: belt, cutter, miner, mixer, painter, rotater, balancer, stacker, trash, underground_belt, wire, + constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader, storage, + transistor, analyzer, comparator, item_producer; @each $building in $buildings { [data-icon="building_icons/#{$building}.png"] { /* @load-async */ @@ -29,41 +8,11 @@ item_producer; } } -$buildingsAndVariants: belt, -balancer, -underground_belt, -underground_belt-tier2, -miner, -miner-chainable, -cutter, -cutter-quad, -rotater, -rotater-ccw, -stacker, -mixer, -painter-double, -painter-quad, -trash, -storage, -reader, -rotater-rotate180, -display, -constant_signal, -wire, -wire_tunnel, -logic_gate-or, -logic_gate-not, -logic_gate-xor, -analyzer, -virtual_processor-rotater, -virtual_processor-unstacker, -item_producer, -virtual_processor-stacker, -virtual_processor-painter, -wire-second, -painter, -painter-mirrored, -comparator; +$buildingsAndVariants: belt, balancer, underground_belt, underground_belt-tier2, miner, miner-chainable, + cutter, cutter-quad, rotater, rotater-ccw, stacker, mixer, painter-double, painter-quad, trash, storage, + reader, rotater-rotate180, display, constant_signal, wire, wire_tunnel, logic_gate-or, logic_gate-not, + logic_gate-xor, analyzer, virtual_processor-rotater, virtual_processor-unstacker, item_producer, + virtual_processor-stacker, virtual_processor-painter, wire-second, painter, painter-mirrored, comparator; @each $building in $buildingsAndVariants { [data-icon="building_tutorials/#{$building}.png"] { /* @load-async */ @@ -108,9 +57,7 @@ comparator; background-image: uiResource("res/ui/building_tutorials/virtual_processor-cutter.png") !important; } -$icons: notification_saved, -notification_success, -notification_upgrade; +$icons: notification_saved, notification_success, notification_upgrade; @each $icon in $icons { [data-icon="icons/#{$icon}.png"] { /* @load-async */ @@ -118,34 +65,8 @@ notification_upgrade; } } -$languages: en, -de, -cs, -da, -et, -es-419, -fr, -it, -pt-BR, -sv, -tr, -el, -ru, -uk, -zh-TW, -zh-CN, -nb, -mt-MT, -ar, -nl, -vi, -th, -hu, -pl, -ja, -kor, -no, -pt-PT; +$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, zh-CN, nb, mt-MT, ar, nl, vi, + th, hu, pl, ja, kor, no, pt-PT; @each $language in $languages { [data-languageicon="#{$language}"] { /* @load-async */ @@ -153,7 +74,6 @@ pt-PT; } } - /* PRICE */ @@ -166,4 +86,4 @@ PRICE .steam_2_npr { /* @load-async */ background-image: uiResource("get_on_steam.png") !important; -} \ No newline at end of file +} diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss index 821e6587..929025b9 100644 --- a/src/css/states/main_menu.scss +++ b/src/css/states/main_menu.scss @@ -277,7 +277,7 @@ grid-row: 2 / 3; @include SuperSmallText; opacity: 0.5; - >span { + > span { display: inline-flex; @include S(max-width, 140px); overflow: hidden; @@ -290,7 +290,7 @@ @include PlainText; display: inline-flex; align-items: center; - >span { + > span { display: inline-flex; @include S(max-width, 140px); overflow: hidden; @@ -429,7 +429,7 @@ $linkBg: #fdfdff; $linkBgHover: darken($linkBg, 2); $linkColor: #55586a; - >.boxLink { + > .boxLink { display: grid; align-items: center; grid-template-columns: 1fr auto; @@ -470,14 +470,14 @@ } } } - >.sidelinks { + > .sidelinks { display: grid; align-items: flex-start; justify-content: flex-start; grid-template-rows: 1fr 1fr 1fr; @include S(grid-gap, 3px); @include S(height, 60px); - >a { + > a { color: $linkColor; background: $linkBg; height: 100%; @@ -524,8 +524,8 @@ } } .footer { - >a, - .sidelinks>a { + > a, + .sidelinks > a { background-color: $darkModeControlsBackground; color: #eee; &:hover { @@ -534,7 +534,7 @@ } .author { color: #bdbdbd; - >a { + > a { color: white; } } @@ -543,4 +543,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/html/index.html b/src/html/index.html index 03b08899..b1d89377 100644 --- a/src/html/index.html +++ b/src/html/index.html @@ -1,36 +1,46 @@ + + shapez.io - Build automated factories to build, combine and color shapes! - - shapez.io - Build automated factories to build, combine and color shapes! + + + + + + + - - - - - - - + + + + + + + + + + + - - - - - - - - - - - + + + + + + - - - - - - - - - - \ No newline at end of file + + diff --git a/src/js/application.js b/src/js/application.js index eb3e4c7d..cc2a0716 100644 --- a/src/js/application.js +++ b/src/js/application.js @@ -411,4 +411,4 @@ Application.states = { KeybindingsState, AboutState, ChangelogState, -}; \ No newline at end of file +}; diff --git a/src/js/changelog.js b/src/js/changelog.js index 1b194f8e..60e3861e 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -1,7 +1,8 @@ /** * @type {Array<{version: string, date: string, entries: Array}>} changelog */ -export const CHANGELOG = [{ +export const CHANGELOG = [ + { version: "1.2.3", date: "unreleased", entries: [ @@ -314,4 +315,4 @@ export const CHANGELOG = [{ date: "21.05.2020", entries: ["Initial release!"], }, -]; \ No newline at end of file +]; diff --git a/src/js/core/animation_frame.js b/src/js/core/animation_frame.js index 52fd42f2..edda0412 100644 --- a/src/js/core/animation_frame.js +++ b/src/js/core/animation_frame.js @@ -77,4 +77,4 @@ export class AnimationFrame { window.requestAnimationFrame(this.boundMethod); } -} \ No newline at end of file +} diff --git a/src/js/core/assert.js b/src/js/core/assert.js index 059c0061..1d80d2aa 100644 --- a/src/js/core/assert.js +++ b/src/js/core/assert.js @@ -20,7 +20,7 @@ function initAssert() { * @param {Boolean} condition * @param {...String} failureMessage */ - window.assert = function(condition, ...failureMessage) { + window.assert = function (condition, ...failureMessage) { if (!condition) { logger.error("assertion failed:", ...failureMessage); if (!assertionErrorShown) { @@ -32,4 +32,4 @@ function initAssert() { }; } -initAssert(); \ No newline at end of file +initAssert(); diff --git a/src/js/core/async_compression.js b/src/js/core/async_compression.js index 1aa5cb8d..1ad5af0f 100644 --- a/src/js/core/async_compression.js +++ b/src/js/core/async_compression.js @@ -118,4 +118,4 @@ class AsynCompression { } } -export const asyncCompressor = new AsynCompression(); \ No newline at end of file +export const asyncCompressor = new AsynCompression(); diff --git a/src/js/core/atlas_definitions.js b/src/js/core/atlas_definitions.js index eda778c1..38d36b59 100644 --- a/src/js/core/atlas_definitions.js +++ b/src/js/core/atlas_definitions.js @@ -47,4 +47,4 @@ export const atlasFiles = require .keys() .map(f => f.replace(/^\.\//gi, "")) .map(f => require("../../../res_built/atlas/" + f)) - .map(data => new AtlasDefinition(data)); \ No newline at end of file + .map(data => new AtlasDefinition(data)); diff --git a/src/js/core/background_resources_loader.js b/src/js/core/background_resources_loader.js index 43fb74a5..bbd37036 100644 --- a/src/js/core/background_resources_loader.js +++ b/src/js/core/background_resources_loader.js @@ -107,10 +107,10 @@ export class BackgroundResourcesLoader { internalStartLoadingEssentialsForBareGame() { logger.log("⏰ Start load: bare game"); this.internalLoadSpritesAndSounds( - essentialBareGameSprites, - essentialBareGameSounds, - essentialBareGameAtlases - ) + essentialBareGameSprites, + essentialBareGameSounds, + essentialBareGameAtlases + ) .then(() => this.internalPreloadCss("async-resources.scss")) .catch(err => { logger.warn("⏰ Failed to load essentials for bare game:", err); @@ -174,13 +174,13 @@ export class BackgroundResourcesLoader { this.soundsLoaded.push(sounds[i]); promises.push( this.app.sound - .loadSound(sounds[i]) - .catch(err => { - logger.warn("Failed to load sound:", sounds[i]); - }) - .then(() => { - this.numAssetsLoaded++; - }) + .loadSound(sounds[i]) + .catch(err => { + logger.warn("Failed to load sound:", sounds[i]); + }) + .then(() => { + this.numAssetsLoaded++; + }) ); } @@ -192,12 +192,12 @@ export class BackgroundResourcesLoader { this.spritesLoaded.push(sprites[i]); promises.push( Loader.preloadCSSSprite(sprites[i]) - .catch(err => { - logger.warn("Failed to load css sprite:", sprites[i]); - }) - .then(() => { - this.numAssetsLoaded++; - }) + .catch(err => { + logger.warn("Failed to load css sprite:", sprites[i]); + }) + .then(() => { + this.numAssetsLoaded++; + }) ); } @@ -205,28 +205,28 @@ export class BackgroundResourcesLoader { const atlas = atlases[i]; promises.push( Loader.preloadAtlas(atlas) - .catch(err => { - logger.warn("Failed to load atlas:", atlas.sourceFileName); - }) - .then(() => { - this.numAssetsLoaded++; - }) + .catch(err => { + logger.warn("Failed to load atlas:", atlas.sourceFileName); + }) + .then(() => { + this.numAssetsLoaded++; + }) ); } return ( Promise.all(promises) - // // Remove some pressure by waiting a bit - // .then(() => { - // return new Promise(resolve => { - // setTimeout(resolve, 200); - // }); - // }) - .then(() => { - this.numAssetsToLoadTotal = 0; - this.numAssetsLoaded = 0; - }) + // // Remove some pressure by waiting a bit + // .then(() => { + // return new Promise(resolve => { + // setTimeout(resolve, 200); + // }); + // }) + .then(() => { + this.numAssetsToLoadTotal = 0; + this.numAssetsLoaded = 0; + }) ); } -} \ No newline at end of file +} diff --git a/src/js/core/buffer_maintainer.js b/src/js/core/buffer_maintainer.js index 237d5d3e..065ec05a 100644 --- a/src/js/core/buffer_maintainer.js +++ b/src/js/core/buffer_maintainer.js @@ -168,4 +168,4 @@ export class BufferMaintainer { }); return canvas; } -} \ No newline at end of file +} diff --git a/src/js/core/draw_parameters.js b/src/js/core/draw_parameters.js index a639a5a2..a6e0b807 100644 --- a/src/js/core/draw_parameters.js +++ b/src/js/core/draw_parameters.js @@ -17,4 +17,4 @@ export class DrawParameters { /** @type {import("../game/root").GameRoot} */ this.root = root; } -} \ No newline at end of file +} diff --git a/src/js/core/draw_utils.js b/src/js/core/draw_utils.js index 13a486f5..01361544 100644 --- a/src/js/core/draw_utils.js +++ b/src/js/core/draw_utils.js @@ -5,7 +5,7 @@ import { Rectangle } from "./rectangle"; const logger = createLogger("draw_utils"); export function initDrawUtils() { - CanvasRenderingContext2D.prototype.beginRoundedRect = function(x, y, w, h, r) { + CanvasRenderingContext2D.prototype.beginRoundedRect = function (x, y, w, h, r) { this.beginPath(); if (r < 0.05) { @@ -28,7 +28,7 @@ export function initDrawUtils() { this.arcTo(x, y, x + w, y, r); }; - CanvasRenderingContext2D.prototype.beginCircle = function(x, y, r) { + CanvasRenderingContext2D.prototype.beginCircle = function (x, y, r) { this.beginPath(); if (r < 0.05) { @@ -113,4 +113,4 @@ export function drawSpriteClipped({ parameters, sprite, x, y, w, h, originalW, o intersection.w, intersection.h ); -} \ No newline at end of file +} diff --git a/src/js/core/global_registries.js b/src/js/core/global_registries.js index 5f10d016..637780df 100644 --- a/src/js/core/global_registries.js +++ b/src/js/core/global_registries.js @@ -29,4 +29,4 @@ export let gItemRegistry = new Factory("item"); */ export function initBuildingsByCategory(buildings) { gBuildingsByCategory = buildings; -} \ No newline at end of file +} diff --git a/src/js/core/input_distributor.js b/src/js/core/input_distributor.js index c02882ce..c3b3efd8 100644 --- a/src/js/core/input_distributor.js +++ b/src/js/core/input_distributor.js @@ -240,4 +240,4 @@ export class InputDistributor { alt: event.altKey, }); } -} \ No newline at end of file +} diff --git a/src/js/core/loader.js b/src/js/core/loader.js index aa087541..26d16624 100644 --- a/src/js/core/loader.js +++ b/src/js/core/loader.js @@ -222,4 +222,4 @@ class LoaderImpl { } } -export const Loader = new LoaderImpl(); \ No newline at end of file +export const Loader = new LoaderImpl(); diff --git a/src/js/core/read_write_proxy.js b/src/js/core/read_write_proxy.js index e9a231d2..1023522c 100644 --- a/src/js/core/read_write_proxy.js +++ b/src/js/core/read_write_proxy.js @@ -111,9 +111,9 @@ export class ReadWriteProxy { const checksum = decompressed.substring(0, 40); const jsonString = decompressed.substr(40); - const desiredChecksum = checksum.startsWith(CRC_PREFIX) ? - computeCrc(jsonString + salt) : - sha1(jsonString + salt); + const desiredChecksum = checksum.startsWith(CRC_PREFIX) + ? computeCrc(jsonString + salt) + : sha1(jsonString + salt); if (desiredChecksum !== checksum) { // Checksum mismatch @@ -165,141 +165,141 @@ export class ReadWriteProxy { // Start read request return ( this.app.storage - .readFileAsync(this.filename) + .readFileAsync(this.filename) - // Check for errors during read - .catch(err => { - if (err === FILE_NOT_FOUND) { - logger.log("File not found, using default data"); + // Check for errors during read + .catch(err => { + if (err === FILE_NOT_FOUND) { + logger.log("File not found, using default data"); - // File not found or unreadable, assume default file - return Promise.resolve(null); - } - - return Promise.reject("file-error: " + err); - }) - - // Decrypt data (if its encrypted) - // @ts-ignore - .then(rawData => { - if (rawData == null) { - // So, the file has not been found, use default data - return JSON.stringify(compressObject(this.getDefaultData())); - } - - if (rawData.startsWith(compressionPrefix)) { - const decompressed = decompressX64(rawData.substr(compressionPrefix.length)); - if (!decompressed) { - // LZ string decompression failure - return Promise.reject("bad-content / decompression-failed"); - } - if (decompressed.length < 40) { - // String too short - return Promise.reject("bad-content / payload-too-small"); + // File not found or unreadable, assume default file + return Promise.resolve(null); } - // Compare stored checksum with actual checksum - const checksum = decompressed.substring(0, 40); - const jsonString = decompressed.substr(40); + return Promise.reject("file-error: " + err); + }) - const desiredChecksum = checksum.startsWith(CRC_PREFIX) ? - computeCrc(jsonString + salt) : - sha1(jsonString + salt); + // Decrypt data (if its encrypted) + // @ts-ignore + .then(rawData => { + if (rawData == null) { + // So, the file has not been found, use default data + return JSON.stringify(compressObject(this.getDefaultData())); + } - if (desiredChecksum !== checksum) { - // Checksum mismatch - return Promise.reject( - "bad-content / checksum-mismatch: " + desiredChecksum + " vs " + checksum + if (rawData.startsWith(compressionPrefix)) { + const decompressed = decompressX64(rawData.substr(compressionPrefix.length)); + if (!decompressed) { + // LZ string decompression failure + return Promise.reject("bad-content / decompression-failed"); + } + if (decompressed.length < 40) { + // String too short + return Promise.reject("bad-content / payload-too-small"); + } + + // Compare stored checksum with actual checksum + const checksum = decompressed.substring(0, 40); + const jsonString = decompressed.substr(40); + + const desiredChecksum = checksum.startsWith(CRC_PREFIX) + ? computeCrc(jsonString + salt) + : sha1(jsonString + salt); + + if (desiredChecksum !== checksum) { + // Checksum mismatch + return Promise.reject( + "bad-content / checksum-mismatch: " + desiredChecksum + " vs " + checksum + ); + } + return jsonString; + } else { + if (!G_IS_DEV) { + return Promise.reject("bad-content / missing-compression"); + } + } + return rawData; + }) + + // Parse JSON, this could throw but that's fine + .then(res => { + try { + return JSON.parse(res); + } catch (ex) { + logger.error( + "Failed to parse file content of", + this.filename, + ":", + ex, + "(content was:", + res, + ")" ); + throw new Error("invalid-serialized-data"); } - return jsonString; - } else { - if (!G_IS_DEV) { - return Promise.reject("bad-content / missing-compression"); + }) + + // Decompress + .then(compressed => decompressObject(compressed)) + + // Verify basic structure + .then(contents => { + const result = this.internalVerifyBasicStructure(contents); + if (!result.isGood()) { + return Promise.reject("verify-failed: " + result.reason); } - } - return rawData; - }) + return contents; + }) - // Parse JSON, this could throw but that's fine - .then(res => { - try { - return JSON.parse(res); - } catch (ex) { - logger.error( - "Failed to parse file content of", - this.filename, - ":", - ex, - "(content was:", - res, - ")" - ); - throw new Error("invalid-serialized-data"); - } - }) - - // Decompress - .then(compressed => decompressObject(compressed)) - - // Verify basic structure - .then(contents => { - const result = this.internalVerifyBasicStructure(contents); - if (!result.isGood()) { - return Promise.reject("verify-failed: " + result.reason); - } - return contents; - }) - - // Check version and migrate if required - .then(contents => { - if (contents.version > this.getCurrentVersion()) { - return Promise.reject("stored-data-is-newer"); - } - - if (contents.version < this.getCurrentVersion()) { - logger.log( - "Trying to migrate data object from version", - contents.version, - "to", - this.getCurrentVersion() - ); - const migrationResult = this.migrate(contents); // modify in place - if (migrationResult.isBad()) { - return Promise.reject("migration-failed: " + migrationResult.reason); + // Check version and migrate if required + .then(contents => { + if (contents.version > this.getCurrentVersion()) { + return Promise.reject("stored-data-is-newer"); } - } - return contents; - }) - // Verify - .then(contents => { - const verifyResult = this.internalVerifyEntry(contents); - if (!verifyResult.result) { - logger.error( - "Read invalid data from", - this.filename, - "reason:", - verifyResult.reason, - "contents:", - contents - ); - return Promise.reject("invalid-data: " + verifyResult.reason); - } - return contents; - }) + if (contents.version < this.getCurrentVersion()) { + logger.log( + "Trying to migrate data object from version", + contents.version, + "to", + this.getCurrentVersion() + ); + const migrationResult = this.migrate(contents); // modify in place + if (migrationResult.isBad()) { + return Promise.reject("migration-failed: " + migrationResult.reason); + } + } + return contents; + }) - // Store - .then(contents => { - this.currentData = contents; - logger.log("📄 Read data with version", this.currentData.version, "from", this.filename); - return contents; - }) + // Verify + .then(contents => { + const verifyResult = this.internalVerifyEntry(contents); + if (!verifyResult.result) { + logger.error( + "Read invalid data from", + this.filename, + "reason:", + verifyResult.reason, + "contents:", + contents + ); + return Promise.reject("invalid-data: " + verifyResult.reason); + } + return contents; + }) - // Catchall - .catch(err => { - return Promise.reject("Failed to read " + this.filename + ": " + err); - }) + // Store + .then(contents => { + this.currentData = contents; + logger.log("📄 Read data with version", this.currentData.version, "from", this.filename); + return contents; + }) + + // Catchall + .catch(err => { + return Promise.reject("Failed to read " + this.filename + ": " + err); + }) ); } @@ -341,4 +341,4 @@ export class ReadWriteProxy { } return this.verify(data); } -} \ No newline at end of file +} diff --git a/src/js/core/singleton_factory.js b/src/js/core/singleton_factory.js index 231f55dc..7fa38bd3 100644 --- a/src/js/core/singleton_factory.js +++ b/src/js/core/singleton_factory.js @@ -94,4 +94,4 @@ export class SingletonFactory { getNumEntries() { return this.entries.length; } -} \ No newline at end of file +} diff --git a/src/js/core/state_manager.js b/src/js/core/state_manager.js index 0b9cba78..3c49ada9 100644 --- a/src/js/core/state_manager.js +++ b/src/js/core/state_manager.js @@ -97,7 +97,8 @@ export class StateManager { this.app.analytics.trackStateEnter(key); - window.history.pushState({ + window.history.pushState( + { key, }, key @@ -117,4 +118,4 @@ export class StateManager { getCurrentState() { return this.currentState; } -} \ No newline at end of file +} diff --git a/src/js/core/textual_game_state.js b/src/js/core/textual_game_state.js index 4cd19cca..80dc7a01 100644 --- a/src/js/core/textual_game_state.js +++ b/src/js/core/textual_game_state.js @@ -153,4 +153,4 @@ export class TextualGameState extends GameState { this.onEnter(payload); } -} \ No newline at end of file +} diff --git a/src/js/core/utils.js b/src/js/core/utils.js index 80dfdc28..6eed9c34 100644 --- a/src/js/core/utils.js +++ b/src/js/core/utils.js @@ -334,9 +334,9 @@ export function formatBigNumberFull(num, divider = T.global.thousandsDivider) { * @returns {Promise} */ export function waitNextFrame() { - return new Promise(function(resolve) { - window.requestAnimationFrame(function() { - window.requestAnimationFrame(function() { + return new Promise(function (resolve) { + window.requestAnimationFrame(function () { + window.requestAnimationFrame(function () { resolve(); }); }); @@ -573,12 +573,12 @@ export function round1DigitLocalized(speed, separator = T.global.decimalSeparato * @param {string=} separator The decimal separator for numbers like 50.1 (separator='.') */ export function formatItemsPerSecond(speed, double = false, separator = T.global.decimalSeparator) { - return speed === 1.0 ? - T.ingame.buildingPlacement.infoTexts.oneItemPerSecond : - T.ingame.buildingPlacement.infoTexts.itemsPerSecond.replace( - "", - round2Digits(speed).toString().replace(".", separator) - ) + (double ? " " + T.ingame.buildingPlacement.infoTexts.itemsPerSecondDouble : ""); + return speed === 1.0 + ? T.ingame.buildingPlacement.infoTexts.oneItemPerSecond + : T.ingame.buildingPlacement.infoTexts.itemsPerSecond.replace( + "", + round2Digits(speed).toString().replace(".", separator) + ) + (double ? " " + T.ingame.buildingPlacement.infoTexts.itemsPerSecondDouble : ""); } /** @@ -781,4 +781,4 @@ export function getRomanNumber(number) { romanLiteralsCache[number] = formatted; return formatted; -} \ No newline at end of file +} diff --git a/src/js/game/base_item.js b/src/js/game/base_item.js index 97af2d6b..0ef6bd9a 100644 --- a/src/js/game/base_item.js +++ b/src/js/game/base_item.js @@ -100,4 +100,4 @@ export class BaseItem extends BasicSerializableObject { abstract; return ""; } -} \ No newline at end of file +} diff --git a/src/js/game/blueprint.js b/src/js/game/blueprint.js index bf614755..9620393e 100644 --- a/src/js/game/blueprint.js +++ b/src/js/game/blueprint.js @@ -165,4 +165,4 @@ export class Blueprint { return anyPlaced; }); } -} \ No newline at end of file +} diff --git a/src/js/game/building_codes.js b/src/js/game/building_codes.js index e94efbe6..952fd3b8 100644 --- a/src/js/game/building_codes.js +++ b/src/js/game/building_codes.js @@ -33,7 +33,7 @@ export const gBuildingVariants = { */ export function registerBuildingVariant( meta, - variant = "default" /* @TODO: Circular dependency, actually its defaultBuildingVariant */ , + variant = "default" /* @TODO: Circular dependency, actually its defaultBuildingVariant */, rotationVariant = 0 ) { // @ts-ignore @@ -67,4 +67,4 @@ export function getBuildingDataFromCode(code) { */ export function getCodeFromBuildingData(metaBuilding, variant, rotationVariant = 0) { return metaBuilding.getId() + "/" + variant + "/" + rotationVariant; -} \ No newline at end of file +} diff --git a/src/js/game/buildings/analyzer.js b/src/js/game/buildings/analyzer.js index 5a409c01..d9d8babb 100644 --- a/src/js/game/buildings/analyzer.js +++ b/src/js/game/buildings/analyzer.js @@ -117,33 +117,34 @@ export class MetaAnalyzerBuilding extends MetaBuilding { MetaAnalyzerBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.left, - type: enumPinSlotType.logicalEjector, - }, - { - pos: new Vector(0, 0), - direction: enumDirection.right, - type: enumPinSlotType.logicalEjector, - }, - { - pos: new Vector(0, 0), - direction: enumDirection.bottom, - type: enumPinSlotType.logicalAcceptor, - }, - ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.left, + type: enumPinSlotType.logicalEjector, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.right, + type: enumPinSlotType.logicalEjector, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.bottom, + type: enumPinSlotType.logicalAcceptor, + }, + ], + }) + ), entity => - entity.addComponent( - new LogicGateComponent({ - type: enumLogicGateType.analyzer, - }) - ), + entity.addComponent( + new LogicGateComponent({ + type: enumLogicGateType.analyzer, + }) + ), ]; MetaAnalyzerBuilding.silhouetteColors = { @@ -186,7 +187,8 @@ MetaAnalyzerBuilding.layerPreview = { MetaAnalyzerBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.left, type: enumPinSlotType.logicalEjector, @@ -205,4 +207,4 @@ MetaAnalyzerBuilding.componentVariations = { entity.components.LogicGate.type = enumLogicGateType.analyzer; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/balancer.js b/src/js/game/buildings/balancer.js index 4fbb3dfe..243f09fe 100644 --- a/src/js/game/buildings/balancer.js +++ b/src/js/game/buildings/balancer.js @@ -130,27 +130,27 @@ export class MetaBalancerBuilding extends MetaBuilding { MetaBalancerBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [], // set later - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [], // set later + }) + ), entity => - entity.addComponent( - new ItemProcessorComponent({ - inputsPerCharge: 1, - processorType: enumItemProcessorTypes.balancer, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.balancer, + }) + ), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [], // set later - renderFloatingItems: false, - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [], // set later + renderFloatingItems: false, + }) + ), entity => entity.addComponent(new BeltUnderlaysComponent({ underlays: [] })), ]; @@ -297,7 +297,8 @@ MetaBalancerBuilding.silhouetteColors = { MetaBalancerBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.bottom], }, @@ -319,7 +320,8 @@ MetaBalancerBuilding.componentVariations = { }, [MetaBalancerBuilding.variants.merger]: (entity, rotationVariant) => { - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.bottom], }, @@ -335,7 +337,8 @@ MetaBalancerBuilding.componentVariations = { }, [MetaBalancerBuilding.variants.mergerInverse]: (entity, rotationVariant) => { - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.bottom], }, @@ -352,12 +355,15 @@ MetaBalancerBuilding.componentVariations = { [MetaBalancerBuilding.variants.splitter]: (entity, rotationVariant) => { { - entity.components.ItemAcceptor.setSlots([{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - }, ]); + entity.components.ItemAcceptor.setSlots([ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ]); - entity.components.ItemEjector.setSlots([{ + entity.components.ItemEjector.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, }, @@ -375,12 +381,15 @@ MetaBalancerBuilding.componentVariations = { [MetaBalancerBuilding.variants.splitterInverse]: (entity, rotationVariant) => { { - entity.components.ItemAcceptor.setSlots([{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - }, ]); + entity.components.ItemAcceptor.setSlots([ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ]); - entity.components.ItemEjector.setSlots([{ + entity.components.ItemEjector.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, }, @@ -395,4 +404,4 @@ MetaBalancerBuilding.componentVariations = { ]; } }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/belt.js b/src/js/game/buildings/belt.js index 063e5e4b..93cfa296 100644 --- a/src/js/game/buildings/belt.js +++ b/src/js/game/buildings/belt.js @@ -138,43 +138,35 @@ export class MetaBeltBuilding extends MetaBuilding { getPreviewSprite(rotationVariant) { switch (MetaBeltBuilding.variantToRotation[rotationVariant]) { - case enumDirection.top: - { - return Loader.getSprite("sprites/buildings/belt_top.png"); - } - case enumDirection.left: - { - return Loader.getSprite("sprites/buildings/belt_left.png"); - } - case enumDirection.right: - { - return Loader.getSprite("sprites/buildings/belt_right.png"); - } - default: - { - assertAlways(false, "Invalid belt rotation variant"); - } + case enumDirection.top: { + return Loader.getSprite("sprites/buildings/belt_top.png"); + } + case enumDirection.left: { + return Loader.getSprite("sprites/buildings/belt_left.png"); + } + case enumDirection.right: { + return Loader.getSprite("sprites/buildings/belt_right.png"); + } + default: { + assertAlways(false, "Invalid belt rotation variant"); + } } } getBlueprintSprite(rotationVariant) { switch (MetaBeltBuilding.variantToRotation[rotationVariant]) { - case enumDirection.top: - { - return Loader.getSprite("sprites/blueprints/belt_top.png"); - } - case enumDirection.left: - { - return Loader.getSprite("sprites/blueprints/belt_left.png"); - } - case enumDirection.right: - { - return Loader.getSprite("sprites/blueprints/belt_right.png"); - } - default: - { - assertAlways(false, "Invalid belt rotation variant"); - } + case enumDirection.top: { + return Loader.getSprite("sprites/blueprints/belt_top.png"); + } + case enumDirection.left: { + return Loader.getSprite("sprites/blueprints/belt_left.png"); + } + case enumDirection.right: { + return Loader.getSprite("sprites/blueprints/belt_right.png"); + } + default: { + assertAlways(false, "Invalid belt rotation variant"); + } } } @@ -300,11 +292,11 @@ export class MetaBeltBuilding extends MetaBuilding { MetaBeltBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new BeltComponent({ - direction: enumDirection.top, // updated later - }) - ), + entity.addComponent( + new BeltComponent({ + direction: enumDirection.top, // updated later + }) + ), ]; MetaBeltBuilding.silhouetteColors = { @@ -371,4 +363,4 @@ MetaBeltBuilding.additionalStatistics = { [defaultBuildingVariant]: root => [ [T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(root.hubGoals.getBeltBaseSpeed())], ], -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/comparator.js b/src/js/game/buildings/comparator.js index 8bbcb568..0090db1c 100644 --- a/src/js/game/buildings/comparator.js +++ b/src/js/game/buildings/comparator.js @@ -118,32 +118,33 @@ export class MetaComparatorBuilding extends MetaBuilding { MetaComparatorBuilding.setupEntityComponents = [ (entity, rotationVariant) => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - type: enumPinSlotType.logicalEjector, - }, - { - pos: new Vector(0, 0), - direction: enumDirection.left, - type: enumPinSlotType.logicalAcceptor, - }, - { - pos: new Vector(0, 0), - direction: enumDirection.right, - type: enumPinSlotType.logicalAcceptor, - }, - ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + type: enumPinSlotType.logicalEjector, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.left, + type: enumPinSlotType.logicalAcceptor, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.right, + type: enumPinSlotType.logicalAcceptor, + }, + ], + }) + ), (entity, rotationVariant) => - entity.addComponent( - new LogicGateComponent({ - type: enumLogicGateType.compare, - }) - ), + entity.addComponent( + new LogicGateComponent({ + type: enumLogicGateType.compare, + }) + ), ]; MetaComparatorBuilding.overlayMatrices = { @@ -185,7 +186,8 @@ MetaComparatorBuilding.layerByVariant = { MetaComparatorBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -204,4 +206,4 @@ MetaComparatorBuilding.componentVariations = { entity.components.LogicGate.type = enumLogicGateType.compare; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/constant_signal.js b/src/js/game/buildings/constant_signal.js index 32c2ea88..3200a847 100644 --- a/src/js/game/buildings/constant_signal.js +++ b/src/js/game/buildings/constant_signal.js @@ -118,15 +118,17 @@ export class MetaConstantSignalBuilding extends MetaBuilding { MetaConstantSignalBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - type: enumPinSlotType.logicalEjector, - }, ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + type: enumPinSlotType.logicalEjector, + }, + ], + }) + ), entity => entity.addComponent(new ConstantSignalComponent({})), ]; @@ -170,10 +172,12 @@ MetaConstantSignalBuilding.layerPreview = { MetaConstantSignalBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ - pos: new Vector(0, 0), - direction: enumDirection.top, - type: enumPinSlotType.logicalEjector, - }, ]); + entity.components.WiredPins.setSlots([ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + type: enumPinSlotType.logicalEjector, + }, + ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/cutter.js b/src/js/game/buildings/cutter.js index c136975b..80d866c7 100644 --- a/src/js/game/buildings/cutter.js +++ b/src/js/game/buildings/cutter.js @@ -89,23 +89,25 @@ export class MetaCutterBuilding extends MetaBuilding { } MetaCutterBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new ItemProcessorComponent({ - inputsPerCharge: 1, - processorType: enumItemProcessorTypes.cutter, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.cutter, + }) + ), entity => entity.addComponent(new ItemEjectorComponent({})), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - filter: "shape", - }, ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: "shape", + }, + ], + }) + ), ]; MetaCutterBuilding.variants = { @@ -197,4 +199,4 @@ MetaCutterBuilding.componentVariations = { ]); entity.components.ItemProcessor.type = enumItemProcessorTypes.cutterQuad; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/display.js b/src/js/game/buildings/display.js index fd06928a..d87140a9 100644 --- a/src/js/game/buildings/display.js +++ b/src/js/game/buildings/display.js @@ -105,15 +105,17 @@ export class MetaDisplayBuilding extends MetaBuilding { MetaDisplayBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.bottom, - type: enumPinSlotType.logicalAcceptor, - }, ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.bottom, + type: enumPinSlotType.logicalAcceptor, + }, + ], + }) + ), entity => entity.addComponent(new DisplayComponent()), ]; @@ -155,10 +157,12 @@ MetaDisplayBuilding.renderPins = { MetaDisplayBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ - pos: new Vector(0, 0), - direction: enumDirection.bottom, - type: enumPinSlotType.logicalAcceptor, - }, ]); + entity.components.WiredPins.setSlots([ + { + pos: new Vector(0, 0), + direction: enumDirection.bottom, + type: enumPinSlotType.logicalAcceptor, + }, + ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/filter.js b/src/js/game/buildings/filter.js index b2df8c30..243de778 100644 --- a/src/js/game/buildings/filter.js +++ b/src/js/game/buildings/filter.js @@ -130,40 +130,45 @@ export class MetaFilterBuilding extends MetaBuilding { MetaFilterBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.left, - type: enumPinSlotType.logicalAcceptor, - }, ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.left, + type: enumPinSlotType.logicalAcceptor, + }, + ], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - }, ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ], + }) + ), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - }, - { - pos: new Vector(1, 0), - direction: enumDirection.right, - }, - ], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + { + pos: new Vector(1, 0), + direction: enumDirection.right, + }, + ], + }) + ), entity => entity.addComponent(new FilterComponent()), ]; @@ -212,18 +217,23 @@ MetaFilterBuilding.renderPins = { MetaFilterBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ - pos: new Vector(0, 0), - direction: enumDirection.left, - type: enumPinSlotType.logicalAcceptor, - }, ]); + entity.components.WiredPins.setSlots([ + { + pos: new Vector(0, 0), + direction: enumDirection.left, + type: enumPinSlotType.logicalAcceptor, + }, + ]); - entity.components.ItemAcceptor.setSlots([{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - }, ]); + entity.components.ItemAcceptor.setSlots([ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ]); - entity.components.ItemEjector.setSlots([{ + entity.components.ItemEjector.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, }, @@ -233,4 +243,4 @@ MetaFilterBuilding.componentVariations = { }, ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/hub.js b/src/js/game/buildings/hub.js index 92f3a233..e2ac459e 100644 --- a/src/js/game/buildings/hub.js +++ b/src/js/game/buildings/hub.js @@ -122,100 +122,103 @@ MetaHubBuilding.canPipet = () => false; MetaHubBuilding.setupEntityComponents = [ entity => entity.addComponent(new HubComponent()), entity => - entity.addComponent( - new ItemProcessorComponent({ - inputsPerCharge: 1, - processorType: enumItemProcessorTypes.hub, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.hub, + }) + ), entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 2), - type: enumPinSlotType.logicalEjector, - direction: enumDirection.left, - }, ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 2), + type: enumPinSlotType.logicalEjector, + direction: enumDirection.left, + }, + ], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.top, enumDirection.left], - filter: "shape", - }, - { - pos: new Vector(1, 0), - directions: [enumDirection.top], - filter: "shape", - }, - { - pos: new Vector(2, 0), - directions: [enumDirection.top], - filter: "shape", - }, - { - pos: new Vector(3, 0), - directions: [enumDirection.top, enumDirection.right], - filter: "shape", - }, - { - pos: new Vector(0, 3), - directions: [enumDirection.bottom, enumDirection.left], - filter: "shape", - }, - { - pos: new Vector(1, 3), - directions: [enumDirection.bottom], - filter: "shape", - }, - { - pos: new Vector(2, 3), - directions: [enumDirection.bottom], - filter: "shape", - }, - { - pos: new Vector(3, 3), - directions: [enumDirection.bottom, enumDirection.right], - filter: "shape", - }, - { - pos: new Vector(0, 1), - directions: [enumDirection.left], - filter: "shape", - }, - { - pos: new Vector(0, 2), - directions: [enumDirection.left], - filter: "shape", - }, - { - pos: new Vector(0, 3), - directions: [enumDirection.left], - filter: "shape", - }, - { - pos: new Vector(3, 1), - directions: [enumDirection.right], - filter: "shape", - }, - { - pos: new Vector(3, 2), - directions: [enumDirection.right], - filter: "shape", - }, - { - pos: new Vector(3, 3), - directions: [enumDirection.right], - filter: "shape", - }, - ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.top, enumDirection.left], + filter: "shape", + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.top], + filter: "shape", + }, + { + pos: new Vector(2, 0), + directions: [enumDirection.top], + filter: "shape", + }, + { + pos: new Vector(3, 0), + directions: [enumDirection.top, enumDirection.right], + filter: "shape", + }, + { + pos: new Vector(0, 3), + directions: [enumDirection.bottom, enumDirection.left], + filter: "shape", + }, + { + pos: new Vector(1, 3), + directions: [enumDirection.bottom], + filter: "shape", + }, + { + pos: new Vector(2, 3), + directions: [enumDirection.bottom], + filter: "shape", + }, + { + pos: new Vector(3, 3), + directions: [enumDirection.bottom, enumDirection.right], + filter: "shape", + }, + { + pos: new Vector(0, 1), + directions: [enumDirection.left], + filter: "shape", + }, + { + pos: new Vector(0, 2), + directions: [enumDirection.left], + filter: "shape", + }, + { + pos: new Vector(0, 3), + directions: [enumDirection.left], + filter: "shape", + }, + { + pos: new Vector(3, 1), + directions: [enumDirection.right], + filter: "shape", + }, + { + pos: new Vector(3, 2), + directions: [enumDirection.right], + filter: "shape", + }, + { + pos: new Vector(3, 3), + directions: [enumDirection.right], + filter: "shape", + }, + ], + }) + ), ]; MetaHubBuilding.silhouetteColors = { @@ -256,13 +259,16 @@ MetaHubBuilding.componentVariations = { entity.components.ItemProcessor.type = enumItemProcessorTypes.hub; - entity.components.WiredPins.setSlots([{ - pos: new Vector(0, 2), - type: enumPinSlotType.logicalEjector, - direction: enumDirection.left, - }, ]); + entity.components.WiredPins.setSlots([ + { + pos: new Vector(0, 2), + type: enumPinSlotType.logicalEjector, + direction: enumDirection.left, + }, + ]); - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.top, enumDirection.left], filter: "shape", @@ -334,4 +340,4 @@ MetaHubBuilding.componentVariations = { }, ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/item_producer.js b/src/js/game/buildings/item_producer.js index 13e67954..4f463b29 100644 --- a/src/js/game/buildings/item_producer.js +++ b/src/js/game/buildings/item_producer.js @@ -98,21 +98,23 @@ export class MetaItemProducerBuilding extends MetaBuilding { MetaItemProducerBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ), entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - type: enumPinSlotType.logicalAcceptor, - direction: enumDirection.bottom, - }, ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + type: enumPinSlotType.logicalAcceptor, + direction: enumDirection.bottom, + }, + ], + }) + ), entity => entity.addComponent(new ItemProducerComponent()), ]; @@ -153,10 +155,12 @@ MetaItemProducerBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { entity.components.ItemEjector.setSlots([{ pos: new Vector(0, 0), direction: enumDirection.top }]); - entity.components.WiredPins.setSlots([{ - pos: new Vector(0, 0), - type: enumPinSlotType.logicalAcceptor, - direction: enumDirection.bottom, - }, ]); + entity.components.WiredPins.setSlots([ + { + pos: new Vector(0, 0), + type: enumPinSlotType.logicalAcceptor, + direction: enumDirection.bottom, + }, + ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/lever.js b/src/js/game/buildings/lever.js index 54244d20..9af392e3 100644 --- a/src/js/game/buildings/lever.js +++ b/src/js/game/buildings/lever.js @@ -121,15 +121,17 @@ export class MetaLeverBuilding extends MetaBuilding { MetaLeverBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - type: enumPinSlotType.logicalEjector, - }, ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + type: enumPinSlotType.logicalEjector, + }, + ], + }) + ), entity => entity.addComponent(new LeverComponent({})), ]; @@ -172,10 +174,12 @@ MetaLeverBuilding.renderPins = { MetaLeverBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ - pos: new Vector(0, 0), - direction: enumDirection.top, - type: enumPinSlotType.logicalEjector, - }, ]); + entity.components.WiredPins.setSlots([ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + type: enumPinSlotType.logicalEjector, + }, + ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/logic_gate.js b/src/js/game/buildings/logic_gate.js index 64918751..52431d34 100644 --- a/src/js/game/buildings/logic_gate.js +++ b/src/js/game/buildings/logic_gate.js @@ -117,11 +117,11 @@ export class MetaLogicGateBuilding extends MetaBuilding { } MetaLogicGateBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [], + }) + ), entity => entity.addComponent(new LogicGateComponent({})), ]; @@ -202,7 +202,8 @@ MetaLogicGateBuilding.layerPreview = { MetaLogicGateBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -223,7 +224,8 @@ MetaLogicGateBuilding.componentVariations = { }, [MetaLogicGateBuilding.variants.xor]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -244,7 +246,8 @@ MetaLogicGateBuilding.componentVariations = { }, [MetaLogicGateBuilding.variants.or]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -264,7 +267,8 @@ MetaLogicGateBuilding.componentVariations = { entity.components.LogicGate.type = enumLogicGateType.or; }, [MetaLogicGateBuilding.variants.not]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -278,4 +282,4 @@ MetaLogicGateBuilding.componentVariations = { entity.components.LogicGate.type = enumLogicGateType.not; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/miner.js b/src/js/game/buildings/miner.js index ee7a3218..a29c08dc 100644 --- a/src/js/game/buildings/miner.js +++ b/src/js/game/buildings/miner.js @@ -115,11 +115,11 @@ export class MetaMinerBuilding extends MetaBuilding { MetaMinerBuilding.setupEntityComponents = [ entity => entity.addComponent(new MinerComponent({})), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ), ]; MetaMinerBuilding.variants = { chainable: "chainable", @@ -189,4 +189,4 @@ MetaMinerBuilding.componentVariations = { [MetaMinerBuilding.variants.chainable]: (entity, rotationVariant) => { entity.components.Miner.chainable = true; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/mixer.js b/src/js/game/buildings/mixer.js index 1b60e2f0..7a7bbd93 100644 --- a/src/js/game/buildings/mixer.js +++ b/src/js/game/buildings/mixer.js @@ -115,35 +115,36 @@ export class MetaMixerBuilding extends MetaBuilding { MetaMixerBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new ItemProcessorComponent({ - inputsPerCharge: 2, - processorType: enumItemProcessorTypes.mixer, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 2, + processorType: enumItemProcessorTypes.mixer, + }) + ), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - filter: "color", - }, - { - pos: new Vector(1, 0), - directions: [enumDirection.bottom], - filter: "color", - }, - ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: "color", + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.bottom], + filter: "color", + }, + ], + }) + ), ]; MetaMixerBuilding.silhouetteColors = { @@ -195,7 +196,8 @@ MetaMixerBuilding.componentVariations = { entity.components.ItemEjector.setSlots([{ pos: new Vector(0, 0), direction: enumDirection.top }]); - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.bottom], filter: "color", @@ -207,4 +209,4 @@ MetaMixerBuilding.componentVariations = { }, ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/painter.js b/src/js/game/buildings/painter.js index 8d580707..9b50120f 100644 --- a/src/js/game/buildings/painter.js +++ b/src/js/game/buildings/painter.js @@ -121,27 +121,28 @@ export class MetaPainterBuilding extends MetaBuilding { MetaPainterBuilding.setupEntityComponents = [ entity => entity.addComponent(new ItemProcessorComponent({})), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ pos: new Vector(1, 0), direction: enumDirection.right }], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(1, 0), direction: enumDirection.right }], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.left], - filter: "shape", - }, - { - pos: new Vector(1, 0), - directions: [enumDirection.top], - filter: "color", - }, - ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.left], + filter: "shape", + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.top], + filter: "color", + }, + ], + }) + ), ]; MetaPainterBuilding.variants = { @@ -251,7 +252,8 @@ MetaPainterBuilding.componentVariations = { entity.removeComponent(WiredPinsComponent); } - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.left], filter: "shape", @@ -275,7 +277,8 @@ MetaPainterBuilding.componentVariations = { entity.removeComponent(WiredPinsComponent); } - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.left], filter: "shape", @@ -299,7 +302,8 @@ MetaPainterBuilding.componentVariations = { entity.removeComponent(WiredPinsComponent); } - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.left], filter: "shape", @@ -328,7 +332,8 @@ MetaPainterBuilding.componentVariations = { entity.addComponent(new WiredPinsComponent({ slots: [] })); } - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.bottom, type: enumPinSlotType.logicalAcceptor, @@ -350,7 +355,8 @@ MetaPainterBuilding.componentVariations = { }, ]); - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.left], filter: "shape", @@ -383,4 +389,4 @@ MetaPainterBuilding.componentVariations = { entity.components.ItemProcessor.processingRequirement = enumItemProcessorRequirements.painterQuad; entity.components.ItemProcessor.inputsPerCharge = 5; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/reader.js b/src/js/game/buildings/reader.js index c28975f4..410cd05a 100644 --- a/src/js/game/buildings/reader.js +++ b/src/js/game/buildings/reader.js @@ -132,55 +132,62 @@ export class MetaReaderBuilding extends MetaBuilding { MetaReaderBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.right, - type: enumPinSlotType.logicalEjector, - }, - { - pos: new Vector(0, 0), - direction: enumDirection.left, - type: enumPinSlotType.logicalEjector, - }, - ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.right, + type: enumPinSlotType.logicalEjector, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.left, + type: enumPinSlotType.logicalEjector, + }, + ], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - }, ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ], + }) + ), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - }, ], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + ], + }) + ), entity => - entity.addComponent( - new ItemProcessorComponent({ - processorType: enumItemProcessorTypes.reader, - inputsPerCharge: 1, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + processorType: enumItemProcessorTypes.reader, + inputsPerCharge: 1, + }) + ), entity => - entity.addComponent( - new BeltUnderlaysComponent({ - underlays: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - }, ], - }) - ), + entity.addComponent( + new BeltUnderlaysComponent({ + underlays: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + ], + }) + ), entity => entity.addComponent(new BeltReaderComponent()), ]; @@ -229,23 +236,29 @@ MetaReaderBuilding.renderPins = { MetaReaderBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.ItemAcceptor.setSlots([{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - }, ]); + entity.components.ItemAcceptor.setSlots([ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ]); - entity.components.ItemEjector.setSlots([{ - pos: new Vector(0, 0), - direction: enumDirection.top, - }, ]); + entity.components.ItemEjector.setSlots([ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + ]); entity.components.ItemProcessor.inputsPerCharge = 1; entity.components.ItemProcessor.type = enumItemProcessorTypes.reader; - entity.components.BeltUnderlays.underlays = [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - }, ]; + entity.components.BeltUnderlays.underlays = [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + ]; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/rotater.js b/src/js/game/buildings/rotater.js index 3cd11a30..23f44bb3 100644 --- a/src/js/game/buildings/rotater.js +++ b/src/js/game/buildings/rotater.js @@ -129,28 +129,30 @@ export class MetaRotaterBuilding extends MetaBuilding { MetaRotaterBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new ItemProcessorComponent({ - inputsPerCharge: 1, - processorType: enumItemProcessorTypes.rotater, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.rotater, + }) + ), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - filter: "shape", - }, ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: "shape", + }, + ], + }) + ), ]; MetaRotaterBuilding.variants = { @@ -262,4 +264,4 @@ MetaRotaterBuilding.componentVariations = { [MetaRotaterBuilding.variants.rotate180]: (entity, rotationVariant) => { entity.components.ItemProcessor.type = enumItemProcessorTypes.rotater180; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/stacker.js b/src/js/game/buildings/stacker.js index 7017cb30..d75bd7e6 100644 --- a/src/js/game/buildings/stacker.js +++ b/src/js/game/buildings/stacker.js @@ -129,34 +129,35 @@ export class MetaStackerBuilding extends MetaBuilding { MetaStackerBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new ItemProcessorComponent({ - inputsPerCharge: 2, - processorType: enumItemProcessorTypes.stacker, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 2, + processorType: enumItemProcessorTypes.stacker, + }) + ), entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - filter: "shape", - }, - { - pos: new Vector(1, 0), - directions: [enumDirection.bottom], - filter: "shape", - }, - ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: "shape", + }, + { + pos: new Vector(1, 0), + directions: [enumDirection.bottom], + filter: "shape", + }, + ], + }) + ), ]; MetaStackerBuilding.dimensions = { @@ -216,7 +217,8 @@ MetaStackerBuilding.componentVariations = { entity.components.ItemEjector.setSlots([{ pos: new Vector(0, 0), direction: enumDirection.top }]); - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 0), directions: [enumDirection.bottom], filter: "shape", @@ -228,4 +230,4 @@ MetaStackerBuilding.componentVariations = { }, ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/storage.js b/src/js/game/buildings/storage.js index 57482839..0b472380 100644 --- a/src/js/game/buildings/storage.js +++ b/src/js/game/buildings/storage.js @@ -132,56 +132,59 @@ export class MetaStorageBuilding extends MetaBuilding { MetaStorageBuilding.setupEntityComponents = [ entity => - // Required, since the item processor needs this. - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - }, - { - pos: new Vector(1, 0), - direction: enumDirection.top, - }, - ], - }) - ), + // Required, since the item processor needs this. + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + { + pos: new Vector(1, 0), + direction: enumDirection.top, + }, + ], + }) + ), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 1), - directions: [enumDirection.bottom], - }, - { - pos: new Vector(1, 1), - directions: [enumDirection.bottom], - }, - ], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 1), + directions: [enumDirection.bottom], + }, + { + pos: new Vector(1, 1), + directions: [enumDirection.bottom], + }, + ], + }) + ), entity => - entity.addComponent( - new StorageComponent({ - maximumStorage: storageSize, - }) - ), + entity.addComponent( + new StorageComponent({ + maximumStorage: storageSize, + }) + ), entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(1, 1), - direction: enumDirection.right, - type: enumPinSlotType.logicalEjector, - }, - { - pos: new Vector(0, 1), - direction: enumDirection.left, - type: enumPinSlotType.logicalEjector, - }, - ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(1, 1), + direction: enumDirection.right, + type: enumPinSlotType.logicalEjector, + }, + { + pos: new Vector(0, 1), + direction: enumDirection.left, + type: enumPinSlotType.logicalEjector, + }, + ], + }) + ), ]; MetaStorageBuilding.dimensions = { @@ -232,7 +235,8 @@ MetaStorageBuilding.renderPins = { MetaStorageBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.ItemEjector.setSlots([{ + entity.components.ItemEjector.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, }, @@ -241,7 +245,8 @@ MetaStorageBuilding.componentVariations = { direction: enumDirection.top, }, ]); - entity.components.ItemAcceptor.setSlots([{ + entity.components.ItemAcceptor.setSlots([ + { pos: new Vector(0, 1), directions: [enumDirection.bottom], }, @@ -251,7 +256,8 @@ MetaStorageBuilding.componentVariations = { }, ]); entity.components.Storage.maximumStorage = storageSize; - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(1, 1), direction: enumDirection.right, type: enumPinSlotType.logicalEjector, @@ -263,4 +269,4 @@ MetaStorageBuilding.componentVariations = { }, ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/transistor.js b/src/js/game/buildings/transistor.js index c7e732fb..8e175d1c 100644 --- a/src/js/game/buildings/transistor.js +++ b/src/js/game/buildings/transistor.js @@ -118,32 +118,33 @@ export class MetaTransistorBuilding extends MetaBuilding { MetaTransistorBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [{ - pos: new Vector(0, 0), - direction: enumDirection.top, - type: enumPinSlotType.logicalEjector, - }, - { - pos: new Vector(0, 0), - direction: enumDirection.left, - type: enumPinSlotType.logicalAcceptor, - }, - { - pos: new Vector(0, 0), - direction: enumDirection.bottom, - type: enumPinSlotType.logicalAcceptor, - }, - ], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + type: enumPinSlotType.logicalEjector, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.left, + type: enumPinSlotType.logicalAcceptor, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.bottom, + type: enumPinSlotType.logicalAcceptor, + }, + ], + }) + ), entity => - entity.addComponent( - new LogicGateComponent({ - type: enumLogicGateType.transistor, - }) - ), + entity.addComponent( + new LogicGateComponent({ + type: enumLogicGateType.transistor, + }) + ), ]; MetaTransistorBuilding.variants = { @@ -206,4 +207,4 @@ MetaTransistorBuilding.componentVariations = { [MetaTransistorBuilding.variants.mirrored]: (entity, rotationVariant) => { entity.components.WiredPins.slots[1].direction = enumDirection.right; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/trash.js b/src/js/game/buildings/trash.js index ac1261d5..2933b5a7 100644 --- a/src/js/game/buildings/trash.js +++ b/src/js/game/buildings/trash.js @@ -120,26 +120,28 @@ export class MetaTrashBuilding extends MetaBuilding { MetaTrashBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [{ - pos: new Vector(0, 0), - directions: [ - enumDirection.top, - enumDirection.right, - enumDirection.bottom, - enumDirection.left, + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [ + enumDirection.top, + enumDirection.right, + enumDirection.bottom, + enumDirection.left, + ], + }, ], - }, ], - }) - ), + }) + ), entity => - entity.addComponent( - new ItemProcessorComponent({ - inputsPerCharge: 1, - processorType: enumItemProcessorTypes.trash, - }) - ), + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.trash, + }) + ), ]; MetaTrashBuilding.overlayMatrices = { @@ -182,18 +184,20 @@ MetaTrashBuilding.avaibleVariants = { MetaTrashBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.ItemAcceptor.setSlots([{ - pos: new Vector(0, 0), - directions: [ - enumDirection.top, - enumDirection.right, - enumDirection.bottom, - enumDirection.left, - ], - }, ]); + entity.components.ItemAcceptor.setSlots([ + { + pos: new Vector(0, 0), + directions: [ + enumDirection.top, + enumDirection.right, + enumDirection.bottom, + enumDirection.left, + ], + }, + ]); entity.components.ItemProcessor.inputsPerCharge = 1; entity.components.ItemProcessor.type = enumItemProcessorTypes.trash; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/underground_belt.js b/src/js/game/buildings/underground_belt.js index b72c72a0..48e85457 100644 --- a/src/js/game/buildings/underground_belt.js +++ b/src/js/game/buildings/underground_belt.js @@ -188,7 +188,8 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding { const targetSenderRotation = rotation; for ( - let searchOffset = 1; searchOffset <= globalConfig.undergroundBeltMaxTilesByTier[tier]; + let searchOffset = 1; + searchOffset <= globalConfig.undergroundBeltMaxTilesByTier[tier]; ++searchOffset ) { tile = tile.addScalars(searchVector.x, searchVector.y); @@ -245,18 +246,18 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding { MetaUndergroundBeltBuilding.setupEntityComponents = [ // Required, since the item processor needs this. entity => - entity.addComponent( - new ItemEjectorComponent({ - slots: [], - }) - ), + entity.addComponent( + new ItemEjectorComponent({ + slots: [], + }) + ), entity => entity.addComponent(new UndergroundBeltComponent({})), entity => - entity.addComponent( - new ItemAcceptorComponent({ - slots: [], - }) - ), + entity.addComponent( + new ItemAcceptorComponent({ + slots: [], + }) + ), ]; MetaUndergroundBeltBuilding.rotationVariants = [0, 1]; @@ -360,18 +361,22 @@ MetaUndergroundBeltBuilding.componentVariationsByRotation = { [enumUndergroundBeltMode.sender]: (entity, rotationVariant) => { entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.sender; entity.components.ItemEjector.setSlots([]); - entity.components.ItemAcceptor.setSlots([{ - pos: new Vector(0, 0), - directions: [enumDirection.bottom], - }, ]); + entity.components.ItemAcceptor.setSlots([ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + }, + ]); }, [enumUndergroundBeltMode.receiver]: (entity, rotationVariant) => { entity.components.UndergroundBelt.mode = enumUndergroundBeltMode.receiver; entity.components.ItemAcceptor.setSlots([]); - entity.components.ItemEjector.setSlots([{ - pos: new Vector(0, 0), - direction: enumDirection.top, - }, ]); + entity.components.ItemEjector.setSlots([ + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + ]); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/virtual_processor.js b/src/js/game/buildings/virtual_processor.js index 944ed9de..0104babf 100644 --- a/src/js/game/buildings/virtual_processor.js +++ b/src/js/game/buildings/virtual_processor.js @@ -121,11 +121,11 @@ export class MetaVirtualProcessorBuilding extends MetaBuilding { MetaVirtualProcessorBuilding.setupEntityComponents = [ entity => - entity.addComponent( - new WiredPinsComponent({ - slots: [], - }) - ), + entity.addComponent( + new WiredPinsComponent({ + slots: [], + }) + ), entity => entity.addComponent(new LogicGateComponent({})), ]; @@ -219,7 +219,8 @@ MetaVirtualProcessorBuilding.silhouetteColors = { MetaVirtualProcessorBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.left, type: enumPinSlotType.logicalEjector, @@ -240,7 +241,8 @@ MetaVirtualProcessorBuilding.componentVariations = { }, [MetaVirtualProcessorBuilding.variants.rotater]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -256,7 +258,8 @@ MetaVirtualProcessorBuilding.componentVariations = { }, [MetaVirtualProcessorBuilding.variants.unstacker]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.left, type: enumPinSlotType.logicalEjector, @@ -277,7 +280,8 @@ MetaVirtualProcessorBuilding.componentVariations = { }, [MetaVirtualProcessorBuilding.variants.stacker]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -298,7 +302,8 @@ MetaVirtualProcessorBuilding.componentVariations = { }, [MetaVirtualProcessorBuilding.variants.painter]: (entity, rotationVariant) => { - entity.components.WiredPins.setSlots([{ + entity.components.WiredPins.setSlots([ + { pos: new Vector(0, 0), direction: enumDirection.top, type: enumPinSlotType.logicalEjector, @@ -317,4 +322,4 @@ MetaVirtualProcessorBuilding.componentVariations = { entity.components.LogicGate.type = enumLogicGateType.painter; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/wire.js b/src/js/game/buildings/wire.js index eee50a50..231a5da9 100644 --- a/src/js/game/buildings/wire.js +++ b/src/js/game/buildings/wire.js @@ -151,26 +151,21 @@ export class MetaWireBuilding extends MetaBuilding { getPreviewSprite(rotationVariant, variant) { const wireVariant = MetaWireBuilding.wireVariantToVariant[variant]; switch (MetaWireBuilding.rotationVariantToType[rotationVariant]) { - case enumWireType.forward: - { - return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_forward.png"); - } - case enumWireType.turn: - { - return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_turn.png"); - } - case enumWireType.split: - { - return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_split.png"); - } - case enumWireType.cross: - { - return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_cross.png"); - } - default: - { - assertAlways(false, "Invalid wire rotation variant"); - } + case enumWireType.forward: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_forward.png"); + } + case enumWireType.turn: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_turn.png"); + } + case enumWireType.split: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_split.png"); + } + case enumWireType.cross: { + return Loader.getSprite("sprites/wires/sets/" + wireVariant + "_cross.png"); + } + default: { + assertAlways(false, "Invalid wire rotation variant"); + } } } @@ -398,4 +393,4 @@ MetaWireBuilding.componentVariations = { entity.components.Wire.type = MetaWireBuilding.rotationVariantToType[rotationVariant]; entity.components.Wire.variant = "second"; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/buildings/wire_tunnel.js b/src/js/game/buildings/wire_tunnel.js index a112d4c4..c59d68a3 100644 --- a/src/js/game/buildings/wire_tunnel.js +++ b/src/js/game/buildings/wire_tunnel.js @@ -157,4 +157,4 @@ MetaWireTunnelBuilding.layerByVariant = { MetaWireTunnelBuilding.componentVariations = { [defaultBuildingVariant]: (entity, rotationVariant) => {}, -}; \ No newline at end of file +}; diff --git a/src/js/game/component_registry.js b/src/js/game/component_registry.js index 7c23a7b4..b81bae0c 100644 --- a/src/js/game/component_registry.js +++ b/src/js/game/component_registry.js @@ -71,4 +71,4 @@ export function initComponentRegistry() { ); console.log("📦 There are", gComponentRegistry.getNumEntries(), "components"); -} \ No newline at end of file +} diff --git a/src/js/game/components/belt.js b/src/js/game/components/belt.js index ae5b43ca..427bacee 100644 --- a/src/js/game/components/belt.js +++ b/src/js/game/components/belt.js @@ -66,18 +66,16 @@ export class BeltComponent extends Component { assert(progress <= 1.02, "Invalid progress: " + progress); return new Vector(0, 0.5 - progress); - case enumDirection.right: - { - assert(progress <= BeltComponent.curvedBeltLength + 0.02, "Invalid progress 2: " + progress); - const arcProgress = (progress / BeltComponent.curvedBeltLength) * 0.5 * Math.PI; - return new Vector(0.5 - 0.5 * Math.cos(arcProgress), 0.5 - 0.5 * Math.sin(arcProgress)); - } - case enumDirection.left: - { - assert(progress <= BeltComponent.curvedBeltLength + 0.02, "Invalid progress 3: " + progress); - const arcProgress = (progress / BeltComponent.curvedBeltLength) * 0.5 * Math.PI; - return new Vector(-0.5 + 0.5 * Math.cos(arcProgress), 0.5 - 0.5 * Math.sin(arcProgress)); - } + case enumDirection.right: { + assert(progress <= BeltComponent.curvedBeltLength + 0.02, "Invalid progress 2: " + progress); + const arcProgress = (progress / BeltComponent.curvedBeltLength) * 0.5 * Math.PI; + return new Vector(0.5 - 0.5 * Math.cos(arcProgress), 0.5 - 0.5 * Math.sin(arcProgress)); + } + case enumDirection.left: { + assert(progress <= BeltComponent.curvedBeltLength + 0.02, "Invalid progress 3: " + progress); + const arcProgress = (progress / BeltComponent.curvedBeltLength) * 0.5 * Math.PI; + return new Vector(-0.5 + 0.5 * Math.cos(arcProgress), 0.5 - 0.5 * Math.sin(arcProgress)); + } default: assertAlways(false, "Invalid belt direction: " + this.direction); return new Vector(0, 0); @@ -115,4 +113,4 @@ BeltComponent.fake_belt_ejector_slot_by_direction = { item: null, progress: 0, }, -}; \ No newline at end of file +}; diff --git a/src/js/game/components/belt_reader.js b/src/js/game/components/belt_reader.js index d8446e64..d451bab5 100644 --- a/src/js/game/components/belt_reader.js +++ b/src/js/game/components/belt_reader.js @@ -41,4 +41,4 @@ export class BeltReaderComponent extends Component { */ this.lastThroughputComputation = 0; } -} \ No newline at end of file +} diff --git a/src/js/game/components/static_map_entity.js b/src/js/game/components/static_map_entity.js index 06495d96..e9fb2672 100644 --- a/src/js/game/components/static_map_entity.js +++ b/src/js/game/components/static_map_entity.js @@ -201,38 +201,34 @@ export class StaticMapEntityComponent extends Component { const size = this.getTileSize(); switch (this.rotation) { - case 0: - { - x = this.origin.x; - y = this.origin.y; - w = size.x; - h = size.y; - break; - } - case 90: - { - x = this.origin.x - size.y + 1; - y = this.origin.y; - w = size.y; - h = size.x; - break; - } - case 180: - { - x = this.origin.x - size.x + 1; - y = this.origin.y - size.y + 1; - w = size.x; - h = size.y; - break; - } - case 270: - { - x = this.origin.x; - y = this.origin.y - size.x + 1; - w = size.y; - h = size.x; - break; - } + case 0: { + x = this.origin.x; + y = this.origin.y; + w = size.x; + h = size.y; + break; + } + case 90: { + x = this.origin.x - size.y + 1; + y = this.origin.y; + w = size.y; + h = size.x; + break; + } + case 180: { + x = this.origin.x - size.x + 1; + y = this.origin.y - size.y + 1; + w = size.x; + h = size.y; + break; + } + case 270: { + x = this.origin.x; + y = this.origin.y - size.x + 1; + w = size.y; + h = size.x; + break; + } default: assert(false, "Invalid rotation"); } @@ -281,7 +277,9 @@ export class StaticMapEntityComponent extends Component { parameters.context.translate(rotationCenterX, rotationCenterY); parameters.context.rotate(Math.radians(this.rotation)); sprite.drawCached( - parameters, -globalConfig.halfTileSize - extrudePixels * size.x, -globalConfig.halfTileSize - extrudePixels * size.y, + parameters, + -globalConfig.halfTileSize - extrudePixels * size.x, + -globalConfig.halfTileSize - extrudePixels * size.y, globalConfig.tileSize * size.x + 2 * extrudePixels * size.x, globalConfig.tileSize * size.y + 2 * extrudePixels * size.y, false // no clipping possible here @@ -290,4 +288,4 @@ export class StaticMapEntityComponent extends Component { parameters.context.translate(-rotationCenterX, -rotationCenterY); } } -} \ No newline at end of file +} diff --git a/src/js/game/components/wire.js b/src/js/game/components/wire.js index 038dcafd..ee60d733 100644 --- a/src/js/game/components/wire.js +++ b/src/js/game/components/wire.js @@ -34,4 +34,4 @@ export class WireComponent extends Component { */ this.linkedNetwork = null; } -} \ No newline at end of file +} diff --git a/src/js/game/core.js b/src/js/game/core.js index d95394ac..a0c68786 100644 --- a/src/js/game/core.js +++ b/src/js/game/core.js @@ -422,7 +422,9 @@ export class GameCore { // Transform to world space if (G_IS_DEV && globalConfig.debug.testClipping) { - params.visibleRect = params.visibleRect.expandedInAllDirections(-200 / this.root.camera.zoomLevel); + params.visibleRect = params.visibleRect.expandedInAllDirections( + -200 / this.root.camera.zoomLevel + ); } root.camera.transform(context); @@ -521,11 +523,11 @@ export class GameCore { context.fillStyle = "blue"; context.fillText( "Atlas: " + - desiredAtlasScale + - " / Zoom: " + - round2Digits(zoomLevel) + - " / Effective Zoom: " + - round2Digits(effectiveZoomLevel), + desiredAtlasScale + + " / Zoom: " + + round2Digits(zoomLevel) + + " / Effective Zoom: " + + round2Digits(effectiveZoomLevel), 20, 600 ); @@ -534,31 +536,31 @@ export class GameCore { context.fillText( "Maintained Buffers: " + - stats.rootKeys + - " root keys / " + - stats.subKeys + - " buffers / VRAM: " + - round2Digits(stats.vramBytes / (1024 * 1024)) + - " MB", + stats.rootKeys + + " root keys / " + + stats.subKeys + + " buffers / VRAM: " + + round2Digits(stats.vramBytes / (1024 * 1024)) + + " MB", 20, 620 ); const internalStats = getBufferStats(); context.fillText( "Total Buffers: " + - internalStats.bufferCount + - " buffers / " + - internalStats.backlogSize + - " backlog / " + - internalStats.backlogKeys + - " keys in backlog / VRAM " + - round2Digits(internalStats.vramUsage / (1024 * 1024)) + - " MB / Backlog " + - round2Digits(internalStats.backlogVramUsage / (1024 * 1024)) + - " MB / Created " + - internalStats.numCreated + - " / Reused " + - internalStats.numReused, + internalStats.bufferCount + + " buffers / " + + internalStats.backlogSize + + " backlog / " + + internalStats.backlogKeys + + " keys in backlog / VRAM " + + round2Digits(internalStats.vramUsage / (1024 * 1024)) + + " MB / Backlog " + + round2Digits(internalStats.backlogVramUsage / (1024 * 1024)) + + " MB / Created " + + internalStats.numCreated + + " / Reused " + + internalStats.numReused, 20, 640 ); @@ -572,4 +574,4 @@ export class GameCore { context.stroke(); } } -} \ No newline at end of file +} diff --git a/src/js/game/entity.js b/src/js/game/entity.js index 3e3952d3..6b50929c 100644 --- a/src/js/game/entity.js +++ b/src/js/game/entity.js @@ -235,4 +235,4 @@ export class Entity extends BasicSerializableObject { drawImpl(parameters) { abstract; } -} \ No newline at end of file +} diff --git a/src/js/game/entity_manager.js b/src/js/game/entity_manager.js index 8e4ef812..4c83343e 100644 --- a/src/js/game/entity_manager.js +++ b/src/js/game/entity_manager.js @@ -238,4 +238,4 @@ export class EntityManager extends BasicSerializableObject { assert(false, "Trying to destroy entity twice"); } } -} \ No newline at end of file +} diff --git a/src/js/game/game_mode.js b/src/js/game/game_mode.js index c5ed0b3e..31ec62d0 100644 --- a/src/js/game/game_mode.js +++ b/src/js/game/game_mode.js @@ -73,4 +73,4 @@ export class GameMode { getIsFreeplayAvailable() { return true; } -} \ No newline at end of file +} diff --git a/src/js/game/game_mode_registry.js b/src/js/game/game_mode_registry.js index a7bc3996..4272e036 100644 --- a/src/js/game/game_mode_registry.js +++ b/src/js/game/game_mode_registry.js @@ -10,4 +10,4 @@ export function initGameModeRegistry() { if (!shapezAPI.ingame.gamemodes.hasOwnProperty(gamemodeKey)) continue; gGameModeRegistry.register(shapezAPI.ingame.gamemodes[gamemodeKey]); } -} \ No newline at end of file +} diff --git a/src/js/game/game_speed_registry.js b/src/js/game/game_speed_registry.js index 0f247c8f..34776325 100644 --- a/src/js/game/game_speed_registry.js +++ b/src/js/game/game_speed_registry.js @@ -14,4 +14,4 @@ export function initGameSpeedRegistry() { if (!shapezAPI.ingame.gamespeed.hasOwnProperty(gamespeedKey)) continue; gGameSpeedRegistry.register(shapezAPI.ingame.gamespeed[gamespeedKey]); } -} \ No newline at end of file +} diff --git a/src/js/game/game_system.js b/src/js/game/game_system.js index 073e0ac8..4cd3cb5b 100644 --- a/src/js/game/game_system.js +++ b/src/js/game/game_system.js @@ -48,4 +48,4 @@ export class GameSystem { startDraw(parameters) { this.draw(parameters); } -} \ No newline at end of file +} diff --git a/src/js/game/game_system_manager.js b/src/js/game/game_system_manager.js index 9bb22ec8..0adcf572 100644 --- a/src/js/game/game_system_manager.js +++ b/src/js/game/game_system_manager.js @@ -164,4 +164,4 @@ export class GameSystemManager { system.refreshCaches(); } } -} \ No newline at end of file +} diff --git a/src/js/game/game_system_with_filter.js b/src/js/game/game_system_with_filter.js index 21ebb162..a6efeffd 100644 --- a/src/js/game/game_system_with_filter.js +++ b/src/js/game/game_system_with_filter.js @@ -134,4 +134,4 @@ export class GameSystemWithFilter extends GameSystem { arrayDelete(this.allEntities, index); } } -} \ No newline at end of file +} diff --git a/src/js/game/hub_goals.js b/src/js/game/hub_goals.js index 44e5eedb..45e745ac 100644 --- a/src/js/game/hub_goals.js +++ b/src/js/game/hub_goals.js @@ -127,7 +127,8 @@ export class HubGoals extends BasicSerializableObject { * @returns {boolean} */ isEndOfDemoReached() { - return (!this.root.gameMode.getIsFreeplayAvailable() && + return ( + !this.root.gameMode.getIsFreeplayAvailable() && this.level >= this.root.gameMode.getLevelDefinitions().length ); } @@ -506,13 +507,13 @@ export class HubGoals extends BasicSerializableObject { HubGoals.getProcessorBaseSpeed = { trash: processorType => 1e30, hub: processorType => 1e30, - balancer: function(processorType) { + balancer: function (processorType) { return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt * 2; }, - reader: function(processorType) { + reader: function (processorType) { return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt; }, - mixer: function(processorType) { + mixer: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -523,7 +524,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - painter: function(processorType) { + painter: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -534,7 +535,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - painterDouble: function(processorType) { + painterDouble: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -545,7 +546,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - painterQuad: function(processorType) { + painterQuad: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -557,7 +558,7 @@ HubGoals.getProcessorBaseSpeed = { ); }, - cutter: function(processorType) { + cutter: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -568,7 +569,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - cutterQuad: function(processorType) { + cutterQuad: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -579,7 +580,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - rotater: function(processorType) { + rotater: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -590,7 +591,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - rotaterCCW: function(processorType) { + rotaterCCW: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -601,7 +602,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - rotater180: function(processorType) { + rotater180: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -612,7 +613,7 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, - stacker: function(processorType) { + stacker: function (processorType) { assert( globalConfig.buildingSpeeds[processorType], "Processor type has no speed set in globalConfig.buildingSpeeds:()=> " + processorType @@ -623,4 +624,4 @@ HubGoals.getProcessorBaseSpeed = { globalConfig.buildingSpeeds[processorType] ); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/hud/base_hud_part.js b/src/js/game/hud/base_hud_part.js index 167382f5..84b6d619 100644 --- a/src/js/game/hud/base_hud_part.js +++ b/src/js/game/hud/base_hud_part.js @@ -164,4 +164,4 @@ export class BaseHUDPart { "mapMoveLeft", ]); } -} \ No newline at end of file +} diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js index aee04d9c..714b697a 100644 --- a/src/js/game/hud/hud.js +++ b/src/js/game/hud/hud.js @@ -342,4 +342,4 @@ export class GameHUD { this.signals[key].removeAll(); } } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/base_toolbar.js b/src/js/game/hud/parts/base_toolbar.js index d8b1e3c1..b3f5abfc 100644 --- a/src/js/game/hud/parts/base_toolbar.js +++ b/src/js/game/hud/parts/base_toolbar.js @@ -18,7 +18,8 @@ export class HUDBaseToolbar extends BaseHUDPart { * @param {Layer=} param0.layer */ constructor( - root, { primaryBuildings, secondaryBuildings = [], visibilityCondition, htmlElementId, layer = "regular" } + root, + { primaryBuildings, secondaryBuildings = [], visibilityCondition, htmlElementId, layer = "regular" } ) { super(root); @@ -81,7 +82,8 @@ export class HUDBaseToolbar extends BaseHUDPart { const itemContainer = makeDiv( this.primaryBuildings.includes(allBuildings[i]) ? rowPrimary : rowSecondary, - null, ["building"] + null, + ["building"] ); itemContainer.setAttribute("data-icon", "building_icons/" + metaBuilding.getId() + ".png"); itemContainer.setAttribute("data-id", metaBuilding.getId()); @@ -159,9 +161,9 @@ export class HUDBaseToolbar extends BaseHUDPart { let newBuildingFound = false; let newIndex = this.lastSelectedIndex; - const direction = this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed ? - -1 : - 1; + const direction = this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed + ? -1 + : 1; for (let i = 0; i <= this.primaryBuildings.length; ++i) { newIndex = safeModulo(newIndex + direction, this.primaryBuildings.length); @@ -227,4 +229,4 @@ export class HUDBaseToolbar extends BaseHUDPart { this.root.hud.signals.buildingSelectedForPlacement.dispatch(metaBuilding); this.onSelectedPlacementBuildingChanged(metaBuilding); } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/building_placer.js b/src/js/game/hud/parts/building_placer.js index abab3e56..96e2924b 100644 --- a/src/js/game/hud/parts/building_placer.js +++ b/src/js/game/hud/parts/building_placer.js @@ -34,7 +34,8 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { this.buildingInfoElements.descText = makeDiv(this.buildingInfoElements.desc, null, ["text"], ""); this.buildingInfoElements.additionalInfo = makeDiv( this.buildingInfoElements.desc, - null, ["additionalInfo"], + null, + ["additionalInfo"], "" ); this.buildingInfoElements.hotkey = makeDiv(this.buildingInfoElements.desc, null, ["hotkey"], ""); @@ -135,9 +136,9 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { this.buildingInfoElements.tutorialImage.setAttribute( "data-icon", "building_tutorials/" + - metaBuilding.getId() + - (variant === defaultBuildingVariant ? "" : "-" + variant) + - ".png" + metaBuilding.getId() + + (variant === defaultBuildingVariant ? "" : "-" + variant) + + ".png" ); removeAllChildren(this.buildingInfoElements.additionalInfo); @@ -189,14 +190,15 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { makeDiv( this.variantsElement, - null, ["explanation"], + null, + ["explanation"], T.ingame.buildingPlacement.cycleBuildingVariants.replace( "", "" + - this.root.keyMapper - .getBinding(KEYMAPPINGS.placement.cycleBuildingVariants) - .getKeyCodeString() + - "" + this.root.keyMapper + .getBinding(KEYMAPPINGS.placement.cycleBuildingVariants) + .getKeyCodeString() + + "" ) ); @@ -442,10 +444,12 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { parameters.context.translate(worldPos.x, worldPos.y); parameters.context.rotate(angle); parameters.context.drawImage( - arrowSprite, -6, -globalConfig.halfTileSize - - clamp((this.root.time.realtimeNow() * 1.5) % 1.0, 0, 1) * 1 * globalConfig.tileSize + - globalConfig.halfTileSize - - 6, + arrowSprite, + -6, + -globalConfig.halfTileSize - + clamp((this.root.time.realtimeNow() * 1.5) % 1.0, 0, 1) * 1 * globalConfig.tileSize + + globalConfig.halfTileSize - + 6, 12, 12 ); @@ -498,7 +502,8 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { // Go over all slots for ( - let acceptorDirectionIndex = 0; acceptorDirectionIndex < slot.directions.length; + let acceptorDirectionIndex = 0; + acceptorDirectionIndex < slot.directions.length; ++acceptorDirectionIndex ) { const direction = slot.directions[acceptorDirectionIndex]; @@ -529,7 +534,7 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { } else if ( sourceBeltComp && sourceStaticComp.localDirectionToWorld(sourceBeltComp.direction) === - enumInvertedDirections[worldDirection] + enumInvertedDirections[worldDirection] ) { // Belt connected isConnected = true; @@ -615,4 +620,4 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { parameters.context.globalAlpha = 1; } } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js index c42d2418..a875aad8 100644 --- a/src/js/game/hud/parts/building_placer_logic.js +++ b/src/js/game/hud/parts/building_placer_logic.js @@ -279,20 +279,20 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { * Tries to rotate the current building */ tryRotate() { - const selectedBuilding = this.currentMetaBuilding.get(); - if (selectedBuilding) { - if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed) { - this.currentBaseRotation = (this.currentBaseRotation + 270) % 360; - } else { - this.currentBaseRotation = (this.currentBaseRotation + 90) % 360; - } - const staticComp = this.fakeEntity.components.StaticMapEntity; - staticComp.rotation = this.currentBaseRotation; + const selectedBuilding = this.currentMetaBuilding.get(); + if (selectedBuilding) { + if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).pressed) { + this.currentBaseRotation = (this.currentBaseRotation + 270) % 360; + } else { + this.currentBaseRotation = (this.currentBaseRotation + 90) % 360; } + const staticComp = this.fakeEntity.components.StaticMapEntity; + staticComp.rotation = this.currentBaseRotation; } - /** - * Tries to delete the building under the mouse - */ + } + /** + * Tries to delete the building under the mouse + */ deleteBelowCursor() { const mousePosition = this.root.app.mousePosition; if (!mousePosition) { @@ -443,7 +443,8 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { } // Check if we should stop placement - if (!metaBuilding.getStayInPlacementMode() && + if ( + !metaBuilding.getStayInPlacementMode() && !this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).pressed && !this.root.app.settings.getAllSettings().alwaysMultiplace ) { @@ -471,9 +472,9 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { console.warn("Invalid variant selected:", this.currentVariant.get()); } const direction = this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier) - .pressed ? - -1 : - 1; + .pressed + ? -1 + : 1; const newIndex = safeModulo(index + direction, availableVariants.length); const newVariant = availableVariants[newIndex]; @@ -804,4 +805,4 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { this.abortDragging(); } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/buildings_toolbar.js b/src/js/game/hud/parts/buildings_toolbar.js index 1c834279..1daf0973 100644 --- a/src/js/game/hud/parts/buildings_toolbar.js +++ b/src/js/game/hud/parts/buildings_toolbar.js @@ -52,4 +52,4 @@ HUDBuildingsToolbar.bar = { MetaDisplayBuilding, ], htmlElementId: "ingame_HUD_BuildingsToolbar", -}; \ No newline at end of file +}; diff --git a/src/js/game/hud/parts/miner_highlight.js b/src/js/game/hud/parts/miner_highlight.js index e735d8b5..a0c6919d 100644 --- a/src/js/game/hud/parts/miner_highlight.js +++ b/src/js/game/hud/parts/miner_highlight.js @@ -103,9 +103,9 @@ export class HUDMinerHighlight extends BaseHUDPart { parameters.context.globalAlpha = 0.6; parameters.context.font = "bold " + scale * 8 + "px GameFont"; parameters.context.fillText( - connectedEntities.length === 1 ? - T.ingame.connectedMiners.one_miner : - T.ingame.connectedMiners.n_miners.replace("", String(connectedEntities.length)), + connectedEntities.length === 1 + ? T.ingame.connectedMiners.one_miner + : T.ingame.connectedMiners.n_miners.replace("", String(connectedEntities.length)), tooltipLocation.x + 10 * scale, tooltipLocation.y + 22 * scale ); @@ -173,4 +173,4 @@ export class HUDMinerHighlight extends BaseHUDPart { return results; } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/settings_menu.js b/src/js/game/hud/parts/settings_menu.js index e00b107e..81156400 100644 --- a/src/js/game/hud/parts/settings_menu.js +++ b/src/js/game/hud/parts/settings_menu.js @@ -15,7 +15,8 @@ export class HUDSettingsMenu extends BaseHUDPart { this.statsElement = makeDiv( this.background, - null, ["statsElement"], + null, + ["statsElement"], ` ${T.ingame.settingsMenu.beltsPlaced} ${T.ingame.settingsMenu.buildingsPlaced} @@ -91,7 +92,7 @@ export class HUDSettingsMenu extends BaseHUDPart { buildingsPlacedElement.innerText = formatBigNumberFull( this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length - - this.root.entityMgr.getAllWithComponent(BeltComponent).length + this.root.entityMgr.getAllWithComponent(BeltComponent).length ); beltsPlacedElement.innerText = formatBigNumberFull( @@ -110,7 +111,8 @@ export class HUDSettingsMenu extends BaseHUDPart { } } -HUDSettingsMenu.buttons = [{ +HUDSettingsMenu.buttons = [ + { id: "continue", action: hudSettingsMenu => () => hudSettingsMenu.close(), options: { @@ -131,4 +133,4 @@ HUDSettingsMenu.buttons = [{ preventDefault: false, }, }, -]; \ No newline at end of file +]; diff --git a/src/js/game/hud/parts/shop.js b/src/js/game/hud/parts/shop.js index 7481e4c6..96521898 100644 --- a/src/js/game/hud/parts/shop.js +++ b/src/js/game/hud/parts/shop.js @@ -244,4 +244,4 @@ export class HUDShop extends BaseHUDPart { isBlockingOverlay() { return this.visible; } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/waypoints.js b/src/js/game/hud/parts/waypoints.js index a9db8db6..7de0dde1 100644 --- a/src/js/game/hud/parts/waypoints.js +++ b/src/js/game/hud/parts/waypoints.js @@ -44,12 +44,13 @@ export class HUDWaypoints extends BaseHUDPart { * @param {HTMLElement} parent */ createElements(parent) { - // Create the helper box on the lower right when zooming out - if (this.root.app.settings.getAllSettings().offerHints) { - this.hintElement = makeDiv( - parent, - "ingame_HUD_Waypoints_Hint", [], - ` + // Create the helper box on the lower right when zooming out + if (this.root.app.settings.getAllSettings().offerHints) { + this.hintElement = makeDiv( + parent, + "ingame_HUD_Waypoints_Hint", + [], + ` ${T.ingame.waypoints.waypoints} ${T.ingame.waypoints.description.replace( "", @@ -643,4 +644,4 @@ export class HUDWaypoints extends BaseHUDPart { parameters.context.textBaseline = "alphabetic"; parameters.context.globalAlpha = 1; } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/wire_info.js b/src/js/game/hud/parts/wire_info.js index 58f47edf..60a34796 100644 --- a/src/js/game/hud/parts/wire_info.js +++ b/src/js/game/hud/parts/wire_info.js @@ -36,7 +36,8 @@ export class HUDWireInfo extends BaseHUDPart { return; } - if (!this.root.camera.getIsMapOverlayActive() && + if ( + !this.root.camera.getIsMapOverlayActive() && !this.root.logic.getIsEntityIntersectedWithMatrix(entity, worldPos) ) { // Detailed intersection check @@ -115,4 +116,4 @@ export class HUDWireInfo extends BaseHUDPart { } parameters.context.globalAlpha = 1; } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/wires_overlay.js b/src/js/game/hud/parts/wires_overlay.js index d0643610..3bcab232 100644 --- a/src/js/game/hud/parts/wires_overlay.js +++ b/src/js/game/hud/parts/wires_overlay.js @@ -146,9 +146,9 @@ export class HUDWiresOverlay extends BaseHUDPart { parameters.context.globalCompositeOperation = "source-over"; parameters.context.scale(scaleFactor, scaleFactor); - parameters.context.fillStyle = hasTileGrid ? - this.cachedPatternBackground : - "rgba(78, 137, 125, 0.75)"; + parameters.context.fillStyle = hasTileGrid + ? this.cachedPatternBackground + : "rgba(78, 137, 125, 0.75)"; parameters.context.fillRect( bounds.x / scaleFactor, bounds.y / scaleFactor, @@ -159,4 +159,4 @@ export class HUDWiresOverlay extends BaseHUDPart { parameters.context.globalAlpha = 1; } -} \ No newline at end of file +} diff --git a/src/js/game/hud/parts/wires_toolbar.js b/src/js/game/hud/parts/wires_toolbar.js index 6b8a09ad..fdb9a3e7 100644 --- a/src/js/game/hud/parts/wires_toolbar.js +++ b/src/js/game/hud/parts/wires_toolbar.js @@ -45,4 +45,4 @@ HUDWiresToolbar.bar = { MetaDisplayBuilding, ], htmlElementId: "ingame_HUD_wires_toolbar", -}; \ No newline at end of file +}; diff --git a/src/js/game/item_registry.js b/src/js/game/item_registry.js index 9617253b..98538e5b 100644 --- a/src/js/game/item_registry.js +++ b/src/js/game/item_registry.js @@ -15,4 +15,4 @@ export function initItemRegistry() { const itemClass = shapezAPI.ingame.items[itemId]; gItemRegistry.register(itemClass); } -} \ No newline at end of file +} diff --git a/src/js/game/item_resolver.js b/src/js/game/item_resolver.js index 0b9e90f6..4e676d08 100644 --- a/src/js/game/item_resolver.js +++ b/src/js/game/item_resolver.js @@ -19,4 +19,4 @@ export function itemResolverSingleton(root, data) { assertAlways(false, "Unknown item type: " + itemType); } -export const typeItemSingleton = types.obj(gItemRegistry, itemResolverSingleton); \ No newline at end of file +export const typeItemSingleton = types.obj(gItemRegistry, itemResolverSingleton); diff --git a/src/js/game/items/boolean_item.js b/src/js/game/items/boolean_item.js index 31d7ad0a..1d710ad4 100644 --- a/src/js/game/items/boolean_item.js +++ b/src/js/game/items/boolean_item.js @@ -93,7 +93,7 @@ export const BOOL_TRUE_SINGLETON = new BooleanItem(1); * @returns {boolean} */ export function isTrueItem(item) { - return item && item.getItemType() === "boolean" && !!( /** @type {BooleanItem} */ (item).value); + return item && item.getItemType() === "boolean" && !!(/** @type {BooleanItem} */ (item).value); } /** @@ -107,8 +107,8 @@ export function isTruthyItem(item) { } if (item.getItemType() === "boolean") { - return !!( /** @type {BooleanItem} */ (item).value); + return !!(/** @type {BooleanItem} */ (item).value); } return true; -} \ No newline at end of file +} diff --git a/src/js/game/items/color_item.js b/src/js/game/items/color_item.js index 8bff826f..1cae9b8d 100644 --- a/src/js/game/items/color_item.js +++ b/src/js/game/items/color_item.js @@ -102,4 +102,4 @@ ColorItem.ITEM_SINGLETONS = {}; for (const color in enumColors) { ColorItem.ITEM_SINGLETONS[color] = new ColorItem(color); -} \ No newline at end of file +} diff --git a/src/js/game/items/shape_item.js b/src/js/game/items/shape_item.js index 511b2383..fd74112b 100644 --- a/src/js/game/items/shape_item.js +++ b/src/js/game/items/shape_item.js @@ -79,4 +79,4 @@ export class ShapeItem extends BaseItem { ShapeItem.resolveSingleton = (root, itemData) => { return root.shapeDefinitionMgr.getShapeItemFromShortKey(itemData); -}; \ No newline at end of file +}; diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index b505ac39..6f8e914a 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -264,9 +264,9 @@ export function getStringForKeyCode(code) { return "'"; } - return (48 <= code && code <= 57) || (65 <= code && code <= 90) ? - String.fromCharCode(code) : - "[" + code + "]"; + return (48 <= code && code <= 57) || (65 <= code && code <= 90) + ? String.fromCharCode(code) + : "[" + code + "]"; } export class Keybinding { @@ -478,4 +478,4 @@ export class KeyActionMapper { assert(this.keybindings[id], "Keybinding " + id + " not known!"); return this.keybindings[id]; } -} \ No newline at end of file +} diff --git a/src/js/game/logic.js b/src/js/game/logic.js index 7f1edf60..ae828de5 100644 --- a/src/js/game/logic.js +++ b/src/js/game/logic.js @@ -430,4 +430,4 @@ export class GameLogic { } return { ejectors, acceptors }; } -} \ No newline at end of file +} diff --git a/src/js/game/map_chunk_view.js b/src/js/game/map_chunk_view.js index 37663801..f8b934fb 100644 --- a/src/js/game/map_chunk_view.js +++ b/src/js/game/map_chunk_view.js @@ -142,9 +142,9 @@ export class MapChunkView extends MapChunk { */ generateOverlayBuffer(canvas, context, w, h, dpi) { context.fillStyle = - this.containedEntities.length > 0 ? - THEME.map.chunkOverview.filled : - THEME.map.chunkOverview.empty; + this.containedEntities.length > 0 + ? THEME.map.chunkOverview.filled + : THEME.map.chunkOverview.empty; context.fillRect(0, 0, w, h); if (this.root.app.settings.getAllSettings().displayChunkBorders) { @@ -350,4 +350,4 @@ export class MapChunkView extends MapChunk { system.drawChunk_ForegroundLayer(parameters, this, layer); } } -} \ No newline at end of file +} diff --git a/src/js/game/map_view.js b/src/js/game/map_view.js index b2e3e536..b15d3768 100644 --- a/src/js/game/map_view.js +++ b/src/js/game/map_view.js @@ -216,4 +216,4 @@ export class MapView extends BaseMap { this.drawVisibleChunks(parameters, MapChunkView.prototype.drawBackgroundLayer); } -} \ No newline at end of file +} diff --git a/src/js/game/meta_building.js b/src/js/game/meta_building.js index 1139fb75..f2ad2e51 100644 --- a/src/js/game/meta_building.js +++ b/src/js/game/meta_building.js @@ -142,9 +142,9 @@ export class MetaBuilding { getPreviewSprite(rotationVariant = 0, variant = defaultBuildingVariant) { return Loader.getSprite( "sprites/buildings/" + - this.id + - (variant === defaultBuildingVariant ? "" : "-" + variant) + - ".png" + this.id + + (variant === defaultBuildingVariant ? "" : "-" + variant) + + ".png" ); } @@ -155,9 +155,9 @@ export class MetaBuilding { getBlueprintSprite(rotationVariant = 0, variant = defaultBuildingVariant) { return Loader.getSprite( "sprites/blueprints/" + - this.id + - (variant === defaultBuildingVariant ? "" : "-" + variant) + - ".png" + this.id + + (variant === defaultBuildingVariant ? "" : "-" + variant) + + ".png" ); } @@ -232,9 +232,9 @@ export class MetaBuilding { getSprite(rotationVariant, variant) { return Loader.getSprite( "sprites/buildings/" + - this.id + - (variant === defaultBuildingVariant ? "" : "-" + variant) + - ".png" + this.id + + (variant === defaultBuildingVariant ? "" : "-" + variant) + + ".png" ); } @@ -279,4 +279,4 @@ export class MetaBuilding { setupEntityComponents(entity, root) { abstract; } -} \ No newline at end of file +} diff --git a/src/js/game/meta_building_registry.js b/src/js/game/meta_building_registry.js index 41922bdc..1cfa3c31 100644 --- a/src/js/game/meta_building_registry.js +++ b/src/js/game/meta_building_registry.js @@ -187,4 +187,4 @@ export function initBuildingCodesAfterResourcesLoaded() { variant.rotationVariant ); } -} \ No newline at end of file +} diff --git a/src/js/game/modes/regular.js b/src/js/game/modes/regular.js index 26038f0a..44c2c748 100644 --- a/src/js/game/modes/regular.js +++ b/src/js/game/modes/regular.js @@ -43,7 +43,8 @@ function generateUpgrades(limitedVersion = false) { } const upgrades = { - belt: [{ + belt: [ + { required: [{ shape: "CuCuCuCu", amount: 30 }], }, { @@ -72,7 +73,8 @@ function generateUpgrades(limitedVersion = false) { ...generateInfiniteUnlocks(), ], - miner: [{ + miner: [ + { required: [{ shape: "RuRuRuRu", amount: 300 }], }, { @@ -101,7 +103,8 @@ function generateUpgrades(limitedVersion = false) { ...generateInfiniteUnlocks(), ], - processors: [{ + processors: [ + { required: [{ shape: "SuSuSuSu", amount: 500 }], }, { @@ -130,7 +133,8 @@ function generateUpgrades(limitedVersion = false) { ...generateInfiniteUnlocks(), ], - painting: [{ + painting: [ + { required: [{ shape: "RbRb----", amount: 600 }], }, { @@ -317,115 +321,117 @@ export function generateLevelDefinitions(limitedVersion = false) { }, // DEMO STOPS HERE - ...(limitedVersion ? - [{ - shape: "RpRpRpRp:CwCwCwCw", - required: 0, - reward: enumHubGoalRewards.reward_demo_end, - }, ] : - [ - // 14 - // Belt reader - { - shape: "--Cg----:--Cr----", // unused - required: 8, // Per second! - reward: enumHubGoalRewards.reward_belt_reader, - throughputOnly: true, - }, + ...(limitedVersion + ? [ + { + shape: "RpRpRpRp:CwCwCwCw", + required: 0, + reward: enumHubGoalRewards.reward_demo_end, + }, + ] + : [ + // 14 + // Belt reader + { + shape: "--Cg----:--Cr----", // unused + required: 8, // Per second! + reward: enumHubGoalRewards.reward_belt_reader, + throughputOnly: true, + }, - // 15 - // Storage - { - shape: "SrSrSrSr:CyCyCyCy", // unused - required: 10000, - reward: enumHubGoalRewards.reward_storage, - }, + // 15 + // Storage + { + shape: "SrSrSrSr:CyCyCyCy", // unused + required: 10000, + reward: enumHubGoalRewards.reward_storage, + }, - // 16 - // Quad Cutter - { - shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants) - required: 6000, - reward: enumHubGoalRewards.reward_cutter_quad, - }, + // 16 + // Quad Cutter + { + shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants) + required: 6000, + reward: enumHubGoalRewards.reward_cutter_quad, + }, - // 17 - // Double painter - { - shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants) - required: 20000, - reward: enumHubGoalRewards.reward_painter_double, - }, + // 17 + // Double painter + { + shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants) + required: 20000, + reward: enumHubGoalRewards.reward_painter_double, + }, - // 18 - // Rotater (180deg) - { - shape: "Sg----Sg:CgCgCgCg:--CyCy--", // unused - required: 20000, - reward: enumHubGoalRewards.reward_rotater_180, - }, + // 18 + // Rotater (180deg) + { + shape: "Sg----Sg:CgCgCgCg:--CyCy--", // unused + required: 20000, + reward: enumHubGoalRewards.reward_rotater_180, + }, - // 19 - // Compact splitter - { - shape: "CpRpCp--:SwSwSwSw", - required: 25000, - reward: enumHubGoalRewards.reward_splitter, - }, + // 19 + // Compact splitter + { + shape: "CpRpCp--:SwSwSwSw", + required: 25000, + reward: enumHubGoalRewards.reward_splitter, + }, - // 20 - // WIRES - { - shape: finalGameShape, - required: 25000, - reward: enumHubGoalRewards.reward_wires_painter_and_levers, - }, + // 20 + // WIRES + { + shape: finalGameShape, + required: 25000, + reward: enumHubGoalRewards.reward_wires_painter_and_levers, + }, - // 21 - // Filter - { - shape: "CrCwCrCw:CwCrCwCr:CrCwCrCw:CwCrCwCr", - required: 25000, - reward: enumHubGoalRewards.reward_filter, - }, + // 21 + // Filter + { + shape: "CrCwCrCw:CwCrCwCr:CrCwCrCw:CwCrCwCr", + required: 25000, + reward: enumHubGoalRewards.reward_filter, + }, - // 22 - // Constant signal - { - shape: "Cg----Cr:Cw----Cw:Sy------:Cy----Cy", - required: 25000, - reward: enumHubGoalRewards.reward_constant_signal, - }, + // 22 + // Constant signal + { + shape: "Cg----Cr:Cw----Cw:Sy------:Cy----Cy", + required: 25000, + reward: enumHubGoalRewards.reward_constant_signal, + }, - // 23 - // Display - { - shape: "CcSyCcSy:SyCcSyCc:CcSyCcSy", - required: 25000, - reward: enumHubGoalRewards.reward_display, - }, + // 23 + // Display + { + shape: "CcSyCcSy:SyCcSyCc:CcSyCcSy", + required: 25000, + reward: enumHubGoalRewards.reward_display, + }, - // 24 Logic gates - { - shape: "CcRcCcRc:RwCwRwCw:Sr--Sw--:CyCyCyCy", - required: 25000, - reward: enumHubGoalRewards.reward_logic_gates, - }, + // 24 Logic gates + { + shape: "CcRcCcRc:RwCwRwCw:Sr--Sw--:CyCyCyCy", + required: 25000, + reward: enumHubGoalRewards.reward_logic_gates, + }, - // 25 Virtual Processing - { - shape: "Rg--Rg--:CwRwCwRw:--Rg--Rg", - required: 25000, - reward: enumHubGoalRewards.reward_virtual_processing, - }, + // 25 Virtual Processing + { + shape: "Rg--Rg--:CwRwCwRw:--Rg--Rg", + required: 25000, + reward: enumHubGoalRewards.reward_virtual_processing, + }, - // 26 Freeplay - { - shape: "CbCuCbCu:Sr------:--CrSrCr:CwCwCwCw", - required: 50000, - reward: enumHubGoalRewards.reward_freeplay, - }, - ]), + // 26 Freeplay + { + shape: "CbCuCbCu:Sr------:--CrSrCr:CwCwCwCw", + required: 50000, + reward: enumHubGoalRewards.reward_freeplay, + }, + ]), ]; if (G_IS_DEV) { @@ -457,9 +463,9 @@ export class RegularGameMode extends GameMode { } getUpgrades() { - return this.root.app.restrictionMgr.getHasExtendedUpgrades() ? - fullVersionUpgrades : - demoVersionUpgrades; + return this.root.app.restrictionMgr.getHasExtendedUpgrades() + ? fullVersionUpgrades + : demoVersionUpgrades; } getIsFreeplayAvailable() { @@ -471,8 +477,8 @@ export class RegularGameMode extends GameMode { } getLevelDefinitions() { - return this.root.app.restrictionMgr.getHasExtendedLevelsAndFreeplay() ? - fullVersionLevels : - demoVersionLevels; + return this.root.app.restrictionMgr.getHasExtendedLevelsAndFreeplay() + ? fullVersionLevels + : demoVersionLevels; } -} \ No newline at end of file +} diff --git a/src/js/game/production_analytics.js b/src/js/game/production_analytics.js index e4b4f449..c8a1fa5e 100644 --- a/src/js/game/production_analytics.js +++ b/src/js/game/production_analytics.js @@ -131,4 +131,4 @@ export class ProductionAnalytics extends BasicSerializableObject { this.startNewSlice(); } } -} \ No newline at end of file +} diff --git a/src/js/game/root.js b/src/js/game/root.js index 78969643..a0b9d189 100644 --- a/src/js/game/root.js +++ b/src/js/game/root.js @@ -222,4 +222,4 @@ export class GameRoot { } } } -} \ No newline at end of file +} diff --git a/src/js/game/shape_definition.js b/src/js/game/shape_definition.js index 52e84bfb..91a10e5b 100644 --- a/src/js/game/shape_definition.js +++ b/src/js/game/shape_definition.js @@ -607,10 +607,12 @@ ShapeDefinition.renderQuad = { context.beginPath(); context.moveTo(insetPadding + -quadrantHalfSize, -insetPadding + quadrantHalfSize); context.arc( - insetPadding + -quadrantHalfSize, -insetPadding + quadrantHalfSize, - quadrantSize * layerScale, -Math.PI * 0.5, + insetPadding + -quadrantHalfSize, + -insetPadding + quadrantHalfSize, + quadrantSize * layerScale, + -Math.PI * 0.5, 0 ); context.closePath(); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/systems/belt.js b/src/js/game/systems/belt.js index 5375d447..12155439 100644 --- a/src/js/game/systems/belt.js +++ b/src/js/game/systems/belt.js @@ -502,7 +502,7 @@ export class BeltSystem extends GameSystemWithFilter { // 126 / 42 is the exact animation speed of the png animation const animationIndex = Math.floor( ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) * - globalConfig.itemSpacingOnBelts + globalConfig.itemSpacingOnBelts ); const contents = chunk.containedEntitiesByLayer.regular; @@ -555,4 +555,4 @@ export class BeltSystem extends GameSystemWithFilter { this.beltPaths[i].drawDebug(parameters); } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/belt_reader.js b/src/js/game/systems/belt_reader.js index 436e6cfe..bbb25744 100644 --- a/src/js/game/systems/belt_reader.js +++ b/src/js/game/systems/belt_reader.js @@ -30,9 +30,9 @@ export class BeltReaderSystem extends GameSystemWithFilter { pinsComp.slots[1].value = readerComp.lastItem; pinsComp.slots[0].value = (readerComp.lastItemTimes[readerComp.lastItemTimes.length - 1] || 0) > - minimumTimeForThroughput ? - BOOL_TRUE_SINGLETON : - BOOL_FALSE_SINGLETON; + minimumTimeForThroughput + ? BOOL_TRUE_SINGLETON + : BOOL_FALSE_SINGLETON; if (now - readerComp.lastThroughputComputation > 0.5) { // Compute throughput @@ -56,4 +56,4 @@ export class BeltReaderSystem extends GameSystemWithFilter { } } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/belt_underlays.js b/src/js/game/systems/belt_underlays.js index 8956a582..d7d8933a 100644 --- a/src/js/game/systems/belt_underlays.js +++ b/src/js/game/systems/belt_underlays.js @@ -252,12 +252,14 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter { } // Culling, Part 2: Check if the overlay is visible - if (!parameters.visibleRect.containsRect4Params( + if ( + !parameters.visibleRect.containsRect4Params( destX, destY, globalConfig.tileSize, globalConfig.tileSize - )) { + ) + ) { continue; } @@ -280,14 +282,16 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter { // SYNC with systems/belt.js:drawSingleEntity! const animationIndex = Math.floor( ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) * - globalConfig.itemSpacingOnBelts + globalConfig.itemSpacingOnBelts ); parameters.context.translate(x, y); parameters.context.rotate(angleRadians); this.underlayBeltSprites[ animationIndex % this.underlayBeltSprites.length ].drawCachedWithClipRect( - parameters, -globalConfig.halfTileSize, -globalConfig.halfTileSize, + parameters, + -globalConfig.halfTileSize, + -globalConfig.halfTileSize, globalConfig.tileSize, globalConfig.tileSize, clipRect @@ -297,4 +301,4 @@ export class BeltUnderlaysSystem extends GameSystemWithFilter { } } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/constant_signal.js b/src/js/game/systems/constant_signal.js index a5d56759..17e07162 100644 --- a/src/js/game/systems/constant_signal.js +++ b/src/js/game/systems/constant_signal.js @@ -172,4 +172,4 @@ export class ConstantSignalSystem extends GameSystemWithFilter { return null; } -} \ No newline at end of file +} diff --git a/src/js/game/systems/display.js b/src/js/game/systems/display.js index a1616119..7915e447 100644 --- a/src/js/game/systems/display.js +++ b/src/js/game/systems/display.js @@ -86,7 +86,7 @@ DisplaySystem.displayItemType = { DisplaySystem.displayItem = { color: (parameters, value, origin, globalConfig) => - DisplaySystem.displaySprites[ /** @type {ColorItem} */ (value).color].drawCachedCentered( + DisplaySystem.displaySprites[/** @type {ColorItem} */ (value).color].drawCachedCentered( parameters, (origin.x + 0.5) * globalConfig.tileSize, (origin.y + 0.5) * globalConfig.tileSize, @@ -104,4 +104,4 @@ DisplaySystem.displayItem = { }; DisplaySystem.shapeRadius = () => 30; -DisplaySystem.shapeBackground = () => true; \ No newline at end of file +DisplaySystem.shapeBackground = () => true; diff --git a/src/js/game/systems/filter.js b/src/js/game/systems/filter.js index 541c1e06..ff0650b4 100644 --- a/src/js/game/systems/filter.js +++ b/src/js/game/systems/filter.js @@ -84,6 +84,6 @@ export class FilterSystem extends GameSystemWithFilter { } FilterSystem.listToCheck = (entity, slot, item, filterComp, networkValue) => - networkValue.equals(BOOL_TRUE_SINGLETON) || networkValue.equals(item) ? - filterComp.pendingItemsToLeaveThrough : - filterComp.pendingItemsToReject; \ No newline at end of file + networkValue.equals(BOOL_TRUE_SINGLETON) || networkValue.equals(item) + ? filterComp.pendingItemsToLeaveThrough + : filterComp.pendingItemsToReject; diff --git a/src/js/game/systems/hub.js b/src/js/game/systems/hub.js index 39cdb6ba..f83780d1 100644 --- a/src/js/game/systems/hub.js +++ b/src/js/game/systems/hub.js @@ -35,23 +35,23 @@ export class HubSystem extends GameSystemWithFilter { } update() { - for (let i = 0; i < this.allEntities.length; ++i) { - // Set hub goal - const entity = this.allEntities[i]; - const pinsComp = entity.components.WiredPins; - pinsComp.slots[0].value = this.root.shapeDefinitionMgr.getShapeItemFromDefinition( - this.root.hubGoals.currentGoal.definition - ); - } + for (let i = 0; i < this.allEntities.length; ++i) { + // Set hub goal + const entity = this.allEntities[i]; + const pinsComp = entity.components.WiredPins; + pinsComp.slots[0].value = this.root.shapeDefinitionMgr.getShapeItemFromDefinition( + this.root.hubGoals.currentGoal.definition + ); } - /** - * - * @param {HTMLCanvasElement} canvas - * @param {CanvasRenderingContext2D} context - * @param {number} w - * @param {number} h - * @param {number} dpi - */ + } + /** + * + * @param {HTMLCanvasElement} canvas + * @param {CanvasRenderingContext2D} context + * @param {number} w + * @param {number} h + * @param {number} dpi + */ redrawHubBaseTexture(canvas, context, w, h, dpi) { // This method is quite ugly, please ignore it! @@ -197,4 +197,4 @@ export class HubSystem extends GameSystemWithFilter { originalH: HUB_SIZE_PIXELS * dpi, }); } -} \ No newline at end of file +} diff --git a/src/js/game/systems/item_acceptor.js b/src/js/game/systems/item_acceptor.js index ccd6f98f..7d1e8962 100644 --- a/src/js/game/systems/item_acceptor.js +++ b/src/js/game/systems/item_acceptor.js @@ -106,4 +106,4 @@ export class ItemAcceptorSystem extends GameSystemWithFilter { } } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index f3480e07..685e103b 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -570,4 +570,4 @@ ItemProcessorSystem.canProcess = { return true; }, -}; \ No newline at end of file +}; diff --git a/src/js/game/systems/item_processor_overlays.js b/src/js/game/systems/item_processor_overlays.js index 453429d0..ffdf0e47 100644 --- a/src/js/game/systems/item_processor_overlays.js +++ b/src/js/game/systems/item_processor_overlays.js @@ -147,7 +147,7 @@ export class ItemProcessorOverlaysSystem extends GameSystem { } ItemProcessorOverlaysSystem.processorOverlayStatic = { - [enumItemProcessorRequirements.painterQuad]: function(parameters, chunk, entity, processorComp) { + [enumItemProcessorRequirements.painterQuad]: function (parameters, chunk, entity, processorComp) { this.drawConnectedSlotRequirement(parameters, entity, { drawIfFalse: true }); }, -}; \ No newline at end of file +}; diff --git a/src/js/game/systems/item_producer.js b/src/js/game/systems/item_producer.js index c09d6b40..a19aa3dc 100644 --- a/src/js/game/systems/item_producer.js +++ b/src/js/game/systems/item_producer.js @@ -25,4 +25,4 @@ export class ItemProducerSystem extends GameSystemWithFilter { ejectorComp.tryEject(0, network.currentValue); } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/lever.js b/src/js/game/systems/lever.js index b86ecb81..2724229c 100644 --- a/src/js/game/systems/lever.js +++ b/src/js/game/systems/lever.js @@ -45,4 +45,4 @@ export class LeverSystem extends GameSystemWithFilter { } } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/logic_gate.js b/src/js/game/systems/logic_gate.js index 3130d6c8..23a1f8fa 100644 --- a/src/js/game/systems/logic_gate.js +++ b/src/js/game/systems/logic_gate.js @@ -104,9 +104,9 @@ export class LogicGateSystem extends GameSystemWithFilter { */ compute_AND(parameters) { assert(parameters.length === 2, "bad parameter count for AND"); - return isTruthyItem(parameters[0]) && isTruthyItem(parameters[1]) ? - BOOL_TRUE_SINGLETON : - BOOL_FALSE_SINGLETON; + return isTruthyItem(parameters[0]) && isTruthyItem(parameters[1]) + ? BOOL_TRUE_SINGLETON + : BOOL_FALSE_SINGLETON; } /** @@ -123,9 +123,9 @@ export class LogicGateSystem extends GameSystemWithFilter { */ compute_XOR(parameters) { assert(parameters.length === 2, "bad parameter count for XOR"); - return isTruthyItem(parameters[0]) !== isTruthyItem(parameters[1]) ? - BOOL_TRUE_SINGLETON : - BOOL_FALSE_SINGLETON; + return isTruthyItem(parameters[0]) !== isTruthyItem(parameters[1]) + ? BOOL_TRUE_SINGLETON + : BOOL_FALSE_SINGLETON; } /** @@ -134,9 +134,9 @@ export class LogicGateSystem extends GameSystemWithFilter { */ compute_OR(parameters) { assert(parameters.length === 2, "bad parameter count for OR"); - return isTruthyItem(parameters[0]) || isTruthyItem(parameters[1]) ? - BOOL_TRUE_SINGLETON : - BOOL_FALSE_SINGLETON; + return isTruthyItem(parameters[0]) || isTruthyItem(parameters[1]) + ? BOOL_TRUE_SINGLETON + : BOOL_FALSE_SINGLETON; } /** @@ -226,12 +226,12 @@ export class LogicGateSystem extends GameSystemWithFilter { const definition = /** @type {ShapeItem} */ (item).definition; const result = this.root.shapeDefinitionMgr.shapeActionCutHalf(definition); return [ - result[0].isEntirelyEmpty() ? - null : - this.root.shapeDefinitionMgr.getShapeItemFromDefinition(result[0]), - result[1].isEntirelyEmpty() ? - null : - this.root.shapeDefinitionMgr.getShapeItemFromDefinition(result[1]), + result[0].isEntirelyEmpty() + ? null + : this.root.shapeDefinitionMgr.getShapeItemFromDefinition(result[0]), + result[1].isEntirelyEmpty() + ? null + : this.root.shapeDefinitionMgr.getShapeItemFromDefinition(result[1]), ]; } @@ -258,9 +258,9 @@ export class LogicGateSystem extends GameSystemWithFilter { lowerLayers.length > 0 ? new ShapeDefinition({ layers: lowerLayers }) : null; return [ - lowerLayerDefinition ? - this.root.shapeDefinitionMgr.getShapeItemFromDefinition(lowerLayerDefinition) : - null, + lowerLayerDefinition + ? this.root.shapeDefinitionMgr.getShapeItemFromDefinition(lowerLayerDefinition) + : null, this.root.shapeDefinitionMgr.getShapeItemFromDefinition(upperLayerDefinition), ]; } @@ -340,32 +340,28 @@ export class LogicGateSystem extends GameSystemWithFilter { } switch (itemA.getItemType()) { - case "shape": - { - return /** @type {ShapeItem} */ (itemA).definition.getHash() === - /** @type {ShapeItem} */ - (itemB).definition.getHash() ? - BOOL_TRUE_SINGLETON : - BOOL_FALSE_SINGLETON; - } - case "color": - { - return /** @type {ColorItem} */ (itemA).color === /** @type {ColorItem} */ (itemB).color ? - BOOL_TRUE_SINGLETON : - BOOL_FALSE_SINGLETON; - } + case "shape": { + return /** @type {ShapeItem} */ (itemA).definition.getHash() === + /** @type {ShapeItem} */ + (itemB).definition.getHash() + ? BOOL_TRUE_SINGLETON + : BOOL_FALSE_SINGLETON; + } + case "color": { + return /** @type {ColorItem} */ (itemA).color === /** @type {ColorItem} */ (itemB).color + ? BOOL_TRUE_SINGLETON + : BOOL_FALSE_SINGLETON; + } - case "boolean": - { - return /** @type {BooleanItem} */ (itemA).value === /** @type {BooleanItem} */ (itemB).value ? - BOOL_TRUE_SINGLETON : - BOOL_FALSE_SINGLETON; - } + case "boolean": { + return /** @type {BooleanItem} */ (itemA).value === /** @type {BooleanItem} */ (itemB).value + ? BOOL_TRUE_SINGLETON + : BOOL_FALSE_SINGLETON; + } - default: - { - assertAlways(false, "Bad item type: " + itemA.getItemType()); - } + default: { + assertAlways(false, "Bad item type: " + itemA.getItemType()); + } } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/map_resources.js b/src/js/game/systems/map_resources.js index f475d137..c433eecd 100644 --- a/src/js/game/systems/map_resources.js +++ b/src/js/game/systems/map_resources.js @@ -132,4 +132,4 @@ export class MapResourcesSystem extends GameSystem { context.fillRect(0, 1, 1, h); } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/static_map_entity.js b/src/js/game/systems/static_map_entity.js index 9c30beab..53db1b26 100644 --- a/src/js/game/systems/static_map_entity.js +++ b/src/js/game/systems/static_map_entity.js @@ -111,4 +111,4 @@ export class StaticMapEntitySystem extends GameSystem { } } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/storage.js b/src/js/game/systems/storage.js index b132d3cd..8b39346c 100644 --- a/src/js/game/systems/storage.js +++ b/src/js/game/systems/storage.js @@ -102,4 +102,4 @@ export class StorageSystem extends GameSystemWithFilter { context.globalAlpha = 1; } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/underground_belt.js b/src/js/game/systems/underground_belt.js index df849882..b4d0f0d1 100644 --- a/src/js/game/systems/underground_belt.js +++ b/src/js/game/systems/underground_belt.js @@ -254,7 +254,8 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { // Search in the direction of the tunnel for ( - let searchOffset = 0; searchOffset < globalConfig.undergroundBeltMaxTilesByTier[undergroundComp.tier]; + let searchOffset = 0; + searchOffset < globalConfig.undergroundBeltMaxTilesByTier[undergroundComp.tier]; ++searchOffset ) { currentTile = currentTile.add(searchVector); @@ -349,4 +350,4 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { } } } -} \ No newline at end of file +} diff --git a/src/js/game/systems/wire.js b/src/js/game/systems/wire.js index 0d767bfb..1e735515 100644 --- a/src/js/game/systems/wire.js +++ b/src/js/game/systems/wire.js @@ -217,10 +217,12 @@ export class WireSystem extends GameSystemWithFilter { currentNetwork.uid, ")" ); - const entitiesToVisit = [{ - entity: initialEntity, - slot, - }, ]; + const entitiesToVisit = [ + { + entity: initialEntity, + slot, + }, + ]; /** * Once we occur a wire, we store its variant so we don't connect to @@ -245,13 +247,14 @@ export class WireSystem extends GameSystemWithFilter { //// WIRE if (wireComp) { // Sanity check - assert(!wireComp.linkedNetwork || wireComp.linkedNetwork === currentNetwork, + assert( + !wireComp.linkedNetwork || wireComp.linkedNetwork === currentNetwork, "Mismatching wire network on wire entity " + - (wireComp.linkedNetwork ? wireComp.linkedNetwork.uid : "") + - " vs " + - currentNetwork.uid + - " @ " + - staticComp.origin.toString() + (wireComp.linkedNetwork ? wireComp.linkedNetwork.uid : "") + + " vs " + + currentNetwork.uid + + " @ " + + staticComp.origin.toString() ); if (!wireComp.linkedNetwork) { @@ -287,11 +290,12 @@ export class WireSystem extends GameSystemWithFilter { } // Sanity check - assert(!slot.linkedNetwork || slot.linkedNetwork === currentNetwork, + assert( + !slot.linkedNetwork || slot.linkedNetwork === currentNetwork, "Mismatching wire network on pin slot entity " + - (slot.linkedNetwork ? slot.linkedNetwork.uid : "") + - " vs " + - currentNetwork.uid + (slot.linkedNetwork ? slot.linkedNetwork.uid : "") + + " vs " + + currentNetwork.uid ); if (!slot.linkedNetwork) { // This one is new @@ -758,4 +762,4 @@ export class WireSystem extends GameSystemWithFilter { } } -WireSystem.getForwardedTile = (tunnelComp, staticComp, offset) => staticComp.origin.add(offset); \ No newline at end of file +WireSystem.getForwardedTile = (tunnelComp, staticComp, offset) => staticComp.origin.add(offset); diff --git a/src/js/game/systems/wired_pins.js b/src/js/game/systems/wired_pins.js index c2e0751a..55e689d8 100644 --- a/src/js/game/systems/wired_pins.js +++ b/src/js/game/systems/wired_pins.js @@ -121,9 +121,11 @@ export class WiredPinsSystem extends GameSystemWithFilter { if (collidingEntity) { const staticComp = collidingEntity.components.StaticMapEntity; const data = getBuildingDataFromCode(staticComp.code); - if (!collidingEntity.components.StaticMapEntity.getMetaBuilding().getIsReplaceable( + if ( + !collidingEntity.components.StaticMapEntity.getMetaBuilding().getIsReplaceable( data.variant - )) { + ) + ) { return true; } } @@ -193,7 +195,9 @@ export class WiredPinsSystem extends GameSystemWithFilter { const worldPos = tile.toWorldSpaceCenterOfTile(); // Culling - if (!parameters.visibleRect.containsCircle(worldPos.x, worldPos.y, globalConfig.halfTileSize)) { + if ( + !parameters.visibleRect.containsCircle(worldPos.x, worldPos.y, globalConfig.halfTileSize) + ) { continue; } @@ -244,4 +248,4 @@ export class WiredPinsSystem extends GameSystemWithFilter { } } } -} \ No newline at end of file +} diff --git a/src/js/game/theme.js b/src/js/game/theme.js index f9dec2f0..330fa0c8 100644 --- a/src/js/game/theme.js +++ b/src/js/game/theme.js @@ -7,4 +7,4 @@ export let THEME = VANILLA_THEMES.light; export function applyGameTheme(id) { THEME = shapezAPI.themes[id]; -} \ No newline at end of file +} diff --git a/src/js/game/time/game_time.js b/src/js/game/time/game_time.js index fcbf3224..07b224a7 100644 --- a/src/js/game/time/game_time.js +++ b/src/js/game/time/game_time.js @@ -197,4 +197,4 @@ export class GameTime extends BasicSerializableObject { this.speed.initializeAfterDeserialize(this.root); } -} \ No newline at end of file +} diff --git a/src/js/game/tutorial_goals_mappings.js b/src/js/game/tutorial_goals_mappings.js index b803c081..c70f8696 100644 --- a/src/js/game/tutorial_goals_mappings.js +++ b/src/js/game/tutorial_goals_mappings.js @@ -28,31 +28,15 @@ const typed = x => x; * @enum {TutorialGoalReward?} */ export const enumHubGoalRewardsToContentUnlocked = { - [enumHubGoalRewards.reward_cutter_and_trash]: typed([ - [MetaCutterBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_rotater]: typed([ - [MetaRotaterBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_painter]: typed([ - [MetaPainterBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_mixer]: typed([ - [MetaMixerBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_stacker]: typed([ - [MetaStackerBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_balancer]: typed([ - [MetaBalancerBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_tunnel]: typed([ - [MetaUndergroundBeltBuilding, defaultBuildingVariant] - ]), + [enumHubGoalRewards.reward_cutter_and_trash]: typed([[MetaCutterBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_rotater]: typed([[MetaRotaterBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_painter]: typed([[MetaPainterBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_mixer]: typed([[MetaMixerBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_stacker]: typed([[MetaStackerBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_balancer]: typed([[MetaBalancerBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_tunnel]: typed([[MetaUndergroundBeltBuilding, defaultBuildingVariant]]), - [enumHubGoalRewards.reward_rotater_ccw]: typed([ - [MetaRotaterBuilding, MetaRotaterBuilding.variants.ccw] - ]), + [enumHubGoalRewards.reward_rotater_ccw]: typed([[MetaRotaterBuilding, MetaRotaterBuilding.variants.ccw]]), [enumHubGoalRewards.reward_rotater_180]: typed([ [MetaRotaterBuilding, MetaRotaterBuilding.variants.rotate180], ]), @@ -65,34 +49,20 @@ export const enumHubGoalRewardsToContentUnlocked = { [enumHubGoalRewards.reward_splitter]: typed([ [MetaBalancerBuilding, MetaBalancerBuilding.variants.splitter], ]), - [enumHubGoalRewards.reward_merger]: typed([ - [MetaBalancerBuilding, MetaBalancerBuilding.variants.merger] - ]), - [enumHubGoalRewards.reward_cutter_quad]: typed([ - [MetaCutterBuilding, MetaCutterBuilding.variants.quad] - ]), + [enumHubGoalRewards.reward_merger]: typed([[MetaBalancerBuilding, MetaBalancerBuilding.variants.merger]]), + [enumHubGoalRewards.reward_cutter_quad]: typed([[MetaCutterBuilding, MetaCutterBuilding.variants.quad]]), [enumHubGoalRewards.reward_painter_double]: typed([ [MetaPainterBuilding, MetaPainterBuilding.variants.double], ]), - [enumHubGoalRewards.reward_storage]: typed([ - [MetaStorageBuilding, defaultBuildingVariant] - ]), + [enumHubGoalRewards.reward_storage]: typed([[MetaStorageBuilding, defaultBuildingVariant]]), - [enumHubGoalRewards.reward_belt_reader]: typed([ - [MetaReaderBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_display]: typed([ - [MetaDisplayBuilding, defaultBuildingVariant] - ]), + [enumHubGoalRewards.reward_belt_reader]: typed([[MetaReaderBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_display]: typed([[MetaDisplayBuilding, defaultBuildingVariant]]), [enumHubGoalRewards.reward_constant_signal]: typed([ [MetaConstantSignalBuilding, defaultBuildingVariant], ]), - [enumHubGoalRewards.reward_logic_gates]: typed([ - [MetaLogicGateBuilding, defaultBuildingVariant] - ]), - [enumHubGoalRewards.reward_filter]: typed([ - [MetaFilterBuilding, defaultBuildingVariant] - ]), + [enumHubGoalRewards.reward_logic_gates]: typed([[MetaLogicGateBuilding, defaultBuildingVariant]]), + [enumHubGoalRewards.reward_filter]: typed([[MetaFilterBuilding, defaultBuildingVariant]]), [enumHubGoalRewards.reward_virtual_processing]: null, [enumHubGoalRewards.reward_wires_painter_and_levers]: typed([ @@ -122,4 +92,4 @@ if (G_IS_DEV) { assertAlways(false, "Translation for reward " + rewardId + "missing"); } } -} \ No newline at end of file +} diff --git a/src/js/languages.js b/src/js/languages.js index 40c9570b..4cc39f9b 100644 --- a/src/js/languages.js +++ b/src/js/languages.js @@ -124,4 +124,4 @@ export const LANGUAGES = { code: "hu", region: "", }, -}; \ No newline at end of file +}; diff --git a/src/js/main.js b/src/js/main.js index 02ea467d..0608dbf2 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -15,7 +15,7 @@ import { addVanillaSystemsToAPI } from "./game/game_system_manager"; import { addVanillaGameModesToAPI } from "./game/game_mode_registry"; import { getIPCRenderer } from "./core/utils"; const logger = createLogger("main"); -window.onload = async() => { +window.onload = async () => { if (window.coreThreadLoadedCb) { logger.log("Javascript parsed, calling html thread"); window.coreThreadLoadedCb(); @@ -188,4 +188,4 @@ window.onload = async() => { app.boot(); } bootApp(); -}; \ No newline at end of file +}; diff --git a/src/js/modloader/mod.js b/src/js/modloader/mod.js index 372579ef..8c03675e 100644 --- a/src/js/modloader/mod.js +++ b/src/js/modloader/mod.js @@ -941,7 +941,8 @@ export class ShapezAPI { sourceImage.crossOrigin = "anonymous"; sourceImage.onload = () => { // @ts-ignore - Loader.internalParseAtlas({ + Loader.internalParseAtlas( + { meta: atlasData.atlasData.meta, sourceData: atlasData.atlasData.frames, }, @@ -1019,4 +1020,4 @@ export class ShapezAPI { clickDetector.click.add(clickHandler); this.clickDetectors.push(clickDetector); } -} \ No newline at end of file +} diff --git a/src/js/modloader/modmanager.js b/src/js/modloader/modmanager.js index da5ea7cc..1e9cfc27 100644 --- a/src/js/modloader/modmanager.js +++ b/src/js/modloader/modmanager.js @@ -112,14 +112,14 @@ export class ModManager { }); } else return Promise.race([ - new Promise((resolve, reject) => { - setTimeout(reject, 60 * 1000); - }), - fetch(url, { - method: "GET", - cache: "no-cache", - }), - ]) + new Promise((resolve, reject) => { + setTimeout(reject, 60 * 1000); + }), + fetch(url, { + method: "GET", + cache: "no-cache", + }), + ]) .then(res => res.text()) .catch(err => { assert(this, "Failed to load mod:", err); @@ -208,9 +208,9 @@ export class ModManager { if (isMissingDependecie) { console.warn( "Mod with mod id: " + - mod.id + - " is disabled because it's missings the dependecie " + - missingDependecie + mod.id + + " is disabled because it's missings the dependecie " + + missingDependecie ); continue; } else sorter.add(id, mod.dependencies); @@ -259,4 +259,4 @@ export class ModManager { if (this.modPack && this.modPack.mods) mod.main(this.modPack.mods.find(mod => mod.id === id).config); else mod.main(); } -} \ No newline at end of file +} diff --git a/src/js/modloader/overwrite.js b/src/js/modloader/overwrite.js index 4617871d..c876b33c 100644 --- a/src/js/modloader/overwrite.js +++ b/src/js/modloader/overwrite.js @@ -15,4 +15,4 @@ export function matchOverwriteRecursiveSettings(dest, src) { console.log("Unknown type:", typeof data, "in key", key); } } -} \ No newline at end of file +} diff --git a/src/js/platform/game_analytics.js b/src/js/platform/game_analytics.js index 328b532d..498e68a5 100644 --- a/src/js/platform/game_analytics.js +++ b/src/js/platform/game_analytics.js @@ -35,4 +35,4 @@ export class GameAnalyticsInterface { * @param {number} level */ handleUpgradeUnlocked(id, level) {} -} \ No newline at end of file +} diff --git a/src/js/profile/application_settings.js b/src/js/profile/application_settings.js index 2348ffd4..dcb5d84b 100644 --- a/src/js/profile/application_settings.js +++ b/src/js/profile/application_settings.js @@ -24,7 +24,8 @@ export const enumCategories = { debug: "debug", }; -export const uiScales = [{ +export const uiScales = [ + { id: "super_small", size: 0.6, }, @@ -46,7 +47,8 @@ export const uiScales = [{ }, ]; -export const scrollWheelSensitivities = [{ +export const scrollWheelSensitivities = [ + { id: "super_slow", scale: 0.25, }, @@ -68,7 +70,8 @@ export const scrollWheelSensitivities = [{ }, ]; -export const movementSpeeds = [{ +export const movementSpeeds = [ + { id: "super_slow", multiplier: 0.25, }, @@ -94,7 +97,8 @@ export const movementSpeeds = [{ }, ]; -export const autosaveIntervals = [{ +export const autosaveIntervals = [ + { id: "one_minute", seconds: 60, }, @@ -150,9 +154,9 @@ export const allApplicationSettings = () => { category: enumCategories.userInterface, restartRequired: false, changeCb: - /** - * @param {Application} app - */ + /** + * @param {Application} app + */ (app, id) => app.updateAfterUiScaleChanged(), }), @@ -208,17 +212,17 @@ export const allApplicationSettings = () => { category: enumCategories.userInterface, restartRequired: false, changeCb: - /** - * @param {Application} app - */ + /** + * @param {Application} app + */ (app, id) => { - applyGameTheme(id); - document.documentElement.setAttribute("data-theme", id); - }, + applyGameTheme(id); + document.documentElement.setAttribute("data-theme", id); + }, enabledCb: - /** - * @param {Application} app - */ + /** + * @param {Application} app + */ app => app.restrictionMgr.getHasExtendedSettings(), }), @@ -229,9 +233,9 @@ export const allApplicationSettings = () => { category: enumCategories.advanced, restartRequired: false, changeCb: - /** - * @param {Application} app - */ + /** + * @param {Application} app + */ (app, id) => null, }), @@ -242,9 +246,9 @@ export const allApplicationSettings = () => { category: enumCategories.advanced, restartRequired: false, changeCb: - /** - * @param {Application} app - */ + /** + * @param {Application} app + */ (app, id) => app.updateAfterUiScaleChanged(), }), @@ -278,9 +282,9 @@ export const allApplicationSettings = () => { restartRequired: false, changeCb: (app, id) => {}, enabledCb: - /** - * @param {Application} app - */ + /** + * @param {Application} app + */ app => app.restrictionMgr.getHasExtendedSettings(), }), @@ -372,7 +376,7 @@ export class ApplicationSettings extends ReadWriteProxy { } }) - .then(() => this.writeAsync()); + .then(() => this.writeAsync()); } save() { @@ -510,12 +514,12 @@ export class ApplicationSettings extends ReadWriteProxy { * @param {string} id */ resetKeybindingOverride(id) { - delete this.getAllSettings().keybindingOverrides[id]; - return this.writeAsync(); - } - /** - * Resets all keybinding overrides - */ + delete this.getAllSettings().keybindingOverrides[id]; + return this.writeAsync(); + } + /** + * Resets all keybinding overrides + */ resetKeybindingOverrides() { this.getAllSettings().keybindingOverrides = {}; return this.writeAsync(); @@ -537,14 +541,14 @@ export class ApplicationSettings extends ReadWriteProxy { if (!setting.validate(storedValue)) { return ExplainedResult.bad( "Bad setting value for " + - setting.id + - ": " + - storedValue + - " @ settings version " + - data.version + - " (latest is " + - this.getCurrentVersion() + - ")" + setting.id + + ": " + + storedValue + + " @ settings version " + + data.version + + " (latest is " + + this.getCurrentVersion() + + ")" ); } } @@ -708,4 +712,4 @@ export class ApplicationSettings extends ReadWriteProxy { return ExplainedResult.good(); } -} \ No newline at end of file +} diff --git a/src/js/profile/setting_types.js b/src/js/profile/setting_types.js index 80a335f4..9a1e0c03 100644 --- a/src/js/profile/setting_types.js +++ b/src/js/profile/setting_types.js @@ -117,7 +117,8 @@ export class BaseSetting { export class EnumSetting extends BaseSetting { constructor( - id, { + id, + { options, valueGetter, textGetter, @@ -145,8 +146,8 @@ export class EnumSetting extends BaseSetting { * @param {Application} app */ getHtml(app) { - const available = this.getIsAvailable(app); - return ` + const available = this.getIsAvailable(app); + return `
${available ? "" : `${T.demo.settingNotAvailable}`}
@@ -362,4 +363,4 @@ export class RangeSetting extends BaseSetting { validate(value) { return typeof value === "number" && value >= this.minValue && value <= this.maxValue; } -} \ No newline at end of file +} diff --git a/src/js/savegame/savegame.js b/src/js/savegame/savegame.js index dcb7c258..a6dfac3b 100644 --- a/src/js/savegame/savegame.js +++ b/src/js/savegame/savegame.js @@ -151,12 +151,12 @@ export class Savegame extends ReadWriteProxy { * @returns {boolean} */ isSaveable() { - return true; - } - /** - * Returns the statistics of the savegame - * @returns {import("./savegame_typedefs").SavegameStats} - */ + return true; + } + /** + * Returns the statistics of the savegame + * @returns {import("./savegame_typedefs").SavegameStats} + */ getStatistics() { return this.currentData.stats; } @@ -283,4 +283,4 @@ export class Savegame extends ReadWriteProxy { } return super.writeAsync(); } -} \ No newline at end of file +} diff --git a/src/js/savegame/savegame_interface_registry.js b/src/js/savegame/savegame_interface_registry.js index 3e09fe21..3edbdb7e 100644 --- a/src/js/savegame/savegame_interface_registry.js +++ b/src/js/savegame/savegame_interface_registry.js @@ -48,4 +48,4 @@ export function getSavegameInterface(savegame) { } return new interfaceClass(savegame); -} \ No newline at end of file +} diff --git a/src/js/savegame/savegame_manager.js b/src/js/savegame/savegame_manager.js index e3ae5024..1634ac88 100644 --- a/src/js/savegame/savegame_manager.js +++ b/src/js/savegame/savegame_manager.js @@ -150,7 +150,8 @@ export class SavegameManager extends ReadWriteProxy { this.updateAfterSavegamesChanged(); return new Savegame( - this.app, { + this.app, + { internalId: id, metaDataRef: metaData, }, @@ -243,4 +244,4 @@ export class SavegameManager extends ReadWriteProxy { return this.updateAfterSavegamesChanged(); }); } -} \ No newline at end of file +} diff --git a/src/js/savegame/savegame_serializer.js b/src/js/savegame/savegame_serializer.js index 7fb0d834..eeb01a4a 100644 --- a/src/js/savegame/savegame_serializer.js +++ b/src/js/savegame/savegame_serializer.js @@ -142,4 +142,4 @@ export class SavegameSerializer { return ExplainedResult.good(); } -} \ No newline at end of file +} diff --git a/src/js/savegame/savegame_typedefs.js b/src/js/savegame/savegame_typedefs.js index e7c082e9..5052ad13 100644 --- a/src/js/savegame/savegame_typedefs.js +++ b/src/js/savegame/savegame_typedefs.js @@ -35,4 +35,4 @@ * }} SavegamesData */ -export default {}; \ No newline at end of file +export default {}; diff --git a/src/js/savegame/schemas/1006.js b/src/js/savegame/schemas/1006.js index 3956c9de..f7ea54f4 100644 --- a/src/js/savegame/schemas/1006.js +++ b/src/js/savegame/schemas/1006.js @@ -307,4 +307,4 @@ export class SavegameInterface_V1006 extends SavegameInterface_V1005 { entity.components.StaticMapEntity = newStaticComp; } -} \ No newline at end of file +} diff --git a/src/js/savegame/schemas/ML01.js b/src/js/savegame/schemas/ML01.js index 6abfefd6..5e35cc44 100644 --- a/src/js/savegame/schemas/ML01.js +++ b/src/js/savegame/schemas/ML01.js @@ -182,4 +182,4 @@ export class SavegameInterface_ML01 extends SavegameInterface_V1007 { codes[dump.entities[i].components.StaticMapEntity.code]; } } -} \ No newline at end of file +} diff --git a/src/js/savegame/serialization.js b/src/js/savegame/serialization.js index 5eb10dd8..799a5710 100644 --- a/src/js/savegame/serialization.js +++ b/src/js/savegame/serialization.js @@ -350,4 +350,4 @@ export function extendSchema(base, newOne) { result[key] = newOne[key]; } return result; -} \ No newline at end of file +} diff --git a/src/js/savegame/serialization_data_types.js b/src/js/savegame/serialization_data_types.js index baf2b104..9d3b689f 100644 --- a/src/js/savegame/serialization_data_types.js +++ b/src/js/savegame/serialization_data_types.js @@ -699,7 +699,7 @@ export class TypeClassData extends BaseDataType { for (let i = 0; i < entries.length; ++i) { const entry = entries[i]; options.push( - schemaToJsonSchema( /** @type {typeof BasicSerializableObject} */ (entry).getCachedSchema()) + schemaToJsonSchema(/** @type {typeof BasicSerializableObject} */ (entry).getCachedSchema()) ); } return { oneOf: options }; @@ -1197,7 +1197,8 @@ export class TypeNullable extends BaseDataType { getAsJsonSchemaUncached() { return { - oneOf: [{ + oneOf: [ + { type: "null", }, this.wrapped.getAsJsonSchema(), @@ -1291,4 +1292,4 @@ export class TypeStructuredObject extends BaseDataType { } return "structured[" + props.join(",") + "]"; } -} \ No newline at end of file +} diff --git a/src/js/states/ingame.js b/src/js/states/ingame.js index 561ccf90..c7c1fa4a 100644 --- a/src/js/states/ingame.js +++ b/src/js/states/ingame.js @@ -468,4 +468,4 @@ export class InGameState extends GameState { return this.currentSavePromise; } -} \ No newline at end of file +} diff --git a/src/js/states/keybindings.js b/src/js/states/keybindings.js index d6ac64bf..b48c90c4 100644 --- a/src/js/states/keybindings.js +++ b/src/js/states/keybindings.js @@ -155,7 +155,8 @@ export class KeybindingsState extends TextualGameState { resetBindings() { const { reset } = this.dialogs.showWarning( T.dialogs.resetKeybindingsConfirmation.title, - T.dialogs.resetKeybindingsConfirmation.desc, ["cancel:good", "reset:bad"] + T.dialogs.resetKeybindingsConfirmation.desc, + ["cancel:good", "reset:bad"] ); reset.add(() => { @@ -169,4 +170,4 @@ export class KeybindingsState extends TextualGameState { getDefaultPreviousState() { return "SettingsState"; } -} \ No newline at end of file +} diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js index cbc15aae..1165780f 100644 --- a/src/js/states/main_menu.js +++ b/src/js/states/main_menu.js @@ -32,15 +32,15 @@ export class MainMenuState extends GameState { } getInnerHTML() { - const bannerHtml = ` + const bannerHtml = `

${T.demoBanners.title}

${T.demoBanners.intro}

Get the shapez.io standalone! `; - const showDemoBadges = this.app.restrictionMgr.getIsStandaloneMarketingActive(); + const showDemoBadges = this.app.restrictionMgr.getIsStandaloneMarketingActive(); - return ` + return `
@@ -667,4 +667,4 @@ export class MainMenuState extends GameState { MainMenuState.extraTopButtons = []; MainMenuState.extraSmallButtons = []; -MainMenuState.extraTrackClicks = []; \ No newline at end of file +MainMenuState.extraTrackClicks = []; diff --git a/src/js/states/preload.js b/src/js/states/preload.js index 1026a7df..2f7b846b 100644 --- a/src/js/states/preload.js +++ b/src/js/states/preload.js @@ -68,43 +68,43 @@ export class PreloadState extends GameState { } startLoading() { - this.setStatus("Booting") + this.setStatus("Booting") .then(() => this.setStatus("Creating platform wrapper")) - .then(() => this.app.platformWrapper.initialize()) + .then(() => this.app.platformWrapper.initialize()) .then(() => this.setStatus("Initializing local storage")) - .then(() => { - const wrapper = this.app.platformWrapper; - if (wrapper instanceof PlatformWrapperImplBrowser) { - try { - window.localStorage.setItem("local_storage_test", "1"); - window.localStorage.removeItem("local_storage_test"); - } catch (ex) { - logger.error("Failed to read/write local storage:", ex); - return new Promise(() => { - alert(`Your brower does not support thirdparty cookies or you have disabled it in your security settings.\n\n + .then(() => { + const wrapper = this.app.platformWrapper; + if (wrapper instanceof PlatformWrapperImplBrowser) { + try { + window.localStorage.setItem("local_storage_test", "1"); + window.localStorage.removeItem("local_storage_test"); + } catch (ex) { + logger.error("Failed to read/write local storage:", ex); + return new Promise(() => { + alert(`Your brower does not support thirdparty cookies or you have disabled it in your security settings.\n\n In Chrome this setting is called "Block third-party cookies and site data".\n\n Please allow third party cookies and then reload the page.`); - // Never return - }); - } + // Never return + }); } - }) + } + }) .then(() => this.setStatus("Creating storage")) - .then(() => { - return this.app.storage.initialize(); - }) + .then(() => { + return this.app.storage.initialize(); + }) .then(() => this.setStatus("Initializing libraries")) - .then(() => this.app.analytics.initialize()) - .then(() => this.app.gameAnalytics.initialize()) + .then(() => this.app.analytics.initialize()) + .then(() => this.app.gameAnalytics.initialize()) .then(() => this.setStatus("Initializing settings")) - .then(() => { - return this.app.settings.initialize(); - }) + .then(() => { + return this.app.settings.initialize(); + }) .then(() => { // Initialize fullscreen @@ -114,84 +114,84 @@ export class PreloadState extends GameState { }) .then(() => this.setStatus("Initializing language")) - .then(() => { - if (this.app.settings.getLanguage() === "auto-detect") { - const language = autoDetectLanguageId(); - logger.log("Setting language to", language); - return this.app.settings.updateLanguage(language); - } - }) - .then(() => { - const language = this.app.settings.getLanguage(); - updateApplicationLanguage(language); - }) + .then(() => { + if (this.app.settings.getLanguage() === "auto-detect") { + const language = autoDetectLanguageId(); + logger.log("Setting language to", language); + return this.app.settings.updateLanguage(language); + } + }) + .then(() => { + const language = this.app.settings.getLanguage(); + updateApplicationLanguage(language); + }) .then(() => this.setStatus("Initializing sounds")) - .then(() => { - // Notice: We don't await the sounds loading itself - return this.app.sound.initialize(); - }) + .then(() => { + // Notice: We don't await the sounds loading itself + return this.app.sound.initialize(); + }) .then(() => { this.app.backgroundResourceLoader.startLoading(); }) .then(() => this.setStatus("Initializing restrictions")) - .then(() => { - return this.app.restrictionMgr.initialize(); - }) + .then(() => { + return this.app.restrictionMgr.initialize(); + }) .then(() => this.setStatus("Initializing savegame")) - .then(() => { - return this.app.savegameMgr.initialize().catch(err => { - logger.error("Failed to initialize savegames:", err); - alert( - "Your savegames failed to load, it seems your data files got corrupted. I'm so sorry!\n\n(This can happen if your pc crashed while a game was saved).\n\nYou can try re-importing your savegames." - ); - return this.app.savegameMgr.writeAsync(); - }); - }) + .then(() => { + return this.app.savegameMgr.initialize().catch(err => { + logger.error("Failed to initialize savegames:", err); + alert( + "Your savegames failed to load, it seems your data files got corrupted. I'm so sorry!\n\n(This can happen if your pc crashed while a game was saved).\n\nYou can try re-importing your savegames." + ); + return this.app.savegameMgr.writeAsync(); + }); + }) .then(() => this.setStatus("Downloading resources")) - .then(() => { - return this.app.backgroundResourceLoader.getPromiseForBareGame(); - }) + .then(() => { + return this.app.backgroundResourceLoader.getPromiseForBareGame(); + }) .then(() => this.setStatus("Checking changelog")) - .then(() => { - if (G_IS_DEV && globalConfig.debug.disableUpgradeNotification) { + .then(() => { + if (G_IS_DEV && globalConfig.debug.disableUpgradeNotification) { + return; + } + + return this.app.storage + .readFileAsync("lastversion.bin") + .catch(err => { + logger.warn("Failed to read lastversion:", err); + return G_BUILD_VERSION; + }) + .then(version => { + logger.log("Last version:", version, "App version:", G_BUILD_VERSION); + this.app.storage.writeFileAsync("lastversion.bin", G_BUILD_VERSION); + return version; + }) + .then(version => { + let changelogEntries = []; + logger.log("Last seen version:", version); + + for (let i = 0; i < CHANGELOG.length; ++i) { + if (CHANGELOG[i].version === version) { + break; + } + changelogEntries.push(CHANGELOG[i]); + } + if (changelogEntries.length === 0) { return; } - return this.app.storage - .readFileAsync("lastversion.bin") - .catch(err => { - logger.warn("Failed to read lastversion:", err); - return G_BUILD_VERSION; - }) - .then(version => { - logger.log("Last version:", version, "App version:", G_BUILD_VERSION); - this.app.storage.writeFileAsync("lastversion.bin", G_BUILD_VERSION); - return version; - }) - .then(version => { - let changelogEntries = []; - logger.log("Last seen version:", version); - - for (let i = 0; i < CHANGELOG.length; ++i) { - if (CHANGELOG[i].version === version) { - break; - } - changelogEntries.push(CHANGELOG[i]); - } - if (changelogEntries.length === 0) { - return; - } - - let dialogHtml = T.dialogs.updateSummary.desc; - for (let i = 0; i < changelogEntries.length; ++i) { - const entry = changelogEntries[i]; - dialogHtml += ` + let dialogHtml = T.dialogs.updateSummary.desc; + for (let i = 0; i < changelogEntries.length; ++i) { + const entry = changelogEntries[i]; + dialogHtml += `
${entry.version} ${entry.date} @@ -316,4 +316,4 @@ export class PreloadState extends GameState { window.location.reload(); }); } -} \ No newline at end of file +} diff --git a/src/js/states/settings.js b/src/js/states/settings.js index a825023e..d5584c52 100644 --- a/src/js/states/settings.js +++ b/src/js/states/settings.js @@ -12,7 +12,7 @@ export class SettingsState extends TextualGameState { } getMainContentHTML() { - return `