From 03a1490c5df813589554aa8fa5b20c55a7fb1d59 Mon Sep 17 00:00:00 2001 From: OneRandomGithubUser <60021548+OneRandomGithubUser@users.noreply.github.com> Date: Sat, 21 Jun 2025 00:00:00 +0000 Subject: [PATCH] Add JSON specializations --- .../Assets/Resource_electronics.png | Bin 0 -> 5263 bytes .../Assets/Resource_financial.png | Bin 0 -> 8731 bytes .../Assets/Resource_food.png | Bin 0 -> 6450 bytes .../Assets/Resource_lodging.png | Bin 0 -> 3300 bytes .../Assets/Resource_petrochemicals.png | Bin 0 -> 7119 bytes .../Assets/Resource_pharmaceuticals.png | Bin 0 -> 7813 bytes .../Assets/Resource_software.png | Bin 0 -> 5331 bytes .../Assets/Resource_timber.png | Bin 0 -> 9123 bytes src/SpecializedIndustryZones/Filepaths.cs | 9 + .../SpecializedZoneSpec.cs | 2 +- .../SpecializedZoneSpecSourceExtra.cs | 887 ++++++++++++++++++ .../SpecializedZoningSystem.cs | 74 +- 12 files changed, 958 insertions(+), 14 deletions(-) create mode 100644 src/SpecializedIndustryZones/Assets/Resource_electronics.png create mode 100644 src/SpecializedIndustryZones/Assets/Resource_financial.png create mode 100644 src/SpecializedIndustryZones/Assets/Resource_food.png create mode 100644 src/SpecializedIndustryZones/Assets/Resource_lodging.png create mode 100644 src/SpecializedIndustryZones/Assets/Resource_petrochemicals.png create mode 100644 src/SpecializedIndustryZones/Assets/Resource_pharmaceuticals.png create mode 100644 src/SpecializedIndustryZones/Assets/Resource_software.png create mode 100644 src/SpecializedIndustryZones/Assets/Resource_timber.png create mode 100644 src/SpecializedIndustryZones/Filepaths.cs create mode 100644 src/SpecializedIndustryZones/SpecializedZoneSpecSourceExtra.cs diff --git a/src/SpecializedIndustryZones/Assets/Resource_electronics.png b/src/SpecializedIndustryZones/Assets/Resource_electronics.png new file mode 100644 index 0000000000000000000000000000000000000000..a663717b52cd2ec7c3f8b3a34d66aad43885cd13 GIT binary patch literal 5263 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 WN!GV`piF^@;D-7wwPIE4;C};=$Dj8A literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Assets/Resource_financial.png b/src/SpecializedIndustryZones/Assets/Resource_financial.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1394d87d5ef87a521991f2153d547c442ed57d GIT binary patch literal 8731 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 literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Assets/Resource_food.png b/src/SpecializedIndustryZones/Assets/Resource_food.png new file mode 100644 index 0000000000000000000000000000000000000000..3b08897a97aa4e8a6719d03ff3c6f8e1b39dd3cc GIT binary patch literal 6450 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 A9{>OV literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Assets/Resource_lodging.png b/src/SpecializedIndustryZones/Assets/Resource_lodging.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbd086c10ff4407a1ba9ced8e17791d1d24816b GIT binary patch literal 3300 zcmd^CX;jjS69222RvLM;>uuBPGt!%hrIuT!H&@(J%yPk{>q4%W8wv<^duF$CNpjyy zF|@?4OCln+Dr#wpn&O&UB0_4Qg2J=U@ALig-iJ9eXMS^L=FFTk=Qn@3INK`jJ+c=7 z07a;s6$}8Rc1$Tie)o=oM?VeTQG257JYxXB7yCn`fDUZKj`MJ=wMVQQGB_4>Jvsrp`vWHh3Xd*KKGDBOfv{eC5(Xn7o;ITn}Hu`(>8u4|a{!Y@@Q%kBvY z9Ia-iM^x#|WHhBqU;1R6b}LF1Lwj+t;}e z;A{{{4zNoFfLltyuVF)rCc{#ImN6$Ys+GH;{GGfn;MBE_n>HSj{w@?^}Z`8*I8o z3Yy`jJ*yq@sD%tXrE0;SebXrZI!`*Bw-n}Q#9Q!LGYP+$6UJ#6T(SYXz6q#*TLI3Z zecHdBmPjPn)Q3{&s~Wjt+h9|8BcALf9>3L%F1g(Dv+bdI`KiBN^_F;54}CNoV13vQ z&n;GG?5B2C%w`mFT%oMc#0A4^@YeXNsV%haY*V0 z$VZZhs>;?5yQezVBZSEeWOhR{ZaCC*obyHhn$LQtW9|t+b5=80XrF_SdFh)tjjvK2 zV0-BR=dqK-La^lPF(3S(&cm7pE9LyLj%&zXv3 zcvMCpuXM&cI^Tzm9psmqjmjFyxu8UIqgnZpZOixWr!Qd@h{JjySyf-kw>8C$>D&_p z5pi1QsIHk%)>puiEo$D>OFEN_^H6~;P)@yI})V;w9xWgNdeSQSf84=Ce`Y|#` zK6GJaR}7d?Qx!Op9xdr>FK8=wgMm)9yq23HVUU|X`IA{wMAq1HTL(R1pkKrMl~Q|= zHZ=jOY)=(==GOu%okfGYZiWubSIC(QQoo~roRSgf!U6uqnO%)S%jpFO)# z-y?BTKBNw1*K(O}>{7^9T}3@1JxbF4QFOj-^Bd^quD%<%0>tL+IdRv}1XV2|j(yG= z_8CwBiJe|TmtefiK*~tfehFX;Fp7ACSlh(1)mKc*dyng+>OvQfKpl1>PEf>A3Ec?s zMjt(TSLT&mI4WCo%FkzDolk&egv7s7XrJ`$ZOmKD8q=`nT2T)p!TzsOFhfX&VM4@h~NvLr+QP>A_U4W!6W)p{d3 zWnVi%`{!bCh$s8F?ag!}W_U0n=QO5y%r9}RMjnVl6v3QX; z;+HGZHY83wyrd*k_bWenF)zfGt(ccxh!&-Gk!%gTlw|riWKBN@Gobzt2=)1xVS@=j z)8^D4fPkoaMyLKS=D{;zC+n$X)u*jGJHT&$05)!*yc|pn?~S8L&pD5_rB}m5)qZ(d zg=F($^s9!kcw$NN!6vK5(Wcd977onMq+D$V@|HSChK?OQscuLMpQ4ZmIUb%j<*zg` zlr*$gCHX?V#Ey2|gb-0loJb8==r4s}%9;HcN?LGWv^rwai8lQd-usNR`K_LWD8r3$ zW@v@lJUd!Ituh3t@>^9gk6TP7p&S_;7D=;=tJnKIMSHjE1>>F4F3o^l7DII>`zc6- z6HO}SOZKuam3l~R+Orb~ESW4tzfrbPIbE`Gm93Pg&ugtle(hpvu%Bm2C468X#r?X7 zA)#7}@Y9dhhItM&>6nh5$dJbM<2M}4`~@5&n2xIMO&~c9zH_*;>`P?S1{H98tJ#k$ zVeuZkv21rxSG8PFBQ#sUb&dDGRB4G9EW0-0$@aR=cKY<&(eAZ$^5pQHlY^Djlj@7D zOiOlUos@_8?c41)+A6h#??Owp8Xb>kG`jfY@r}W`)qVxPg8Ws1Gl}Mwb;ZYkzhvzd z2aA}|2vs}oD*6m*%;3U8BqbWUg37rX;7&xBuQ>9U&0$| zxbqS#yg+G#KnJbKeQR_HVl_Q621gyaFB-hq;!sR2bzP`M2(krETkj9oknxL3_kP^$ z))&0158k8Wr(09V;~NV|BzK|m*zHRtGDd-$)fwT0k+Q;&Ej}`=6GT5TSG>mm!l(+{ zGVJ}->8S70OTvIS+c(%se3!2~Te>VfC%W2tGkoz$&|{)URu&0$rNPyn4-AMYQgK6!wcDW%njYP$?Wv5&XwW{3LHPV(=LXaxfBA-#-u zHr>rzmM?KnwE1^u+?#=L$vg7aL;+eZ>fg1DkJ~Ajj_KF3Q}0%i5cl8U4b=6ir}=k& z#09QqlMDgd72<@LTwIKPyP`E^c`M19EvwJ47wBf$z<3rjbMtQI3DP_sWLcIV1-O`}H1Df>E(ySA=9BGdGDcS^temyljady6s;A{+5y`fUf}QzDN8b-5Aqut!gj%|M?%FkkF(6 literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Assets/Resource_petrochemicals.png b/src/SpecializedIndustryZones/Assets/Resource_petrochemicals.png new file mode 100644 index 0000000000000000000000000000000000000000..3217d8b4f39d1de35dd32a8b7738b369f70133d6 GIT binary patch literal 7119 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 literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Assets/Resource_pharmaceuticals.png b/src/SpecializedIndustryZones/Assets/Resource_pharmaceuticals.png new file mode 100644 index 0000000000000000000000000000000000000000..d27c057013ab0087d614cefa0b70feec6b5b676b GIT binary patch literal 7813 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 Y__gz;mAcQuEo5+AQ(vQ4&F<0v16V2$9RL6T literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Assets/Resource_software.png b/src/SpecializedIndustryZones/Assets/Resource_software.png new file mode 100644 index 0000000000000000000000000000000000000000..7c938c8c27a49b67d133b5388fa4c629ac07f2c1 GIT binary patch literal 5331 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 literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Assets/Resource_timber.png b/src/SpecializedIndustryZones/Assets/Resource_timber.png new file mode 100644 index 0000000000000000000000000000000000000000..b982b66061eb79608bc985a0c53481a95b11e6c8 GIT binary patch literal 9123 zcmeHtWl&Xb^zJ^Sbax8^Do9GVl+w~54T5w@a}I*i(%sSxN*p>wI5ZsLkWvED-F^4( z&iv3i^o!9@=0teAnHETL1ia_H8`b!zE zR_7o3cw4?kt9!EhMJtaJg|2rUw;=DtI}ud-TXU15qc?jtLwaFklG0lW5E;eY%OznA zeE&ORkpWLKEZ<7uEIZC{*Kwk3Ye3)!HpWrx>cw?W&gez-i>)#`y((O`0OqeCc6-Y2 zPsBntV{ao9qlrGPk{U_9P%1cV6#kToPduX6YaewT*zM|#xJfBJh=?GnK7a0I{xuI^ zepSA7d~H=}eT`W#u|*~s3NOGR$;B@I8)0ssK5%?3FL&?yYwx;!XwTPYmaM}6t$PB! zJVfSi`PG8)kWb750mqgKsib26#Fw06JYMo>?NehIr~5b)&PVTiU8+rA*QuTg@!#&h zxfCHX)mje^Lga&=y0Ej5$LZZE2ZTy7pI5~E$+MWd`JJDUwwuM_i*Ck-wus-yZxBg} ze7HIp`M|@hq6rWK?L*!lbFpA$0&9}EF)Ekde%`C1KE^M8N(GX5CTMlzl93ZCpf51k zWD{)UzB^wqLsgil7k>koOXrXK(Ax@O$;b%b2u9ZN*_g(}F!LAb!EJnr$y_{7???3n zQ7NqBD69|<)kIUCfV1-hr)tgCYE@ZCo`n+p-cL4Z74GV{Iw>DZLV!8$x68a{M?N|W zXGXr1eG`RoXD4a;byS0>;9*H*=!92H#ppEn>K=AIChT3IZ}C147|$y(7M^20Y)52P znkk>6nS|nBe9_*N@W6p) z9NgjRD^Yvx^WG=6__#sz`X}A<+M+DS;)`j*L`V0BN-{BuV1O~45JW7nZHbwZ7c%*= zkCMqND$bNC@>ewfT=3Ep-6S=;4mY`32V%REujGuXe0wpi9mVLoLWG-|<;DrP>nuo{ z3h|r#76(zI%N`-Lu;1rlS6%Vht})+kg<*V44OcH+L}Td5e{r1Ii+sQe{p7oAO+IRp z;5w4i=drgy71Mb)CVe|{k;wV7Knqx7EcV*jc~Ie?f%YHfr)|mx=e!V{*6Z4^S6KNo zZ%!kvHb6^8xw|FjVS?$GF-mmJ*xpY3#UoWF*DPsV)VhCD!XKYI>^U((7>nVq#ek#n zLptg}D&B4(Jra#MY%=h2yVEt{^u==;JTNf?=@k)WwDsAgp&y3X$a$L3vzVV6zL#55 zrrzUl7>6Dc=f^Amx!62q7qMMRnB4A(E5Rc`wXQfhP#Kp;I zJ|O}IjPFSuColn+EnSAg;PS_YE+HF2-1iF-+p-L0#G78{8dc(y$r-)F+CJ2o1Iq^#ZCjb|9j(7m|I!-#OD- z$rGMPACV1c)#sKg>>%&r3XaAmm^hScHPZ2JCa!* z=;uc)!uF<0O)uk6ne6NVanCE(=VBOx=p&e6*K%tbW*DKmz7_q?Q&~pBo|E8Q{_RlU zHPqzYp-fXLX8Twk)QS!UW!bv{|Hf23$vjtrs*&y=LGz^O-xG|G1qP<3^{&;SAJ!r` zm@+A)H$BFfk3yxEN2bR3S*i0ysWoN5n`%6Q zKi_`9Gw-x8b$?EzbW{a93z4SEa$Y0Sc?@;o{j)mv%=3mZGkK-wH7CHoFje)=sqknz zc;J{`U53R%9oEn@kQP* z;G3%YaFPTqy4>|`XCF2jg$0=HmfYJ(UrytBHC|op&q8~wT<*8re`3Gpn`00OK?Pn8 zqGv7MW|$8ObNEHu2}Z||y|j})!pTSSsw$9a)^Dnx`Jb(GzT1c?IJ2X8{OPhY^WhE`i{ELY;$!FDF#~x$ic6hwWk+@iAqv$`-G+@tBYgQ|2CviNlsRiwN7~ z%?}*_FTP{q`)<(Xa{m+drc>Q5W^^wgb0$l_z4# z?9gyG9>_4PeopjX<6l&b9ZPVL*>;NtTD-*zv;4W}OfOwer4+*y<&Q2vrwNp<9fnEg zvUvOr6Z7v5wvJi#ZU8-u-|>8`j^O+;IkyoOAJ0l7OaXtop4HGF+k=|EH!_Q7e0H%l zgJ-k>x*Kwk*7&F`=}#gCAR`!=;=!S5*g;DuLVoHQ?g9OX{AE=f#R8y!hDv}NtnmTs2paKV~y&wi4ndW`%s3tczQ=4AkZ)4fAsw81>&DxCGIH-};K*!ncT?>G&2WHvVN7{a8E()rfdL1|UYW!ho$QWZ7 zg<|MgaPg916Ff|ZcZ*Ugc%;hJv-72~61pgnWt4lfj4$AX+E~yCQ-GmkNlUt0ewBjs zz2X`?cML=9=$_9Qg0T6G{~jCPagHRKl6+Vl3OfB7w(|;W_=&bA?+xW6T-YkQOl>RKOMmIUbUa%MX|KjS zKv`z*UxV4kapV#)LtkNzgRc?Y_*?HiJ-zhtilym#kCnBcX@l%Xh|@0vME}Bj<`+MM zjQ!}W$>Ldhbg&`3kPTQ@rcTwEv|PG>^SNhsqA3xV94OE{>5ipx&Dui$=6XA99V0M< zJ^YRzv-iXWJ9TY2N`3(O=$&nBpUa$u!3_H|fi$ZwUsj8HM)B}-?FQc1?9Xm0`>&Ba zOf)$uSi9WwpM><4aAR@y!h<0*fYfCdK)qZ3ijyw#D%L zD|nB@`-I15?D?SZFxq}beA%S7hto!4T?@#0-foqRfw2T1{kQ&<^Rt+68yw zLX`6I+{R$&ElAorHTtm9Vg_v_2Kk6t`6XJW)Q@O8k)+e%_LbB6cXGXm`IWbBVzGui z%?#`(Fp0}4vxh<>5>|N#koRvP7n%y6FIehpQ5k8~Y7K7&TNh!*H69=AC!Nv(--Ek37 z!sprgk2CDsum7{%0b6LVmWybfV36>iX4DuexLi_vd{XR(nxwYu+Epzp&p|K6j`TC# zs&F>DXF&OM)r6bn#!m1{m?*3A>xIRAhEc6gK{qX!Po77ljTadU zl6TFvpqEyc>Fu#IP539)(E9y5d2Y7E2nz|}%1Z}IXD0qf0>*KLYBq zz^w^L%@#-vJZ-PCP48GTyx5Fo4?aRW+(Sfl+=|>v@&mA2{3XhhEy#-)D`ro}BjFE? zx($!X6HXwSbw^4nhE|LIVo|JRLJKn}3D58<)#jrW)aI=8ZqVz>prd zXqh!&b4W>684*bI3|{#bOV_K1FLwH!RcED1GfRvH_B1U(%=)MW1TDT>VT*&TWA|YksH>5f7zVGgcQ*NoA zJnot)kd*S{C0Swai4fwMdR)Tw8g|RvxQ;QQ%X}Bfxc&Jy(Nuk6c{ja1*qmCr%zD)~ zR(MBnZ+cpk%+`DLUc=h*j7Xj)X+t#I-OkW0O;;SU1`>2KodwBdhQ5bP<8N$^EmMd5 zrAsX;R0m^UdkM`zWUCu&Nyp{L+x|#Q4r_jHK zTpVb5ehYXWAB%6f#T@RVt*bv;89O%6SIdix)~e`n&j7=P3@pFsZieA8Yvx(CGTu=NsW86R$AMPhSRi$WEpv7|+OX2cx7iX_f%DjWNJRbU+ zXGit?V_R>I4*FHxgv+=;fn9c?dJQzMjzR6C4Z5?`IpIG8G(Mh}?I&BwH1qa&5=`GS zqB{+m-EQj2DZb@b;sllJ!+3S;4WS$}cpFdZ0;s6{t_gr}-z&}zH=5JN;KES>qmYFF z@)14qVUvUeFv^c^{9JF%F=Mhss^>fzLm`gr6K+;H_Z~xLcNOokv8)4t$@bf5zHLuO zQqYC`1NB>$m)sSoZB*<+KwHO$Ffulg_r=bV;<{^cP)tMSM`>7IaKW#x^S;dJ2tvM`q?ETX1tnY;pOm&$HO`vb!QWi- zaGO0`@PpRLfY!+zjEKQbFfrycnaPu6xHusK!MQ#E&6cKN$T0roaMw1?z}Pyr8u3 zG4!$Kf@NbKS<0_=lDYz}B1+QsAi+11g#YjEWQmZaIlGrX@;^TQv1ezmny{e9HfDn^yx_?`@MCH{8a7BS#alG`MqQXTbm|G242~~i?NeVcE z$!ZjP%T0Q?s_H}`CHk%a#2mo8Q$$!{cs+P54BykM3g=2XgLLtRJRo1|aYRxr;0$DR znBMuQiMK6cAfo9kvIVu1%etPDWR7Y#qAxI>6`veRP&K4SyHw8ApBTHdOHYhy8ZrS# zy!d$YO?1myaB|0t>a*3Vm*ygj=TDpYg6cXo;dr^bH`KPHx!MhcnFBt!Sa%B=9anG< zjo&D!oI5|DIu#I3kA3m|E-vc{F&-jh4Rde!KI= zq2p&($luC5k04P4m#3>c4@aT)3Txq6_`rat&9;*u?tj3Vqh%ITVWy1H_Ka}Jt04IL za{aKu%xMlej|Y-tnZ5sgQ6#*IB-y|5Th*&}rv^jb+VymA42Ii>fZL+j$=3aT7Evl7 zxDXfkyj6=)M7phz|0lh6v|VN; z#@w`82kM)he#R(uv>NHTaJ$6}mI3BnGSb0nJXqis7@ZZEYAAjbvk&a(H{*8b^KB4`-B{4saL=_oP;P)^uIhJqo z`ga~~R?JWCF#nFr!T~}pm}wII*C@SO$M>qSa#LgfO@x8k6-q6l6>Qa~R;!VdOa`VU zo`0*`Daeo6V%6JfQi*KM$M~T)OePOVp|kSw9B>~k7qp6T)(#mZJa7)li;uojILnz9 zC}5CX+W%cZ@&9z$c^Sf2Go=ez7yF2XMy1BerToReXkQ1@f$ zMu)6%K@#ZSl&9G72GyORN~=Xnw>=r-H(pVOtYAN1nmy7+MKS~KYyexq)3Ps;tSn)# z+8rJly?FW~jkC&{Wc#djTRCp;PI*rkB!7+kdGlHcEw~ zH12-H<|F&rV|R_@j&9M8#*R%0m7xe?n{ajly)B#@f&2D6;Cw^`)voEz+#^5%eWEqcXyY?dk(0I;AnY0Oqt;h zD*Zp0SUf|~64De14R*lNvk`4GisO?S0xL%!ENgqSgt60^*Czy#vK_MqBLiSCI$9;~ zg@)J)tZl$Qrf*bc+i!bof-Io;%UDl{s^q~nYAj1A->>|Lr}HZuGYb(K=X*bAPmbW? zDpVnyO=^lqbkC;`ZVSr4#AyvI0!{gT3k5Ca#;2Kp9=fKrK0z-UbEpkPu4>ZLd3z78 z=f=^Y(u@?X2mUvEA?R>Jb{g&-bmrogQ>|B;9MWitP)7cQmM1knz`O24v2e`QgmT}Dvy#={^<^WqgQIRAWqBp8?56CfURDJSrnlTlPTg)Diz2ZXo|wugSDWq1*d z|L-YK&_b5F4TM`@;#jWugvWfVd3W82da;BFlWFf`zzXWMDKhbEbb2wC^dOg)Y z3xtH$J`>D0Y}Ux$4X%2w&T2(k820Y#l5V+G5Q8RlP}zxvMsOOZr^brd!dHIaSpagkag zESUE7wzJB|AHkxF$MUqG83><+pCgT}MO(1CY-?a@dq5n^YQgqgeXg+La&zshxxvk( zxVV{S)uRMT!{1}&ZN{A!UMQ!rn$D=?*?CA(nTZCwIbiTLR19xOBaf(4$nKn~>#X{e zrVYdV6D16yESAkP#w^w0K2hyG;b)ouY~&uTX|d{|+4;ulTLK-+&;{h!uwmyl6(zpo z`w27Jg({)zLkFTewD47znm}3WF?W~HSKT$UQHT;-{}t%(GrTUg*CXto9{#Q#?9Qbg zC&ow1LwG+=XaveSa?{=bK@SAXPOX8(Vt}Uv)4&9s>D^STcy7uTk<0`*GLVT_?=6TQ z1o{Q2V}7vT?;o@^ue!fcm-&H<*~Q6L*XASmmIMH$#Jc{cokajZXZ!Cg!0SE^{f;`P z#C&Xa!>?$}5dUcjsT7Nzu|a-D%)HAOmN!@c9@dn^gpyX~gUZsCLXk#%NJ5q@B<}Oz z%OMV4{1XYqT5#tiTp-cZoFGuU zXqUFLnjAnS`or%l2HUC@z-f1ou`V29GbPh!GCNO*dCR4cU7bsuTW6ESOaJOr0{x)R%MLZN0 zh6~imUhDk(JSJV|izq3pNU+1i40^L|dLR0ogHv)q21?lVk`A{I5BRhZ?CaMfP$6^> z@G|>j!XI!R_@ljOXfK*@?A*-sk2GK@eAV*!o~P=5PYRyVknjhbJhBW`w5f zxeUei#+Ex+5cjIfF7H2#{)>J1<`u{$tOZ!79p_3&q(}W2(_xTiC_5GJR1m&Weg^)g o&$kdHjsE|~EdHMkoZL%uUQpScSC`j;r2%-Ype|o6XCC~&0HL}txBvhE literal 0 HcmV?d00001 diff --git a/src/SpecializedIndustryZones/Filepaths.cs b/src/SpecializedIndustryZones/Filepaths.cs new file mode 100644 index 0000000..b1f64a1 --- /dev/null +++ b/src/SpecializedIndustryZones/Filepaths.cs @@ -0,0 +1,9 @@ +using System.IO; +using Colossal.PSI.Environment; + +namespace SpecializedIndustryZones; + +readonly struct Filepaths +{ + public static readonly string ZoneFilePath = Path.Combine(EnvPath.kUserDataPath, "ModsData", "SpecializedZones", "SpecializedZones.json"); +} \ No newline at end of file diff --git a/src/SpecializedIndustryZones/SpecializedZoneSpec.cs b/src/SpecializedIndustryZones/SpecializedZoneSpec.cs index 365edc2..815b4c8 100644 --- a/src/SpecializedIndustryZones/SpecializedZoneSpec.cs +++ b/src/SpecializedIndustryZones/SpecializedZoneSpec.cs @@ -53,4 +53,4 @@ public class SpecializedZoneFilterSpec public bool? RequireStored { get; set; } public bool? RequireSold { get; set; } -} +} \ No newline at end of file diff --git a/src/SpecializedIndustryZones/SpecializedZoneSpecSourceExtra.cs b/src/SpecializedIndustryZones/SpecializedZoneSpecSourceExtra.cs new file mode 100644 index 0000000..d60affe --- /dev/null +++ b/src/SpecializedIndustryZones/SpecializedZoneSpecSourceExtra.cs @@ -0,0 +1,887 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Colossal.Logging; +using Game.Economy; +using Newtonsoft.Json; +using UnityEngine; + +namespace SpecializedIndustryZones; + +public class SpecializedZoneSpecSourceExtra +{ + public static readonly string officeByEducation = """ + { + "Version": "v1alpha1", + "Zones": { + "EducatedOfficeHigh": { + "Name": "Educated High Density Offices", + "BaseZoneName": "Office High", + "Description": "High density offices that require mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Financial, Media.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_financial.png", + "Filters": [ + { + "ManufacturedResources": [ + "Financial", + "Media", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "WellEducatedOfficeHigh": { + "Name": "Well Educated High Density Offices", + "BaseZoneName": "Office High", + "Description": "High density offices that require mostly Well Educated workers at Level 1 and mostly Highly Educated workers at Level 5 - Software, Telecom.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_software.png", + "Filters": [ + { + "ManufacturedResources": [ + "Software", + "Telecom", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EducatedOfficeLow": { + "Name": "Educated Low Density Offices", + "BaseZoneName": "Office Low", + "Description": "Low density offices that require mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Financial, Media.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_financial.png", + "Filters": [ + { + "ManufacturedResources": [ + "Financial", + "Media", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "WellEducatedOfficeLow": { + "Name": "Well Educated Low Density Offices", + "BaseZoneName": "Office Low", + "Description": "Low density offices that require mostly Well Educated workers at Level 1 and mostly Highly Educated workers at Level 5 - Software, Telecom.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_software.png", + "Filters": [ + { + "ManufacturedResources": [ + "Software", + "Telecom", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + } + } + """; + public static readonly string industryByEducation = """ + { + "Version": "v1alpha1", + "Zones": { + "UneducatedManufacturing": { + "Name": "Uneducated Manufacturing", + "BaseZoneName": "Industrial Manufacturing", + "Description": "Industry manufacturing that requires mostly Uneducated workers at Level 1 and mostly Poorly Educated workers at Level 5 - Timber.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_timber.png", + "Filters": [ + { + "ManufacturedResources": [ + "Timber", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "PoorlyEducatedManufacturing": { + "Name": "Poorly Educated Manufacturing", + "BaseZoneName": "Industrial Manufacturing", + "Description": "Industry manufacturing that requires mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Furniture, Textiles, Food, Convenience Food, Beverages, Machinery, Concrete, Minerals, Metals.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [ + "Furniture", + "Textiles", + "Food", + "ConvenienceFood", + "Beverages", + "Machinery", + "Concrete", + "Minerals", + "Metals", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EducatedManufacturing": { + "Name": "Educated Manufacturing", + "BaseZoneName": "Industrial Manufacturing", + "Description": "Industry manufacturing that requires mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Paper, Vehicles, Electronics, Plastics, Chemicals, Petrochemicals sourced from Crude Oil, Steel.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [ + "Paper", + "Vehicles", + "Electronics", + "Plastics", + "Chemicals", + "Petrochemicals", + "Steel", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "WellEducatedManufacturing": { + "Name": "Well Educated Manufacturing", + "BaseZoneName": "Industrial Manufacturing", + "Description": "Industry manufacturing that requires mostly Well Educated workers at Level 1 and mostly Highly Educated workers at Level 5 - Pharmaceuticals, Petrochemicals sourced from Grain.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_pharmaceuticals.png", + "Filters": [ + { + "ManufacturedResources": [ + "Pharmaceuticals", + "Petrochemicals", + ], + "StoredResources": [], + "SoldResources": [], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + } + } + """; + public static readonly string commercialByEducation = """ + { + "Version": "v1alpha1", + "Zones": { + "EU_PoorlyEducatedLowDensityCommercial": { + "Name": "EU Poorly Educated Low Density Business", + "BaseZoneName": "EU Commercial Low", + "Description": "Low density businesses that require mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Petrochemicals, Lodging, Chemicals, Plastics, Vehicles, Beverages, Convenience Food, Food, Textiles, Paper, Furniture, Meals, Entertainment, Recreation.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + "Lodging", + "Chemicals", + "Plastics", + "Vehicles", + "Beverages", + "ConvenienceFood", + "Food", + "Textiles", + "Paper", + "Furniture", + "Meals", + "Entertainment", + "Recreation", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EU_EducatedLowDensityCommercial": { + "Name": "EU Educated Low Density Business", + "BaseZoneName": "EU Commercial Low", + "Description": "Low density businesses that require mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Pharmaceuticals, Electronics.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Pharmaceuticals", + "Electronics", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_PoorlyEducatedLowDensityCommercial": { + "Name": "NA Poorly Educated Low Density Business", + "BaseZoneName": "NA Commercial Low", + "Description": "Low density businesses that require mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Petrochemicals, Lodging, Chemicals, Plastics, Vehicles, Beverages, Convenience Food, Food, Textiles, Paper, Furniture, Meals, Entertainment, Recreation.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + "Lodging", + "Chemicals", + "Plastics", + "Vehicles", + "Beverages", + "ConvenienceFood", + "Food", + "Textiles", + "Paper", + "Furniture", + "Meals", + "Entertainment", + "Recreation", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_EducatedLowDensityCommercial": { + "Name": "NA Educated Low Density Business", + "BaseZoneName": "NA Commercial Low", + "Description": "Low density businesses that require mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Pharmaceuticals, Electronics.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Pharmaceuticals", + "Electronics", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EU_PoorlyEducatedHighDensityCommercial": { + "Name": "EU Poorly Educated High Density Business", + "BaseZoneName": "EU Commercial High", + "Description": "High density businesses that require mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Petrochemicals, Lodging, Chemicals, Plastics, Vehicles, Beverages, Convenience Food, Food, Textiles, Paper, Furniture, Meals, Entertainment, Recreation.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + "Lodging", + "Chemicals", + "Plastics", + "Vehicles", + "Beverages", + "ConvenienceFood", + "Food", + "Textiles", + "Paper", + "Furniture", + "Meals", + "Entertainment", + "Recreation", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EU_EducatedHighDensityCommercial": { + "Name": "EU Educated High Density Business", + "BaseZoneName": "EU Commercial High", + "Description": "High density businesses that require mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Pharmaceuticals, Electronics.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Pharmaceuticals", + "Electronics", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_PoorlyEducatedHighDensityCommercial": { + "Name": "NA Poorly Educated High Density Business", + "BaseZoneName": "NA Commercial High", + "Description": "High density businesses that require mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Petrochemicals, Lodging, Chemicals, Plastics, Vehicles, Beverages, Convenience Food, Food, Textiles, Paper, Furniture, Meals, Entertainment, Recreation.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + "Lodging", + "Chemicals", + "Plastics", + "Vehicles", + "Beverages", + "ConvenienceFood", + "Food", + "Textiles", + "Paper", + "Furniture", + "Meals", + "Entertainment", + "Recreation", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_EducatedHighDensityCommercial": { + "Name": "NA Educated High Density Business", + "BaseZoneName": "NA Commercial High", + "Description": "High density businesses that require mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Pharmaceuticals, Electronics.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Pharmaceuticals", + "Electronics", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EU_PoorlyEducatedMixed": { + "Name": "EU Poorly Educated Mixed Housing", + "BaseZoneName": "EU Residential Mixed", + "Description": "Mixed-use housing with commercial space that requires mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Petrochemicals, Lodging, Chemicals, Plastics, Vehicles, Beverages, Convenience Food, Food, Textiles, Paper, Furniture, Meals, Entertainment, Recreation.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + "Lodging", + "Chemicals", + "Plastics", + "Vehicles", + "Beverages", + "ConvenienceFood", + "Food", + "Textiles", + "Paper", + "Furniture", + "Meals", + "Entertainment", + "Recreation", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EU_EducatedMixed": { + "Name": "EU Educated Mixed Housing", + "BaseZoneName": "EU Residential Mixed", + "Description": "Mixed-use housing with commercial space that requires mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Pharmaceuticals, Electronics.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Pharmaceuticals", + "Electronics", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_PoorlyEducatedMixed": { + "Name": "NA Poorly Educated Mixed Housing", + "BaseZoneName": "NA Residential Mixed", + "Description": "Mixed-use housing with commercial space that requires mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Petrochemicals, Lodging, Chemicals, Plastics, Vehicles, Beverages, Convenience Food, Food, Textiles, Paper, Furniture, Meals, Entertainment, Recreation.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + "Lodging", + "Chemicals", + "Plastics", + "Vehicles", + "Beverages", + "ConvenienceFood", + "Food", + "Textiles", + "Paper", + "Furniture", + "Meals", + "Entertainment", + "Recreation", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_EducatedMixed": { + "Name": "NA Educated Mixed Housing", + "BaseZoneName": "NA Residential Mixed", + "Description": "Mixed-use housing with commercial space that requires mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Pharmaceuticals, Electronics.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Pharmaceuticals", + "Electronics", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "UK_PoorlyEducatedMixed": { + "Name": "UK Poorly Educated Mixed Housing", + "BaseZoneName": "UK Residential Mixed", + "Description": "Mixed-use housing with commercial space that requires mostly Poorly Educated workers at Level 1 and mostly Educated workers at Level 5 - Petrochemicals, Lodging, Chemicals, Plastics, Vehicles, Beverages, Convenience Food, Food, Textiles, Paper, Furniture, Meals, Entertainment, Recreation.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_food.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + "Lodging", + "Chemicals", + "Plastics", + "Vehicles", + "Beverages", + "ConvenienceFood", + "Food", + "Textiles", + "Paper", + "Furniture", + "Meals", + "Entertainment", + "Recreation", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "UK_EducatedMixed": { + "Name": "UK Educated Mixed Housing", + "BaseZoneName": "UK Residential Mixed", + "Description": "Mixed-use housing with commercial space that requires mostly Educated workers at Level 1 and mostly Well Educated workers at Level 5 - Pharmaceuticals, Electronics.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_electronics.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Pharmaceuticals", + "Electronics", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + } + } + """; + public static readonly string commercialByModel = """ + { + "Version": "v1alpha1", + "Zones": { + "EU_GasStation": { + "Name": "EU Gas Station", + "BaseZoneName": "EU Commercial Low", + "Description": "Low density gas stations - Petrochemicals.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_petrochemicals.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_GasStation": { + "Name": "NA Gas Station", + "BaseZoneName": "NA Commercial Low", + "Description": "Low density gas stations - Petrochemicals.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_petrochemicals.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Petrochemicals", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EU_Motel": { + "Name": "EU Motel", + "BaseZoneName": "EU Commercial Low", + "Description": "Low density motels - Lodging.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_lodging.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Lodging", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_Motel": { + "Name": "NA Motel", + "BaseZoneName": "NA Commercial Low", + "Description": "Low density motels - Lodging.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_lodging.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Lodging", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "EU_Hotel": { + "Name": "EU Hotel", + "BaseZoneName": "EU Commercial High", + "Description": "High density hotels - Lodging.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_lodging.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Lodging", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + "NA_Hotel": { + "Name": "NA Hotel", + "BaseZoneName": "NA Commercial High", + "Description": "High density hotels - Lodging.", + "Color": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0, + "grayscale": 0.587, + "maxColorComponent": 1.0 + }, + "IconUri": "coui://speciz/Resource_lodging.png", + "Filters": [ + { + "ManufacturedResources": [], + "StoredResources": [], + "SoldResources": [ + "Lodging", + ], + "RequireManufactured": null, + "RequireStored": null, + "RequireSold": null + } + ] + }, + } + } + """; +} \ No newline at end of file diff --git a/src/SpecializedIndustryZones/SpecializedZoningSystem.cs b/src/SpecializedIndustryZones/SpecializedZoningSystem.cs index 0938cdf..a7aa071 100644 --- a/src/SpecializedIndustryZones/SpecializedZoningSystem.cs +++ b/src/SpecializedIndustryZones/SpecializedZoningSystem.cs @@ -1,4 +1,9 @@ -using Colossal.Logging; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using Colossal.Logging; using Colossal.PSI.Environment; using Game; using Game.Economy; @@ -7,11 +12,6 @@ using Game.UI.InGame; using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; namespace SpecializedIndustryZones; @@ -76,7 +76,26 @@ protected override void OnUpdate() if (!File.Exists(ZoneFilePath)) { + // Load extra specialized zones, once + var json_list = new List + { + SpecializedZoneSpecSourceExtra.officeByEducation, + // SpecializedZoneSpecSourceExtra.commercialByEducation, + SpecializedZoneSpecSourceExtra.commercialByModel, + SpecializedZoneSpecSourceExtra.industryByEducation + }; var defaultSpecs = new SpecializedZoneSpecFile(); + foreach (var json in json_list) + { + var specs = LoadZoneJson(json); + if (specs != null) + { + foreach (KeyValuePair zone in specs.Zones) + { + defaultSpecs.Zones[zone.Key] = zone.Value; + } + } + } foreach (var (specID, spec) in GenerateDefaultSpecs()) { defaultSpecs.Zones[specID] = spec; @@ -96,12 +115,30 @@ protected override void OnUpdate() _lastFileModifiedTimestamp = lastModified; _log.InfoFormat("Reloading specialized zones from file '{0}'.", ZoneFilePath); var sw = Stopwatch.StartNew(); - + + var numLoaded = UpdateFromZoneFile(); + + sw.Stop(); + _log.InfoFormat("{0} specialized zones reloaded in {1} ms.", numLoaded, sw.ElapsedMilliseconds); + } + + private int UpdateFromZoneFile() + { var specs = LoadZoneFile(); + return UpdateFromSpecs(specs); + } + private int UpdateFromJson(string json) + { + var specs = LoadZoneJson(json); + return UpdateFromSpecs(specs); + } + + private int UpdateFromSpecs(SpecializedZoneSpecFile? specs) + { if (specs == null) { _log.Warn("No specs loaded, cannot provision zones."); - return; + return 0; } var numLoaded = 0; @@ -173,12 +210,10 @@ protected override void OnUpdate() continue; } } - - sw.Stop(); - _log.InfoFormat("{0} specialized zones reloaded in {1} ms.", numLoaded, sw.ElapsedMilliseconds); + return numLoaded; } - private static readonly string ZoneFilePath = Path.Combine(EnvPath.kUserDataPath, "ModsData", "SpecializedZones", "SpecializedZones.json"); + private static readonly string ZoneFilePath = Filepaths.ZoneFilePath; private SpecializedZoneSpecFile? LoadZoneFile() { @@ -190,7 +225,7 @@ protected override void OnUpdate() try { var json = File.ReadAllText(ZoneFilePath); - return JsonConvert.DeserializeObject(json, JsonSettings); + return LoadZoneJson(json); } catch (Exception e) { @@ -199,6 +234,19 @@ protected override void OnUpdate() } } + private SpecializedZoneSpecFile? LoadZoneJson(String json) + { + try + { + return JsonConvert.DeserializeObject(json, JsonSettings); + } + catch (Exception e) + { + Mod.log.Error(e, "Failed to load specialized zones from JSON."); + return null; + } + } + private void SaveZoneFile(SpecializedZoneSpecFile specs) { try