From aff44f3f18d29f529894502bd610c59a2a4f8c39 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Thu, 11 Aug 2022 13:10:44 -0400 Subject: [PATCH] Make nh work with eye (partially) --- .../AchievementsPlus/AchievementInfo.cs | 3 +- NewHorizons/Assets/eye symbol.png | Bin 0 -> 25663 bytes .../Assets/translations/chinese_simple.json | 6 ++ NewHorizons/Assets/translations/english.json | 3 +- NewHorizons/Assets/translations/french.json | 3 +- NewHorizons/Assets/translations/german.json | 3 +- NewHorizons/Assets/translations/italian.json | 6 ++ NewHorizons/Assets/translations/japanese.json | 6 ++ NewHorizons/Assets/translations/korean.json | 6 ++ NewHorizons/Assets/translations/polish.json | 6 ++ .../Assets/translations/portuguese_br.json | 6 ++ NewHorizons/Assets/translations/russian.json | 3 +- .../Assets/translations/spanish_la.json | 3 +- NewHorizons/Assets/translations/turkish.json | 6 ++ .../Builder/Atmosphere/VolumesBuilder.cs | 23 +++-- NewHorizons/Builder/Body/ProxyBuilder.cs | 2 +- .../Builder/General/AmbientLightBuilder.cs | 5 +- NewHorizons/Components/EyeAstroObject.cs | 17 ++++ .../Components/ShipLogStarChartMode.cs | 11 +- NewHorizons/Components/ShipWarpController.cs | 30 ++++-- NewHorizons/Handlers/PlanetCreationHandler.cs | 51 +++++----- .../Handlers/PlanetDestructionHandler.cs | 24 +++++ NewHorizons/Handlers/PlanetGraphHandler.cs | 6 ++ NewHorizons/Handlers/ShipLogHandler.cs | 8 ++ NewHorizons/Handlers/SystemCreationHandler.cs | 3 + .../Handlers/VesselCoordinatePromptHandler.cs | 30 +++--- NewHorizons/Main.cs | 94 +++++++++++++----- .../Patches/EyeOfTheUniversePatches.cs | 9 +- NewHorizons/Patches/LocatorPatches.cs | 35 +++++++ NewHorizons/Patches/NomaiCoordinatePatches.cs | 5 +- NewHorizons/Patches/TranslationPatches.cs | 16 +-- NewHorizons/Utility/AstroObjectLocator.cs | 1 + 32 files changed, 326 insertions(+), 104 deletions(-) create mode 100644 NewHorizons/Assets/eye symbol.png create mode 100644 NewHorizons/Assets/translations/chinese_simple.json create mode 100644 NewHorizons/Assets/translations/italian.json create mode 100644 NewHorizons/Assets/translations/japanese.json create mode 100644 NewHorizons/Assets/translations/korean.json create mode 100644 NewHorizons/Assets/translations/polish.json create mode 100644 NewHorizons/Assets/translations/portuguese_br.json create mode 100644 NewHorizons/Assets/translations/turkish.json create mode 100644 NewHorizons/Components/EyeAstroObject.cs diff --git a/NewHorizons/AchievementsPlus/AchievementInfo.cs b/NewHorizons/AchievementsPlus/AchievementInfo.cs index d1789a75..98e6e5dc 100644 --- a/NewHorizons/AchievementsPlus/AchievementInfo.cs +++ b/NewHorizons/AchievementsPlus/AchievementInfo.cs @@ -1,4 +1,5 @@ using NewHorizons.Builder.Props; +using NewHorizons.Handlers; using Newtonsoft.Json; using System.Linq; @@ -61,7 +62,7 @@ namespace NewHorizons.AchievementsPlus { foreach (var fact in factIDs) { - if (!Locator.GetShipLogManager().IsFactRevealed(fact)) return false; + if (!ShipLogHandler.KnowsFact(fact)) return false; } } diff --git a/NewHorizons/Assets/eye symbol.png b/NewHorizons/Assets/eye symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..3634a28daa600fa21d494a0ed0c2066536f69b56 GIT binary patch literal 25663 zcmcFKgL5WM&(HJJw*9MZ+qP}nHm`24HmEhVM`0DwUM>(F5TAko?CU;hT6tBRxupmrMn^xp*BQdnLX0BA^n z`!I$80KfoBa%$rL;IOc;LPA1JOibY5;Bato_V)INhleRCDG(44K0ZEIS69D(|E8y> z2Z2B+C@9|E-ZwWleSLlK@bI^{w}XR&e0+RBAn@Vg;m@BxbaZrRXlTK~!H9k@xra)6>)3+}x%YFfR##VLWMqhmiAP38*4Nk1&(B|9U;X_2 zT3cJczrQy&HezC8sHmvAySw-I_mz~CPESwY-`_bnIJUR91qB6O@}Iw~e6#>&cSV`Ia>zz`4+;Njun>guYi zs~Zv$a&mHFZEdZmr+0UE7abk#>FL?q+w1J?92ORajEvmT(Ge6B^z-M>A3uIXMMYs^ zVy331=H})$H#gVS)y2ohr=_Lk=jS&xG*nhrE-fu3B_*Mwqu18f78Mm?V`Jmv<7Z@K zR8&;p;o;@w=SH;G|X{`=Qnt z#=C&m%{kwdEX#&(Yr4}$BJo7;o5H@fVj0J0Hqk4dl*_lqubp>%d$Fe%0feUGe^&xAU5N=}83&79vK52LJyV5_`t(4$DeJMe=@E3k`@^%rlcP4x)1~ zs-&bUKzk#{n4}Hgqe1*Nu8!7Dr-J!~CPMhTI#Ir2UJU4sy}{x^{wG<77|GOdy3h~e zG$Rqqx%xzHJ981_jkT*X-oo+&{GO@5AzFXQh75763($6^z;5F*k3-TlW{)vHmjH75 zmey{;tbk~Q)xP8r{MJ%LYyT*!)Jb0iX-5=CiuMqlIfG^lUwIzKPmGrL%ug40Ba?$X zMGKWpQK8I8v_OKhU=RZGVWs9jK#i!hhVD&7l$d~$>>3+hU+^L8A%M(Eqs1ds=UgVMJmyJ2EJ7%XFIqaBCHP4`fU<7zZ=TapK(*dlN>9fvkx4<2!OhJ6opYg7=cMW_O ztNCIfJ3okoK+(>@^;1qNaDI%5;553@qaCPeIF2yB^2D$&4#Y5W56SVa9lqnGV;IN5bTzKqk83Pdc=L37b@c3os3A zeytJ2mIC?f|2oiW;;(jM);LtT}`?S;NA!RSlU=ntHT z;we{Ke@z~A;VW*3o6Jiu6BU3givd`Y+fnf)Ly|Q;$iK*9A*Vz{ry!Z}KA_LbgC}T5-~;I>aw%!9lmtiRryC zTeO{f)Y4M?axV#K6%R&=KJjz*oj50HVXMLQsaQwIyI+}y+>G{t5m{q=PnkPE30Dmc zA3jL|W(_W_Uy*wQ{h1-&zrT>`H02)^ktBSm)VY75rzMj>Y@+Gs)T3nkN1qorWet&*@xpJIMO z@q@Xc_3t95WJ6=o)H9xm@$wSBrKHi|?1JXoP$(>5D+toNA#TaW41^durETWpkF-&? z!Jph1QOIQV;PI`=3M|l;J2{R?+lS+uUar+at{rS0!h|8bKx0zNQ?k%8Om1#HnPaQs z>O6K>Fg?am+2b&LQaCbz#>$@NuZ5Hg4B5Y6DS^lkfB81mp?&|RE3iZySZ}x0xY_*| z4K^?aRsQ@>zk%8pkXvU`z?%=y!fa3R4q0hK(E*`Q=AFzkW1xC0u09!_ap;_PckBQT zeOi9~Wk-UW!b?1pHKg^0G&Gov3?`?9iR++e7@<2W zz2*d=7-~CJt{I@Uim2L^mS6R&+o8%S-v~wp&I~Gk*taaTHj*E*aFpPb>=TgxU-$Xe z1D!Z?HZ?KCO{j}yY1cRYLqp-Tbqf2FM=6=n&V1@lUS7MvnIhqP&{0hk(io-?KWDSkODWu0y3~+NWGqMwVP3X=gh6 zH`pRmAF;o1_Rs@2pi#i&-9fwKq}7047v+7hSP-gZd+WHIWG=~7cwDU9RKFJJhUk<` z-{~Xs88aWfeT8SKFFWM^6v9VC# zax;-R9#j-8RZ{*-kQ&fo^n&MUd_B@lrG>VIJk$t`W%3AKD#*Z*5?WnOFB;Ov<2MMo zbMuc*@b@#If4?=hVm7+nGz1$|lJ}3j5#U@G z7(t%-p~>}H41q<7iLnx7riJAjLBgjr;rgfPx*fBRDmG>iQwzZ@&>Bo=k%2eTMf;^Z zga1a4hCP@nnEzCPTf*^9yfC-REsaM=r9Y@q3|I=#S~GR^Vux#@UsQS3_=$)BC?z>p zlPd!UbQPeW(|xBZs7i7gpa+%uU2S}jt(bI;=)I~g*F3jA!x@-v8i%rv36w2l?nkx= z5)1WaOXC2mVRcPmZnmlp<1ZovA?Gyp*n657kgnCWmR{yBW2FlyZT7V_S%>RvJv&Sw zpcAH(myLJ;jkJU!=X7{XUJhkvHqGGCs3&RD;(#l8@bb;^45P)wP_Jm@zZ06ouu@0> zE=;(C7_%jrs+X$|gW^k1CkX8m@i#J~R$%HyMU}i1lEq^gF0GK2POwjn#hjF$RxSU?uwiI_hOA$4X`YZLhUlCOpFMC=T0m@{F$)?humrA#i1x;bE_~B zi=nLyid<+R+0EGog~`g_C^NI(k}*SfdH!2Vy1EP(_C?$DckMMNa=7OoUrde4*AEZk z*4f-JvkvIFrQp?Bw)KE84ohiWV$-ovcePi<6a|*>+9D%=Ms`LeK7uJECA1dEl(PA& z-yRzw5P-d6%6SNp&ZGoKu%Tm%U?RX!Xeb=cDGB&+tZWeT%@(mUMdi+W>HHem9zUu& z76=`;hs-;i6`m;@1N!o78pL>pI>O1$q5&QtnWke*n@bLLqLKFL(F)Tu2ed9#%3_bS zr*_Mh2_nc()FEa)8Bqw%VxeeW&8U4;^`9>z5!|ll1==Qo8{nMrnAivA9=|*yHF&NU zH|h&aT?olm?(+azApU(Q(q`wM;kz!@GYrRH`s>m>Y-9f+@ag{HOab16*i8kW` zW;B^rv!Rv?BXoTmDCZB?&;JVNIds;~>{k&P=kt;bP0P~SKZ@tbBcsgz{0+>E#90zi zVwX#qjumDV7)>ut9{9-(5qgc6E+niBB8iKpNbe7)7%ZtX0nXM^vs4@AvsFIJ+dC0M z8^?@jBTt}GH7V13EfF=$XEFoySqqeC-aq?->thDkkd07bZ+tO^Bj-ea%AW#^QaX;# z`CK$uXQ%uyO#R_~PLv6yfaUZ`_4Kzu?a)?dU*NQ??QB#@`fCrn!O1=d!d>%}3t|_i zv2q91?_|EJ)=L_EEFLb{@Q@T7%wKu!3G2}W-J=#k1z-aw=dIu;gbDm>Uv*bm0jEOm zgI-W%tDC^SZd`m0`6`GIj=oEf9ONkfvFAGY6X7I;oM10B#a^7L49?~H%%b86*7^MA z0pMo%e*7ECjG!}*e$mTJfrlOB)$`w`RTIEYO*Amn)Ymf!93;D6>=$g=o1*)M!`UARnWQmLSF3t3& zHl@yK?<2M&FegsgiGsKILeL;_gtv$V8w~kmc38?J!dC z&F)+h-76g+?(YYU~G(C3F?w24o_Jgq%kffxgR2TlUQVQ8&mC_**nmzd{D!MWD7JpQg}j!iOH#CkW+L{aJw3n1cF} z%9uz7+~NaPZd0cBv*3{h?}D0@VcPLg{Q=SRqe=fP>H&4Dn&7kO3M6c=FW656PK2!s zV*Cg4jF{SP@l7lTWhNJf;>4EFuaI;yPNcIUAHnY2FYqCaq4&uCedqbtHnOh}9Zc-L zj(_$#QmY6G#$Tj$*)m9D9{FH>cm_P9XwlVM*>p##3fTs(zkfWar@rwn4tQN}%^Q3iOe+KwO~`-T3dN zaUK`WGPMA~IDSP-sBa0`104{;2N!4jePs#5-3L=YDa`cCV8+_nYxce$I3U3Yls0d! zWLpf|AUUp6It@cY(VcFIN_2?#^bs8cbD(xL=*1O%wPXTV0M{qtHD0E(0k|mTZCxT&=rymPK|-7BJloXgRz`rK~0Lz z2Crv;){+)oyN;kZw9N;sA1$BAGML7-WI%z0!095O-=-7nVo8-pR^m&D>V?9d^s$ZB zFGmE#4<{hOQz!`^u?(>lTw_J4T=Hf2^RB$15!~Rv_Vix%(?GZW}p`rk|KL{ELj0{ zsGT5iaN~t^K!#7A?;`Kvc2lT3GY7eMem9v-3C)o^hWVRvY1&pK4V05m5OT_?MArn# zoE_`u{phHYswadXWcw*1Zf_4=cc8I1GqziKdQw~~qy>|$?~JP3EFaJV-hY9yIs+Fu z2`?R_KhIB%`Z2oQP6nfm=(JHMQS&+{F>0qZte{ENojTn+i-U9CT#jGWM|=@{9P{`? z2-4w)z-b_|fry3$*8b(+JtqHSFuaEZSiH3%r|65OmD`@EsM88LJu*M26K=sms;$T9 zhCHscM~5lV6-U%bHX-uP$klVpaQt?tcD!QnR0L67K)pndK*9$(kT%*2 zHF6JNzw(*Y`*XE=N(+7U0eP@P%6v7<%F7dw_si?`i8(6!1bV{vi5g`49ooH~Fj_iy zpOKfpN$}VS^rnI%g-I1Kq84xkw_Hs?@SW;v? zp>t@-Cy zQwyotFP26I;%uOYaEIpbSLYSUj#d>~asEhxhgdfDbV86WD5eU|8qfmKIBRL~%E!X1 zKlj;RHRzY^dd>!>@y<_kio6&A+GMy0sZ7ke7>&NMrOCYH?~Dk$e~vsReX?Cbfkm&y z%YTVT@QVq2L&|TV?6CF)RafhiPoo7V^vZM8oCg}XVJcxXus^Sb zL=be?)VopKDNRB|J0ny@cKhqw+D(vJs96g_E3z&k-}WSww~Vj%?mFx3s$JvZHId%T z8()CwmHl)M#vd`sW@k}d$eusdJki*bLpqu%QH8gPI1iB9WyKj4;EwhUc%gwktAGj< zWL|{6?GYV2o0RA>;v;eMU0gw(MZk~d0}u*%tQIUi6Ct}GZrF46XV34{lQ$1Jcjue@ z9{b89V(A3XPpqlRt@O6%*lMIeTu`W4=Pao3&vB#2y9WI+j2tbLaH^@pDDWZ-5)l6J z<+>&D2Ic~6d|z#$Jn3@jgg$|<6ZXi#B1@N!+ySO}jd+k8UA6M&ZaDutG}X&f$o&$oWFxKPX;-N}ZGgBJ)Vc2Kr_kAdG!1b0^P+2eh1cR3RjFlv@OaPvHJ{7lI~JLX z;26b}61>2)aEc4ZJa8N=llQ`t@z2Hn`_;ZYd9&yZ(rrMfYCN(|oVX#`8w?b>JgN(d zh30RD9hWx=AL~V%x_dTh&?bcQl_6?~k?Jsk=k*?V$XBsjia#s<%Z6TKk(sTp@o_>T z8L|eQ`88`3H9j}GUqT~!1%wOkG-Wu#>dtQ(pVENF3|DXHDat?x%4GzsGXM4>jb5#g za2~};Dvm(cYz%g7hAZ$Z#+=4H$oTM_-)$(lE&L7O5yK@`$Sn6svmwrwDN{fdxW8PO z3ssDY+gQXKCovagS!F~_<=zB?{pQm092VWH5alRpM;t}i1&%mauylH=Kg|stB`Gl0 zpBIAH94}w$$m$uvgBTGInmSHQ>Ck5RYv~cptI5q6`+GKuyT&PFXYq#P2HH+ol`tP8 zXHQ*O08W76kji?DXJ3KyqLrXhPrkU~a5z$RDk;0>WMIQmsIpv?uw&o+57d`oOzd9b?X;14Eo#Z6AX)g%IxZM{A}c@6kTJluyN z56AI8bDO{$pOq2ExAgU_v_2R~NK^`*nDjFaamv6SFc2v5O`-LYQ23tCU2Gbw&LQyi zkCHZQM2^lW!(4$0g_1;mSsWGHe+SUMdWI>ajiADMoEb%xf`8qTAL{<(C?hq4(mT-n znB&}?xVTat`xISOlOvJjAEvxib%;nH>u=4%sZMy$jqgwc3eV<{wFo(ox@0m|*7UW% zvnJG6(6vS96%s51s;T6OexdCY6>WZ5W+ihDjfXL#K;07mhyC9x1WcKD$|}3tYFbZr zLdoCfVHh*$717^Ne+4E-Joa9xA(Al@oFAQwjI1~fAK*Qm?!2Z#m&T|8>;4oTSA%n9 zbmktM0A2J#zGrl$f*DQJjMTpnT89#j_=Rbe$`3;k#ia)j$wiAIoy zMgC&T_#Ksa5Hy>q5Q4l)Y;7=R)9r#xV;Myt>8{)*6x6#Aa+i+98;;+)Ht!(F3-UQ! zB>S0=Tec2LFJ}{y7ToNSi*}6_ z@l7W$;`U(3C!stYskXZ&!}t~Ctx7?IJ4g9vIny{UG*heMb{ zlWZk4KK0tQG^|oyd~uMhbnygc@+<{nrrQ8|334N{2J<*RhR3(OO54_%%IbDyk5?yD z`u71A77_DSQXJ1IKtE7BD5WT$6ftsq^?7Xip4&b)2NtI^JqR0-!|j*N>#1W%rR@)N zsp@%Cmp^+4j!t+xVrxefNkSZ8fGwnV_X$$jhnWD9ZA#QT(({9bk3({V8{=#IOztw} zB?cKz5IeUa7k97LA9{#U+uAg6a6qt+TyQwm zKA3Uef1<&M4tT!Kb&N@9}#z{3LO5@|J3B$bx=qx5`Li+Ra6nVf72T$BnrAh?!40m zwJt*XMczT!Aar_xN5;xSyacX zyqEIx?4n{l@cT?^L+)Q?)r8y?g)*n4q968P(i{rHV3veFpZb7X25yH<;6)uQC*tk+ zNabTyfz_p}9tk&`WU=3s42h#Xy0KeuJNpFEylGACdZH1?i|;&E%A17EP$C*))Z}P{$yGo>y^$uerBq7>C*2qPqK686LT72jMQjKy81h zZ@RHqEX5T^E-am`I*_YuD?(Pb23Di;xhz;|{(7K2=!=Hpcgz!o01jOMl90$x{Iah2 z$E>JZ^Ei_JIkhK8g+;GPG0<8PN6CL-`6NwT^;(J;HQJVPg^s9K<1ZI83eP=9U~lM& zi?xsqm49@5v}x$*=QE6Dwe?Bu;^&HhR$@Sy7Z4kD|oaBpC5)~g6rxG(?SEdh4QCUho=4zT*7~4=l(*w;M3Kyr8uK;LisJL z*{$uqYCDHvO6~#H)k9H`MuMGkq6C4LG1IVYlHxJeG+GdH12#z(;;fDw7Wn9tPR(;rhSS8My;i@&% zXnQi`u{XLqymA6M^XajLR>&hYQeLk)dugNP0mH3o%IYi@3==^u-))7O;y|6|PuVCSeE{+0xGqr)u zXtZ!>IM0s%7BLtLmO+*58h)3HVl72o1arW-baDuAr4oqb=dX3S2;r2SHli3}=-?jlrCb!*>_1YyEYyAk*^W$Umu0zbxJG~ zRFrc&34Ex#+r*Fe{;>dGq`H#EfUXH3pwA=q2Fm{=H?%;WjUDbmyJTN3{sG>YgT#L^ zNEElGQZi7^>(0n^mRQDK4bt!}>(&w6+i+*wf>#HJumwS2^`O0i1x(WDJRw?^2)BH0 zNR2$vv=-j!z?&=MS8o5o*w`awbehw-hM;m1u4Y$)uXjTnbx)k1w*Aw9KW(Brnms3L zG?~u!SY5OguYzl(>PLq|HRjXJ@VCpQ-Nq0JYQn%C_tV)#q9O1+{Yegfo(1r$oJ32b z_brDYK@Mq8rxV+z1*?0k*5klLu%l?Tc8or^I;fYyY5fSanP5!%_Ecz>E;7ZD>j!6t z3!alCp+raAw!a!F|A4!Tgk_#-Gmk0eYwbYbQ*j_4gNi&NYlu{xGx|hWiB2aO?`k=A zF>npsb$ddJWV7lR29taa5v{{qNzcoBGIp7YG~mfPa>9xyL}uL*ZC-|aLQNCm^;q<$ z-Q|NkMx;>*PD{Y}4BD-q2#KqV$`REfqUnTIGcc(h=`V~=;j}p;f%zRjuk7|&@uJ~& z-whFDA4y4cThAlPDVl!f6}odXX;Mf8p%o^65dDQaR%Q6fpY0WN4GYkVy`M2R@UugU zHE}lBWk2gZl>O+myh?<9^}lf6ubr>n&s&Y_3(ifj@#T~ItF{_L(}{k*?*k?Aj87Sd z23{tj9DAwDo8goIOAT6r;HsOJMis&s$icY3)P7s0ZBPgvtXiV;;(^TfBL}V`4OcST zKR+O^;5%l9rr{aS)*}ce89R-a6vyTHm2XApn4cR$(-d$F`s`DLmJMDY=8*6Sm7Xl=RP==@mHU zQgrg4k?;&&c23DA3%+Bj4hC7_#lS5htLKAk+?|2Fv&>y{r;lVX@P%e3Hlkksc5DrS zPheWPH8TsGZAgp^R+P)%CM&aba{hF|ruf^jtw!=kJ*YO2e8%oEgUZ+gocyA$+mUly zA-kQdY4N>_@u`Myhbv8Xi(q)!Tr?wK(gj3m0Jm~VC^>&;Hk7TcA~ZOL2h3^fO#KtL zhPFk<*+`a+5Cb($Q*9PqGE1R^++_&weD5YxL$3m~C+H97&R^s{HB+BA@I~4rV=iPv>_$b`U4M2rvJoN}fIfz1>+w%Z0uXrrh}u5$C`y53HQGCRq%qai zuR}1z4DzcFJJ=*L5=3_DXYDuyK&eO-_)@_#UVa~&9nVcLDiJW}6;fdlX(R*E|3a9( z&&J4X3Tt9n+V#Is&p&%2^ii)#S7izAz@ zn$k7S-fY4xZRiWhsR7jThM*#CWVcqc)0OEe*|eO{OE@YATp!y?BrgUBJ+_eKYe_~9 zII4p3zBY*_DHVdh#D=iVRKZ<~gYiY+5;6SZN^-^8n$}vCQu1p~6JGwV;@js!xf~fOg;@TxJgP<(RYD@SD+|wb`(2?9F zStA>|689g`4P{#CYyXn*noyj72$w{{gxEwP0<>9Op}SO~Cr*|PoYD0mD!oz>*6J?a z!T$5@wLU(eS~*Sb1n=nJFKvc7S*7LMoZ%#4qN7u)zKdbj0=54)>kEV)3i#P%IZ;*6 zh_-S1tajw>y{012ZdxDDi_!TxH)kDd+Eyx`jVScZPT=G=A*N}t#RM+PRPGdXlcSO& z()LEFvc8=txerZOYPcZr65!zt+J`gIN)zYN@B?7;n@Nx!1QU?K^Nw|~O8UV}Je)~OBFY5=6mz#-ZBiEE?`ewuI5NiT6UMDmeW z(TKlpO_42LwmNZ*|M2E*^w6+t`AR~;tUMM!(%R>}BwR^a{lnRR99{I-uTh;TSNNS8 zf09gOJ!#e)md?WkNbs$REuhvjvNT)YH=yfH<%JHuc%XAJ747$uh*7Y;xYpmhse*rL z0S5Yf{)`3G?d4dkUU}gU$Hnygi(51D)YJi#HWup0HqmY*J#9iFBFNwWECP5lRA)!juARMhE~qOH{oQjROrbm zZ6+ULthdm1*}M*CVep+6T$w;Q_c|~dbhmq4X1#n{{?MDfX-*Glv{Y&j^haDeqYA4z zjGiZ#WiY(saeKNbx6-X5Ui`{7j`YQ?nk?m#d8WMM=O~^sGY}^Em$!ObIQ?q7jrX;2 zwN6>JS?v=`j+%y}T%W6?jj02S?V<;y@`IKAe6mCLe z3Nu^^nJciwi({rvL<-9n2@cLCE^^h>>%tBS;49wKk=f+FbAQygrbO&k@jnU%ebn zC}XGP=sv0>uaZr7Xz5>|-1hg#k#$RyW6(TtTM42ZGw$%ZizztAuSghlY4n^aCv!p+QF3mOJ<&WGNik@deV&L zHt^)N&<8&W-Dm+HwpV+U9(futscVPTmu}>(62K%EQ)H3v3Rk)tEd34>JNTM0LPt&bYNnzJpRdOD>6wXy(`1wyOOX?8Q4i9%S(tXyS)Q~Gq z6nT|6Y}t^@9!+?bElf}9+;nBDL#0;|GG>NI8*8UsQQt5{OP_wySQLU|8w|%n*_D!%wV zg~HyPwo+4MOUbp8Gv$BK*}Z8**(&bhN&CZ+hv4x_ABWv)_v=$q&1h_e-r3Ur75&>=n>DMO)xT1S(Rc#iJqCM0L8Qe*DQI{$PNb&h z=GJ&8r}~BlR~HwIxpKC05ZZU%Oo5b21-yrgi&K4TvshqzU1YvtT|7S|I<<<4+4ay; z)iwW*%3`p?uQt=s5AE#rC-1e2^}EAY#}=LX{tY~J8D^4y#S$7UYUIY5MSY?V+^d3_ z4_b{V8o}Lt73|1BxU;Hr?yZB?{oJHkdtt2IVV~80UGh+*fEeffr5E09FG4al? z2(J%VE#r^F!?(A8SkT!X85Ew_abCZ`xzZ)}wdqhG;#fkAzY+Z`REvCnQ^;i5wTjcM z%Zl}8axuI2fA7-Y(yv|nB^`r_;3x31-9yQEol>padSQFLnqdXU$cpY9)q+wR>%>R= z$u3A&J_b~~(L&!XV6E0bpExnoFnGemY@M5Hg^o$_l`Qs+J|nLmL`c`D>D`rCqN+5+ zc%qOAs`8Q5#nuRnHgzVJBX?YFn8*FI`yM&j^zKc;pEo@w~pJv=-W;eW)( ziVdK^a+^`%qGq?AC=N^Y)qbITQvJG}pa|qWRYa%N%^G2p4(!Cfv~kyII2tB)&L|uO z<9kH4x>pQ_Ja3)O53JDIv#>2qrM~YQJ=BR`nV*Qr%upuW?mEYH) zZL_s?`$YNEwueu*?dYzoO@>!cZ?}US5cUo;%9>@!hjwg|Jl(^@LxVj6zbLT-(Thr9m zHisYNRREfan2kT>88wcy_S+vXw+{roO1HTW4$IZ@j&EChuB{@c8UhRq^9%tODxPe`uLsRS7SxOZB}Z%ivJYm3#iw9 z?GGnSq~l%fv|T4$ZXDaMshG(fPS@2MUKX8l1^DzOjmJfU+7FGEGJzb|^Gr&W6B)#`5@nqe-+}%QIW4w5~JKxvSzKLZ4i5LvCQsr>QR?_Er zyRk&%BcF!s7xXZ#U*Yj|m}JC@5Y{ zUQP3Q$XB@sA{y}!nb`s;n8FCG6t5Mj2gbS(8(}4C_7KS7p>{k$xu&7dJ9;vNk2SNXxkeYCYI}QY!j9 z;V|1QzCD_b#%-(@tR1*u&}ujeK&NhDq*8k1>9qK!1Izaom^b+bNw9HHW=c@v=!MMG zH-lsH2zb;hQpQ?w)nY{AP*;9+%h0ds4vPxIBz@j)d8I*iRu1YnOW~dbJdl+8*9{OA z4hm9{-G3k|wws~uve$Z~5gu>kT=VWK$DO;Eez^=>Aia#R9gsb*(#0Idif}1fFvItR z`A7NmG(g2e&(^UW9V=aHOt+;qSGCe)l?HV$z30oQ^$M6y2TFs+lRof4y!>egP7sBn z_MGSik-vYFjSNpcWgc9vof*%4DAFzl&O6@B6mRct$Ae~Y^*Wo4hiXknpYjA;ymmsN zQf1|P42ma;fnbmiC(MT*uOSda{C-nlLv%GsRZcGAhq|F)wPXt>bAAHJ26NdjM7KM? zs*13veClVX+qygzbydB-8lAzq^0;-IPii9J7`)zI+PkbV7H>t>YdlN`7+S}N)G{VY0=1F3B1jq;taM<&_Jyv#Bm10duY`^t9)<;sb^4>xF z3`aeZ$J4mEbfl+;+ec;VR(Bl_h9k-D=(JSowD4NmJYIkM-SrJcCg2$wU9Q_FJm(0w zoh?pAL^?awH%lc=my~MMtd}br27cc-?esIXwEy^Mz@VC!55zx)a&ywjufiT`u6Br5H}-hvVjg zOA3cVUpNoRy^~P1n6fL-Ga71*HzI5@{_$2%rRiuwhZC=j;N$*&{Aa%B&0!u6|b80e6*!!i&Um*yJhC%o{mk`ESm@ zNV_H^H+E`$4#x^@>v-}u-Z*oMih|lJO>gc-ltS@(CV8~#Zs+; z$NqmFWWg^#l%T(Lld3o16S~76HU$^eVUZRS92Vo`D#4?`8}a+w>8*WF7sh(`!JUPb zDlY6I(tPC)R*4(FCu|rsJS50-q7emrnW>MnyCt{L8Ey3X-ug!CM{SS z`uZbj#i29Ve4`avjk6hUQkj}?`smtpQ#e%j{y})_Re(q4%VlAzsfx&FBtlFwQcOHt zjJ$K0ra6}Wiu}SWlIFbb`eNDYrj8;*aaI?v{%#54i;Bu4LUby+g9@2^PiO?tJW2jA zy<D8-n@1V|6SD|V9FKpA$s=@R3R=GZWlA+JGR)ZV-NgpjC=Qh6x z=22~B9QL2~`Ru$`%BZ**$twhQRgUWypTn+wsf3Vhe><{nuKvaDMu$gwY}7N$dC%ca ziv3hP!Tg3@tf?Hkp@~CX5<7un)9r;9ZFGA`rVV^REwNhZH4%{9hh+h&whb)p>w}h# zzG4Kw+#TLVlsV69qdilshrvUoh_Ta_s6%q9)?6(P|4XUd73!N1Mh|_zNp7z;Vwl~$ z!(EjK?Jn{yNN0Z-0xmx|pVK0A^EWC6t;QDk+rxv)pFaAQ}$za%K@vK5Hv$ zuSY=TMwH_+pBW_{jB(v_5_o%M0WG}L9h#Qw$`U&ossU3b+G1yy8Itysd+j@M+#ipW z$ZXjokAU!4EZ@LvsjUT$HgLV#iz}KAT>X*i6nDTaNF$zdy#UI3F$VO?DocnX)iD*@ z)N@^c5<)}*vrA6_<}mYpb7b+E1!omqOM8TNbiQd;bE9*!uH&nhp8Xy7r#;|5q$kRk z1-(iw(VZHWx<`WHPQY5vhY-#&M@@lO<+{M1Xm`KfI$F}cF#B!q6#6Ne&GS^3!O(s6 z3EZ4K#Eci-=g|k1s>-yqTI5FTIvIu4-T+r?nzzbOnT16hr3B^4XZW?$k#*xW2ro}z zXh9DXY63*Guavp$8+fL^LG<13txN9sR`<~-SBE%9w;D@vB*BD05Xp-{w8i1~6Edk- zp(Z(z#`$NKGT#s&>gZrW06A)q=Hu6feB(~ zWdk^(kkwk637TdN%~^@LX4{Cl)|L;jX36F@t(nz4WrdAbt&$#zM}>J968*!=tdmoG z?m9aPK+Q-X88RY1LmB>GuN_j>A5$0>P`fc3Cl$FIj?hbY~DRq-ezIWsocbs7z>oL zo5m(Ym*1xUP(B>6b)nPnn&`I;!F7N^qD9Bj|J8QRZIyUm8&4-q=H!#>WZN}alWn`n zwmE6CZQJH#O}1_R`abXBc>(ve*4}^Zy{>zGZW(?BOKd^TJ8F1tB3;DA#}@!^j0xv? zf?x&DUG{XjmN$<6v1o#69!eLozL1GE-f{!(H!nGjl)@4t6lgo+W1EB1ilgc7n%enB zBd+HlnEK;a35ccZIIO>GJFTgy2gAxm zNxts44mr&<_bz}L8|G$n=|*pXm}Srw8rvDMiglMuugoGy2S;NtJ=psGt*T#sg5#5**HLES~wvTxkU zCNOsClc|VU937%WO)UZ6Dl_Nm)PARdMMU27cCP?A8 zuYMcAN2Rmk!WZTE7Sx&1N;48gz))A7T+?Gh(X_3QktO=?GpQ>q+xM@%**~ECw!(xA zlSa4lNHy*2#zj!EoMKy$E@Z&xwio`@OKXQZxPjZ}=erqY)CUS!ayoeo3@q}Rm|}+L zaInJs4{&*he#epx4%ebgFggaugt*U#lEK9{HbRBm!fCD83~Kh5pHRq^#Pd<5;jctl z$y+u1S}oSZ7( z(ITFSbo=t)-}r)*5H5Ud*a2SlG<_C4;<*;1!wI@5eVkvkVpIZq2;lcnA6h~ApFAw~*DQ{RN z=uGM83O@eUg!+KVLq)}>)F{tYLwEs5l?n3FMd8=D*Oa;X;C`o>am_vIJ59t z(x_QoK%TdspyQC)b51g0WIu`Wr>K1DE7#gIp^J!g5Q;KUD^Qvw%;3z|v`(+Vi`Ls1>V zM!O^rH1dkcn7=E(ZCKXk;-BAZDF9w(YMxJ6kmx6ii4Dftw7_6!)|&&M-F4pl;g?46 zFfkb~zp^Z0Gi~b-+mHFkDa9ncsg2R*G>z@P=;=d>Zxx394T~Z=Fe88_{Ltz3n93ee zgX9WgKQILw+BVGC=yA1_*6N=nsoF1W1u8 ziDA*NXjCLQLi>YFl;9t z*UDQ)qg-&r@yJpgVp}ufGz7tzP)aP^6D{qptMTDlSjq1ZP1f{**4!TgZz7cCBd#t5 z9C?qVFW^<{B6Qfw6V+R)G`3TyXLHX&h2Uo0SfhhCJ}8xi%Xut{)?k@cZA$vvLQIuO zN)Ysq2SmTQLoELK5*`~t!0M!T)B;H%R$>QP9Sp?5WF5q&%lAQJU8r3-b!#Tzd9UgU z#IZJG<^0)%Z)4rdI zMAu}Dx6Z_VK5fe3HbfsAE|kdurw0s5LTh+VGs92;D7E`h{wuISmvBmziR#e(M3511 zA~2}r{ttf37O*z#;^0U@%29rg`?_xB{uHWCko$h>wy4}L1YtgDU2_^0!$~9l*OkIY#^Wy5StF@6t+bJe*((7qLs9(6B?V8qWm>p_kbV z`ys`xC|%#``V4Ch+8!$qB*B&rk<8RBo93}U_1WhA z`SAYs4hw!qXEfNBiNTTou8!{g^OL>TBH{eXkE6or z-;9MGM^(91uYwDZ8;L=()~LIn5O(7XB9BA=l6d~ON8xNG9v72$dnl>16UFbzhJ8oY zA8@xRQp=`Aiu&{@!>$E2z*|llE{JI#Y;Bauw=9P?ZraOCKO3yU37WQUg0Q|rm}v{R z&su5NO$zd!;m%;8*k)T=%)dl)!Qg(Vl&|Hv;#0@~Oo&g|?;4H)mA<{*r)WmdcPb+; zEEr*!`rY$l6XU9}!BY|~>^>C*5y<>W zz@{2IL+R4*#3cA(gB~c_YhlNWt^9<|0o`3lUw*$a&z43IKwCyARO`m!NcDCPrvetB z|7%w9)NK>3xVls+GJjdCn=1Ff5jlBfBeRwv1|6xcr6@PjzvN z^V2F8_MkTM9f+#>#a`$ZeOfEP*N97O@X|Tptu;9Dm0Vz^4CO+a2@%CDy6TXEfU;K% zJFDaos$;!NPKb>5&By*Zb~nB!3?!z+zaPBAdiA3m3_ucjoG?#=+_*DgeCF--Hp;cQ zUawNgAPd9d=jhVT=Qb_N?b5BGBsN8=h)ci=!%9&V6n zWutqYtYGRnp_e(KpOW2G5qV4|Z%6iKSdMOagpqsG;QkcmuhlBy+PE4#>&#XUF88$w zMz}`ipKqw1dsjqu_#n!Vu1&u>y*yI26;<&n>A)ZNSU^vj+xaqr3onXZ^-;QFyeIX* z%>$h*Erb#OPP#AZq$%&TQ_Me!x(QQ^Fd#uZfXwtSH9Sx}#La7QiD=jxQKaqc`_IzxaL>cj&Qm+|$_V^?;Tg68ZbKX2V5v5-clLec1Y zz7(A@`9!-_GJ%O)s>7_5=c%(Z>TrJQ5_A4^JdJ{{QM-b&+>Ml;ikcHkEG^=Y3Jd=L zLA|OU)%yV~)}I2?YPGUQ(c2lt;bg)WL~S8QsZrwgtiLla3=(>I7{Nn3?ywzCZ z?}wCe9?bP?XMNqsXm@7^4c*94+t}|Ubn{gu{Yi1|R0`!>si;c3Y0v&rCBqAf5EBc2 zV=s;}wL`sdb!Vcsr##jt-2dKI>v&EnaQFM)#(lAcD}Y{NV*Cj(GHf-Ru#8c^q4yZa zns^WL32j!ti_jh2I_Qen4^!#iZl#z*oB0oENZ>1xk6kuz30_e0I4zjSFFt{rGz01H z9?ZJo2wH0***T|bDhhm8165w5-xVRt-u0RRh>#8ZR@aFvcX+RMw-hlznrZ&wYoBE& z&tqP4MK{NmIiDHzYz>?+84Av*JgTC@Wewk0&j;&|%U}-c<<94ag*nneCVy{74PxVh z3v!Jf)`uReU{9Nd9o$_Nz;rVmsH5T+YM}yrBa0$weofbItGN7oaWT05pMmFfhYV^e zPi;*Je4(Q2RD*Egb~H1DzvE%&(S{#eAZls6cDzv%^&0D_w_YM7SRS6GE&WE#d`0qe zSfzo0jS8oC^`AoHwo;vMguy0`U!GV-eP9I4k!5I78HHFa;8+%NfXB<1#X_C~jB4ol zkeDAkoj_RvK!!jh%J9J7&3BK5-np$^{ zV_UnVWPgqhAI(D}C)C0<-wTHAwgcj4Z39&m`QV_Zw%K0Wlroj}<44ELXA9WDEiG~qLg)+hxv7Pi{C%?%Dd>U4Q{ z+K}whi<>l>{j>y+LU9p*5A$5Q08COOB|aarljV2&tvIC2w8{U#P5hT?x}Fq;j^GSgMn zBH;cvE?ujal_QRXU{30SSImq7g)*TRu($#1jpZG8H9V(pN|>k zLqmM+oq-20bn3(kxY-sGw)QR-V(CxpD0)WInJ`)VJ5JOaEy#2qEjj}2fE4~RfPWl7 zeT20(OcMvSKhtU}3Uw^%(?4p^Hq*q(G6g4W0%r!P7|^nduO~@c@!(C|J&fw^m1au4 zNXyJ^+4K!y2p!|w?EJ4ckU_DdMb8=;7HKXo?~-0sM0w~@g zm+EtP9xc)*!e3_Zur|Uj$z=Qjf0<(kOBRXYVE_l${cORbHKki?DZui zARNrSv2&Y~{>&|3b8HkQ2m$S$#v?2FUmju-wQc(MnbSbnLqVrj_!au@+K4^ctD+t1f<>>!Mn}pnL$U3eL(!7Lj zliW{BI3@i^F{JX#V)f1_*&su`5sl^X+2%$2tQ#vZB8Chd=5DPT9jG@Y??u8un6 zlOHsA)&G^(Zp2(i=HBaHhuwDoCAa9roO`NCXbu$gb2w-EFGtlf`S}L7ht%{YF~wTc zP$}U()@04JvKK1(w}wS}i=Nbf=aVVT4}^FHhu$LeMm(G2wH+B<78BMSr^GQSpPg(% zmi&HF8L+^~aoX96YkOE)cy)A0&%ebkoMSL=j@S-4m8`#WdGU8qu~yJG=c`YSVy{h) zzhZM*(jEDm0?VeFJG6Zvck--Wjo&EH)&#kA={ zy%!@M_xJHd1qC_xj#c$)Y+|;eT=vwtC}j$}wI3mh$nv1)6n(e4fENXP6wbaAaum)r za-Xi&Ivi#aU0YZ{EXJIi=)}VgXK(IxGj5y?8cpCNuJ4i1$I(iRgJfGSvGx1&cQI7Mzt^ZSngO~xzNY^4wvm%;G0K9JpwnBGcj_k!=j*)Q}uVCCtz)?W{X<8}2}y+8CMR^u1B*kN@` zHjii&()VEUAVh9KYI_ohk~V{!RG5t|Hp?-Gkcd+{CZ58}BLp19+T(mbk|l4NIi{OG z!y3#8e6`^s4W$d6^eVYIZFgJ~5e&*_4~P+!fQuvPGXJDo;!P(9@@CuEPmR zD)T)))$P>iEywSL(1dIGzcIz!2sc|yZAte`3V`{VhH)Npw&e8*1|g4y>^`30%z`P& zPl!2j1@bHp%cKSPBoJDeB|sad)yP9k*K=PaoFqWxusg2sbTu^kNPkaX6JNqS1P8($ zT`31@?y$K8I+I)fLtXwIFiaO1-2rfW`P!J-IwLo8ppbk`!Ks)zr)1l4SDD+CG!0;qw&JgM$G^-34lM3NT zbRZlRF?Ze6A6gk$ZOKLT;Rs9xEC=JQ-Udu=quSy-0ETk0bBj_Zvsj64^kGWc=*}%e z^)2<}q{K*mVoCZ9qix9n^Y3T$5-(Mqg<}cdqO^R+iWU&kiQ(;nDLV#9r#A)v3cmzZ zd9v^#;QLO4!ymBlP=`T9ft?i-{|l~`^@Mm7+JoZuwlE%T@08wN%8uyov*UtK6oE;& z$6g_4bJ;Evk&()W&oVGp%gtFYSuf#A5&kJzQyGy13ejuR=9cG}2;kce0KJLAFpthN znsQ|1Oq;5%#twt<;XM=Jf~!8s#qfu4LT%r?1^o$19GEoQP8!QIzVoeNm_hTmnHaZg zJk#HGITjfZ3~iCyU77#8bH$dPHbWM>@_Oz2CLy8k7iUZ5Bd|Ig6rx0lDN{m2fM*CE zbEfhbpE+a&%wW(dG};mEHc%yy7IfFMJ&T0b2N1A#TvGGlQ121fmZ0N{H18bSw#kJ=71Ha<~ngTn&T%#D#1|WnKR*;qsMfdvP~pLc&zA{xqT4 zsn*}v5*jnulp#X{H~ADqHM(kDnRSO|EN|M>wg=TwG4*%t3BcKFMM)iW)KTzaF1~ZK zUZ$lfd)Z&WDMFa>0pFC`UT~1)#RJQXqsOYj`2OW&XImHx7!E^9sJ)dhSy(P`n)0Q9 zf_wVSM(9IF-BvJ!od-pg(xkV@kv(AwUCc-bF%DdFdDf(?-S(8WX=oX%SrmcM6{PZRW&ZjKcayzs-O(@X3hhkh_Kbvv1Z{j+f! zxvryLDUCAXX=YG%)et|x&J%VY#1!5fEkY`Yu5)0{2;F0G>_})mfM@38L+-oSTzr<1 z#z&+YFIfDDijtpXU7Hk_F!k0m1?55Nj+Y7V&pTYZceYQLMImB9doki>cmrOOvn@H* zKckR1URi@3j>W~J5xj1M9Y6{xOQ}?T)n*{#yVtl@Il{$u4P=!8qQJnL2Fe=m$cQ;Z z5v~ISaCP^9xkc6&m4@s%ZfmDqfBPIeidYy9Pru@HV;sIkX zP;$-LY7U!K0VfB@(c-4m;M#PYDpCM_3?>>j0XQQ5Q2U5n+l&P_E3_w2rMwho+oJOw z+wH1kF-~wK!>=rX?q(fb9sdKq-=QZVQx&C+#QLDJV(MA@bk-@UNrC>*M&KRC{L*;% z^T-*yan%_Y$5KuN#q$sVN4U1bFrZD^;BuZcN0gfdeDT&p#alB+dFv{x zu}{ZKT?p_oLz_Q1e=18hgk2`a8}07;pk&4BX@NT%2mjx2zp7&f!Oh9|W2%TV zl>0l@dT+!%Vgg2Q= zr-qEE=V26SLFfcd?&bhoS2(VjAKtTvuZHjPMcmcOL6t#i?;wZ%(UI<)d)ez9jt{}qQx*QGh&5T1_Ri4WV!FtdEl!{VlLA4#g%iQU(9MeCfhniaD*L8dz zUIQMv?rVsfgRr|v;DTt|mPc2>w4-=YTO@hjkEDnr#UjiEN__D8Im|NMeR(q+<&F|t zGA5K0xTBYikz0&ry72GW0C^stZumYW>cdK7lz$N7DoLlU4)ebJRAFUR z{wL$u1uO{`3s!}2a(=60l#+hyp{?9M%OPW#g7{LoDrjH zfuRJl<2o5wXMNA$U9Wl}Z^h&a4a`9<&2yV+E;#HY=Ne*R{v!-DpIFGRrBBjBJ_875 z>><7;U1FiBx5e;ns!W{kyz4a^pQo5^^h!D@t$6lL!9a|)v?^^~58Q4>ax}q512`EJ zWNc8d#Sax090rE^)O5Cms{MeMWmG7<%xq8_`Q0dXE zv_QL3^-1WSJ*(OJCQHs<6IiJ%nLv8HXQAh7$FN zE0{$JcEN0mPN%EZ*E~hS;g=WLdako%A}RB<8SHKi$@WjpY=M*`pc0pj^A0UXs&}>Y zsFG=l|Ky5y9G3@fXFr6re!@o!$-wbJbg%XgG{63}`W(*` zeR$i$M8>nNN4qOcVmQvqB_iw)@}E|v&OPJf5SxdsimUj2g+XBFA55jcD1ZGSPv{|= z+?gLDF>xy^b&MNyO(6%Lv1P(|+cX;{&Q*Vm{m|yx$nQg88e~ z=Qs{*0lu2~d?B>O|1w;KT&N~J-rpfNY8FDwjkI8wb$hG?i187JBgrE?0%6Dx_y%W{ zS6F|h@8Cfu*t+{(M>=J^AOXIOXNV_!RLg|t4JO9sKmBuz)f9d%9_ptt1Bo$t&K=GC z_lbk;`g4>J#P}H59=uD}L(c?J$W4HYq^rO00z*2FzPyNe77|>|WgOI#082Mjn7*If zc`l==ic3nh6bi-ne+wfhGn_n%y_969(u?^7-=PD2ou?i+t;D&>do~b56r9N>3oV20 z@|JO7Gi}|>J_9?0%3Qo(EYKaig4P8mY18h+zL2*_AqVY_c_BKXWI&2sj#RN0J0MRx z{SDL%Oro%`zf&ddBJo zIX@`~rhGvb*R3nS$(mX93xk}tNL~-i5?kemOQFrw@u|c< z!^R1TmNNz-o?oN59c78$Wh%UR>&cKUSRO`dlK;fj^Fv>HpptdLoFp?94+s|T|JCBX z&PhUwmc#ulRFd^0&wm2-pMru4U;13-Y0^Q>CFq!wfRO`;;ju>I4Vg;Z&?0p^euHnP zzVPS=`Ey0Che{0ni!4v1ft%sb(?1w+qFtWBAXXmI2i{z;dzZ6L4cj-PMJ6H`a?AqY z#vHSDd8p7AQd%B7LNYF8Y6nI@yO=S5nOlQ(=TSYhrNrfqFGCOW5v2S)CPZ@Wc;f{_ zaz2|v{4X5?kp+WWp)0O6x#fr|p#_C*qY%EELbYkvOgH$_ySp$&8Z1QZTSF!QgVr-g zC4^pTEBDGyyeOLQD#RB2m#`&bd?kI)RjKANCz(fwwV*U(4LU~fEOBK!M7`WgoamEO6=#Uk*ONFkOa+1 z6`@?YJSSns@W_wpV~45}jpk~EaWgkNhZGVj+!kqQ1ldro-QL%aP+Z>OmM+9*q$dG z+DHG3tZi0Al2bB{qUj5q>4}Y8>6jRV;2iN6Mn^+@YcbY^Sj`4DOte*kU{|6wPA62M z<|`Sg-jYWD0{8GuNx$gF=Qe~P(G<2@;s8lt0w%Z^A3|VFZn~53(@YI+vIPV1fK2wg zgemfS4iJuY^iKI8G&biX7GH-zdW2Jh1iT6%XwhuMZ#y=8=|ScJDWU}+xb0S@jx8j? zp$?In{WAETALRco$$BNS!$zfa3-}FN3ja(>CjO2L_gir25Q)O5;`bw-&{|JySRNj2 z66Q)3ngD#+IP1)RayVY-`LtdyT%) zEJs{Qd~DE_LX5Ez5+!pis{PBpt>b)sG-=_YQ-)VWoMW|0RiSko7~2 zfWA|(2zlQ^m5Vbjy8MRy=ETcH>pzjk0?iXgh%&$(=iyJ8D1IsY4QsQeXa^M2!(vMBcQosE9SFx%DZu1qFN0Oiq{|2`td|99THk5Q?w>ym9y xTQu%H5Dy~4$&68k`hSW5_(~UW#EN(kX!C6m2PcCu`wBV$lN6H^trFG`_#cRl&#C|b literal 0 HcmV?d00001 diff --git a/NewHorizons/Assets/translations/chinese_simple.json b/NewHorizons/Assets/translations/chinese_simple.json new file mode 100644 index 00000000..74470395 --- /dev/null +++ b/NewHorizons/Assets/translations/chinese_simple.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/translation_schema.json", + "UIDictionary": { + "Vessel": "飞船" + } +} \ No newline at end of file diff --git a/NewHorizons/Assets/translations/english.json b/NewHorizons/Assets/translations/english.json index 62c8b150..82798871 100644 --- a/NewHorizons/Assets/translations/english.json +++ b/NewHorizons/Assets/translations/english.json @@ -11,7 +11,8 @@ "FREQ_WARP_CORE": "Anti-Graviton Flux", "FREQ_UNKNOWN": "???", "ENGAGE_WARP_PROMPT": "Engage Warp To {0}", - "WARP_LOCKED": "AUTOPILOT LOCKED TO:\n{0}" + "WARP_LOCKED": "AUTOPILOT LOCKED TO:\n{0}", + "Vessel": "Vessel" }, "AchievementTranslations": { "NH_EATEN_OUTSIDE_BRAMBLE": { diff --git a/NewHorizons/Assets/translations/french.json b/NewHorizons/Assets/translations/french.json index 15099fc0..1fd08442 100644 --- a/NewHorizons/Assets/translations/french.json +++ b/NewHorizons/Assets/translations/french.json @@ -9,6 +9,7 @@ "INTERSTELLAR_MODE": "Mode Interstellaire", "FREQ_STATUE": "Statue Nomaï", "FREQ_WARP_CORE": "Flux Anti-Gravitonique", - "FREQ_UNKNOWN": "???" + "FREQ_UNKNOWN": "???", + "Vessel": "Vaisseau" } } \ No newline at end of file diff --git a/NewHorizons/Assets/translations/german.json b/NewHorizons/Assets/translations/german.json index 460adc9f..0edde904 100644 --- a/NewHorizons/Assets/translations/german.json +++ b/NewHorizons/Assets/translations/german.json @@ -9,6 +9,7 @@ "INTERSTELLAR_MODE": "Interstellar Modus", "FREQ_STATUE": "Nomai-Statue", "FREQ_WARP_CORE": "Anti-Gravitations Flux", - "FREQ_UNKNOWN": "???" + "FREQ_UNKNOWN": "???", + "Vessel": "Gefährts" } } \ No newline at end of file diff --git a/NewHorizons/Assets/translations/italian.json b/NewHorizons/Assets/translations/italian.json new file mode 100644 index 00000000..5ed2e16c --- /dev/null +++ b/NewHorizons/Assets/translations/italian.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/translation_schema.json", + "UIDictionary": { + "Vessel": "Vascello" + } +} \ No newline at end of file diff --git a/NewHorizons/Assets/translations/japanese.json b/NewHorizons/Assets/translations/japanese.json new file mode 100644 index 00000000..b67fb1fe --- /dev/null +++ b/NewHorizons/Assets/translations/japanese.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/translation_schema.json", + "UIDictionary": { + "Vessel": "船" + } +} \ No newline at end of file diff --git a/NewHorizons/Assets/translations/korean.json b/NewHorizons/Assets/translations/korean.json new file mode 100644 index 00000000..6e23b0fd --- /dev/null +++ b/NewHorizons/Assets/translations/korean.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/translation_schema.json", + "UIDictionary": { + "Vessel": "함선" + } +} \ No newline at end of file diff --git a/NewHorizons/Assets/translations/polish.json b/NewHorizons/Assets/translations/polish.json new file mode 100644 index 00000000..d3d9bcda --- /dev/null +++ b/NewHorizons/Assets/translations/polish.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/translation_schema.json", + "UIDictionary": { + "Vessel": "Statku" + } +} \ No newline at end of file diff --git a/NewHorizons/Assets/translations/portuguese_br.json b/NewHorizons/Assets/translations/portuguese_br.json new file mode 100644 index 00000000..cac86858 --- /dev/null +++ b/NewHorizons/Assets/translations/portuguese_br.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/translation_schema.json", + "UIDictionary": { + "Vessel": "Hospedeiro" + } +} \ No newline at end of file diff --git a/NewHorizons/Assets/translations/russian.json b/NewHorizons/Assets/translations/russian.json index 7063f448..f5e22023 100644 --- a/NewHorizons/Assets/translations/russian.json +++ b/NewHorizons/Assets/translations/russian.json @@ -11,6 +11,7 @@ "FREQ_WARP_CORE": "Гиперядро", "FREQ_UNKNOWN": "???", "ENGAGE_WARP_PROMPT": "Телепортироваться к {0}", - "WARP_LOCKED": "АВТОПИЛОТ ЗАКРЕПЛЁН НА:\n{0}" + "WARP_LOCKED": "АВТОПИЛОТ ЗАКРЕПЛЁН НА:\n{0}", + "Vessel": "«Звездолёта»" } } diff --git a/NewHorizons/Assets/translations/spanish_la.json b/NewHorizons/Assets/translations/spanish_la.json index 787342ba..5a65346a 100644 --- a/NewHorizons/Assets/translations/spanish_la.json +++ b/NewHorizons/Assets/translations/spanish_la.json @@ -11,7 +11,8 @@ "FREQ_WARP_CORE": "Flujo De Anti-Gravitones", "FREQ_UNKNOWN": "???", "ENGAGE_WARP_PROMPT": "Iniciar teletransporte a {0}", - "WARP_LOCKED": "Piloto automático fijado en:\n{0}" + "WARP_LOCKED": "Piloto automático fijado en:\n{0}", + "Vessel": "Nave" }, "AchievementTranslations": { "NH_EATEN_OUTSIDE_BRAMBLE": { diff --git a/NewHorizons/Assets/translations/turkish.json b/NewHorizons/Assets/translations/turkish.json new file mode 100644 index 00000000..7b82267a --- /dev/null +++ b/NewHorizons/Assets/translations/turkish.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/translation_schema.json", + "UIDictionary": { + "Vessel": "Tekne" + } +} \ No newline at end of file diff --git a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs index cba3845d..01445351 100644 --- a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs @@ -36,18 +36,21 @@ namespace NewHorizons.Builder.Atmosphere rulesetGO.AddComponent(); - EffectRuleset ER = rulesetGO.AddComponent(); - ER._type = EffectRuleset.BubbleType.Underwater; - var gdRuleset = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Volumes_GD/RulesetVolumes_GD").GetComponent(); - - ER._material = gdRuleset._material; - - var cloudMaterial = new Material(gdRuleset._cloudMaterial); - if (config.Atmosphere?.clouds?.tint != null) + var gdRuleset = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Volumes_GD/RulesetVolumes_GD")?.GetComponent(); + if (gdRuleset != null) { - cloudMaterial.SetColor(FogColor, config.Atmosphere.clouds.tint.ToColor()); + EffectRuleset ER = rulesetGO.AddComponent(); + ER._type = EffectRuleset.BubbleType.Underwater; + + ER._material = gdRuleset._material; + + var cloudMaterial = new Material(gdRuleset._cloudMaterial); + if (config.Atmosphere?.clouds?.tint != null) + { + cloudMaterial.SetColor(FogColor, config.Atmosphere.clouds.tint.ToColor()); + } + ER._cloudMaterial = cloudMaterial; } - ER._cloudMaterial = cloudMaterial; if (config.Base.zeroGravityRadius != 0) { diff --git a/NewHorizons/Builder/Body/ProxyBuilder.cs b/NewHorizons/Builder/Body/ProxyBuilder.cs index 629e7570..efc2c70b 100644 --- a/NewHorizons/Builder/Body/ProxyBuilder.cs +++ b/NewHorizons/Builder/Body/ProxyBuilder.cs @@ -29,7 +29,7 @@ namespace NewHorizons.Builder.Body public static void Make(GameObject planetGO, NewHorizonsBody body) { - if (lavaMaterial == null) lavaMaterial = SearchUtilities.FindObjectOfTypeAndName("VolcanicMoon_Body").transform.Find("LavaSphere").GetComponent().material; + if (lavaMaterial == null) lavaMaterial = SearchUtilities.FindObjectOfTypeAndName("VolcanicMoon_Body")?.transform.Find("LavaSphere").GetComponent().material; var proxyName = $"{body.Config.name}_Proxy"; diff --git a/NewHorizons/Builder/General/AmbientLightBuilder.cs b/NewHorizons/Builder/General/AmbientLightBuilder.cs index c51f90c0..617b3942 100644 --- a/NewHorizons/Builder/General/AmbientLightBuilder.cs +++ b/NewHorizons/Builder/General/AmbientLightBuilder.cs @@ -6,7 +6,10 @@ namespace NewHorizons.Builder.General { public static void Make(GameObject planetGO, Sector sector, float scale, float intensity) { - GameObject lightGO = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/AmbientLight_BH_Surface"), sector?.transform ?? planetGO.transform); + var bhAmbientLight = SearchUtilities.Find("BrittleHollow_Body/AmbientLight_BH_Surface"); + if (bhAmbientLight == null) return; + + GameObject lightGO = GameObject.Instantiate(bhAmbientLight, sector?.transform ?? planetGO.transform); lightGO.transform.position = planetGO.transform.position; lightGO.name = "Light"; diff --git a/NewHorizons/Components/EyeAstroObject.cs b/NewHorizons/Components/EyeAstroObject.cs new file mode 100644 index 00000000..6b78ddb4 --- /dev/null +++ b/NewHorizons/Components/EyeAstroObject.cs @@ -0,0 +1,17 @@ +using NewHorizons.Utility; + +namespace NewHorizons.Components.Orbital +{ + public class EyeAstroObject : AstroObject + { + public new void Awake() + { + _owRigidbody = GetComponent(); + } + + public void Register() + { + Locator.RegisterAstroObject(this); + } + } +} diff --git a/NewHorizons/Components/ShipLogStarChartMode.cs b/NewHorizons/Components/ShipLogStarChartMode.cs index 2496bc01..5778ebd5 100644 --- a/NewHorizons/Components/ShipLogStarChartMode.cs +++ b/NewHorizons/Components/ShipLogStarChartMode.cs @@ -63,6 +63,7 @@ namespace NewHorizons.Components // Conditions to allow warping into that system (either no planets (stock system) or has a ship spawn point) var flag = false; if (starSystem.Equals("SolarSystem")) flag = true; + else if (starSystem.Equals("EyeOfTheUniverse")) flag = false; else if (config.Spawn?.shipSpawnPoint != null) flag = true; if (!StarChartHandler.HasUnlockedSystem(starSystem)) continue; @@ -73,10 +74,8 @@ namespace NewHorizons.Components } } - //AddSystemCard("EyeOfTheUniverse"); - - /* Ship log manager isnt initiatiized yet - if(Locator.GetShipLogManager().IsFactRevealed("OPC_EYE_COORDINATES_X1")) + /* + if(VesselCoordinatePromptHandler.KnowsEyeCoordinates()) { AddSystemCard("EyeOfTheUniverse"); } @@ -130,6 +129,10 @@ namespace NewHorizons.Components { texture = ImageUtilities.GetTexture(Main.Instance, "Assets/hearthian system.png"); } + else if (uniqueID.Equals("EyeOfTheUniverse")) + { + texture = ImageUtilities.GetTexture(Main.Instance, "Assets/eye symbol.png"); + } else { var path = $"planets/{uniqueID}.png"; diff --git a/NewHorizons/Components/ShipWarpController.cs b/NewHorizons/Components/ShipWarpController.cs index ed08e79e..3ff96a3a 100644 --- a/NewHorizons/Components/ShipWarpController.cs +++ b/NewHorizons/Components/ShipWarpController.cs @@ -29,22 +29,24 @@ namespace NewHorizons.Components { _blackHolePrefab = SearchUtilities.Find(_blackHolePath); _whiteHolePrefab = SearchUtilities.Find(_whiteHolePath); + + MakeBlackHole(); + MakeWhiteHole(); + + if (_oneShotSource == null) + { + var audioObject = new GameObject("WarpOneShot"); + audioObject.transform.parent = transform; + audioObject.SetActive(false); + _oneShotSource = audioObject.AddComponent(); + _oneShotSource._track = OWAudioMixer.TrackName.Ship; + audioObject.SetActive(true); + } } public void Start() { - MakeBlackHole(); - MakeWhiteHole(); - _isWarpingIn = false; - - var audioObject = new GameObject("WarpOneShot"); - audioObject.transform.parent = transform; - audioObject.SetActive(false); - _oneShotSource = audioObject.AddComponent(); - _oneShotSource._track = OWAudioMixer.TrackName.Ship; - audioObject.SetActive(true); - GlobalMessenger.AddListener("FinishOpenEyes", new Callback(OnFinishOpenEyes)); } @@ -55,6 +57,9 @@ namespace NewHorizons.Components private void MakeBlackHole() { + if (_blackhole != null) return; + if (_blackHolePrefab == null) return; + var blackHoleShader = _blackHolePrefab.GetComponent().material.shader; if (blackHoleShader == null) blackHoleShader = _blackHolePrefab.GetComponent().sharedMaterial.shader; @@ -79,6 +84,9 @@ namespace NewHorizons.Components private void MakeWhiteHole() { + if (_whitehole != null) return; + if (_whiteHolePrefab == null) return; + var whiteHoleShader = _whiteHolePrefab.GetComponent().material.shader; if (whiteHoleShader == null) whiteHoleShader = _whiteHolePrefab.GetComponent().sharedMaterial.shader; diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index bffe3fea..b0e45432 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -32,33 +32,36 @@ namespace NewHorizons.Handlers _existingBodyDict = new(); _customBodyDict = new(); - // Set up stars - // Need to manage this when there are multiple stars - var sun = SearchUtilities.Find("Sun_Body"); - var starController = sun.AddComponent(); - starController.Light = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); - starController.AmbientLight = SearchUtilities.Find("Sun_Body/AmbientLight_SUN").GetComponent(); - starController.FaceActiveCamera = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); - starController.CSMTextureCacher = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); - starController.ProxyShadowLight = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); - starController.Intensity = 0.9859f; - starController.SunColor = new Color(1f, 0.8845f, 0.6677f, 1f); - - var starLightGO = GameObject.Instantiate(sun.GetComponentInChildren().gameObject); - foreach (var comp in starLightGO.GetComponents()) + if (Main.Instance.CurrentStarSystem != "EyeOfTheUniverse") { - if (!(comp is SunLightController) && !(comp is SunLightParamUpdater) && !(comp is Light) && !(comp is Transform)) + // Set up stars + // Need to manage this when there are multiple stars + var sun = SearchUtilities.Find("Sun_Body"); + var starController = sun.AddComponent(); + starController.Light = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.AmbientLight = SearchUtilities.Find("Sun_Body/AmbientLight_SUN").GetComponent(); + starController.FaceActiveCamera = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.CSMTextureCacher = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.ProxyShadowLight = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.Intensity = 0.9859f; + starController.SunColor = new Color(1f, 0.8845f, 0.6677f, 1f); + + var starLightGO = GameObject.Instantiate(sun.GetComponentInChildren().gameObject); + foreach (var comp in starLightGO.GetComponents()) { - GameObject.Destroy(comp); + if (!(comp is SunLightController) && !(comp is SunLightParamUpdater) && !(comp is Light) && !(comp is Transform)) + { + GameObject.Destroy(comp); + } } + GameObject.Destroy(starLightGO.GetComponent()); + starLightGO.name = "StarLightController"; + + starLightGO.AddComponent(); + StarLightController.AddStar(starController); + + starLightGO.SetActive(true); } - GameObject.Destroy(starLightGO.GetComponent()); - starLightGO.name = "StarLightController"; - - starLightGO.AddComponent(); - StarLightController.AddStar(starController); - - starLightGO.SetActive(true); // Load all planets var toLoad = bodies.ToList(); @@ -124,7 +127,7 @@ namespace NewHorizons.Handlers // Events.FireOnNextUpdate(PlanetDestroyer.RemoveAllProxies); - if (Main.SystemDict[Main.Instance.CurrentStarSystem].Config.destroyStockPlanets) PlanetDestructionHandler.RemoveSolarSystem(); + if (Main.SystemDict[Main.Instance.CurrentStarSystem].Config.destroyStockPlanets) PlanetDestructionHandler.RemoveStockPlanets(); } public static bool LoadBody(NewHorizonsBody body, bool defaultPrimaryToSun = false) diff --git a/NewHorizons/Handlers/PlanetDestructionHandler.cs b/NewHorizons/Handlers/PlanetDestructionHandler.cs index 4d60a271..7649194a 100644 --- a/NewHorizons/Handlers/PlanetDestructionHandler.cs +++ b/NewHorizons/Handlers/PlanetDestructionHandler.cs @@ -31,12 +31,26 @@ namespace NewHorizons.Handlers "White Hole" }; + private static readonly string[] _eyeOfTheUniverseBodies = new string[] + { + "Eye Of The Universe", + "Vessel" + }; + private static readonly string[] _suspendBlacklist = new string[] { "Player_Body", "Ship_Body" }; + public static void RemoveStockPlanets() + { + if (Main.Instance.CurrentStarSystem == "EyeOfTheUniverse") + RemoveEyeOfTheUniverse(); + else + RemoveSolarSystem(); + } + public static void RemoveSolarSystem() { // Stop the sun from killing the player @@ -54,6 +68,16 @@ namespace NewHorizons.Handlers Delay.FireInNUpdates(() => { if (Locator.GetAstroObject(AstroObject.Name.Sun).gameObject.activeInHierarchy) { sunVolumes.SetActive(true); } }, 3); } + public static void RemoveEyeOfTheUniverse() + { + foreach (var name in _eyeOfTheUniverseBodies) + { + var ao = AstroObjectLocator.GetAstroObject(name); + if (ao != null) Delay.FireInNUpdates(() => RemoveBody(ao, false), 2); + else Logger.LogError($"Couldn't find [{name}]"); + } + } + public static void RemoveBody(AstroObject ao, bool delete = false, List toDestroy = null) { Logger.LogVerbose($"Removing [{ao.name}]"); diff --git a/NewHorizons/Handlers/PlanetGraphHandler.cs b/NewHorizons/Handlers/PlanetGraphHandler.cs index 20b87cb4..b31535d2 100644 --- a/NewHorizons/Handlers/PlanetGraphHandler.cs +++ b/NewHorizons/Handlers/PlanetGraphHandler.cs @@ -40,6 +40,12 @@ namespace NewHorizons.Handlers SunConfig.name = "Sun"; _rootNode = ConstructGraph(new NewHorizonsBody(SunConfig, Main.Instance), bodies); } + else if (centers.Length == 0 && Main.Instance.CurrentStarSystem == "EyeOfTheUniverse") + { + var EyeConfig = new PlanetConfig(); + EyeConfig.name = "Eye Of The Universe"; + _rootNode = ConstructGraph(new NewHorizonsBody(EyeConfig, Main.Instance), bodies); + } else { Logger.LogError($"There must be one and only one centerOfSolarSystem! Found [{centers.Length}]"); diff --git a/NewHorizons/Handlers/ShipLogHandler.cs b/NewHorizons/Handlers/ShipLogHandler.cs index 3d3a3f6b..11f5d2d2 100644 --- a/NewHorizons/Handlers/ShipLogHandler.cs +++ b/NewHorizons/Handlers/ShipLogHandler.cs @@ -108,5 +108,13 @@ namespace NewHorizons.Handlers { return _nhBodyToAstroIDs.ContainsKey(body) && _nhBodyToAstroIDs[body].Length > 0; } + + public static bool KnowsFact(string fact) + { + // Works normally in the main system, else check save data directly + var shipLogManager = Locator.GetShipLogManager(); + if (Main.Instance.CurrentStarSystem == "SolarSystem" && shipLogManager != null) return shipLogManager.IsFactRevealed(fact); + else return PlayerData._currentGameSave.shipLogFactSaves.ContainsKey(fact) && PlayerData._currentGameSave.shipLogFactSaves[fact].revealOrder > -1; + } } } diff --git a/NewHorizons/Handlers/SystemCreationHandler.cs b/NewHorizons/Handlers/SystemCreationHandler.cs index 16df0230..98e99ae3 100644 --- a/NewHorizons/Handlers/SystemCreationHandler.cs +++ b/NewHorizons/Handlers/SystemCreationHandler.cs @@ -25,6 +25,9 @@ namespace NewHorizons.Handlers SkyboxBuilder.Make(system.Config.Skybox, system.Mod); } + + if (Main.Instance.CurrentStarSystem == "EyeOfTheUniverse") return; + if (system.Config.enableTimeLoop) { var timeLoopController = new GameObject("TimeLoopController"); diff --git a/NewHorizons/Handlers/VesselCoordinatePromptHandler.cs b/NewHorizons/Handlers/VesselCoordinatePromptHandler.cs index 636de907..7cd1da78 100644 --- a/NewHorizons/Handlers/VesselCoordinatePromptHandler.cs +++ b/NewHorizons/Handlers/VesselCoordinatePromptHandler.cs @@ -43,7 +43,8 @@ namespace NewHorizons.Handlers private static void RegisterPrompt(string systemID, string fact, NomaiCoordinates coords) { var texture = MakeTexture(coords.x, coords.y, coords.z); - + + if (_textureCache == null) _textureCache = new List(); _textureCache.Add(texture); var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(texture.width / 2f, texture.height / 2f)); @@ -61,27 +62,31 @@ namespace NewHorizons.Handlers // Gets called from the patches public static void SetPromptVisibility(bool visible) { + if (_factSystemIDPrompt == null) return; foreach (var pair in _factSystemIDPrompt) { var fact = pair.Item1; var systemID = pair.Item2; var prompt = pair.Item3; - if (visible) + if (prompt != null) { - if (Main.Instance.CurrentStarSystem != systemID && (string.IsNullOrEmpty(fact) || Locator.GetShipLogManager().IsFactRevealed(fact))) + if (visible) { - prompt.SetVisibility(true); + if (Main.Instance.CurrentStarSystem != systemID && (string.IsNullOrEmpty(fact) || ShipLogHandler.KnowsFact(fact))) + { + prompt.SetVisibility(true); + } + else + { + prompt.SetVisibility(false); + } } else { prompt.SetVisibility(false); } } - else - { - prompt.SetVisibility(false); - } } } @@ -190,12 +195,7 @@ namespace NewHorizons.Handlers } } } - - public static bool KnowsEyeCoordinates() - { - // Works normally in the main system, else check save data directly - if (Main.Instance.CurrentStarSystem == "SolarSystem") return Locator.GetShipLogManager().IsFactRevealed("OPC_EYE_COORDINATES_X1"); - else return PlayerData._currentGameSave.shipLogFactSaves.ContainsKey("OPC_EYE_COORDINATES_X1") && PlayerData._currentGameSave.shipLogFactSaves["OPC_EYE_COORDINATES_X1"].revealOrder > -1; - } + + public static bool KnowsEyeCoordinates() => ShipLogHandler.KnowsFact("OPC_EYE_COORDINATES_X1"); } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index aeacc748..1af5e4a7 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -4,6 +4,7 @@ using NewHorizons.Builder.Atmosphere; using NewHorizons.Builder.Body; using NewHorizons.Builder.Props; using NewHorizons.Components; +using NewHorizons.Components.Orbital; using NewHorizons.External; using NewHorizons.External.Configs; using NewHorizons.Handlers; @@ -58,7 +59,7 @@ namespace NewHorizons public static bool HasWarpDrive { get; private set; } = false; private string _defaultStarSystem = "SolarSystem"; - private string _currentStarSystem = "SolarSystem"; + internal string _currentStarSystem = "SolarSystem"; private bool _firstLoad = true; private ShipWarpController _shipWarpController; @@ -144,13 +145,15 @@ namespace NewHorizons { Config = { + destroyStockPlanets = false, + factRequiredForWarp = "OPC_EYE_COORDINATES_X1", Vessel = new StarSystemConfig.VesselModule() { coords = new StarSystemConfig.NomaiCoordinates { - x = new int[3]{ 1,5,4 }, - y = new int[4]{ 3,0,1,4 }, - z = new int[6]{ 1,2,3,0,5,4 } + x = new int[3] { 1, 5, 4 }, + y = new int[4] { 3, 0, 1, 4 }, + z = new int[6] { 1, 2, 3, 0, 5, 4 } } } } @@ -231,6 +234,7 @@ namespace NewHorizons var isTitleScreen = scene.name == "TitleScreen"; var isSolarSystem = scene.name == "SolarSystem"; var isEyeOfTheUniverse = scene.name == "EyeOfTheUniverse"; + if (isEyeOfTheUniverse) _currentStarSystem = scene.name; if (!SystemDict.ContainsKey(_currentStarSystem) || !BodyDict.ContainsKey(_currentStarSystem)) { @@ -268,24 +272,55 @@ namespace NewHorizons TitleSceneHandler.InitSubtitles(); } - if (isEyeOfTheUniverse && IsWarpingFromShip) + if (isSolarSystem && _ship == null) { - if (_ship != null) + var ship = SearchUtilities.Find("Ship_Body", false); + if (ship != null) { - SceneManager.MoveGameObjectToScene(_ship, SceneManager.GetActiveScene()); - _ship.transform.position = new Vector3(50, 0, 0); - _ship.SetActive(true); + _ship = ship.InstantiateInactive(); + _ship.name = ship.name; + _ship.AddComponent().Init(); + DontDestroyOnLoad(_ship); + } + } + + if (isEyeOfTheUniverse) + { + var eyeOfTheUniverse = SearchUtilities.Find("EyeOfTheUniverse_Body"); + var eyeSector = eyeOfTheUniverse.FindChild("Sector_EyeOfTheUniverse").GetComponent(); + var eyeAO = eyeOfTheUniverse.AddComponent(); + eyeAO._owRigidbody = eyeOfTheUniverse.GetAttachedOWRigidbody(); + eyeAO._rootSector = eyeSector; + eyeAO._gravityVolume = eyeSector.GetComponentInChildren(); + eyeAO._customName = "Eye Of The Universe"; + eyeAO._name = AstroObject.Name.Eye; + eyeAO._type = AstroObject.Type.None; + eyeAO.Register(); + + var vessel = SearchUtilities.Find("Vessel_Body"); + var vesselSector = vessel.FindChild("Sector_VesselBridge").GetComponent(); + var vesselAO = vessel.AddComponent(); + vesselAO._owRigidbody = vessel.GetAttachedOWRigidbody(); + vesselAO._primaryBody = eyeAO; + eyeAO._satellite = vesselAO; + vesselAO._rootSector = vesselSector; + vesselAO._customName = "Vessel"; + vesselAO._name = AstroObject.Name.CustomString; + vesselAO._type = AstroObject.Type.SpaceStation; + vesselAO.Register(); + + if (IsWarpingFromShip && _ship != null) + { + var eyeShip = GameObject.Instantiate(_ship); + eyeShip.name = "Ship_Body"; + _shipWarpController = eyeShip.GetComponent(); + SceneManager.MoveGameObjectToScene(eyeShip, scene); + eyeShip.SetActive(true); } } if (isSolarSystem || isEyeOfTheUniverse) { - if (_ship != null) - { - _ship = SearchUtilities.Find("Ship_Body").InstantiateInactive(); - DontDestroyOnLoad(_ship); - } - IsSystemReady = false; NewHorizonsData.Load(); @@ -300,13 +335,9 @@ namespace NewHorizons AtmosphereBuilder.Init(); BrambleNodeBuilder.Init(BodyDict[CurrentStarSystem].Select(x => x.Config).Where(x => x.Bramble?.dimension != null).ToArray()); - if (isSolarSystem) - { - PlanetCreationHandler.Init(BodyDict[CurrentStarSystem]); - - VesselWarpHandler.LoadVessel(); - SystemCreationHandler.LoadSystem(SystemDict[CurrentStarSystem]); - } + PlanetCreationHandler.Init(BodyDict[CurrentStarSystem]); + if (isSolarSystem) VesselWarpHandler.LoadVessel(); + SystemCreationHandler.LoadSystem(SystemDict[CurrentStarSystem]); LoadTranslations(ModHelper.Manifest.ModFolderPath + "Assets/", this); @@ -315,8 +346,11 @@ namespace NewHorizons { // Warp drive HasWarpDrive = StarChartHandler.CanWarp(); - _shipWarpController = SearchUtilities.Find("Ship_Body").AddComponent(); - _shipWarpController.Init(); + if (_shipWarpController == null) + { + _shipWarpController = SearchUtilities.Find("Ship_Body").AddComponent(); + _shipWarpController.Init(); + } if (HasWarpDrive == true) EnableWarpDrive(); var shouldWarpInFromShip = IsWarpingFromShip && _shipWarpController != null; @@ -380,6 +414,16 @@ namespace NewHorizons var remoteViewer = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_NorthHemisphere/Sector_NorthPole/Sector_NorthPoleSurface/Interactables_NorthPoleSurface/LowBuilding/Prefab_NOM_RemoteViewer").GetComponent(); remoteViewer._visualSector = northPoleSurface; } + else if (isEyeOfTheUniverse) + { + Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => + { + IsSystemReady = true; + OnSystemReady(false, false); + }); + IsWarpingFromShip = false; + IsWarpingFromVessel = false; + } //Stop starfield from disappearing when there is no lights var playerBody = SearchUtilities.Find("Player_Body"); @@ -629,6 +673,8 @@ namespace NewHorizons } else { + PlayerData.SaveEyeCompletion(); + if (SystemDict[_currentStarSystem].Config.enableTimeLoop) SecondsElapsedInLoop = TimeLoop.GetSecondsElapsed(); else SecondsElapsedInLoop = -1; diff --git a/NewHorizons/Patches/EyeOfTheUniversePatches.cs b/NewHorizons/Patches/EyeOfTheUniversePatches.cs index bde6a789..00bb84d2 100644 --- a/NewHorizons/Patches/EyeOfTheUniversePatches.cs +++ b/NewHorizons/Patches/EyeOfTheUniversePatches.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; using UnityEngine; namespace NewHorizons.Patches { @@ -13,6 +13,13 @@ namespace NewHorizons.Patches return (Main.Instance.CurrentStarSystem != "EyeOfTheUniverse"); } + [HarmonyPrefix] + [HarmonyPatch(typeof(SubmitActionLoadScene), nameof(SubmitActionLoadScene.ConfirmSubmit))] + public static void SubmitActionLoadScene_ConfirmSubmit(SubmitActionLoadScene __instance) + { + if (__instance._sceneToLoad == SubmitActionLoadScene.LoadableScenes.EYE) Main.Instance._currentStarSystem = "EyeOfTheUniverse"; + } + [HarmonyPrefix] [HarmonyPatch(typeof(ShipThrusterController), nameof(ShipThrusterController.ReadTranslationalInput))] public static bool ShipThrusterController_ReadTranslationalInput(ShipThrusterController __instance, ref Vector3 __result) diff --git a/NewHorizons/Patches/LocatorPatches.cs b/NewHorizons/Patches/LocatorPatches.cs index 30c76cf2..5bc61cce 100644 --- a/NewHorizons/Patches/LocatorPatches.cs +++ b/NewHorizons/Patches/LocatorPatches.cs @@ -1,9 +1,13 @@ using HarmonyLib; +using NewHorizons.Components; + namespace NewHorizons.Patches { [HarmonyPatch] public static class LocatorPatches { + public static AstroObject _eye; + [HarmonyPrefix] [HarmonyPatch(typeof(Locator), nameof(Locator.RegisterCloakFieldController))] public static bool Locator_RegisterCloakFieldController() @@ -31,5 +35,36 @@ namespace NewHorizons.Patches { __result = __result || Components.CloakSectorController.isShipInside; } + + [HarmonyPrefix] + [HarmonyPatch(typeof(Locator), nameof(Locator.GetAstroObject))] + public static bool Locator_GetAstroObject(AstroObject.Name astroObjectName, ref AstroObject __result) + { + if (astroObjectName == AstroObject.Name.Eye && _eye != null) + { + __result = _eye; + return false; + } + return true; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(Locator), nameof(Locator.RegisterAstroObject))] + public static bool Locator_RegisterAstroObject(AstroObject astroObject) + { + if (astroObject._name == AstroObject.Name.Eye) + { + _eye = astroObject; + return false; + } + return true; + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(Locator), nameof(Locator.ClearReferences))] + public static void Locator_ClearReferences() + { + _eye = null; + } } } diff --git a/NewHorizons/Patches/NomaiCoordinatePatches.cs b/NewHorizons/Patches/NomaiCoordinatePatches.cs index 98f39af2..dc0e7bb8 100644 --- a/NewHorizons/Patches/NomaiCoordinatePatches.cs +++ b/NewHorizons/Patches/NomaiCoordinatePatches.cs @@ -48,7 +48,7 @@ namespace NewHorizons.Patches { bool canWarpToEye = __instance._coordinateInterface.CheckEyeCoordinates(); bool canWarpToStarSystem = __instance._coordinateInterface.CheckAllCoordinates(out string targetSystem); - if (slot == __instance._warpVesselSlot && __instance._hasPower && (canWarpToEye || (canWarpToStarSystem && targetSystem != Main.Instance.CurrentStarSystem)) && __instance._blackHole.GetState() == SingularityController.State.Collapsed && LoadManager.GetCurrentScene() != OWScene.EyeOfTheUniverse) + if (slot == __instance._warpVesselSlot && __instance._hasPower && ((canWarpToEye && Main.Instance.CurrentStarSystem != "EyeOfTheUniverse") || (canWarpToStarSystem && targetSystem != Main.Instance.CurrentStarSystem)) && __instance._blackHole.GetState() == SingularityController.State.Collapsed) { __instance._blackHole.Create(); RumbleManager.StartVesselWarp(); @@ -56,7 +56,10 @@ namespace NewHorizons.Patches __instance.enabled = true; Locator.GetPauseCommandListener().AddPauseCommandLock(); if (canWarpToEye || (canWarpToStarSystem && targetSystem == "EyeOfTheUniverse")) + { + Main.Instance._currentStarSystem = "EyeOfTheUniverse"; LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, false, LoadManager.FadeType.ToWhite); + } else if (canWarpToStarSystem) Main.Instance.ChangeCurrentStarSystem(targetSystem, false, true); __instance._blackHoleOneShot.PlayOneShot(AudioType.VesselSingularityCreate); diff --git a/NewHorizons/Patches/TranslationPatches.cs b/NewHorizons/Patches/TranslationPatches.cs index b938e8f6..87bb031f 100644 --- a/NewHorizons/Patches/TranslationPatches.cs +++ b/NewHorizons/Patches/TranslationPatches.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; using NewHorizons.Components.Orbital; using NewHorizons.Handlers; using System; @@ -16,14 +16,18 @@ namespace NewHorizons.Patches if (ao == null || ao._name != AstroObject.Name.CustomString) return true; - if (ao is NHAstroObject) + __result = string.Empty; + + if (ao is NHAstroObject nhao && nhao.HideDisplayName) return false; + + var customName = ao.GetCustomName(); + + if (!string.IsNullOrWhiteSpace(customName)) { - if ((ao as NHAstroObject).HideDisplayName) __result = ""; - else __result = TranslationHandler.GetTranslation(ao.GetCustomName(), TranslationHandler.TextType.UI); - return false; + __result = TranslationHandler.GetTranslation(customName, TranslationHandler.TextType.UI); } - return true; + return false; } [HarmonyPostfix] diff --git a/NewHorizons/Utility/AstroObjectLocator.cs b/NewHorizons/Utility/AstroObjectLocator.cs index d28b225e..e3ab7bee 100644 --- a/NewHorizons/Utility/AstroObjectLocator.cs +++ b/NewHorizons/Utility/AstroObjectLocator.cs @@ -35,6 +35,7 @@ namespace NewHorizons.Utility if (stringID.Equals("ASH_TWIN")) stringID = "TOWER_TWIN"; if (stringID.Equals("EMBER_TWIN")) stringID = "CAVE_TWIN"; if (stringID.Equals("INTERLOPER")) stringID = "COMET"; + if (stringID.Equals("EYE")) stringID = "EYE_OF_THE_UNIVERSE"; string key; if (stringID.ToUpper().Replace("_", "").Equals("MAPSATELLITE"))