From 2d717b1a61e0edfefd51db4d92bf1bf69298eb33 Mon Sep 17 00:00:00 2001 From: nishikawa_takeshi Date: Sat, 13 Sep 2008 09:50:02 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=83=BC=E3=82=A8?= =?UTF-8?q?=E3=83=87=E3=82=A3=E3=82=BF:=E3=83=9A=E3=82=A2=E3=83=AC?= =?UTF-8?q?=E3=83=B3=E3=82=BF=E3=83=AB=E3=82=B3=E3=83=B3=E3=83=88=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E9=96=A2=E9=80=A3=E3=81=AE=E3=83=90=E3=82=B0?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82GUI=E3=81=AE=E3=82=BD=E3=83=BC?= =?UTF-8?q?=E3=82=B9=E3=81=8C=E3=81=A7=E3=81=8B=E3=81=84=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E3=82=92=E5=88=86=E5=89=B2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2516 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../tools/MasterEditorTWL/MasterEditorTWL.ncb | Bin 11226112 -> 11226112 bytes .../tools/MasterEditorTWL/MasterEditorTWL.suo | Bin 53760 -> 59392 bytes .../MasterEditorTWL/Debug/BuildLog.htm | Bin 16376 -> 17504 bytes .../MasterEditorTWL/MasterEditorTWL/Form1.h | 2900 ++--------------- .../MasterEditorTWL/Form1.resX | 18 + .../MasterEditorTWL/Form_deliv.cpp | 251 ++ .../MasterEditorTWL/Form_file.cpp | 221 ++ .../MasterEditorTWL/Form_lang.cpp | 480 +++ .../MasterEditorTWL/Form_pctl.cpp | 187 ++ .../MasterEditorTWL/Form_srl.cpp | 369 +++ .../MasterEditorTWL/Form_tmp.cpp | 342 ++ .../MasterEditorTWL/Form_util.cpp | 265 ++ .../MasterEditorTWL/MasterEditorTWL.vcproj | 28 + .../MasterEditorTWL/MasterEditorTWL/common.h | 2 +- .../MasterEditorTWL/deliverable.cpp | 364 +-- .../MasterEditorTWL/MasterEditorTWL/lang.h | 2 +- .../MasterEditorTWL/MasterEditorTWL/srl.cpp | 473 +-- .../MasterEditorTWL/MasterEditorTWL/srl.h | 19 +- .../MasterEditorTWL/utility.cpp | 72 + .../MasterEditorTWL/MasterEditorTWL/utility.h | 14 + 20 files changed, 2891 insertions(+), 3116 deletions(-) create mode 100644 build/tools/MasterEditorTWL/MasterEditorTWL/Form_deliv.cpp create mode 100644 build/tools/MasterEditorTWL/MasterEditorTWL/Form_file.cpp create mode 100644 build/tools/MasterEditorTWL/MasterEditorTWL/Form_lang.cpp create mode 100644 build/tools/MasterEditorTWL/MasterEditorTWL/Form_pctl.cpp create mode 100644 build/tools/MasterEditorTWL/MasterEditorTWL/Form_srl.cpp create mode 100644 build/tools/MasterEditorTWL/MasterEditorTWL/Form_tmp.cpp create mode 100644 build/tools/MasterEditorTWL/MasterEditorTWL/Form_util.cpp diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL.ncb b/build/tools/MasterEditorTWL/MasterEditorTWL.ncb index d7b6b430ebd2b16ab3ee47d94c315e45b188e71a..b82c247294ae84f2fb367359290783a4a05fbfca 100644 GIT binary patch delta 199399 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%0De%Gyo+i@( zFJ1r6i?J?oeGyp%@CGUHGzBjzivs@mZMdOrEuv1`C-1|FuD4HUTZ<}qFq@L~#HLbCFP(cn&psOx5k`z1H6k}2>Kgd0fs`T$OBPML!H)eR+ONxtCp zod-Rj;ALbPz@JUQiINIlUb0fhODXVD3SL200Q}7qcxeT%DCsS4e3){AT6Tu0BrD-W zgOPV$TvoxW%Bp~m8g&Owbvr{m2=Xb!gAhmTsieA{0ZN_@c*_(x)$I&XT~-G?Y0?!# zQL~EbL=9O3CkB0R=RuVeytZV$*&l|R_C!#>u~ihjo~#G>;8Azr4=Q+lSs(Dp2wyd6 ztu{7Y!Og0WgHqr%X}8D#6=&7IPeER*<3hfmwz{E}Yz6qO6nI?)Z!KE`egR)#Utdqb zpO8-gUi+In@P-QBPPPO5uaxT_QSkP%y@3eBs$U zFUU~v&XNUir}eu7Z=vAbWH-RmFqPHun;+In!F$S{fL{WJT`DfndA;$Z$tfe%*jDNrk*6{Wz3DEL$ZSyHjFpK@ZTIx$U5!{62^ z@L>u*T};Q{-YM|m3O)lW8s;$tK0?8thV%wA4&eNDe8AWV3O*My8{zOHV^tfTn50fn z%SSyR+<@62d@H}GJG8NF`1`K)pl-OH9q$eqY%BhLpK?7r-UE8iF8tLnNqlh+T+a^n zfHt%fe{);#HY{Ak7xoaZh$Hyh3{=QQ8^ZfT$>JB<0#AfN8+v z9*{}gFm|OnQAw?2p5RCjzFNU6K&^&4Fxealz_+f!@6mW&9sDf?IOli_u3x9%wV^9x zRi#}25`K>n4?`)(CtKH##q}H5!!b~->*Mcp_yP_!UqI|Mplp+Dt_7Sg7>^q^6P{f9 zGFC1RrvXbT7Zh5YO9|)`gf@PQf)`fReENeDQgA1ncsflKM1ySPlKr|H~wbcc;^LN2-9Gxp(s}-1^%*v z=TQEkO;X^y6+F9gDeRpBe?`Hwswxd*H-_)L;8mX3wSRY_y37h*KoZB5OPu9k;_GE{ zOa4MxrA+3(oVipPtVY->G^}0?RtpK^hz9eB2F%v5;56W|2E5gPxtbV+|A*lIrrt#E zD5i|FfSJ+6IQ;)qa_{BLC6a%@x4+`cCfad*q*7aM-`?RtAp;z5~pq5~ukTpa8J+E^CM9glh@^X^TQ zW6?0tP9FK%1h$u_E%#gq1CYmgHX!E!Q+U)!Fs7GB1>^`YPabuXH&2-skaOZQM6Q-e zuHKtSizeiHa4=qwQy#{@W0EBfCl>2o=}W$MI8iX12ZC`v2)hL!zb0f_QXWaf^Ou20 zRsmvGB}h&WLK>F-;!Ir4sntvO2|CT%%fOR?n}fA zMr2p(GYg95*ecL*5iL`VMFi>%ZwV%=?@LsWwUfj5C34G5$>hF7VWXei4c5%luLycQ z6K5|7mmF_(ppvX%J+`W>@q+18Fay@9t9S_mpLD;GXi&nh z2Kp34H=b@KXF)CHkyrKwVdT++(l%gMPfmR!k>7uxJZlX`ujGz55=HZKst#G`lS6c{ z#;k%|YN1N@r1#B4;evhTG>`*6va|eow%Nm}F!`>8(cz#n)Rsv$eKV1k7KEM}hVB`K zIvIy%mkrul4w)0G*57f*ura4P)OJ4mmKbFrM{(H(S_EPD%a5(E&MZki2=j@R&{KI7 zmz}{rIpt@>Ct{!b-U-c@`CbS;ig;%~@k1_aVdR%*tSL*AyR4UGN;W=_DA%%x%xCqe zm|S8FuTSQ~@M3*}yLN%VG*pbW5U{^oV)cg8ym6-arcQF>Z1YHyYb}fjCC?v#VZw`t zyn-Rzk3l?q8^3a%F&z;Hi=iF=h9{6T2g;b$siJbOH4stR%$mFMa)5PIQO>niSV>7? zf?aM6PTmoC5d-JZl0y$B!jW|O6L5~m`3$zQ7K!ANgNZ!;tg^LrbDrc|2NOB7)RtdZ zD3Di7ut-l0nY?l^kudVf-qv(IAnmNnd8Hk%^%Uf&IZ%~I8rtE#9R7zzUW?WYl$Wi6 z>L@pWg@kZ62AbC#ib-qe2%RAJr>qnCwKYRo z=D^$H9dQhnz?bBDxdGNb<__S)Ul5~YN$VLKL`jRw_Xk$7Xc4dI1of4f19;pIpZUoN z!~F3Y()*pOV?Jh{7$oVH!HY`5JT>3yOk+9UvWY$|Tf#uh^TQywUbJ3WOR^*pp%cZE z(hlv;M#;p!zPhKB3G_t@f}_}7>VauZimOEU{9-KSz3DuhQJewy}bgG zyN6%l2ZIl}UH1UKx)k`6y~|QXR0Xf%9tpQc>fGKOX$m>+QR?65U<)k2Ho&n?Nja`a z&g9YA6(WU4VYbKMtH(l$7!T!Z0>)*Msu?jI`pO(J7prn!^6hDfoW=@}+f}fxuY*N+ zz1o)A1kK_#u?L3c?~p6&viLzA@w2#wIIv%VYGh1s&4X2ubUCJ2luea$E2>Ox zUI+%D;xOvm4?9gsSxS~B8R@aBDPLZ%da;O}Ja*QM7NI6Q5mSdzL$I5YX zynISdkQ3!3IT@uIr=wWo({iSqC6m&4K`xSSTUi|5lPBc+@}xW^KagkSS$R&fZV_ke z85GoH1_2)bAl{SA8^GhTFmZ0OkhFRGD}>u5_U|<>eFERcYycN=8y|8HW+dBcrL!kL9A6}m+ukVqZ^i`^6R!NnGjGds zg=AsMbFe1<2UuVtf$_hD1ttodkcK(uOcKCZ8zWlFZ>{y-O>DC!XdD(3>n`z%beMbJ z#b45l$n7oTy<#7D@0((=Tq2iZXM`nB$OdK$%491oO3+VyY2i(VWTg^3&wxTvU$Qg_ zA3h$^_)H5``U@5!A#}3nBpLtD;Go@dojw^gJ#GGF8Ru z&R~3ZPK#Hp7q41JHDncwzqSQUadgJ_^Ty=@#KQXOYvKcGC)wJGBrOxHRXjtob_K7V z0^ybJp`2l^``n@ye(?+m7o+NV+#RukjGgE4QZY_8vgW?NWKjx^dT#NmVO?Aq+Y}68 z=fw-e2zeEMc^tzFSbl-WX~HQPmCoa4qNHRTI*%)e%#uOlJbnZLZmgHUdFPy7GEXFsBFGvg6JR%8Ww@Qj5GnuEzEyJG7OuS^b`+E78v+X zQHqrWcwZAp`vL2PEtLwYVZ2klHnL${3j$wi|DQ79C;soUVXk44U+Qaj7SF$C%M$yD z{~sB%aho$&vD9tw=Kn#~{K(&VGwBv7^WB8vU$bh)$8)}$i!yT8^WH=^ExE5~yg>4a zE16@-vXMlMYV+lucUNn&@xg?6CccO_5g9*iX|My6oz%=4K{zaUT z&sx-SjK~bp%>^htR$!VlRZnIH=amTvfDD%B@hH(!GUOd5HEg4|1p#c2t@6sU3QPjb z2+nH;iYAgdz9$r=9chP# zlRibP)z(8Wv-f|xREC4vshlJ~i&OG9>k$J*CF>RSK7-EvTf-pJQE;a|n zA>im+Vx?RKvc6U_aW^}_?)O<$Ty+WMR%#ZYe@V*huP>$>|z{{ z2f-7L$nSFIQkIf}|B*L>gwg1~_D5h6Z@&0f6e8_ueQF=^(yJEnH^6t9#haI`M_2=m zpa1DFGM=3GWgzPgL&SN!Nz9VhEPhj4GOsqFRj}dA+}S)X0`m`IxlON(m13e?WKq#h z${mp%APSi*ostEInpzlCI9Ptp!9?+?8aE=C$?hq4a3ZLqQNMc`T=sSFS&r%|ATfo6 zI;bx7u&4*auqmk-6xA37&OWulUS`J?p5ZoCR@+GdWAzE{o??M=ppx z>Q!$@hJ*82LQO1}6s15Itb1VrVzdBn>!noVC8Zt9TqtiC~KNjO*s{ zB+*eaa+}B9L~VJ;<&fc*gf_*VFq2X9xP>Sur&;scSJVdsAapKrYEQG6K`Y5L)PzXlsA>90>{1i)s-&MGX~Q&(!7PY{G(_|^V6kJ=B5!VuTGD@513XGpwfa5>T8M3| z$_)H9mr`6X-Eb!SY6~3M2kdwUm~j@9@r9@?yUHHGi6y{>^}vLeF*OI}L2Hz|h=bMw zZz}r~v+(~Z(OxnmFT1f0DFK;%m*1OTIVBQGDTI+h9Fu7%e$`Df!7k4%5o09-f_S`0 zjFt@l;qeu5LNa+QkB6fcf}P`)1dAa)gcmp9?qa*y{cq3#?k593U$P{||8Y8C*n~h0 z$NxMXFl<8bzeEQNn-Kgj(Sb0rkc7aZ1OGpB!)#mhj$0+a6s8MMGpu0P5^LZW-7{&r zfcqFsHA1|6A?Iy4WgaShxd1=4>dy6~VFJ5o4e{@4{7)k*y)9{gzQ;YYyE;L>^G~4! zeg*%(=bl+OtRDFHNCGM`>?3+9DkY;^ym{}A0XT;tV1{DSwh2(}W{50cKK#xBkl0A8 zE!&x(XC^7eO~J&$+*@e}Gmq&5ZF~Rclz-t_ylS3u;O9|i<(bK&naVkzZ%TtSP|c9` zHd|l89J{swB%EEw?728*f<@jU70e=)F2-d%yrBAW{Y0d-ou-MyKkIux@p+J2bq4UKMJOU+IS@R6oAO`aXd!AzH<&^ z!>hW>#xEIWSb#^#v;?+Sn|++w1pMBsK;m~Rxt8a~3U2@LF&DvRZ8!1;%8Q)mJEcgv zW`P+Rz&k5Ha-Q$3L|d*CkJ{r4$%p|vY9{P$K`^vtET7Pn_{kft3VQ=^sIWHx*9z8_ z=h;~zqpvxnZzx~gW6D$a96WV1tO;=5H34)@=Y1U|YtZvEE(zlsq1_%d`b_YGFK+J> zwh;C{VILLqf-Nw(9B~lMbuu3ue>teYOOSXOtg%zPftG+wSpw!?R!E@~Z3d~(t$z?q z=@U|4P}TVT(}7F#PQv6av6B(v4$TcCf86HGxwU|+#nCqyhW^nh_Ogv0WT zZ7?p#La^3XhYf}afp})F;N~W~Ku1jG0^*AczyxZJ08G8=x(f1+*h)L^1Gq}r@(s(F z-wK4p4yGW{xiiG6YyR%x-iw(gZrd-rdz9>Kr4=MgZ}6iosH<65o?Raxm^no0f8PVq zD76yYF~zjWpqZ?I6~uQJ#(KC9Utb!lqB7P+x}^`B8z62N5~`?O`-h~x1Dl~tqkLvN z$%Gv|YJPiHcBW9fvef^^3wv93fM8vEUf56kF~#ilkLcW0B>{8cWd0jTzFQ*ZBz44> zeve78H+EkYEHcffek7P4f=7LXxp|BCUlpuO!5i~h&IjkMFG_K+;6K!hbOO(6dB z#;d}CKkR>YaQwWOO?%_`s$h{}UeiL@Tg79Ay;ZzRaI2X26$Eyq<0;%Q<{Dr~PG!gv zuG<^OX9SBf@JVx&KN^pIgg-M7kNwFDO7Lo9^MXOb-Y^~}XotP?9V`&c8}|yka>3(R zIV=uLXohHnk>Jys!%Th*(@N+NVecrP6wE5h^IUJ-T~_$dd8Xx+7Z1W%*fVZ#Fn=ZN zjpBiVmQ`LiSQPo#{PLZ!xbH!S7y;K5XH07M@77GpE}jQA4vG+6llx~^$ZCuQPK}4k zJM%79pM>#vB|=6wU>UrMEr!D?EaN2n6v&52{J25KExH?mp%3<&Bu%0Kz_>g18OBzt z_X7p9RdSy0Q16CQy}RT)iT%=e%C!g523=5V;EFpkVp-Q%z>j`@2TtM)!s09iIK5i! z>rIibv*Q!If?lvToRJJLp6gEnW#~0)!%Yco5DIvJDH&k0_KCQ? zC#^Ez^y9VR*%kb_c3Ct1er-6N#9(|t9W>KV*oM=o44gun3^@IY2{-t~dDV$BS|ywq z|02XM^ce7dg%mudl>(d|%DjQsClvf=83ddj&^Ek?f*+JuFah**w&BGTe4^Y3I6b3n zIK15HXjuoFm!^xgeS$25`z|#Br%yH+D_>k%!G}UV!ceEc%PDvVm(=fLBeHxRS`~dr+OOrdQLGk6cOQNj|o>L~T}oOK-2GwbwPBm9E=S!Q|1tYTM2KQYBzm(}z~_2y`m`E|Iem8*@b zm#Ys_12T*hcw@js)g89h6Nk)OuiTcOg{=IR3Df1^#U}l!g6-&&@;cl(_^|wX5xs<} zoc`2N^8=QMV|rRCQy%+8`(67(lX@+^q25Sus;|Ci%I|fw46TjUN$aWg*H(WC+Y5Rj zmN{0SUAJC%Q(VUbF&QxV4Sv@=s^%Cx$+S{EfJj1$%beWN2*O&9psR97d%IBIgzPQ{ z^$$=`?<@U#as1tU}qe-HwB(UUb@UTtZ5tV$Q~> zzu4Z{18IIoIVT~9(Q4;r)CNA~^t-aSin^X~4RZ}XZxWDgqU2O_$jj>Gbo!#RqxiPz zPNko06xUHBKCb7~^XZ@TG_x&MfVt?b=F{uxkE4`hQ^!z;3;B>*yFNK@d4lW`ryTRK zGWe(&a`g%Gn`b(otYW5y%_A8VQy7iGD2x{=g;ox2^V{aN?>aW4h9NQGO^oK|G3Ivs z7+}y3d5Y98(KMi zuk-Eqb0{{~K%0%C;fFL^EIuYCS$4{uC<#T!jvTnB7(`q%T%3{2D`B;rf$VYl(K?`Y z)KT;rIgJgs^Gmd^&@Q2!0tT}?TQD9O*39Q}&?S%1$FcM&?y^gD^tzbyzIZXmY?osX zI!Aaq&}xi!1Ncw6+)?kWcU7%Bu69{f9%GK`KvI4xGPFB%FR(L1uWrrctIq1yLpMA6 zS_tWueK93`{9D3{Op)ub04a&()N|>1Fwgg)nJZx(I61Fdt`K?~b~7j#%+z*hdoW_Q zShz&IfG6-egNRa0e*yf2Kh2s+^ubfu@9YdXkLEk*dB-nm0{+?zsq}AXwUF+)3{pMt zJ2Gj7wKVNMt+@6s7y)1TzIIYOkM@GKl0MdL*-gqA9>np)N-{*}H*%<*hBw6ld>v{e zL7O}w8)=O&#|N}i+AmncNKC5}D{ATW)mSxG*uiAGJCP2I6*1f{k1H>VF0^!Yb9Hxh zwj{d6x8*qJZFj!|;`dp){d!@%+s4d2lnJ!V9Kv!yk0;SO>b9(R8aIDHka4eqMn5d4p|SBfSoC?6>`*CVlJls@*`R6f;m|k zS}kijP1KtJ;>$_w?V_I_C$Sl1Gm~@~yO79mu9fe)I&gQGHbJvRHLvWA8;BQEu^+fu zR*ru*wiwGQX2m`sr-*A z<<8H{4s_PmX}@43_{Cp2e?W4&o6ZnQsTX%0IG97M$>tY_^X*E+57vKj4L z!7L@r-d~7(6|qfVC&Q=0SHf4rKZSn|UkhIk)3`^9XT86#cui@@>lbx`>XqF_-mrFcWo3?t?PfdHEMm-_ZJVA2r}rHTNu(`G1MXS zWT<1PQ>b&OOQ>t88?u1^hD7Af@RaZfbmnHHQ|xg3#D`}0iiFFCpFkiS5$nUqQyWa^ zk!U!UOwWUYa96ae+E3cg+BNMumhesOa%g#ERb*{sW8^|4_*G0{2#dYh=CVQ&dS7y? zvT7TU_<9pk%xwv54cO+gYLT%KdRg+bzmUuIQmUAEI%*)+KxNEYffEvx<-_0eHgo+x#09R91dzT?<--UTGQo8AW!aC*2TtXNdYm&krdm|HJ)P>h z2+f9P*2jkJCSiieK#Wj|_G2xd9CJ^GLCE66(d6Kb1&=Fb_d5SkS_89Nip zVZ`&q=}E~)R1;rl%fK05hS2c}>b1V+pzVpvdXn~Vq<+LUIn|EPZ<15+rktd|gN%V6 zp*+laA317QK%ds;Xq$tZku`fu@Gu+@bBFqb28M=)#)KAzUJNY@eHgloQc+hiB*Cx| z3a6oVb+K^qaC*3AxE9LSHBptxUk!g0{xtk$_?z(M@Xhe8up@#x6_H3JQzR=|LA1${ zsgaqH*^%XuU8?Pl?2f#G_FCi++7Yz3(B6-nM7x0YIocO!{i6M%!_hpk!m+|eED@_3 zOOGv%?T)<`doT8D?6=tOv0Je$@d;>)(T>M$%he;1CXu(_%&JDjtW7cr8VBLvtj`c{3LzFntp% zD4fU|ww-0CLSmgRmL*>*oY-Xi3Tfj{?UwczL;($4)UOBhpdQl0dQ^`=)FtoEt>=Xx zlwU8P7u3_B7*IGauUF73>Xr2>`a^oUUIXGoUHxGQ!S(e9Pzo~i#~=>3)LZFo^tO6C zB^371d+Yu60s3Hls6I>|sgKeZ=}QcKslHZUr|-~r>gyseMK(n?N9b9|y_2utJh#kw z#(5UmMn6PN;})Sap@y+C_nC=U4n^JuqMnVMM=P`4T#XKyPw#``qrW4+=$|NJ{FjSv zhs3VyBCKz5KIUqH+@vj00J*j6-B}z%*oRmm;!uE|h`cZ##$pL7oE}1&(<3OReAH>n zRz)JVo$Hs#pOJ7hM|4RI^PX(7h@S4QjwGfvQ7O5$`+L7_*m^%qr$atBDSMy}+9~e` z$TE5crHs#cRr~{`>8FG9g0{gaTf`QDDkjSnN#r$5xv8WQ(Vo}m>kIVN`Wk&fXc3C` zoeLESj~r@}71m4p{WfBb+-lOn>%Mt0nv{qhtK|qit8buh5Ym_q@eM_}ZvK2^z486~NAgiAoakQg8FdthWfQ$NZZ8)^B{eX8e-(Z`QwgbJv~F#_d4 zKXjZ$qS~8I4Vmy`s8?1DX`Z*Be8_&J*gWAn=la%_*PZ4riSnO*)X}Modc;q7GQ#EG zF^TuV01Z>cAl*cuw9{d{4E&Ij?TaSz<-Qwp;pB~~$j>3y&-1YIE!(xXXriP3Ka#=J z9`?(i!$m-R8--2A3(PgZeTlpmB9o&zV+CW&V=u+NK>I3ofBgP<$$0H}!}yf=toZWy zx_GU_W*PX89DjH|@eV>(ebg8XiqttDEMnzm2VE z?-Ree*+jX6aHK#sDiu5lHAMJw!acKcDN*jXQ){}xn>=%P;gKq`HAw$)OpAeoH zo)n%Oo*teRekPm@FATpBUK(B&ULIZ%-WJ{--Vxpz-W7g1ygR%vd?5F`o+xwLI4<@Y%<|9**y?2l2UZ1bs3FHzbN|6c!#b+wGQZ&&~7 z4_748&u@iOUybk$Xh$y8aCT*cPKD~l=s-$>R9>9ZzSkQ#8X`6HBd9;$#4!V#7*se9 zBN_Yf(EYKkvA`CS5+9ON^b5#v{4L7aeUAcelR`6N$=G3BTLm`+!L7o{zS9yF{_BN0 zS?=mJBXLC>$@Ac8=~e!6Xg4Cj#BO|PyZ_(SpD?aKw*Hqz zC{U}Yq^C3r)Ko?B!CEL?|A;5U^B4-xwD$}^4Y*OBF`kL2$vG31l#{3dvjhdw)_Puo zvbG&+8tYK(Rh1}?s9F>!R5gkZRXvK&?TQozN>cpwZ;DdXLV5ZI-e%qm$Wv`0Np(W4 zpI%t1{ZR{Pn0JhKocAfOU7O-r)RtX@9MNk~k!>5u^XuNXQR4Iiu=(@e3n&Kt4az{@ zTc5&6El^PjRln0w?%OU>k>N`%Q_&YZdnj}i!#Bw{#Wzz`Us;Hh|13VZ1}lFH5=iex zv4nl7SaBGYhgr4aG}MdpAPB5o@jZ%u{fvsefB7_&`HrfpZ8;6Aib6quiQC02sJ%Yo zZ|ra8Z{vT$-vc$(2BIMGaR2{VL5qK`XJN3Q#UNGEV%$ANEfxe8qGZ>LsG7DXz|t0n z14pd#7T=qou)B;7FT|+q%}_;AJ#~d?Dd-ZnV5;1wzH4fAvEfU}<3spocAjCbks1*g2(* zU4}+x>SVv5TCx^~vZ@+*9qP-*!+D{ku@$jYwFgiwE8S`}!v?iBvzfZvzvGPmwO-fk zHZ$v)*urii zX7mr_R~AxAs4)n;VbG#mdX#%e2;tQEu~S%Brop~mOnGjUG7z;_PT4~z%PDfI6)E?L z^lRl|P^3My42m8v*LNYA{4ubo&mlEkQI_+VBbTEv$|P0;$L#Is#R8yZR1Ko2CHmqnsco42t-4N2q&}M$!Cb7}U*k+0__27ZESN;xk*a_o4uQsRI zuMHWk>kIArehYT z=$#!GfIe$5PJDe07_*6pMXXJV?6)^5Y+-k(%3#YbbijuWl^sWzqHld=pf`r0j^B94 zOe`8VjPwODWR!iU%NONFSi_sd*jlRgWQ?t^YJ+2J(^Z=nV_T%!Vx@2Gim{nSDO2~l z9%G|{>ZWC)va~S+>R9Lac-3gNqH4BCHQKMJq`j=#>v6UNs=XU$J08yrA)XTST-j02 z?wt%dV5)bTcRFfBGuVcokrN3S-$HrN^MOyGjb#SHa`N5{G609}qz=tkg<2H#0v!TR z20EhrN9RBnR08f6NDo#IK6})h(RRW8!Azlk(etrF@rUAL;*8TFT3(c_rTwhlMKNXr zuBDwoAM#^xIo|OzkNs6FTMKlBiEp+Fi!|mHz?syU9j#E(1Y&WzxIi@9J2y z2w7V>g}_8yA}kSg7f^9LaO`DZlyLy4bPMJ}YIG&VMeSvMsbV85ptG!k*0RR27B$gB zep>i!XV2P^x)B%Iejjl z+lSKVKA-PGShF@IwnRfQCK;wuJ4t-2edqYzaT)yYN0f1&?#~-N4>+G326ZVe#(-zc zXcY$qfw_WOE0tDylJaXf1qY$^a}pRb!Cv2xn�9WZx}N#VA@nSlg|e1e>zl;t__ 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 P=~m0KR3%+smKpeemmcK? delta 175848 zcmeFaXP6XKyEa;(yQ(X7Rd=O^8NvWPcHiU4e^Xn!4bK|L-@JXRPNlibQ-`?o zPA(ryXAb+qqXX+MyA#-eN)0S?G=Ut_b1y&D_af*jMZMV*zI0)cIkkb%nI}hn``dFI z&0cp|h-a*gARp|zBj(VmBV|{XyjZUD^SGDI0>d-PqcX}gzyK`Z0^9%x@PG#p01=P? z!dC!qazOZ3Q#Kqt%~W zOQ&C9hZP>;(VE0|CwD__!;fFTz5DjY+vh0`#>SMA=A`%|zKs zl!;qx$lzBYXAQMOJq>|o#Iy^pgMW0JL3 z+4iOn?aEG3yMaBxUSJ=vA2oCJOWP64NZGr$GlH{c?0 z3AhYg0j>hqfa|~w;P>oQi24JCKY^RTE#NkA2e=E|1MUM4fQP^%;4$z7cnUlNo&zs{ zm%uCFHSh*_3s5;IiUnMN8{hyQ@BjiJ<_J-ggn|qxfEQ2!4e$YeKnD!K1T4S?0zf(- zJrD!L0vUl!KxQBg$O2>qf1%X09VW0@`9#9l` zA1DTV02BvG040G^Kxv>1P!=c$d&%0Lw$0jLUm1XKe;)$v~qpe9fYs14Ks z>H_tEkAeEYCqM(BA_CN=qBhU%xoCEd$ zYfg$f2b>2k0KWkjflI(;;0kaRxCUGYZUDane*k|1H-THgZQu@Y7q|!92Oa)cm_NNUgSjmzeM2`@EUjnyalLS6h#9JzydD74R8PtcmM$q0SS-+1@HnYpaDL> z59ojan1BV?KmbSwqz~c07$6qN0AvI*0hxg~APbNc$OZ&~cpy8F1IP*F0&)X+fV@CH zAU{w5C?^10Yl!|CInr0;Pb`KpCJcP!1>$d&%0Lw$ z0jLUm1XKg612uq}KrNs)PzR_B)B`>S>I0tu4S0X_%%0{wEK{`;da02l}i z0tN%5T802afnmUKU<5D{NCZX!qk%C%5-=7R2aE?M026^pz+_+wFcp{vOb2EFVPGck z1$oS~fZ4ztU@kBZm=7!f76D%Zi-9FTW-r4-6%B9e8jLkhLhuW43OEg%0nUbp{*t5z ze?##ia0$2!Tmh~E*MRH54dD0i$ken$$VVEgbPSa0j>x+ym|d4}gb&Aco&`30kHqqHh8|zz=lCfqH}wO-U+Y z>iB8^7GMJb;BENWsiaI^4~ngEly*RSA)M4Tm@$1RC@Kwbtc z2fhYY04srSfK|XW9Cv#7{@A1v%v32Xj!!BsG{Vmt15Lu^#wXc@Dxz2kXbol?pe@i2 z*pFWy01g6&fWyEM;HVIuF(zq3#s=Wb!}s~X0$?Gq2>23MEQIeg2tHWaJt%J+5206J};IbD72A zx}$@Q>Ehwlql2~c{#OTI&unDAV}4*ZGmkRGP|qnUx!kZ|bvpcQC|K)%f16p0Op2k< z`l-A06I#SY2l0^0GL=z@tx#!$P)RexpC<)Ng?3+v5FgVoX$|+58+B2Msm8Qq+MyPP z;lAcFEo;S6&{U}+^y(eyDHf&NR6gokW`Fel8#67yZ-rlUWyJEaln0C$>M8AK@-kJJ zPnp5Y7fi8i>78SYq#FDdLv;pY3^ksb9KM|t9AE4}JVzu-J(#?0X1nuTeps((uLm+3YyhlQY;-u2kD2jm&wUg zz<|&noqdhdn0GL{nAWo*2irrpULPs_Mwf{;lZW&()bb1ZEzL0=bnI8*=7WP{lDqZ} z_N0@W^a?I!!^K9SK6~~JPGG~h1EYFMGk%Dlc^MO@EP#`KgwwXgiHG9UbC`P36YZcU zR*SULIJ(=wSc<_D`kd-V1*%4*gTo7xg8I7#{~Xt0FzM0G-a{L!h4$46HI;~VweVeo zFZP!Pzy4i=Z_cy^zb$^zGfjhkNn7YV)zA%wq0{`e!FR#Myle0!-t*A`Iuo6h&Q9m1 z^V3D?Qgj9SBf1XVkZwV@qr1|*>4EfcI*Fc2hw0h$eELiJD|$t^>DXXQ!ZrFPddp+_ zHSI!g(U<^}3B4sZQ-^CPo^ z*~=UZj~W}yRQND6G+Je+=%I%qRd$;m7=30V=_VgVp58e6T=hsPXE^)DU|hw&H)32s5@06rB>lf8-p3*DliGC$B$5xpD?EqBD-2pZIWV~hLE4yAI_8<%#dyZy&!t> zAl-F;>S(qrd}LfOd#2CnDK#U%txeU54toXZp3zd7@a*JZ*0>YQHe4lXUoq4PW>fSB zI^DQV`QA7W{pPVe+pQd0%#Vssh05?!6H zM>nQh(H-dS^yl{_tHN^_U?ee4Jy~mV9=Sz9UL=}ki0HOdy zMmRF<&q4oL#;mD{*=;{_n3*5F=PPukXp{JXN*Ovi9J(Z`t0xA>Wz6sWBG2hx51!$! z3)Mo&SHB2uVUiae44$RKKMfAXlfk1Iy>wepp0PQ2v}JiZ1NABZ9R{c3#eSxl=vYY4u3E|qyNmLR(m!zR&cjRNKvH1KXd+JjlPbGmKM~%bh@A0YfoQ`}v)CqXm z(#Uf;@(I)gd>+JXo$@?#JMxJkY9b1k)9fJ6HG!T)O~U8XH1fQTd@?l|pGuk&^WLH65Q?njaJ*^6-7~Jc+81 z@NZNF)P0JokU;-yRUsh^Re`kJ+0<+tDVRo+DCV4`Tx9oLYA(K3Nwd4Sv%5!R_k3zT zzMe``PZqDN;yKQ>QHV`xA3_sck1p4Z=J`_K8iYzEdnm zq@Os&$wb<~DfS@JhE8!ikv4LQ3yHL`Q@sBxicOs2F(Pg16ywgJ*vu)?`%!G}6l)V{ z3#V9+NLxC^p+wrsDYhiiPo3f#B5myyClhHKr+A4-+d9SVMB2_N`p%=+-YMQE(hg3s z9FcZ(ig5=}?Bo=C5NT(pSer7WP6N*q~IF!D0Ur@%jNj(v9 zD5AX(%1nncfF1zKuOFmRh(i%3C!x%8D1+!hptSuwl|n29m>+~P$Ds^|Qwq_7ZmASv zEx`P^49Yx*G7>HYD9CAad}1-6y%5R*hcb#D1QJq8q^ODg3{ zhq8uH7CV%&^jJ_br=cuyD3=IjsY4l0j|b($PN_%v%AxqKfU?Y?Or$4*k~D#9aeri$nRA{uY$PG#z%UL#a(D+Z@U|dL1Yu`=uUbyF(dDC_g!r zP4p&Ey01#5>~JV+2xX^3*+OptCAd13vdf`dB9z?@Wjnnclx=A!dmM`IIw*S`$_{!5 zD7Vv4_BoVtgtFhE?4oypl3`8ii4HiF9)xnxq3ogefbzrIRLUWTvXD>?JCuF&K2Uyc zok}_4P>vDGQHOGfJ_O2zGz0uGheF=~<+wxnh5iMUDQO1PpB+j;LOJ13&d_H-d6wpK zPdb#Agz}3+xjUZ3FWjyxkz6GW#^&P%RS>zwiC)(hjN*|3`(QJsgz$G z%6&pP=TNTFS3yZ$mr6PBP~v_E<$^=GN8bbGVw$7;=1^)A%0-9r0>J```aTWil0z9v zD3=|Ii*Yf?i`bBQqALz%4WV3hC>+Cq!X~Fut~r!TgmT@X2#f$q*)${O4Ts|U1C-w# ziq7buP~W8<7IC?mCoXgmTZJ#2~T;zhWB7eTPE-3CaV9k^#XiWJ(-My_Sa#r64HPA32mvh&N!A zLZ~RE+dp>XnVHOx|CmN;`A3;a)9?OKW-!D2|4Et2y8zAJdpflnJaM`~9AX;CBuOKG zO61|mq?0{!C|METMp9>*x%Ih2*-j`g97;SB56YP|l$Q?WKB2sFC^-?8f#3Xm>IJ-Z zC~-GIdE-!WBP@utwQH%Aw+^K?p->njq242|gTQhc3QgqUp@hOXl+T#YKp``u?s2UB zAuflqhEO<%@-5&U&{!H~}>n=1D?@?qZZAYYM2ZaDJI-V>0|IFrh^9r@{y zw}^^l#j~k9(mOleSGPevJdHe)BhRK4(*7zZUc&_1*0TOhp39NHQLVqp^E>iO>TBot zq0|!>adzxfFJi|}`%~pb9eHuBJ`QwZX{x-KBX6#Cg#5cpc(~CgRNRqw(X#rG1efN? zm2~9szG9HyN;yu5VuqAvbUzOCmLhq8lO4YkMIC@tvT{GZyOrxiDa^#lrv4Mpo^ADu{po_Dk ziP0WE_%V&VnEO>z&T1e&)^$XD%8{lQ#E zp3W`=`P($|g^s+4T>|o-NM>2|$q^rM0$s|k0QmxvzZ{h>cjT4q+K_MP8ykAJW0kX` zp4}KbG7*Pv^amRpc{95kf+PbL1oK(U8}zn9ASj$j92VAa6?C ztIqL}g1y(-vC#esJEp$d!3;U*$iKF~h5S76J4P?)s3Tuz?}ywV9djeQ3 zLEMK?`DsTk1*Sv(a~cct9Fd3UnSpPyqu{TpKe!kG05K| z&d2Bpes|<20;eEjEIuf_?I7n0Z_ApU z3+I~>KQ5f_Y4CV>($x4sxIm^76O#MiF@K^lSp1JV`G2a9hyI71{6E#lql3kNyOTT5 z`#;dfBZI|%zmxx``grJn*va3u)c<84PaQ1&d!770)yFYd{Es^Mf2xlcr~hZ2Jle-= zg?HrCGliSoGyUN?TzvU(pdvtcvt%EaT4{f5uU)uXUzJq_eFlQ zC$mHW$t(Ey=WMvv4o@IFshHpjYg&BgtRG+oss~rpKwxu{L}kT_w5q_Q2@*os67~HA zDg1V17Bf8QMEtYLDSLDEm#CTm`BhrkSDPfN(PoJn4Ez`S!mGnLVliKQj&SDb!7Slb zS+fWJ{rDE%=8K;edRzfZ>Jhkr!;u<^#cPd`PK_Q+jqqCVK@sUa|6{+kC6ds8$Fwj# zvydKQLdp;&WueR@ZL;=_wn|&AeXFg})@pANm=(eLjBdu7LSvzc&{Sw9G#6S3*taQi ztPbj<-V(rAN{Y<#%PDvE1DIL*yDV8?0$9kD+RUyh3{D zja4(KnboXnyqZ(Zqvltesz=q6>N&N7uY<3jZ;bB?-*VsgzJtEUKEa>PpVwc?U)|rr z|CxUn?nTfm>kahgdRv_~Sfje}hjHKd(5!0KG3%QR%qAhTnc2#0ZMHW%nqAHAW-qgk z+0Wc(9yNnj9;=8|%qnh`w#r%+tV&i@tD05Is$+d(HME*oRqO`#`M@#EJ>;>yRVA&N z$L&1KKm25!9}np?-*n#$Uj~0>e?EVH|L{tYN6}Xw{!QdpD=qn!r$_TTa)f+xg7xui;;(g=I?pAL^2W5P}O0Q>c$#13I?t+ZZR|Jbf?H@92ZJ?+oz?9mJO)hvLN3n(kp z0(vNWoc&JxUi?AaByJXe6t{?5#ckqt@h5SIxKrFE?iTlmd&S$*`H*r!DX=;6@JgEn zwngfquu;J%fcOQeO_#-4>EOjBjk>h{kzP%&qu14&=uP!c^^STcJsmU}!s{We3tWyK z>6CdH!9fYqEKF8bLlzE)4xH|yK=1JV9h&^mA=a+&$9bkIxTqoy*_RoTPr7oJ(3*`7I`xt`hbFUkXN z19gV}hke^F5GWEzcQnSij55?!W}R!VYoBYs>wxQ^>yYb)vBx}78G0$X_RIP$J=ZX| zbK*qC?c;s(^dARC?u+rw))NuzC)c}!4zqov5z`EL zPTtPghIu!8PkY~2OR8nn%4%!1o!UwLQr)TUQTM8s)T`<>^^N)#3rShc)`%ZK?LPmaJ{kwrjhzecB=In05l&MQnL}`F%xvMSZ*dWZR2vAGQPj zlh{sSJB{s<|1!3F*dAbeh^@39(ue9J^)K~%x?oJfHXGY!<40pl$k=LZGqxK)8M}GAvWnXk;ZCT+2n%W|V%@m5H*Bulmw%WEM*Wce(=rCWw&T9##70V|!A z-pXKQv@%(ltvD--mCMR+6|f3gg{?WAGfdBN3Fw*sceh1(Hy8Daoh!4(za<$!(8RUm30>{t)Se zhuKr?74|Ayu0y2#XJdw8SUD&j5)X?<#G~RdvE0v*PFc`f4kk}o9PN_#s`pRtP46x5 zZSNiLUGF{beeVPBL+>N+WA791Q}1){OYdv%TQ8+DDyxQEs$1n$UiGMgDyotytBUGX zRaH}cs$Vr#TTQ3NsASg5sAj^<7pG>y?3YaqVg}5v=D;kNOU;d$Ft3^qvta?Xpc;#d zfW<_mT>LM}b>+44Mj5liOSvHrDF>{h)@kd!)opZ4I;YQXv6}}L1%3>4n;u!yx5(Q& z5dQrvCZKujeD+6n3%ixw#{R_aV0W^+*uotnqv2G#H@j0PE|w5WilxNTVi|Fgb{Hoh zBc+$x$^88S%1w+Y7(KOE_$r7hVHx+WtbtfOUGkeTbT@X3;1b;;C-S046vPRIv<1jt z`wlw`W6@Sosu)$ADoK^1N>gR1@>r`i66>!hKQ9R8vJj=UyH?N~79-bI^?z^OV%24HSbdJi5hFF#B#&zd< za6P%txL#ZUeKlnP={4=tiiqOi)@41To>M;sHIBnc@*DY$ve?MrwE%10$t4Bo57vSRm^fT4jInS5x)Pa;s(5R9 z$9x|t$6$y}S&e#9n^Gsz*&c@1^XTQJ^QKJR_&-R z!VELu^N7AuPWedL_^#0pfa`;tX1?^bUEzGB<$XnuWw(nNq>NG~DYFzOWs%Nn72r1` zJTjh5!CFDmLf@xOF)!K5t}3nsSJjZ~BUd$7Pc1J}g^1p~Q5ldq(!g1J0D}DF$M@K` z)_|{LsLUu=admTzb**sSbPeO?aErN>+o7H`+HiH_II(eg;&>EY;lqz8R( zZ?|7ydu3M$R0vcGG!C>1%nK|Dd>_~rsIUj`DZ|sb<>sy zl+YL@Wi|0+?RSi1$cLaN)BV`iVjHoo*iLLOb`U#?ouGS8)$*8L>v#N^wDz`8qkAb+ zm08L{r6{U517w?+Bg|g*5&M{Z!ail6vCr8T>`V3)`Z zYrV7|qpxzo*kTr)5@{1sd8NZ5{3;7IkSXXb?k(pf{idO}wRePfzqhs4Mr*5e*Lr9@wa>I(T5qk7 zHb@(;jnqQpwDH;mZK6gDw<+3GZJIV+o1x9q=4%VI#oEfh7;_u6t=bN4k9I&ish!a- zY1gzrwA0FJEt8AKwVyNME8aViYa*E%7b&t@my4ZS?K&?e*>R{o*_2JMFvVyX?E- zyXt%Hd*u`Tl3($s_s95COsInX(*833a{e0rn*Q4Umi|`$*8X<>UjE+xFZ9`Z4`ZM; z*cxMvwPsqgtku>Ui|E9+?GRCmi{KIe8Muk<7PfoXQdVY9*6%+HICIk}sV^ETS&>aT zGI`8jMiuZ&=Kb$uob}7|Tm#*S?#b>s?yuZy-9NhD<5F6FM31;@R5a_Ejm#EiTeGv- z)9h;=4w>1lqE<<(yj8`jVb!x5TjP+WL+0gS-k-hYRlmL0o*uQ6RdYI={bVjr?;Yqp z;+WNBGre_x zjpjT78cNkTtog5pgJr@ik#c(Tc#C@9_ZIV3_BQaI_g?T4&F6P-3AKz`N&Q%@uYRI7 zP#dbv)%I#I^lkexc4%XRCA6x#~Pz z+5&a4x>Ws2U8XKqzgAbME7fn*RqAT>TXl`PR$ZsAS2w5|)nxTM^?UUPb(6Z;F))aE z@dl=at)+LYigB=%NcC0Z(%H3Ek?|7>-yY?I==6Hd{NPHYcek=T*mINevR%s3|(vxI&dv4V9tnNO{JbO{oMoH z1Koq%gWVzb5O?{IoFCU)S3BtY%s>FOW&PjXCjZiFGVR~_O+tThoZP$` z>%3*40JDN^CJ&ZF@(_8bJWL)gkB|*a;-xT(W%iXaGg(gpkD|u)X|w7Tx1&c?cE-GR z7*R%GBw36RWDiD;nK?M8&m`fkACLJb{0pA)&>pvkIg}o40rkJo+bh6e_#~5QckL#+ z5}5?hng?mTya`;EKEUEFVq{&w3~z8$HRM?>zhD``-R)NKHi79i>mUXWC2QJVIE7dPy(FYoeCo4ObgkR`Dyk zVko9!DX_SdQ^slIjB(cZ)krqKGru=~FgKYkiEp2Hp?-vFa1R@K^%KIW6sfHjyxa4@ zds}^=K36B{ll3Y3RDGI0T~GCAJi@Yj;x?Q^(d=pW8TVQDukLg1^X^h|Zj1&sv<W6ZFJ;vU}cmJF4B(E&4V+8?5^aW>NcndnUYn#C=8-nfA~)JEOTShAQLH zL`~6jZRyAuDjxfXVM3nmT?C)VPVa8-{*d=5#`)9U!s`2KaaFWs+i&ZzQ+H$BKLSgY z%uNN18Q2rpA0V%xB2TXzCe~({9jitiR$1XUsERNtxuA>m z0(PBrLHbR)C|!~+OIM_;(oy4Eb0%IebDiA(9hP%xIDTeV4p%|f2d?r^V?TDaaCLBf z<{ID{;hN|QyB51vxxRPpfUD@F>%8ll>#pmmi*gHYzdOdA&7Id>)Lq71#a-Lo$o;9i zv%5D&wz2LR?uG7^?qv5*?)~ncQ7zZpcid0i6enI5H`p(W(C69&j(AFJ+{X{wtQE<4?1QdKLIn{ zeAqi{_#gNk{6YQ%f1bYvYvVa|ET1P9)t2A$fv19}mZy=YjiU@;GlT`g3SphF zS2!;GDqIzA3r~c%f=Bd;>BX#K9`QX`zE#A!Vl(KCePPUu6Q_xD#jnJ*a55eh&xn`B zo8lw!wa7`T6p*rn;N>eUm6obVb)|2ltUTzkA38M>3lW57y(13HEfmWK>a(=sqQ* zjVlY>Qcuyah{f)sh#pWCb6!b&3*n_V%e_t1uId0BX^=V?W5iJHttR?%`tD#5tBc{Q zIfkxI7`8sgkoCfR9m1&f9>%M37^|vdoN8nZutr;9Yn64!x@+aMbJ@A=Ja%3?pPk<> zV1HoOw5Q?1X4qj2I%n-)?U+DpU|=BS-AYsRly@ub(#gA(NZ(kaZ`3!Tt8T+cOunZ~ z+~j3RJZb-J;DRIiD$)M#1@82WjNrA^wZ=;O4xT`I{OBIN9ey7V0v$t@VK7-nDv8P{ zWwbIzNm9n*!M{-kSVM5x^Q^C|{ni2N2wW;p@w~_^vD<$b?#Od+LK1WRp8uJDEu>_& zp{Q*Q=0r~StvAv7-P#5Nl#I=}nKkTA`KYN;K zL|}RCNa;ZM(EHglgeJ37*s1I^b~-zQ4YM=ZFW6b^T3EcuAf`y5;3WH{v{+gqEtS5K zmPyN{ucZ~zN;Je((oW@yaz4;HAL|_0_HKjgm<-J2s7uUp*ViyySGvBzs8B(Ag{alue%1|ZZPT<$^zsRj$#%DQ?T<0erDUT^v4RIF1fF!B z^qv^>SxW7KX4C_U;&wgWD2keI9kr`RGObTWtf9Z!Ic4ww$TQf@y!g@WOkuM;p&9zx zn(3W~mI*rP4QQjpz7Mb}zgIQEPsu7+y$-Cf)G)N6% z>LZv%hSV?UL2M6kk~mqMB2GpBo-Rh5)b+c@I&VRGXA_5D6#pxexcg zqad@KZ6ddqJIEd7PI71T`L1#|xx2hbEu#f|Wz0D1PJq00jx@$ZrU8^o;zay=^o!VZ z5p&LMkeMSCar+m64w~{Bx??(d4IR0oi~65Bc@Z7aP$EWHieXh|eB?ekW)sUPRpBqG zrc_sIV34V$3^bctWuOt0UwvlGvDR68twYvH>#S8Bjt$ay3({5CQJ&GBF`lFl#@TV6 zrSc==XVU{`6KTEanV;C<$|Pm7G6m-IAhU(#L4zdL%LRHFdye(XP2{F>Gr76kLT-uC z?^C(8d{?=rlr%G1^`mOqUA8`EesZ$%)D7m6>$2;L>nf(D>#nfufz#OsuNt|<&|rPM z?yDYo*yFVgST#w+B)s{;>He_e|I+(koQN1$#Bfd<#(V*9F7fzeWtOn2oI%bgXTtCt zCufnf%AV4Z=SiH*E0Lc(JG>l~;NMsR-^NNj3vwhf0B_hDLuEzz zDy6Xd*#xdC_Yqf(tImaLa5cGFTy3rnSC^~DeazM8KH(a04Y@{KW3CC;lxxN{#{}Gx zYsKA_4=YC$FFf@zcDoXhc07XmgL&wB7wjWc(IQ2KVx>DC*SneSNrO* zMmy+Wy8w1299o`1PNwBDafZwK!^X(}1$1a^{VvS*5CDklHwo-bq?(Taws1TqTD z)aU675fW;MOC~d0duZ#s0u7^HKN7Ebuao`P-u-Vnce`m32hKw8qL6nPjEmmz;@rUS zNe;WjRh(NT-H6`BY|NrZ+(+HV+{d9Jop8S==Y#!PTifev=}-Hp^XXZ-MS9OdI+5Kh z-V^VO55$L1Bp!>4`bDCgC1GfnRm;QJu8fTY*AA&65?%Y#iLFU6fn&6cPG~K+RzO>X zr7ooTbkIuqvV8aNW~xOPsL0b9YR$KnS-Y)87<$R~Jl=fX4&Kkb^S-g2qfCKXes64K zJoRX~wH3y&z}O(diA0H>NIhceyFYO^a5sd4*x3D{oE#Z9@pKV3hTqC>;^$C0`-%O^X;UkMV2t zIuVg=kC<#{L}eGN=Xyt8)wc^K!!s$n`~y+}{0i}z*Haom`xyz}dH0K!(+X0CrA0`9 zByFjItCUUN08F~HubM;)qT$Lzkk)`F+aI zhN^R8xFl{YHx9`FgGF6gyUDViQ}g4cEkRW z;Q>3Tmol_zXdj9CFnt|EHj(~%5sq&SwOc`Q+YOTg? zgvhvem)^~;RK8JGDXU>1tWkC-yNo5~YG^p5QN~Pt&rS8aEs;lG!1^vadsa8YU)PGy7%ITp{A_*>KbM~eyKezc zUf4|Zhu-iZPlxY#1ANA(93OFdC%vXLe8MdqU+~a(CVpA72^tbvn3{+;(=NoDlT#cQ z9#>9Rao2~g`mUC)j;?{Ok*=ApO|G5Dk+_a2kamk9x9*O02i^JH?;|v+!*dek@^K$x z4()_k*&wvDFn1Kbpg*~X+$+w_$MLz4=TVZc$k*T};&PYsYxzwW(yk*Mro*F9z*F2) z$y3ME*wfC_!_(h094gav&r;87&wkI(o(rCP9!7{0a-o%$6eFJ=>qiV0#pu{pvO{SiZ(CoU7$A*cowq+FKNgoDI!&s>PbzcR#FG4 zyVOq#A#r1(G+mk}ZG%_fq4Y+Q$^GDWn;@^0H=v3C0xRTq`4Mt~l#r5D z$*UAsDnT1uqij<4DYG44#!+~DQwH9YarY5o+>yw3+Hv;pVQtbt(gr8`LL*Nbmq<+m zAv#$oCAaLaIU(n@=Nd^>Ny!Px`L3tr*Yl&Ve6IJ^`{{%9!TJzne+)Pu~=`}$M;MM!_Czt+7*j1g;OFftpY z2gMt?jNC>ZL_iA~g^dzMNuv}Zq2-Y`RMTnrPIAeAnOpL+aUz;ulHw)%cX=kE|3sq6 z|02&M!X<^DgM9zNrp-2f0ttN-^(yb%`a(_l1~z{bc9k! zFeS5{1zR?3$87^CB>54XC((h_;Cz0(!IR7iS16e+&6VNGa^<-47%M7p6}j88h%m>` z`Ui%J?3frk*3KV|6HKF?Gb5k`B)Uht$GDT=ODiqsL2#p%_Pwu#KlE44u)E^}?q$|- zyu6=Se@4w%;z9j0I-fo_hQdN1lferr2dnap5Mge@H-#6CN4({z{xDBuGPvib^=igv z@DY(|vL0QRz3I8-x$U_F$Jjm3VVS%bn}y4SI-{T0f7i*|vB@0r5Z&UnJ`}G=B~gwq zs5i_eC@w#`x4O5vx5NKeM$Ul1O*yRtk}wDO6a7>CbN$Qw>-;(OI*wDjzFEX^TNktF zGm&X=jO#R?@}BJlTFQI2CuvJ+Vp1a-z!_~xbZVx}low`Zd$*ej^AE!^iS_D!a zB1wS>(HVp>C%}*+($n76fsS9>jyA#CK{)-9X-nmz%d>~rk37{p)jc&lHQ_O=je&Wt zd_p;?JTp$2VJJ5ox&KIrG7@sM;Uy>0-$L|wq+}N6ig537MY;F6V(@Pk=L*TO2wPP^ zcxD(LuAqNtMx6OokwqGD*ypiqWG0Zx@iS}LUGf$As(ekp4kzF5GLIZ8dt9V)A~8gJ zJl4h&{ZI6%KH_v5ZHo~KtS#@{Pbq3%IC}3TP5W%*-m}VA1LVzO5l!mhvdFYe z!u(5qA~6yC$sC06g7BY_G8rRVOo+4yi}{hQA5uP5S}Sdow#sm`t<_>p#E9KQPhwB7 zHKbZnZK)2Nnf0XI${yvCa#@)G=XJS@iIXYC*>?k9_0hYiwq0$M2b*nnKx`3S6f#*S9^G*JGw3!p>5_qL_{4k1jDQksdEYE zB6s$lKHM0ApA`iD&tU8z*{ zUx2*zf!tXJst@xmLmprQ7cuZEa@jp6J)cS)r5@4{WJb=A=EI|wRnD)JRO}6rJEQ1) ztjQCpkr%9!8!L-gc~bkN!2L5lAcd)miwyzEfUhvi63<}t2q&(TGqvX z>s?HFo%1BeiA z&w7-&H1IS;aG%l)sQ?$)VZu9C@xh zPo6I?kQd5}J ziP#i@j^<(uk&&lpxe@7mg76{9FCeMDd*OUw;dIEMk!;&rR%DWV0zWPZ6{h&%55oq0 z>QB&X>5cT3dV9T<(ZlF(BpQQ}t1-)3f=rFga6J5M)hTB?O=gUXOb(&b{D|X`!OHfg z^SX{idQ~y%7v=?9+EvC?)>RIXtPfpRj2&k4evwn|gTeg^Jl<=ib<%oi12P(trSGKg zr5~hC(q;r8w;%wsP1-J9Rjw&}jb&!@QIXc;^3Byxj&M6hM%1~X$PjOZZYsBw{l?d3 zj_4Hm${>Fyf%LZ%+9~ZiVC-gwqouq`7d9Y(svX@hGms9e4Q?h&4OpK+{ z;kPg7%}C1S;hrEVWet>uN~n?2SZSg(Rhl6v_F5qmWMpbgnG)AT)uJax^QaT`F3a1^ zalb?f7(?A*GP~p4S=?C>+YGvE%Y*!5{L}pN{a^bx_;c&Cq7^uaddxI;w{W*~w?fpj zwfiGE8xm3yv>EUF^85exlNFJMR7x+Wr-$K92E=&dtT_uIBGN6Z!Av-4hSN8Q&lghI zIJP8Pp8bSv&-Q1BvJ=@a*{|4T>`L}qHkr)e#gJxJU+rWZD<{7v@i+0JcnNXOD`IK_e>Du2}cCGUKxp}!^%lEov{qF&-lfAJDm`z3N; z^}VgUvnEFpEk<}pdPjM^@SKkfj0$`Tt&W@|mOjnAVr#i-yXv^=y6PdgUElSItAVSZ zHdwoE>^5)M`2y*qDV^`(PdqYj*{(>=?C$E}>WLV55A9@pq|1({9xxT$72TEGl@aYu za2J;IBH^fxw$InTY2O<}@N;(^8i$70B9yIZbwEbCiECiBq8}X)9D-o%NL(C!O z%E}ljMB0NF*FPq35Z51vZ%?Q=_5dsJFyeWcS9mY4@*3~s{k+Z_yvd^v^8r2`pPrB5 zWBCkxM#Rc9!|iZKKB^p36r|sO3jKf_=>zH_GsiX8HP5xcwa~T5^(6xPOI+o#j;bM6 zPBm3&gAQRSl-sC=?-z_oUxA1Q^s4}+uWPvo#dVFUF<#R z9i`1Sy!HwEg8c@W`k4a3K$Sr2z~_Oaz{J3os*y?ZwpJQdNuI@Wp`=uLbwp>_PETVS zN?oOHa7px#LR*dbX6fi+8#k5&^t%`dHQPv+knNwgMY4JRo=jd19hvB}f3Q4WF-OLQ z+H@`Uu;+;9sOK1h`#*b5KqcEPKlb)khp7Ga0eVKmjYSIM?Fsfody+lbo?`QrF@qEB z<{1^wDtrQ8mH&vZhIE4(d=}GX@tq>qJAv-WZWl6%nZ-CU3u6A+L>^t5ocxUWF}#3e zoZVzM4J-(33Y?6NDT&lg#_fhP$n8Pagy=5$w@AvQXuh;fhl;V6_{;ni{wi`9uJem! zt#;(#TQ#k1WZLdUH)k!Owa`XrE3`vuLI+`ureTUBR>1(w9fROi51~O0g{d_a!`1?1 zzbryl*#`L7lM%T2-rvlgG$2wDMZF(*wM7wM>p1-JsKz1ReP66z+01Eam_0~c#bYIl zhR#Mb2C{1B?@4u~@#x8rw3)fUFqoW^kk&lTHQqG=nIqk`EzwZN0?N(4a=&)Jalds_ z9L-gcGa-?$yw=+%{>3H?<<$Fij%ZSebZ2&x@Q3iHa8tO2M2kBDaRl}27O94jbSL%) z;i7O!xGY>jBE~hLUsMeYFk7Jp_E35%pCLteq}kqjj$0x9inwZAX1{BZCtAj=xx(%A zi&>tJy)C_m5Ha~Pgm?+3UGR}5L?@AAf60Fx+h5anhZlK=^#C`F&?=gMG_))J6&5J?KgY0^+@R;6;O#5 z*vwoUmxarU^rIkGP%dj`v5G)5CrAH;uFrA;9}+x*Ac)8T+AH7n_C*%U2z87)M9*SO zMB2&vjgdZ4QaKzbf?QEjb1m(TSjsWjo^<)IQIQO}BD2PB|NmQ0;oJ|RF8e`rJ9f43 zt*}N|i&Ufa!VgkWGhoey+Ctg_aXUUXu16L1j&x(zFO(I^3FU8=^b z2Ak>nP`V9;r6%SA@&w-a?^);U41t=sV{(B9{P*-1`jMz3YBG}cYR-=61bL_-$Pr3_ zqEAw>NgDPKQ19QBx)%BVup7%jn5pS?YYs`&e4V0^!!FXng5Re z9{FCIcs~}EWk6OlQQdA*Hd}{Vhm{l?xQ)mn^CExvj9%8rV7@lrn0f5exM0$M$nw<& zcuHhQTS_Of+eAY$B}+n(MoK4**BZbfLk!Ol-JU(leistH7k&^n37dr=bqhyM;Z-1=|N_{7vbMa#qP&O#x{oY9H`5p@zzQ^K)>-}P!0sUideQ&5f{v%zoC3GFKwf1tF$Js

%}AmkdFTpkHBSpqOHV7$r=Hfxcx#KmLVHhJbt(Ma&yCY&+vuc}MBQa_ zx^ua6yYnE0FP}R>PK}%syQ3{U0%Tg75z^zLQ%`TY1#1gkgswt2p*wQodJ5la3%f_| zk!1VF^@wz)mGlI*7?xWUmr7v$M=2z@B}+Nqx#nLu9`v~A5cB~?9P$EB@|sIO^(T89 zt9{)r85XJGvR$#ROs-JSmED!sRlrr$RSc$GIag(@wW$M5uBodzTtn?$U7@J;g^e{7 zqec=Yo@r>N3!vS6jTEJguJ2siTt8v0>jBp>*9q4d*E!^iTy_2Fx`Wh)C$877w=NFT zvg-D^1Mc)t{IlYj!l7T?+y1hS2s~!DQ>??&_k&^nW`?CA0`=jQyqD3T_qJ z_(pCMw*}F{-P}R$Fn5AGg*4>fxa-{S++FTI?1C2@jip|(&<5kt%<^NoaWTF)UylC} zYE3o14*xN{z)hjPx8XbTUHG1SZzMYp;)n4g;gTAUH3TydVVj4wWMA>CLYP>R(cQKo z7{8Z4z#l~##~J<{)Re3IO)Tts#6RQTVtJhxZ8CuLtvKY$=JDk76!jE?9q}QYsWsta zX@~~d+SA3;&C|!z*Awy#MUGGs@-e1*zQA(jMV`f;6`pU9WtqEfx}sh{dtGv7%U6tR>cg3#2Jl3AIP){c|i|8!CQD}RiPs+Pzu>n!({KSyT$P999WEX4oobF22UeyBQl=GMHP=s^hfMMG{G;?2$vxAIsA>%{RjQ`5e|HbEhAz;I!p&*^FF7tvtD$rx_mu!u=>1! zr7Xww%qC^gmi}2}cKk@4Vt#4sQR`0Zd5f zHKF$!2qd)ooZXczNXVPK-*>-1?(Z@`WBKe#+MS)5bLO1$JO__hA<*3SmV=fsWVjX=X9EhLSpNo*r2>sy-Zw?V^@P zeI2z66d=)(k^z~JeSra4Ej^WN)?C(N*7Qg)sELoSV_0rzZ1S1co41-To1Y+=U{YlH zs9Nw&wvJjDwI-?&(o#DhkF=+~m%X>WkG(If#lbM?h621$+)=_&(oxD$#!=Q$&Qab` z!BNps$x+!+#ZlE!%~9P^!%@>w%Te1=M{(43eBh|(sPBl8)5x)Mdie#+3BfCRV|)dD zl=0dMN!Fjhz17Fp*O#)Te2K&z@``s8e-eM=sSRliX`#(x4c#1}YO<>w{jqT)wY`ar z=f`+iOF2t<%>0U&`;{$K5U!sk{cKf!vEKC@l3$L{29Ooc-tK$}TaKQ%Ro;aE8{)^J zM*~t|SpN=u9v-593wy5o*Wh!)e(eVcOGNfroQg3F&#Ihu)vDgY4(litj37Y!b7+1K zw0>qN{DM&Sm7wUACeZR7q2UKYyH9~;UjePY6B_+TX!Fa^t~Y(FK+PV8ioF2!`T(kxL9GU$QVU~Is*2hE5!C2sP@#RHK1V}!&Vt%p1C6;8 z+VUtgj0K?;Yd|Bmgf{F6O*jHta0Zs2mC%0Mp!t4)*1H0Q_Y}%5 z0*X!vK+6?|hN}wg)(D!d1GJg~jW!wDY%w(1UTCq?&|tTqy6i%Eep zNdq_50fck!M=ko1ss~O=7*>JuM7xG8c3uwhxzzvUa?A5L4XC7s*?qInp zQ(0s(7VmHa!WJ^7RKSqSPzdh+D)8+!MVPQNyzPVFfS3yZ)+)m$!!B@~{A4(b4B>l7 zWPNRjFglFUaPDR|<~NprE3X#v5?jCv-wlwwk%*ejHLfsjK;ZfSvNF#auNdzdpDOTL zM8N+YjjdyLM0QIfZ?-Ma@qGc-A8nd~ds=K-jV;GEByJ^{P67>f!}Ji2SrN{-I552w zf$FLTjnEjL()JPEfhZe-sNYm1FfGBReKV3A4GLGnjLl3&96l z6R|1fV{=DyFLNSNswaWlWubW$fLJ>a2RLdzhrRGUKserD*P13W4hd~Vun(*jSr1H0 ztzoA3icE|g894>Hl1s6h+!uK?@(lbXwPxWW9Em!mz=wMi38#NV8L*X1k9rHqW}Y*Ia>bhndw0@ODOF{*XQp!*3BhilR!Pz^-^ zCzj5d)mqS64!PzZA;R1a4xGL~SxmGRn{J(pytXyg&DH}}yVI>__&pZV@P?*qn3OkQ z_1;3l)tb@T3aN!MZeg4>2&V57m;2wq;vcpRwEF)zES?BT$#B>S;C+AHZ*zcukJRx) z{4f$Ae&EVc)Pck&~e0I)m`iIb`QwKs@qi{tLgvFY{}>0zv^4NPQ(_=PoRO z-7vU&0F`9~lJ|ReZchv#J}=}=dcb6o@J#H2^|%{0Pd#7?RF%>K&0EgV(`k9j1(?;H zs6=Wm$=mijX!q=tQFGQM=zio|4graRWN(dOy?9Ni``Q@1b%DC72iw6QO?Bjw9bN$e zB3gTl;y2uAEv?$BhlbMhTG|teK$MfP)>k5c{UM z

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 z zrs4=)V8UHpWr?}5K{Rfg@RMA;&b(1G=FZ5cmGtpC{D%abh;zaBLAa&wp*({9%V-LAWJ`-59`%Wr>GSM`AnJ}Qdp zV(X^g9&oL$?t^#l-nj8b-3|XbN7e1y({DKHe)*~Dg5#cJM&!M^x*Ox4y;o!0{PIDARd?$g4}aUa?#+99Klq|< z=&z1@&;Nd7-Y*xt>gu*#7{C42v2VZW`^GTquXQt)+&d$B95c7k!>`)7Q|55CO}u`} zyhLVqx&5qpe2d++b-MgBod?%F_nss2>)(U;!cXgN4T(5fbuWQ`aMm1cn{@MX-N%FP ztvFw|Fv@Z1@^26Pe6!B|z=1vybvM7AR`Kk;nXg}}3w?IRBfIPBzCBrcw@xR5&Y9Qi zb!VC+FUQo7b!}K2Es%?a?cBfsfV=tG(^`?DR`Nd~@d~|9jW#_?=mg z)+OY8H-5qupSqhJ4%HR?@RehG!vzk<&GU5)TiuQQ=5FU-FE#vH9H|={agF!=#ccI) zT)ez#(DK_=g*&Df-4JtsG2@m1pSHIh>nxYcgSfud5xrocc;~Wtw|ny43%7<``Mz^q z(Us1>AFR?j>iF?HGc5OBztYfpgjN=BM*O0H&`P$+2>Ht1FNYPSdWl^@mig`k zx&JTu{;M*%yHn9AhhX)44V_F$2BU8HCl;73Xu}e*!D2xh5~R`K#7Os0sx-qx|7aVI z-eml*ZsQU6h?n}NH{-(+!W#2}QHhzXT3i{G_%16hiqx|+{7~bbCQ&^maWvy6(-S>e zys$o-xKeJ3Tb-0NJ&+dh6knvMriMj3?-y$^3GaBzQRS<{ZefVgR%*wq5-ly64?mS? zY2imKmP8WbXvEFJIUAQ~3LI)!E)a?KaK>}^@-ul%dLoPekZ!FR>zF|Y0y&}rM)!b2TLW2JNAfNW(@gy5 zo|fv@+DCZu%3hY%Y_~Yp%W{pe5BdHS%U2DlD-C$)AFMg}raqP+w3oyWJ%PjnebTz? z+*Hku7w_E9(m@Y)U&jmkS(Z5otFK>Lh0J{iSui^dw0y$etX=E^>dKiw&+Ack~2e z#7m+&*OJP3)KQyW1WdBrWUNB?OtHMwknI#RC#6|+N;b&<1s+m_KK*&F3H84)3!O2_<@g@ha^&#SSIs=Nojhv zhaZ}QI#s`vc35ZFgfi{mhvoxtaG7O0Q*)U-KMm}jMn1~Wg%`b#1TuD7&hqkiBK0D* z$}&&Ks>F_pv{CMCt?2T(WddWRqGF#Vn(^VY7V5Da-*wz#s{F!I*3c&iqqaAyO@G^X zzeC8Xd|z6*jz_(hYt)5EpYdH^0#u2x#RRA8`qQ(dW|^%Pc_HezQz6@S3A(0ft~y z^)cS>H(=NNn3meW*;sWq(<<0pQE@A6u8t=U7$3+od6q|*iBG(nc9I9TNN+60-AmIk z1t$vY(h?bqd2N4sH$FTeEPx-ZKqp4A^dWjAGT)GH4RAKx`+TN3EQnuhmVVR;vhfOQ zm`T($PhZE_Dn36j{hi`l*?K5SR+<4Xj0{U{%GY#AH!B2ah?iRD!QbpjdlSJrrl)JY zQ{5vhLuRjvh~8mtGXFUt-CJ#()IMPuj2C{6E}EE>9w4jGn$)m4DEpBfdXd>b?2g`9 zl=a-!7g;7hoDNFVx_T3@cre{0^iPFh!TOm985FjOu`A-x;II?*amMhX$I&q0cok3I#*)PTx5GY{`PrXh_3TAnv601D7CyVfCNUoTZn}3fox)+Du-AqUP0l!5=a<2=KEW45-c8SxS-#l+UV7*QmFCcF zCbE;vOBnaeY5UvS#8CI*+2MLI{Kv36ZqX#p)5L+*Lp7QY|J20CgO}6vwi$maoMO_O zPDBTW?$@ygIlGI@yw9ay9JRK4s9p>i8D8C#%@8f8g}=jKeBvt=i2eEDdu29LM2yU6 zfxPU z9Q=GkcrjBT^3yN#2A^4)v)7@=2{-ZXo5IH{2$8ZN?%UIH)xJPI*Po5nYr+J%vQMWb)Z3)cl; zKyXDyp)Vg;ozYaJej8ryE%Lv}h%*+C2x}@19?odvPjB4!=Zvk&OJ?)-HOfoPrHsW& zq~O5zG43kpHxmM{j-#Kx(xYO8F5(G>C3SObjQC1@`7V9LTpzk|Ar(LA zuQ4Ct6@kt$M4XoSgI`$P#rs{yZ*Ir*eB9XaCS5FO%4&^h)_^@AR=zZTmYxTfLqH<^ zRxpQh~ckAoRl$|=!ed4 zgD;=Z*V5QS=i??B@Yhv=vxn8-1Ky<=1)I1e0`tPtDr}Gvh_g#0GQcKO7zEulh&Os! zL>nDjp}_djud~WfNF~qNN3zz)ib&^NJ9uHCbzxNmiF5+D7vSUet0SJ&v#V-?zp3Aq zltvuYvv7W89SUB3J}W?G-9*;L2uKC!B?6w^6tRY}VWQ$f);BVHNd+cviHKwDRpke- z{wb@Ly`dt?f6m(C&TcC|SU=9TBj5aAv-CzB_baMK+ZEi-n#g)9@9Z)^R|UNHovb*S zjZ$HE`4s`!kb7C~dbUu7t>v~ul#ZNT?v9WA?q&t@khAEfJBK3<<1im3EDnAhu}lYH zvfnY#F4gE80Be1-2YRTJ%Lwjw0g1G)LErJ8m)ZO{3(CfX8JOKv=H;JG)QjL&*%P&C zskPV;lpQ3ib5yw4@Kc1FQ65&xPuJ!(*ZGDwRfd(=cO@d3@iu84e2YuN^zQvIFz8PV zw`AAq<#$W@g17C>d1_>KAdV3!KUhazaTldXxfyY=F~5^yaTi0nXJ@+Mh@p};v-2yB zB2A*KaU_ZooYo6lRLt?k0c!wwmTjKEfa0WIUGb&0uS# z=9(NFxlaC0{UL&%$X?9kt6F?BAJIP2#P>a!T`n8ft7)v@wzhx`c_8wl?61K_@{kau zJETqI9D`CzXeyga15ph6>%U$pab;MfSqDp5B^fb%RCcl~uU3EYk}=tFaG$QCO01EE zI(eV^6_1LJ?5?Eg-4tokWj6FD3Zo;3F!_QSiG9t_nNfhm^lS(d)Xd%{L>_>M^e4(Q zvV*-8Nr|21hdLtW_AZg_^y(bYCO`XZTUCtmU6uW$H`_0gCPxl%uU|v(f=G1@5yHSN2U6Fo4f|1!dd!VRjrdd;t!2iyxW=K=7XIfy@BE;nGw!M&U=<^BDV5u%bu| zzpq5rqR0e4c35m!9oZY=_1SE19(*EukKt>4(wnpMpx&CdB2PlRI|UTs#o5xxri>jC zK4-Fp%=U?jcOpw=c3O<9$zEt=XT;qfvsbGnW(Xn2_&o8G`He5s%%slHXNbazIP9VD_uK4GC z%h>N?*O^GGObp~)WGuTQlA7j(>Uixr2*v}yi^OOv(BNXzo3jnj*=Ah9o ziRJBbAT$5M`q&N5 zB>7llb#8qT$cAeu%us$P2nm%8%$eiI z558#$@JgW#DPZD1bK^l@c5WiFqO3RE6`aRY8mCx ztW%2hC}DV)9@d}Kn0>UE1w5-SVvg=WFKq3 z_Dv5Blg9me;hVx#>sFnb&m$U!tEm+Xw4y{&-rd!9+x3`Lr$u~7i+GdIL=vTUp0r|K z@$25iP3^2~zH%T^ju~wIS^dD!g+35T!>l=KA>5MH6vTlM)(u*TJ8Oxy;Qg}E_FG0- zxA3!TCe=6T7T#|VQY{&6tyL3oC%Z`^4pIKBvvyuF8tkPqO-x{0CRl5<*ODyja5b7+do^hhlw+Nug1o}C+`iuL z#_OhcY$6U#L=~}C@z&o;;-@=DHsvEHSzD{kYtbT?@+;#|!R?c*wJO4_AujQv3@X`V zYkM_)_fQQZqNZB+Xr*mOFyWVP?WO_RDuAr%*1=j2x6!_8&uz1ik-oq>M9IjVY`2vL zD=4rAs$YAw)?g95-&{mKJkxqniR=}kA%gZo+%tza5x+ifou-v5Si|wc+18)cN(5=3 zlicrlRAS2uRgMrk^JNda4))umboNtBk(C;Z$x z^lf#ybq`Mr4D;rN71q(kZ(G$8U%8NDQZx2?Q2XH6Lygt;82+Ah2`_(byt8q)a2rw* zQI*ydt*nXKCogce6?tsg22MzA>(Nj{yvqAk0^$3?b5u8M+~`N>4cR}rG((}}xf1KlJECUmm6*JGS5%GLw}^4z$%ZO9RDT$iX;6^5 zvd6Vac;F{d-I-erqD?sN!-FnmG!gH88fDUiiXXUb2Xd?ZJZd5a)D@)7)E>><)#rspcbRSNR`F& zlA5SCyn0N8lSl{iii^nPPEFKxl}2nz5*h(3%?Uf4^+rzmrjAe)o&1@!_jT1wA=Dy0fFCGsO^l4i)GrWkhL3&NKnJS0d=Ex8R zTNdU%U})G>BK>0!o?!H~SyVl1>*rNG!RD@LNp+h}Hc`|BJSNAMQ4eN!_{z~X6W^0# z+kPKthME+>H4|NdCA=aFz}dOBICf9$$hF;OZe&03ZHA5yle;(JUr(|Qvhjl^J+zv@)L;O#vc!noXOoyfnl#&ZeRzy64;S4F>Ac5^h5h;^a(Q zCWDr~xztOXE6*)880MlGmhyAY0~zqL4P>%s+r$77xGi^%J2Q!p#kNvCOA&oO&b8`f znTZ*n=AM>WKQVM)F2v1whIDtnWPk2S_Amt z*)Ct@2Kmti@N{cD-4IWgzPIFAU*+EB)olB%!?|aROKt9A^4Fjhp80jI zJMZzf?Icfr+h!ES-{d|D{rfk$f4BP51!0Tmf3V(QDF;WefXgY+W=^6+itdb!Jbdp-nDrdc+|VdtLs)< zYvwUUNf-7w{M=6Jw{5mSXhBzQvq5So*@pDmd|*4uSf04M-L_iCa>dGO8z`-$+Gf-> zfof;vUNmjZly#zE87uK z%km1D!HBla9K5q@%BWy=)!@zO$d1%XHwno@ZIEF+wp0FL^ z_!@KQNeqrO-tQC&6?_6iHp(mSDCUGyi1pza+X^KX>%d2t@~|K~YrDz#_A^L+_IX=V z*`0|M=WPq1p+Ap?iK(&WGhV~;nzE^C{3!oCbZPq<#1Fn;3s$u@c0TliZ8a}nTwvga zTH656F-nU!l-itD)yAv2?Ht;0ajmUH_8P4qv06Q?G171%c|P7yFCgXrfDC-T;{=2j;np)Q9XnWHwy9{)ipTI!s*YX4^O&)DnO<6_*i_A}T~dDiaE2adJhk`9r>g4hA_KWKG)uvF&jTM&prv_ zPSG=YZeIN0JD4JeFR_9ED{oV;~9USbIg@F6n@Uy1mpne@UF^Gw`( zh5b2RvJO?C-7`_J!af>xum4^9rhN(A4PL}PYAr$4a^V+zvFur`V zJxGmIz1d!)MDidz$;S~1>&@hkKRhGApvHrZvmjI=1 z%)=behVObG9Ab2N-X6v#^D9SyNj!!Df=l<#oyCvpck_n0v1Z)13(;cE+n;2*kDhJ8 z4=jZ`XhaaT3 zxR3MZU0XYlHeLFRea?B_9%pSo`ECi6R2 z@%ftHFx&?5o;U29*i-!04g0Hn*>8X^zG=V7o)GhI*;_DZrr!SD{sfN>fw5HHM~?2y zhVy=rmPvph(x3I0=g%`t$xoXUFyoq8${44p4DM8C!}4AJhQ#~EUx z$!AcX=iH*#@ZoL%2DnFK@OZl;`|IcPQu)F2Ku38-f5M|`@=~!MJhLXR1%_!2z}4U7 zUE~Gch`QJ(dL3KNnP0St&%1zb>&p8zjDEG!H+m1N{3)+Y7UcoazB;y!+q|Pq;<_ms zK1`~cMYlJwFZqbp0Hxf_!(^JwSulPa{5@}U3!d6A+9+BjMMt``WYOoL=&yQ1whAeV zMk{p|Pc4duK#|B9j~2x|S}(Tq=)f5Epg8tQ@fPolZ> z>q$oO=)LG{9nZK+oPx!GT~#w!iMgMgR9$=$=*_yA{)|P7kkgYe(FdQN<`!cVBi&=bl&zxT{G`Ety!`wmBmb>=%qzUMIgl^5h?yF|+Hw{ZbDOo} zccWtF8bZ-|cld}0VnDKGt9!5N5|ZD3j^9VAEFysc^&kbe5W`z20N`C zV!$!m3lU+xr>;~;xovOXp|U05B%xYz{A#e@ws6RfaJutGAy zy4nQuQ_`cGAdi}`k!FIil?m6fn_$I77xtN8ENj9h8<|*}B(fDILuIlNriW~U$uOC0 zg2^D6Y=OxT*(jMJA>5i^`DVg$-h{no6U@L&I6`289hV8#Ty*}2ES$-z*(7E0nGeQb znH?Xq&yDt_u@BA9JU^=$FH1lN91NJOXUF(C8=}+(Oup`6L5aJec3s7x#F$rG^TIqV zJ0=f92OQyS0JY+)v?1fzOa;X7lFZ3x(BW;=%BAW9D3ZukG~Puj!qo#>&xQu+m452 ztaERDBuX4CwUOJvm@d@?K8jCY9%pJcT0ysvTL2y6f*!*+5c(Mf-ArxLS$>Mp z&nf5tIRNOdN8ZnLEcaOfbee*0BsT(jlM6bXClNYBLA%Q^p_GbT(Bt?xLXTI_zp>vS z&`okdPvFZ5ovEPd&QD1iF6c>oD4{1S=u%#^cxDAT!q51hzoi-Pa^aR1s#e@ zg>i#|3;Inyj?ix@Xg#hVhKj)j{SIGFXtH+=mhR%g=z98o-W&LSLX$yZFud#kg78BZ zbOpal=q(DGT(0BHmUkhfe7G!-cr9`kb% ze(8e#i1#7%UIm>EH%O?M3;Gj2ozR~u=%?ZJNRkG-pg-dq2u-$T!H}#UM`(3H@8hQk zy6tTM>}=e z?8#HE#ra~Zt<&L1QM0~NAgj#pwBSv?pm%(BWnlct#^U6N_%?EJO#F-D#nJIob(L}P z-|NNq8S%|^mC5n_Wzj!7ej}^w9)Gr@Sh7Aom=)*8C$k9NB|qNOECNzVI~3*^{Krt; z;Ng4}raUQvX90~^2>cDu=%^5X16dM9@RbB55{cl4)OZSntg9n9o34C`z~4Y(i30IA zz@`eXHiCL9uOrlW3WV~G;6*9~fj@L(8pPi~CkZ0>E`l~vUazR}6bRX@NAQptN}dS( z4dh5qf%qFt%4$Ih529_(MfUsVlD` z%4-*bwpL!V)OZS{jRIMzLJ;^HsGZSt^ct$X9->#X^2!R7927{H0jKO^&ue2SAXdG20vEA~y$Zm^`zc0#A?<@cT&@ zc&GwbN9hiW^;GG9ao$}7&|MVt zG?m0|Bzln=4aNfpcqz+f$bV(@WAQw2@rx2jr z4TMf`Np2LMPq~d&&^d6-iGMEWF?`XT8d zpnJNYv-l}O)BO?w+H7lgLFaIvw}GChpxZ0=E46V!=kg?=Sss7v?f4|#wYG69QT}%P z=tjErk{6%$UVK}AwlW^4N4CdzXYxkI7wm{%s~hyX#G`k{|LR3n-O6I7#*>Fu#rMP3 z)Re0DuNu=O6{6qQ@edj6r|iX&C_WKi=%!44MZ)rJ{O5Y{ctFB>UFF62i+XV}Frlfg zvNqms5cakSU&xg=OZ_d_1XW-4XOuuU2H;xrB-qyB3bqoT9_ zhi^v30RI;*Ms>hx7+o>^KX)_gzjiTd%fD_$CAswf$jzu$VvEF;|H+$CMO{L|xh9VP z@V#_@yp|4Use?w~zDnm=xc@^J)9LAAI#D+up)C$NOi6f9{4zFUg;zco z|E&)q{`};GvwUQ3LYSEMGL+r_9S=lq%3+8GlA9Z8Fd8DH6I#9qNyp)bkklTH5K_g?zEF8&uX_i)t!F8o(!Oy>&VC6rQnoa*>Zj5SFH%3cjx7V?1Bp*k;-!TvJ zIErCm#&9^wH@;);FW}+>a|OFs$RQ6Ysp^)&?b5` z5VRAIS>W%TKE;DR>*^{{Md)wffpH)EiXDaZ0j_poy!&;QhmuFuxn|a_nX0tM+ zOh@-BL&}pnoQ4!W-1H7Uq_jVK$J`N{2Kx+^`x2TM;{NE+i#moJdQnG_Loez$B6;da za_B`JOAft|;Kl{!rpgdvdF$fU zdlL3=dl8%`lyI%jxZ`WUbyZ$M^T@f-{Er#DUS9$*b#(!5gy?Aa^hYX!Z zTQIOkzXnvTtn4B_YtC8pbnC1!T4R^ta&I6`&(evTD_T;=a6syc& zNt8S>#a(u~?0bk`nbrZ0VV;_D)5qY;B&j1``EdtR@$L?Hn4h@2yTfY662;1oI>7!e zNlf3{;q|79Z=1>&rc7iWArKjRL1gSHmY?fjGQc%KbKINYEA_x}q$$%H>0%07@V;(g zCN~mR&C-6pa?unVVqG!Co9TK2M<)y1{P00yu)BH`x#0H>7g=fI$|)Wm-Z0^(b3n4l zHFP}T;n6_*trwOpQ}(vywK#Uf<2rQo7Q;Jqoa3c>GAjFS%H-fb+S*IfrMJ~X3?kJy z^%L2n9ZLByGJQy7jqVsEHw?w^hwz(h_D7azr?9s?({X(izn5ac@!_P0j5;sLjrV)K zBMt`gjyu_XggjxqNPWHIQp0@^;wJHm)rec&ZR&@*`v~SG&aCQK>H>jHpQBvjbxm;! zyKHU8<1Pv7>=8+P=4PZ)wytBODuA4kDh*zwm`0G3V)~+7m zF3Jyeg!3_HRoq#7e&`6Ioju%fz3c++%-Laphv!dSF|Hm=6%XMvd&k1#%tNui#MC2j zbZ%;FqPOD4&chR(ONx`*yx%0mToyhp%8O5YH8ueE(zM4RTOKk$)>IigtrmwWRL`gb z_@UPkv*eA~iK@d(oQMf3kKF+Beqx&HkP>I6i?-micVjadds$>{iA^v#$rfHx_u})^ zr>DW+)*LZzN9?=q>Us6~-0u@$x_=zoy)`_AdCZ@7fxRNKeu$kQvw7m&PqDk1+kA9% z)0hC2;;Jvjp2Pu~rPK7H%YY|O?4K|&JU%;fy^I?^R0J#d66HA2W)hYIC$+Dho9}v|$348&48v)KJHzAV8J%5^?OjVlv{)ZjtZpq2pKj6X7la~bRV zQsQJcXJTo*%gactdO_k4p05jYhYLeG&EqEC9FYHm+O}~28MG+z7LHrbe3)@X2Tm|I98P>gEd@$ewKV@N z!*ryyfUi7+lmfm>v6;#iza-x3Sg3M=yW;N@S0WmYk2aCe0Ux>ljvPv+i!Wr0kqThHHiPTnE6&d&Sg_Vx)ujD4-jSN6X)R+ zEBJw{6ZmN;W&AEKsAAyqmv=N4$q0JW`>`a9Z;vE2(@?<<zCC#DH~ASn_1weoA{~%~Do9ru60+W7hB4*skzuLk%K%zK%9N!J; zn-s@-i&Os7rv>wp2}#}}I5VkfLuagL9x@%}&u}CSH*()z)4loGZqvOnEM`75-BkHv zQY{?ej|LQl^x;J-5VcJS66EE#(r}#l|7q`D;G(MbJ%G=ihrDIbL7vK>gCL@SqEf;L zGR#1lNRoQY2c$Nb%A+VL1$>MHjWaMLvV4n)Bb6GSqbyIMLUD>p3w)Qa!6&9BDyAmH z{q1?6-CLh?JNKT?`JD3^Kc6q{)?WKDdp3Koz1Zvj-x}S@qpEp%)dGPO4HgZ_u0##d zhtY@m%oy78QFOTTldB-nvj% z59uxI?=}rRlDFMln~gx+oOi`q>)WGw@s>-8_(Gn{(RAg)AJy4micXx5XA4Nu2;5Dk z2S}%x!xq*BNZTDrYN*ti)P+g)yc^9JyF4FP*=K1|xO5G}>$DUgI$JKu9*N!R7$%*L z-_NAi`Pg`U7)o*?qzKU$L}DYP9)d)iv=Jn26w2F1NVNcPXP0-EWV{|>|SVGDc^dbs{M ztg>ApZ4j`73%)lkL))D5&vt+Nfy6BZANTk;sl6R<-!aS1l;f6-C50aOdfq`xA*t}l zPhq|=ZA%c3)g2&AGJ6Oov4`-Kxm=ENh9pnN!euW?qj=Y>3pc$eHS*f6|5rU(+Q{P^ zw`{GN+!>D*>8D6j7@mW*6v5B~@;!L5_*7lK`P&(c7G?_sW3h=IBzqnCFON97~(gJqF}q<#?=>3Bn0 zC16JjXhoxogan#E7`B( zd}T*ZY$44Hv5!sB`4X;x9o#en5oxd}e~B~_k3!K)q@x&K=*jM_6vXDg&qR^t#aRAX zRDVd)*ySVgrQ+_!NF2%5Vino~X(QrB&5-2_#NAg8_F9rTCqKy?I~2c0{#&v5*-GhD z7t__6%HGW1KfxM0bWPV7b20=vkr`7dpsio!SNGw5ex79fIKmr$zGR>Dw)a4=Z=W%U zmC%yElgqn*-u%GD>%|e$Ofi;s<(mc&AZ!h4`ytl)me%~Yc*w;}O5Pvl#f!5{Fi9jl z7^?}po?nd->wd+2jNu7lPj2xTkD43#je(4q-kC7Qbss(bMFHN92}+1rfWTVbOLK^E z0wTYSdzOc$GN-W1dnqiVUEa%Y%|wvpTW>9=Jx!0RcI>Def6h9xtadD}CJkfjRwJ@T zoFn~wYTQpfiEk=9sf_FIV4l3273bY65FZocz;Fw|KWowr?`WRsvv}iam;D<_5KiVX zE8`q)Nue;LFUsW36^aH8Cgi6QT<7%I*X~?fCg*dGw^*^Fg-A{4* zx$f4@4Su>3Vm!nhd$NMyr{}Tf3i0R5a6Nb&H|I&ELBFaL?lhOga#2ar8CU7BMm$7> zVBBmVsR203PMikw8u)gy9JcRa0H>Y!yP|fPn=Ew}Z(4xw)BOM+<6?q&&e<|teljtS zjl_tgEp*mvvUyzYssM9voG~OhSLQ*CIkHCXdP|v+?3s&2>)wzdMsJm+a3yieK*fkf zvM4S!m(i?6vIPw9FjmfXGT@C4yu(87pc-w@l^thz7p-$fV$NOj9OK)vNQU+TqMo16e0+9P)5`wZgPRa&UfpnnB1ARgyX+yF5@`7p z>`*i0pe2~oF-4W$uY83{h>*D9yHTKhQ?&#an$jqD>YuAx#bXB1U5i!3PJnRcxJ@_j zN1eJuvSB<^sCK)h38pigc6};4$0hBJGLdP(;FqR~r1~9|$Q&6D_u_A`jYa?mwI@@%r$R2`$*hnB9Ql>i8eWTNoWnW>wkf;zBO-<{M%Z^#^+;q!H znL8sWG#&c1FHtLHgG$`p7%F&A)fbO+7ozY;zD?DAzbCHSRf*=`&tX!wyTPAB2xF9a zFqwG9P$AwByI;I>QFf+uFO+{-hBO&3(p^_%#GRxr4ECkQgQ^O&O6amW)w=K}mtM5^ zn$Zf0M-a-ps?%5xdkr{aIzsFntvM8Pn!@56__*Y-=e($=kfe=9;ocGPMGQAC%>1S8 zLr`lJHvFs-?y$DLE^J-7l3^-o=Y@F0k=1WsS%$xKAGjEQ&K_4CG{NYW8}V+4N3(gp zCym&%a;dAp3mb5z$(`}vGF;_o)0&C6E53u5Gum<*1mm-Z;pnbJSIcKBn*`=>Dvm7U z$vsF|5BU;v=86IMPDYUyt{fMcuU782Ggli=(%ewe&{Hl$&^R`5p07|YL0p)62NdTB z1xhR9XJvRXSut(~gY{ztRw$3 z^2Z1}bzY9V66fSac1bu`TPE~2_bE1>i@-hfd?Ib_#T0auw)!3(;9uFtLZCmW`O| zVy{pL$oMi#Idg@iIVkW5SElP=hSIz>x zx^G4=1upi(Y1(_b2Z#~Mu0M6V4wrXvD3(qYD;gaLe~-1cc#kgKyhl|3XB}eUjiBfD z>O2?(PWKO0e8KZ%Uv0EDH<2&S)a3JG-{(C2SDoI~y#A~&bvc%mh-Hce3{ptx;uQ!g ziktE`x;R{M7QSJRZt4119Gu#5iWt&x)Vc%4qq<65XV?r@eQ@B}KYer&Mvjl)_Pl~` zo@37jS7K)%)r4-TgE_vMeyXC;9N*2)IydW23O(~=-Ne|UduZB2V!Wu^Y2Jv~QW?LB zMx95^3}x1J`mqp4r$B=4)AX9-fmhM^d1;Y1wE$%N#$_qQaauyW(2QGW{)c z&XQ#vI&9dn*m8(*b823Wx>?S}_~uLj?%2kt>A1DI6z3A$UVIrn0`4h%$iqU#VN(Is zyB1GHUlKcSsc8j7>{i@rE?7_M*{#R)D#rO%UBaGkT7{Uw1Lz%{;t<1(rh7^h4;VZT z3OPPxj~**-ELDinlw$8Re)M*!;t|3w77gZ`?(Y8dPMKngW#2q4`$kjC6-&8P>sQ=n zXZcPl6m_PB(5MNbO*r1W$G8a1;^HdM({CKw~8#giq#1(Cxr2sS{i#T!H!`L&?6ZoN+)Im-E%LYkYP5`1B*+} zFm{`;K+o4*$e6!{AqI0^2`&(u>5=>r9@G7Nc&ebpoYfb>Vx;s{s2wjQzV{~!yofGlh>Oa9`N?A!d!w`C4O^JeG z*3wd8;sb_RM>^M*TwvDIbL&bPdxaf6*ub!`-KF2V9uEek)ov&Ux*Rb@Jq8$ydh42mbO8XrR zZ-xj-c28w233F3Al7rd!VSKh!Nc2M!9ciXeS=zfM=v9VKj`}MD=s=0`d#4={r3*!9 zGAli(N0{=u6Kz}{(qC@N59QC^J=lN0nfi%i%MWGC55?H>L)r2}+44i#@CHk?U$P@eTnqmsC2(~Oz_N9Gul$X%ifIPW$=L?}|Z<|uK z*b+~n)on{W)oT8YwI!ayOJE$1E%DU9SK=vQcjBoR%!7#yxymq_`sj7G8;(tg^^c^V zDj-Zmq8ACBoZgFU-i{l?W`oj?&aP5!a^0~YFUQxgU%A)dyGCVbPY>A>djoG%x${VA zR=R{r#PiOcBEl)JdY9jtXGi_3$}em~$c^NAY(As;VfKBAwkGE$^LweRUgDAD&lh@- z8MzsrG&DD(8M&_xIgHlo=!qS-d0**2otHlo=!qWK>j(R?Y=Isni%XxTPs**0j|HfY&4XxTPs z`TsO%d95Bv&Ih@hgJih!XxWQ#L3o(8jbpZrW44WBwvA)%9;;#-$7~*yZyU$_pFED) zS6~}(Y#VTF8*q%FeE+He$Dc90E8~4hL2Qn@10vzzUl2lOBxCR~?f6!gj);x6;mGW0 zTHA1B+i+ytaO8jbaAb1RJyA&PHP9KoedFs{!=4h3{iSM zUJv&)OvP-y@+|ubx4J#uP+6X`I@w1_#I2H^^bOJKRZe72zlH3}+zZe87(^t+pkK{5 zRA<;5Hm>HA?2qwow&(tgRy#x0YI{Rn#sU(XnC3%$e9Nv-awjAc5da5d3aD>L=H;&q z6>In;{BdSKlKEh!9l3odvwyj3mJ50H!Ayj_u3cL(>wkXc>4qX=Phv~c5$JDzwt$Lj z)yBmJ=e2wiJF;*9$sAMIlYBI~a8UWkLho`#VQK z_as5|_&o^%&rS#|^d%z$3%?pR3AOhwLPR$oOj!Q4uI$gbgm_-P5#|j6(m2K@ACBET z7tU_XUtU9oJ(LU+EXVX~WZpx`06_ZSJ@rFznQ)q&iViZ&&B^6 z5jLzA|9uW4>t9Csc#Q4VV$ClziVG<*l= z;Q|<;1unuRxC~d|DqMrsKu!VYIwpRA8*meD!H;ko+Tae{g?rEr_u(ga01x32{0xtw z13KXs=mIo8I6UA3g4S?)fF0Na+dOd$LI`FjOgMuJ^aNKBf*bUL-XH>Z=mQ?$30~k0 zKHv-ezz@XW5B*^P1i(NDgdi9M!7vy?3h-kH424h#gK!uI!yy7jz(^Pck?;&W3!@O~4rCAya!^15B*Jqr4#q>l^Y}3Vl3*ev!wWD8Qs70H3{zk#{0XMPOE4W~ zz)YA0sgMRQ!)%xXbKw95fRQi?BH$jY=Dih2{ywPsDSri z8&tw}7~qI=0R}=K1i>H(hQSa5p%6yTsWb{M2@C!(j7}}oG&s=K)tVr0Zb^S~F-_CI z{In*wpr${fK*E0bD|`%}KrI}AgK!AypdLPj&!7SR2A{(h&sI;ze-4lx$p|igISOYY49@41|*5$ zAgwOvOH6+S-$IiE`FypepI0-ckHRrH4sRo%+hXt|ohLO(q+`&Bl8}Dbo*#(8ANs>% z)a`&y_yz1x_BoKfTMEaMiT5SBG`FI#DAUlekx$$v1obV?D%x1yujmGC8=UwSL;LnF zx+F6QH}Pwx79|ZdHK*MS<2TtGmaYn`QEg)E3z_Owl&RKsO(ONTB_rub81YmHE6=Rg;AZhpjddaAv>Z}FD z?hgY%0s*A?n5MTN1d~JPt@!~343V7FL^^CiK?Q6j*(Wsfd(~p{033uvP}h^ZeM~cw z)MW(tx}QM7NjL?k;XC-AEIX;`9dH4YMreVHa0xEM6}Sr5pp~rj4H)2d2a|W<9<;-K zy304aN57eP!zuIKz@o3SdWmnrI`U9jyKSRV4GeGT5r9(OsWZOd3xo>9@5FLe813!ht*-b2{0$ZEhS*-?DY1h)#*D^c_IO zB|EOg)Kpb6eEQPH%I!{tyUy%@D!S{;`;)53q?8@#%q{xhvJ*{-tn?dDi26{4<=!{8 z(`l(Y&N2MaogB_zT3r0NhN2II-A%T=zuRQ{gMFL9b^+$r*6(#|I$63kqn>JQ-KGDn zTQg~h7X6gR|8D=~Z#Julan}bThYy3%v6ob($-sP>#h9P^;WXI$bY1_ z@(%9AcgcxDjh}$QpRKr5P^9s&^+cjW(bg0BbWddB|5s1sHQF*Zpf|7AC+LT%gL?QB pcur*UZq3-=>!Ivx?VXgpK|O@IoaSPzm$^Gy^Jy3ZPgh0V;#ap*fmM)B3?YmYZDXEDb0d*z@w@7Vqj_K-wgu z+WCRQc@9?PHz{?WhnWLaK$Xy3=o9Ech&yhaZ8E8eOXvOvC_O$z&FUVk5}Yno8JOeU z3`L#n)VLmaLJ#!UbRC}{e2@dwsi2V7X5%2opG^+Fa`SQnE4b5z>X)DlHP|=7bq|(e z!&PWAPg^`!Gf9@L||O5#%s_XglBG%Erg;NLB5wc8!6pXkq;5b~v10 zp5NJLZ)_jkc`2>iY{?ClsxJupWpD=NcI-3`&LgT-3E-d-*cdTjE zVUI(Pv>&ay-YMIqx5kFs*s(XShy+#DdAK*vM_c=6#`VrI4s{`~xzWDcMcp*+gf6C0 z;}gsLlOHgi!`d2GR39dO-E;*GW;4{4rzbp&pCRmB@m`>&oeMN>CM|J{i9sbVhYP6r z6#5L}@)yV##ea$X6?6%@3@yewUn5_IzJabm*P(Br8_;*qP2=O9Q=9Re8kK{bPDi@8 zs?Hdu2KgrXufxYR*aSo6wi>S1t+bugBYodFEXX_2b9|`aD&YJ>0uJHq*ggqONBz(!*6%PB#A9@1E;9IlSmq zWp0i)Z`GvRKh15G%$p=SNYi>i4C~C0&&37$5X39Q&Q)4*je28LCT}+7mv_U6&L69* ze?<5+EyUI!v( zxBWat{hyy!!P_^~O-|(&H1_zT=t7R|i;&4U z7O#Zo!)KMSX!tsKo;f8f2R;VkI#e7)#sQAYtZf33_kghX4M=9(&?b4ba9QYxY;B|y zd@j^o7V9L?(@Q&nmv? z9bz%&mm$_suR=c1>#|JtKadmpYa`1u?_7?<-Vn!NYh{kJykii_fSDT(dvyh$*#}Q<}5Fj>yxDhuX;@t`3y!LVC?@h z!Ro8{P}P2VZ4X!DWaSI)qZXq5e;+KymbzMNXq}7W$909F)vcc2lB!Z`Qq`P@N>3qX zQ|2eOo(ZjN7|fP%47VZ_j#mlU3aFL%c9It($BXAlWF04uyeR2YCI23oR~`csl##a@ z;r$o@x@%Hl&F>vsDn z?@$U>G1q72fkjH@Hm$HT?h6l^5e2a>3*x?U5aaCFV!Vym3A}~K%AprI$nS7f$OiTJ(<(%Rt|ER zPnur0j~6R3i{%rmw;lVv4RYDM-89wEF-q^-c+ZA7y?f%5&bQTG0r7F*4~81n_OWVx z`T%jXQWLtz@C%85Qyh(N<7PE=YFmFi%JbECPu}fOu6k@bp>lTY#~=`_j=xcMw?ivD zv{e;le*SNsI*miX&F$f;>#?!wOhMS)HgoV;no&PBLsvJqw^D_}=G>)5|3no{tyJZ& zmepOxt6AtJxhW>P0 zFRSaY&acPyXce@avyA3O_#Z#hpQ_OJzIk0Yr-mD_Uue`iRya+25+dX5tX}+|BwGxN z+B3q~vAe~;d)~4Pt20LnFC*Zl$Cx!8nc#T6d<0Ql$V4Q+lL;nqtQ5@IV$lqj{eg1cd zJ9-vk4LAM)#5fOG>;5l%2k4@(UdWt^F}^OvAFJ>xJR80yjE!7}*vR+7x+3!#!uSc| zx~!vNofDaiqa~jwj3xl)U9PTHtGX4z-tVKbsXDbk)abm=rF);oqOZA_wb`ZXe>HNq zMC$s-Mp-@58Dq^>q|emur`oA~&peE8*}nR5^-*p7-e-F0x}VYe*;cyV%*fe^)Y>T7 zg*4q*xVx_dZ&O~|6QMU2t3#PfRG02y#@e^b9BS?KC2Hr8Fx}Uhe*gPhP3I&$MQyD< zkGYn#;9vL6m&gb8ReIkrKasl3r{DqBOg>Me_t&KSY@J0p92bn!c1;O)% z2oY8Q9|n)`Xl(`Fhoz`SsI|8hb`X{-Y&7c9g)I=42Ua7@FR-yuZm$_UqrHuF5SC^# znNy@=fp^JJDVzd74BiVlTi9gyTzE#2up;*2|^+1L(YJB4v) zcEjVJ_Pj7Qau_}y`AuOR;rV`o@t!dH{_tWA zM`okk8NPXDT_0iH;lCk3^cO}y06rBtMVN;x=VF1iGX-{rPlacc38OEUx(Z>Or_6)r zYt6{shk_ zOoTru>}_FjU{lZ_xU&P`d79FMkq?0nLe3Bt6^(^tEHEAsNWW0n0hb!zy`A}MKuwU-(;gpj zJHsJfXN-Oj8KXbMw$mW8EGQjfR6tf;B|PhXD{M9L0*Fz7BGwIsM#~C(wTFKm^Xn?# z?=dztLep=C=LW6sMYG|bkveP2%)+B!-0}BiU3U0ocn+FZgtdeJ4xat|qpT!1b@}*o)iyH5Ol$L6(ZvpB3E*l`I8%={UI~c{(VEe;p2?suK%Aef>p`njsNki zoVRNp_ZY#+FZYG5-GFx?|0Il)=p#~h(^lt=IS8jAGWqeC-_UdtL^v`x$dx(iVU!B% z1V2mIMPb!om*BYrP4T4Vx(gs*crt5J!_&@54OxoRaoyBFoM*y&1y;e2fM<*sW}XuG zXt0UGc=|c1Va&1BRl>W$s)TXdob<#XbHc+NEQhwh`yy}S$3g-wQ!g*W>@NnjC{drIL*VPn8@gpC%)4UL26a9b#h&x|or zS7c)oh0V0F+3<`CWb@rn5f_uVY@cGNaUbC?S!VcTmTf*KGmW_2!n5+xF zq6y^r#N+CA(&@ITCd;m=JMA+ z+P;g4Smu3hXHBro9qnpGzJJJkOfzPm($Yg9R8)EQ3 zB9O6>C>lhPFs?fao;!2DFqTZipD5(%!gxSQC0OVP^MF8(yffgVk@>qQ{+Z98WE#Y5 zc3^~O1}q7;HxXjYg2;G~b0Hq2Ooz=Mh--u`LS|hYR3@I20J2`tN{H(!h>TC8^$^)c z2rNx&2eTAnY=&6a6{;7%Q!;K%Z5PDg4Z^wzNR@YNqt>?aH`e4&)$j5{hU#CGiyuID z^7jS&D17Hd5^25(TyP|`F2P6bInk}&i(TrS8%9^wTN^$MtnX&@*HG)jnqlz@U}x)KF64dtl>n%C5{)D+oe z4_lR1%Nn0}%pPMiD)#b$is^DJN3~u_da{? zv+ubqI_9zHb&nmN7>*=O(}qBUpy5ykbgQkctz9WNP8A01j6@u#LHGWO^O{j$nNSuq z8oD2n%i5;6d9tyZHc=Y~SO^tB*8A^uQD=LDY3QdDbpkgQrnhwo? z;-Iy8g$;ZK%Xq2@h zoUf+#o{qJSgq;wf>VmUauP3jIQP+b~&--D#B`$a=ehIm5l)ejpqXn;9SS zu~olpUJw7+=)eh_&s<*T>G?0$fzG_%ZN6d6gKM^_I(wZpAGR^n{Ml|8mTm_(dhU!G zqFa39j;5KZ(V4oXsN{UDIu;*dzSOHwx17A*d`|iGuq%6?R!d8_z#P*ObHFgVx;p!P zY>x9*I0+G|wqLfjJ6t#CN%Q-Dk%ooSW`+;=L3g>3xFNdwC_7M1jxYC%IazWF=^95= zosPdcxE1C)#Bjgs&vE>BC;d;Jj9bm~G;a-DX6U!p=Jnu5irG4-$lpt6!{M%uRHs`k zhL5i5MmY!G?^#r}NT$&&EgYq*bL&?4H~YSt+U)DZLtj)qEuGcM=loUUj=LH*cJzoE zvs&%T?re@7U8-C5WF6UN?$6c@FReeSij%RpKi}x%vejeqjowacgO>F^ zBiOoobVPjtP$;xEFG9c7nD?4)$QW%un`bU4Ok!0X)g?!$+A_W14nyfmtJYP}?o_p? z(xMuw=BPQPA!f*e-{=j+!}|_IKWiaARtq5B!*ZxA#5ifVhDB2|kF0li;HhE;l}e!LzaH!Un)khG)za#%s&qIsfGjfkSXmA&K+c5^LbuaIG*lQU}jQ77B}je*~WK zxLe*b$y*_eUw=y^?`dJWq1IGYm~%?c7)GpX7pX4GHwHPa-%q%rlxqv2aLE{?}i$m@KspATs=mxb}FtZZhPFH;%?wGK}&MW@{A4Av`%I~ zO|juyq?O|z18xHIS`mryH8_LyIh7hpJh7lrkPe}^X#I!=hy40z^QgpvEh zd!q~z))PJ$o^6B*W4m1p&EbUI-Jo3(dkJG_`oQDA7AuU6q`-6er3&i{@5v-YhA{e( z@Wh$IxU8}W5Hk#{;r2UuSQ2MRBG+0yJU2NdjGd{IyhdSngFOPz*d>hqZTR6R-xbDd z55nWWc2QVAw6DEKg197*{%d&R%fh%M{vnJz96KEeeZwS#MHsm+ygy2RH+B#nOGP^@ zjJt#tp6zSr1xCSNf@hsqg|Wg~JTZLdnU9jkJ)!OJ+$MGj<9zNG_B%KBfw29;I0^^g zQN8ww1?{uKcqkpKgD?vv8GHC80isA4=dJ{vQ6;PbegQmFmk49ZQhcz3D}`~doXZo4 zmxWdE{(r#%@7NF7Y?xa@06bZ+FfJ||YeP&EmIz-gY?d%PSgEiNgt4BF;kk|u3u8OS z;DbiMvvOoO6;V&#u7+3aexi&gT76dEojReL}No2>9;koyx3afyh1kW$Asls}}-viG$ zBdh}c8a!Vkz7xhazJO=cU=L*nyK_O*azjPz708D7!P`)NC~O)0NAMht7GcZbPYP=l zHUaE{uy2Jau&eNl8^YMZ2z+b%pfR)U@ifD+8s9SfzOI*Vn-us4c*YBEY`w6J!r0r_ z;q55j6jlKLmgMaab|2Uk_;Dz&y0Hwb(?o6zBVjlu?Aj>!43wF|M#JaBcR^X;#vT+l zNmv%n7sC6Zoa&Z0UDym^_v3u2u-Q(gV>Ldp&oKrkDgpQaR!K6y(|4lBj5We|H_h-5 zqCD!x`e4%d!!8D8`_1%)XUAfN@n#0YKZP>MjiuT!3Jrkw2;@cg!q=cocT3EK=Nn{} zFy74=VL8HhBl++%P>vTC4&Q*zGAe~}`l{ghMAX=@8rf?;OA7({EG?Eq=bH^Y;|XCy z;8#lC8ewc?ndCJHV|_15-UeY@Yi|g9OPDx!F_LCQ@RnA|;)(?Tc^-y`}>bjQ}mzIj7+nvACRuv3WGgsW9 zCu-A*YYt8|M+HAVG&{tp<<={Ef%A2SjN-S@D2QXg<9vwI#+gWi$ReS1h-@T876oNO zWZ4iI|9F5k>2ShafowPqVvL2DNO3=4!+er>%;_$ISm7Lqj5kpZkySxt(a>Co>`{n} z59uU`QOB*7keUy%k;QU66QzQ9@it+7Q0@?B3S%R?guNpy9p(GNJ`omyatXvZ2sztD z``RIh4Yvqn4?l<4@I_&KvQ9vZub}o$UxMegSB3FWy$*3&e{o~ExBzcBT0Tl%OJ4%x zh=-XjFcAJ4#Hbb41)kqzjQL=$7XUk^qy&FUtJY>>0)U<3Zp=<|UukD~!X~;gZhp)w z=Ipg6&Jfr>pXA);nbz%pnFX&{EdE{b(&ZVX`$wn9h{}DV#tVI|X_X&7L zt1v#1UkdwC7-!}uc&@Pg_xrT5Ym@hnIoiJAT zys$<$W(qqjY!dRCg|(oZ#U2xWCh)Xd;u&EVgykUb&%%BY#=h|dm2p!TpGdw)IRgi- zCsM6_E!@H87`-8GOR*4HPl%g48E2j>1?mSexbL=KI}4t9?VCa}d>O=81-0ir4bQwa z!oVHcYdGN7&FlY$+Hv?qh}q5YEABL#%?-gsQNdaF`wDTNj4v zCaa?bwqK>B1$9;vo=sDYnak9c44dwwu0-Uit6?vrIvcv;r^+6_f_Ik))pBlt+OcWB aDi5=(ReinH*V7g_x5`CZ1J%-sz5fIQ7(L7Y diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm b/build/tools/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm index 4e88d96fa95a685e287a68b6af60ef8e6a8dcf1d..7bb5bc6b22b011e2fac61bb07ef8c5e68445634d 100644 GIT binary patch delta 759 zcmexS|Dc0$g9V$Q5rZ3pF@p(%84#N=7%&)Y_GJ6c#u?90%22|P$&fR-kyl&LjUk_* zh#{9Do*@k+#*hjUR8g4!fTEkjG{umg(m zBD@U@<;mwYtdXpO#l}WW@k#tLo3*s1K;A`j`{q!cVvw*As+Tt3)GcJfA{=et4N?t) z$nn43@HIB!&BoF{L1pa+b_0wCmN-~y%~wB&(97Mx6Q$bo|fCO28utk)l5Dl|l4 UvS@ZfV*!UOJOyo@YZlE302#-gXaE2J delta 295 zcmaFR!T6(og9V$Q0fQlfF@phvDT5J^He)cETxe*zxsL4++h!d;F~-e5`0p@cQM6Y& zezT8(2uKQ~4_*H}VLlE_sm*((Jz0Um##nUtD6Zk$d`Wu;BPOyS9UrDZn@nCO9Yn4;yh<&txa7lFdTaew+YJ C3p}j= diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h b/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h index 7524cbd9..6d890779 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h @@ -130,38 +130,38 @@ namespace MasterEditorTWL { - private: System::Windows::Forms::Label^ labPEGIBBFC2; + private: System::Windows::Forms::Label^ labOFLC; - private: System::Windows::Forms::Label^ labPEGIBBFC; - private: System::Windows::Forms::Label^ labPEGIPRT; + private: System::Windows::Forms::Label^ labPEGI_BBFC; + private: System::Windows::Forms::Label^ labPEGI_PRT; private: System::Windows::Forms::Label^ labPEGI; private: System::Windows::Forms::Label^ labUSK; private: System::Windows::Forms::Label^ labESRB; private: System::Windows::Forms::Label^ labCERO; - private: System::Windows::Forms::CheckBox^ cboxAlwaysOFLC; - private: System::Windows::Forms::CheckBox^ cboxAlwaysPEGIBBFC; - private: System::Windows::Forms::CheckBox^ cboxAlwaysPEGIPRT; - private: System::Windows::Forms::CheckBox^ cboxAlwaysPEGI; - private: System::Windows::Forms::CheckBox^ cboxAlwaysUSK; - private: System::Windows::Forms::CheckBox^ cboxAlwaysESRB; - private: System::Windows::Forms::CheckBox^ cboxAlwaysCERO; + + + + + + + private: System::Windows::Forms::ComboBox^ combOFLC; - private: System::Windows::Forms::ComboBox^ combPEGIBBFC; - private: System::Windows::Forms::ComboBox^ combPEGIPRT; + private: System::Windows::Forms::ComboBox^ combPEGI_BBFC; + private: System::Windows::Forms::ComboBox^ combPEGI_PRT; private: System::Windows::Forms::ComboBox^ combPEGI; private: System::Windows::Forms::ComboBox^ combUSK; private: System::Windows::Forms::ComboBox^ combESRB; private: System::Windows::Forms::ComboBox^ combCERO; - private: System::Windows::Forms::CheckBox^ cboxOFLC; - private: System::Windows::Forms::CheckBox^ cboxPEGIBBFC; - private: System::Windows::Forms::CheckBox^ cboxPEGIPRT; - private: System::Windows::Forms::CheckBox^ cboxPEGI; - private: System::Windows::Forms::CheckBox^ cboxUSK; - private: System::Windows::Forms::CheckBox^ cboxESRB; - private: System::Windows::Forms::CheckBox^ cboxCERO; - private: System::Windows::Forms::Label^ labParentalForceEnable; + + + + + + + + private: System::Windows::Forms::Label^ labParentalRating; - private: System::Windows::Forms::Label^ labParentalEnable; + @@ -672,7 +672,7 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // 複数行表示したいが初期値で設定できないのでここで設定 this->tboxGuideRomEditInfo->Text = "このタブの情報は提出確認書およびマスターROMの作成に必要です。編集してください。"; - this->tboxGuideRomEditInfo->Text += "\r\nこれらの情報はマスターROMの作成時にROMデータの中に登録されます。"; + this->tboxGuideRomEditInfo->Text += "\r\n(マスターROMの作成をするまでROMデータの中には登録されません。)"; this->tboxGuideErrorInfo->Text = "このタブには読み込んだROMデータの問題と本プログラムでの入力ミスが列挙されます。"; this->tboxGuideErrorInfo->Text += "\r\n赤文字の項目は、本プログラムで修正不可です。ROMデータ作成時の設定をご確認ください。"; @@ -715,7 +715,7 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; /// void InitializeComponent(void) { - System::Windows::Forms::DataGridViewCellStyle^ dataGridViewCellStyle1 = (gcnew System::Windows::Forms::DataGridViewCellStyle()); + System::Windows::Forms::DataGridViewCellStyle^ dataGridViewCellStyle2 = (gcnew System::Windows::Forms::DataGridViewCellStyle()); this->tboxFile = (gcnew System::Windows::Forms::TextBox()); this->gboxSrl = (gcnew System::Windows::Forms::GroupBox()); this->tboxRemasterVer = (gcnew System::Windows::Forms::TextBox()); @@ -743,38 +743,21 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->tboxWholeCRC = (gcnew System::Windows::Forms::TextBox()); this->labCaption = (gcnew System::Windows::Forms::Label()); this->tboxCaption = (gcnew System::Windows::Forms::TextBox()); - this->labPEGIBBFC2 = (gcnew System::Windows::Forms::Label()); this->labOFLC = (gcnew System::Windows::Forms::Label()); - this->labPEGIBBFC = (gcnew System::Windows::Forms::Label()); - this->labPEGIPRT = (gcnew System::Windows::Forms::Label()); + this->labPEGI_BBFC = (gcnew System::Windows::Forms::Label()); + this->labPEGI_PRT = (gcnew System::Windows::Forms::Label()); this->labPEGI = (gcnew System::Windows::Forms::Label()); this->labUSK = (gcnew System::Windows::Forms::Label()); this->labESRB = (gcnew System::Windows::Forms::Label()); this->labCERO = (gcnew System::Windows::Forms::Label()); - this->cboxAlwaysOFLC = (gcnew System::Windows::Forms::CheckBox()); - this->cboxAlwaysPEGIBBFC = (gcnew System::Windows::Forms::CheckBox()); - this->cboxAlwaysPEGIPRT = (gcnew System::Windows::Forms::CheckBox()); - this->cboxAlwaysPEGI = (gcnew System::Windows::Forms::CheckBox()); - this->cboxAlwaysUSK = (gcnew System::Windows::Forms::CheckBox()); - this->cboxAlwaysESRB = (gcnew System::Windows::Forms::CheckBox()); - this->cboxAlwaysCERO = (gcnew System::Windows::Forms::CheckBox()); this->combOFLC = (gcnew System::Windows::Forms::ComboBox()); - this->combPEGIBBFC = (gcnew System::Windows::Forms::ComboBox()); - this->combPEGIPRT = (gcnew System::Windows::Forms::ComboBox()); + this->combPEGI_BBFC = (gcnew System::Windows::Forms::ComboBox()); + this->combPEGI_PRT = (gcnew System::Windows::Forms::ComboBox()); this->combPEGI = (gcnew System::Windows::Forms::ComboBox()); this->combUSK = (gcnew System::Windows::Forms::ComboBox()); this->combESRB = (gcnew System::Windows::Forms::ComboBox()); this->combCERO = (gcnew System::Windows::Forms::ComboBox()); - this->cboxOFLC = (gcnew System::Windows::Forms::CheckBox()); - this->cboxPEGIBBFC = (gcnew System::Windows::Forms::CheckBox()); - this->cboxPEGIPRT = (gcnew System::Windows::Forms::CheckBox()); - this->cboxPEGI = (gcnew System::Windows::Forms::CheckBox()); - this->cboxUSK = (gcnew System::Windows::Forms::CheckBox()); - this->cboxESRB = (gcnew System::Windows::Forms::CheckBox()); - this->cboxCERO = (gcnew System::Windows::Forms::CheckBox()); - this->labParentalForceEnable = (gcnew System::Windows::Forms::Label()); this->labParentalRating = (gcnew System::Windows::Forms::Label()); - this->labParentalEnable = (gcnew System::Windows::Forms::Label()); this->labRegion = (gcnew System::Windows::Forms::Label()); this->cboxIsEULA = (gcnew System::Windows::Forms::CheckBox()); this->combRegion = (gcnew System::Windows::Forms::ComboBox()); @@ -1263,46 +1246,37 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->tboxCaption->Size = System::Drawing::Size(349, 74); this->tboxCaption->TabIndex = 8; // - // labPEGIBBFC2 - // - this->labPEGIBBFC2->AutoSize = true; - this->labPEGIBBFC2->Location = System::Drawing::Point(12, 216); - this->labPEGIBBFC2->Name = L"labPEGIBBFC2"; - this->labPEGIBBFC2->Size = System::Drawing::Size(46, 12); - this->labPEGIBBFC2->TabIndex = 35; - this->labPEGIBBFC2->Text = L"+ BBFC"; - // // labOFLC // this->labOFLC->AutoSize = true; - this->labOFLC->Location = System::Drawing::Point(48, 236); + this->labOFLC->Location = System::Drawing::Point(101, 234); this->labOFLC->Name = L"labOFLC"; this->labOFLC->Size = System::Drawing::Size(34, 12); this->labOFLC->TabIndex = 33; this->labOFLC->Text = L"OFLC"; // - // labPEGIBBFC + // labPEGI_BBFC // - this->labPEGIBBFC->AutoSize = true; - this->labPEGIBBFC->Location = System::Drawing::Point(12, 204); - this->labPEGIBBFC->Name = L"labPEGIBBFC"; - this->labPEGIBBFC->Size = System::Drawing::Size(77, 12); - this->labPEGIBBFC->TabIndex = 32; - this->labPEGIBBFC->Text = L"PEGI(General)"; + this->labPEGI_BBFC->AutoSize = true; + this->labPEGI_BBFC->Location = System::Drawing::Point(12, 204); + this->labPEGI_BBFC->Name = L"labPEGI_BBFC"; + this->labPEGI_BBFC->Size = System::Drawing::Size(134, 12); + this->labPEGI_BBFC->TabIndex = 32; + this->labPEGI_BBFC->Text = L"PEGI(General) and BBFC"; // - // labPEGIPRT + // labPEGI_PRT // - this->labPEGIPRT->AutoSize = true; - this->labPEGIPRT->Location = System::Drawing::Point(12, 182); - this->labPEGIPRT->Name = L"labPEGIPRT"; - this->labPEGIPRT->Size = System::Drawing::Size(76, 12); - this->labPEGIPRT->TabIndex = 31; - this->labPEGIPRT->Text = L"PEGI Portugal"; + this->labPEGI_PRT->AutoSize = true; + this->labPEGI_PRT->Location = System::Drawing::Point(69, 182); + this->labPEGI_PRT->Name = L"labPEGI_PRT"; + this->labPEGI_PRT->Size = System::Drawing::Size(76, 12); + this->labPEGI_PRT->TabIndex = 31; + this->labPEGI_PRT->Text = L"PEGI Portugal"; // // labPEGI // this->labPEGI->AutoSize = true; - this->labPEGI->Location = System::Drawing::Point(12, 156); + this->labPEGI->Location = System::Drawing::Point(69, 156); this->labPEGI->Name = L"labPEGI"; this->labPEGI->Size = System::Drawing::Size(77, 12); this->labPEGI->TabIndex = 30; @@ -1311,7 +1285,7 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // labUSK // this->labUSK->AutoSize = true; - this->labUSK->Location = System::Drawing::Point(48, 130); + this->labUSK->Location = System::Drawing::Point(102, 130); this->labUSK->Name = L"labUSK"; this->labUSK->Size = System::Drawing::Size(27, 12); this->labUSK->TabIndex = 29; @@ -1320,7 +1294,7 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // labESRB // this->labESRB->AutoSize = true; - this->labESRB->Location = System::Drawing::Point(48, 104); + this->labESRB->Location = System::Drawing::Point(102, 104); this->labESRB->Name = L"labESRB"; this->labESRB->Size = System::Drawing::Size(35, 12); this->labESRB->TabIndex = 28; @@ -1329,116 +1303,53 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // labCERO // this->labCERO->AutoSize = true; - this->labCERO->Location = System::Drawing::Point(47, 78); + this->labCERO->Location = System::Drawing::Point(101, 78); this->labCERO->Name = L"labCERO"; this->labCERO->Size = System::Drawing::Size(36, 12); this->labCERO->TabIndex = 27; this->labCERO->Text = L"CERO"; // - // cboxAlwaysOFLC - // - this->cboxAlwaysOFLC->AutoSize = true; - this->cboxAlwaysOFLC->Location = System::Drawing::Point(373, 234); - this->cboxAlwaysOFLC->Name = L"cboxAlwaysOFLC"; - this->cboxAlwaysOFLC->Size = System::Drawing::Size(15, 14); - this->cboxAlwaysOFLC->TabIndex = 20; - this->cboxAlwaysOFLC->UseVisualStyleBackColor = true; - // - // cboxAlwaysPEGIBBFC - // - this->cboxAlwaysPEGIBBFC->AutoSize = true; - this->cboxAlwaysPEGIBBFC->Location = System::Drawing::Point(373, 208); - this->cboxAlwaysPEGIBBFC->Name = L"cboxAlwaysPEGIBBFC"; - this->cboxAlwaysPEGIBBFC->Size = System::Drawing::Size(15, 14); - this->cboxAlwaysPEGIBBFC->TabIndex = 17; - this->cboxAlwaysPEGIBBFC->UseVisualStyleBackColor = true; - // - // cboxAlwaysPEGIPRT - // - this->cboxAlwaysPEGIPRT->AutoSize = true; - this->cboxAlwaysPEGIPRT->Location = System::Drawing::Point(373, 182); - this->cboxAlwaysPEGIPRT->Name = L"cboxAlwaysPEGIPRT"; - this->cboxAlwaysPEGIPRT->Size = System::Drawing::Size(15, 14); - this->cboxAlwaysPEGIPRT->TabIndex = 14; - this->cboxAlwaysPEGIPRT->UseVisualStyleBackColor = true; - // - // cboxAlwaysPEGI - // - this->cboxAlwaysPEGI->AutoSize = true; - this->cboxAlwaysPEGI->Location = System::Drawing::Point(373, 156); - this->cboxAlwaysPEGI->Name = L"cboxAlwaysPEGI"; - this->cboxAlwaysPEGI->Size = System::Drawing::Size(15, 14); - this->cboxAlwaysPEGI->TabIndex = 11; - this->cboxAlwaysPEGI->UseVisualStyleBackColor = true; - // - // cboxAlwaysUSK - // - this->cboxAlwaysUSK->AutoSize = true; - this->cboxAlwaysUSK->Location = System::Drawing::Point(373, 130); - this->cboxAlwaysUSK->Name = L"cboxAlwaysUSK"; - this->cboxAlwaysUSK->Size = System::Drawing::Size(15, 14); - this->cboxAlwaysUSK->TabIndex = 8; - this->cboxAlwaysUSK->UseVisualStyleBackColor = true; - // - // cboxAlwaysESRB - // - this->cboxAlwaysESRB->AutoSize = true; - this->cboxAlwaysESRB->Location = System::Drawing::Point(373, 104); - this->cboxAlwaysESRB->Name = L"cboxAlwaysESRB"; - this->cboxAlwaysESRB->Size = System::Drawing::Size(15, 14); - this->cboxAlwaysESRB->TabIndex = 5; - this->cboxAlwaysESRB->UseVisualStyleBackColor = true; - // - // cboxAlwaysCERO - // - this->cboxAlwaysCERO->AutoSize = true; - this->cboxAlwaysCERO->Location = System::Drawing::Point(373, 78); - this->cboxAlwaysCERO->Name = L"cboxAlwaysCERO"; - this->cboxAlwaysCERO->Size = System::Drawing::Size(15, 14); - this->cboxAlwaysCERO->TabIndex = 2; - this->cboxAlwaysCERO->UseVisualStyleBackColor = true; - // // combOFLC // this->combOFLC->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; this->combOFLC->FormattingEnabled = true; - this->combOFLC->Items->AddRange(gcnew cli::array< System::Object^ >(5) {L"G", L"PG", L"M", L"MA15+", L"未審査"}); - this->combOFLC->Location = System::Drawing::Point(95, 231); + this->combOFLC->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"年齢制限なし", L"G", L"PG", L"M", L"MA15+", L"審査中"}); + this->combOFLC->Location = System::Drawing::Point(152, 232); this->combOFLC->Name = L"combOFLC"; - this->combOFLC->Size = System::Drawing::Size(164, 20); + this->combOFLC->Size = System::Drawing::Size(204, 20); this->combOFLC->TabIndex = 18; // - // combPEGIBBFC + // combPEGI_BBFC // - this->combPEGIBBFC->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; - this->combPEGIBBFC->FormattingEnabled = true; - this->combPEGIBBFC->Items->AddRange(gcnew cli::array< System::Object^ >(9) {L"3歳以上", L"4歳以上推奨", L"7歳以上", L"8歳以上推奨", L"12歳以上", - L"15歳以上", L"16歳以上", L"18歳以上", L"未審査"}); - this->combPEGIBBFC->Location = System::Drawing::Point(95, 205); - this->combPEGIBBFC->Name = L"combPEGIBBFC"; - this->combPEGIBBFC->Size = System::Drawing::Size(164, 20); - this->combPEGIBBFC->TabIndex = 15; + this->combPEGI_BBFC->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; + this->combPEGI_BBFC->FormattingEnabled = true; + this->combPEGI_BBFC->Items->AddRange(gcnew cli::array< System::Object^ >(10) {L"年齢制限なし", L"3歳以上", L"4歳以上推奨", L"7歳以上", L"8歳以上推奨", + L"12歳以上", L"15歳以上", L"16歳以上", L"18歳以上", L"審査中"}); + this->combPEGI_BBFC->Location = System::Drawing::Point(152, 205); + this->combPEGI_BBFC->Name = L"combPEGI_BBFC"; + this->combPEGI_BBFC->Size = System::Drawing::Size(204, 20); + this->combPEGI_BBFC->TabIndex = 15; // - // combPEGIPRT + // combPEGI_PRT // - this->combPEGIPRT->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; - this->combPEGIPRT->FormattingEnabled = true; - this->combPEGIPRT->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"4歳以上", L"6歳以上", L"12歳以上", L"16歳以上", L"18歳以上", - L"未審査"}); - this->combPEGIPRT->Location = System::Drawing::Point(95, 179); - this->combPEGIPRT->Name = L"combPEGIPRT"; - this->combPEGIPRT->Size = System::Drawing::Size(164, 20); - this->combPEGIPRT->TabIndex = 12; + this->combPEGI_PRT->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; + this->combPEGI_PRT->FormattingEnabled = true; + this->combPEGI_PRT->Items->AddRange(gcnew cli::array< System::Object^ >(7) {L"年齢制限なし", L"4歳以上", L"6歳以上", L"12歳以上", L"16歳以上", + L"18歳以上", L"審査中"}); + this->combPEGI_PRT->Location = System::Drawing::Point(152, 179); + this->combPEGI_PRT->Name = L"combPEGI_PRT"; + this->combPEGI_PRT->Size = System::Drawing::Size(204, 20); + this->combPEGI_PRT->TabIndex = 12; // // combPEGI // this->combPEGI->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; this->combPEGI->FormattingEnabled = true; - this->combPEGI->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"3歳以上", L"7歳以上", L"12歳以上", L"16歳以上", L"18歳以上", - L"未審査"}); - this->combPEGI->Location = System::Drawing::Point(95, 153); + this->combPEGI->Items->AddRange(gcnew cli::array< System::Object^ >(7) {L"年齢制限なし", L"3歳以上", L"7歳以上", L"12歳以上", L"16歳以上", + L"18歳以上", L"審査中"}); + this->combPEGI->Location = System::Drawing::Point(152, 153); this->combPEGI->Name = L"combPEGI"; - this->combPEGI->Size = System::Drawing::Size(164, 20); + this->combPEGI->Size = System::Drawing::Size(204, 20); this->combPEGI->TabIndex = 9; // // combUSK @@ -1446,21 +1357,21 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->combUSK->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; this->combUSK->FormattingEnabled = true; this->combUSK->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"年齢制限なし", L"6歳以上", L"12歳以上", L"16歳以上", L"青少年には不適切", - L"未審査"}); - this->combUSK->Location = System::Drawing::Point(95, 127); + L"審査中"}); + this->combUSK->Location = System::Drawing::Point(152, 127); this->combUSK->Name = L"combUSK"; - this->combUSK->Size = System::Drawing::Size(164, 20); + this->combUSK->Size = System::Drawing::Size(204, 20); this->combUSK->TabIndex = 6; // // combESRB // this->combESRB->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; this->combESRB->FormattingEnabled = true; - this->combESRB->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"EC (3歳以上)", L"E (6歳以上)", L"E10+ (10歳以上)", L"T (13歳以上)", - L"M (17歳以上)", L"未審査"}); - this->combESRB->Location = System::Drawing::Point(95, 101); + this->combESRB->Items->AddRange(gcnew cli::array< System::Object^ >(7) {L"年齢制限なし", L"EC (3歳以上)", L"E (6歳以上)", L"E10+ (10歳以上)", + L"T (13歳以上)", L"M (17歳以上)", L"審査中"}); + this->combESRB->Location = System::Drawing::Point(152, 101); this->combESRB->Name = L"combESRB"; - this->combESRB->Size = System::Drawing::Size(164, 20); + this->combESRB->Size = System::Drawing::Size(204, 20); this->combESRB->TabIndex = 3; // // combCERO @@ -1468,106 +1379,25 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->combCERO->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; this->combCERO->FormattingEnabled = true; this->combCERO->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"A (全年齢)", L"B (12歳以上)", L"C (15歳以上)", L"D (17歳以上)", - L"Z (18歳以上)", L"未審査"}); - this->combCERO->Location = System::Drawing::Point(95, 75); + L"Z (18歳以上)", L"審査中"}); + this->combCERO->Location = System::Drawing::Point(152, 75); this->combCERO->Name = L"combCERO"; - this->combCERO->Size = System::Drawing::Size(164, 20); + this->combCERO->Size = System::Drawing::Size(204, 20); this->combCERO->TabIndex = 0; // - // cboxOFLC - // - this->cboxOFLC->AutoSize = true; - this->cboxOFLC->Location = System::Drawing::Point(296, 234); - this->cboxOFLC->Name = L"cboxOFLC"; - this->cboxOFLC->Size = System::Drawing::Size(15, 14); - this->cboxOFLC->TabIndex = 19; - this->cboxOFLC->UseVisualStyleBackColor = true; - // - // cboxPEGIBBFC - // - this->cboxPEGIBBFC->AutoSize = true; - this->cboxPEGIBBFC->Location = System::Drawing::Point(296, 208); - this->cboxPEGIBBFC->Name = L"cboxPEGIBBFC"; - this->cboxPEGIBBFC->Size = System::Drawing::Size(15, 14); - this->cboxPEGIBBFC->TabIndex = 16; - this->cboxPEGIBBFC->UseVisualStyleBackColor = true; - // - // cboxPEGIPRT - // - this->cboxPEGIPRT->AutoSize = true; - this->cboxPEGIPRT->Location = System::Drawing::Point(296, 182); - this->cboxPEGIPRT->Name = L"cboxPEGIPRT"; - this->cboxPEGIPRT->Size = System::Drawing::Size(15, 14); - this->cboxPEGIPRT->TabIndex = 13; - this->cboxPEGIPRT->UseVisualStyleBackColor = true; - // - // cboxPEGI - // - this->cboxPEGI->AutoSize = true; - this->cboxPEGI->Location = System::Drawing::Point(296, 156); - this->cboxPEGI->Name = L"cboxPEGI"; - this->cboxPEGI->Size = System::Drawing::Size(15, 14); - this->cboxPEGI->TabIndex = 10; - this->cboxPEGI->UseVisualStyleBackColor = true; - // - // cboxUSK - // - this->cboxUSK->AutoSize = true; - this->cboxUSK->Location = System::Drawing::Point(296, 130); - this->cboxUSK->Name = L"cboxUSK"; - this->cboxUSK->Size = System::Drawing::Size(15, 14); - this->cboxUSK->TabIndex = 7; - this->cboxUSK->UseVisualStyleBackColor = true; - // - // cboxESRB - // - this->cboxESRB->AutoSize = true; - this->cboxESRB->Location = System::Drawing::Point(296, 104); - this->cboxESRB->Name = L"cboxESRB"; - this->cboxESRB->Size = System::Drawing::Size(15, 14); - this->cboxESRB->TabIndex = 4; - this->cboxESRB->UseVisualStyleBackColor = true; - // - // cboxCERO - // - this->cboxCERO->AutoSize = true; - this->cboxCERO->Location = System::Drawing::Point(296, 78); - this->cboxCERO->Name = L"cboxCERO"; - this->cboxCERO->Size = System::Drawing::Size(15, 14); - this->cboxCERO->TabIndex = 1; - this->cboxCERO->UseVisualStyleBackColor = true; - // - // labParentalForceEnable - // - this->labParentalForceEnable->AutoSize = true; - this->labParentalForceEnable->Location = System::Drawing::Point(359, 59); - this->labParentalForceEnable->Name = L"labParentalForceEnable"; - this->labParentalForceEnable->Size = System::Drawing::Size(41, 12); - this->labParentalForceEnable->TabIndex = 0; - this->labParentalForceEnable->Text = L"審査中"; - // // labParentalRating // this->labParentalRating->AutoSize = true; - this->labParentalRating->Location = System::Drawing::Point(139, 59); + this->labParentalRating->Location = System::Drawing::Point(201, 60); this->labParentalRating->Name = L"labParentalRating"; - this->labParentalRating->Size = System::Drawing::Size(58, 12); + this->labParentalRating->Size = System::Drawing::Size(82, 12); this->labParentalRating->TabIndex = 2; - this->labParentalRating->Text = L"レーティング"; - // - // labParentalEnable - // - this->labParentalEnable->AutoSize = true; - this->labParentalEnable->Location = System::Drawing::Point(273, 59); - this->labParentalEnable->Name = L"labParentalEnable"; - this->labParentalEnable->Size = System::Drawing::Size(62, 12); - this->labParentalEnable->TabIndex = 1; - this->labParentalEnable->Text = L"制限を有効"; + this->labParentalRating->Text = L"レーティング情報"; // // labRegion // this->labRegion->AutoSize = true; - this->labRegion->Location = System::Drawing::Point(12, 24); + this->labRegion->Location = System::Drawing::Point(71, 24); this->labRegion->Name = L"labRegion"; this->labRegion->Size = System::Drawing::Size(75, 12); this->labRegion->TabIndex = 37; @@ -1588,9 +1418,9 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->combRegion->DropDownStyle = System::Windows::Forms::ComboBoxStyle::DropDownList; this->combRegion->FormattingEnabled = true; this->combRegion->Items->AddRange(gcnew cli::array< System::Object^ >(5) {L"日本のみ", L"米国のみ", L"欧州のみ", L"豪州のみ", L"欧州および豪州"}); - this->combRegion->Location = System::Drawing::Point(95, 21); + this->combRegion->Location = System::Drawing::Point(152, 21); this->combRegion->Name = L"combRegion"; - this->combRegion->Size = System::Drawing::Size(164, 20); + this->combRegion->Size = System::Drawing::Size(204, 20); this->combRegion->TabIndex = 36; this->combRegion->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::combRegion_SelectedIndexChanged); // @@ -3121,41 +2951,24 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // this->gboxParental->Controls->Add(this->labRegion); this->gboxParental->Controls->Add(this->combRegion); - this->gboxParental->Controls->Add(this->cboxAlwaysPEGIBBFC); - this->gboxParental->Controls->Add(this->labPEGIBBFC2); - this->gboxParental->Controls->Add(this->cboxPEGIBBFC); this->gboxParental->Controls->Add(this->labParentalRating); - this->gboxParental->Controls->Add(this->cboxOFLC); this->gboxParental->Controls->Add(this->labOFLC); - this->gboxParental->Controls->Add(this->cboxAlwaysOFLC); - this->gboxParental->Controls->Add(this->labParentalEnable); - this->gboxParental->Controls->Add(this->cboxAlwaysPEGIPRT); - this->gboxParental->Controls->Add(this->labPEGIBBFC); - this->gboxParental->Controls->Add(this->cboxPEGIPRT); - this->gboxParental->Controls->Add(this->combPEGIBBFC); + this->gboxParental->Controls->Add(this->labPEGI_BBFC); + this->gboxParental->Controls->Add(this->combPEGI_BBFC); this->gboxParental->Controls->Add(this->combCERO); - this->gboxParental->Controls->Add(this->labParentalForceEnable); this->gboxParental->Controls->Add(this->labCERO); this->gboxParental->Controls->Add(this->combOFLC); - this->gboxParental->Controls->Add(this->cboxAlwaysPEGI); - this->gboxParental->Controls->Add(this->labPEGIPRT); - this->gboxParental->Controls->Add(this->cboxPEGI); - this->gboxParental->Controls->Add(this->combPEGIPRT); + this->gboxParental->Controls->Add(this->labPEGI_PRT); + this->gboxParental->Controls->Add(this->combPEGI_PRT); this->gboxParental->Controls->Add(this->combESRB); - this->gboxParental->Controls->Add(this->cboxCERO); this->gboxParental->Controls->Add(this->labESRB); - this->gboxParental->Controls->Add(this->cboxAlwaysCERO); - this->gboxParental->Controls->Add(this->cboxAlwaysUSK); this->gboxParental->Controls->Add(this->labPEGI); - this->gboxParental->Controls->Add(this->cboxUSK); this->gboxParental->Controls->Add(this->combPEGI); this->gboxParental->Controls->Add(this->combUSK); - this->gboxParental->Controls->Add(this->cboxESRB); this->gboxParental->Controls->Add(this->labUSK); - this->gboxParental->Controls->Add(this->cboxAlwaysESRB); - this->gboxParental->Location = System::Drawing::Point(252, 60); + this->gboxParental->Location = System::Drawing::Point(262, 60); this->gboxParental->Name = L"gboxParental"; - this->gboxParental->Size = System::Drawing::Size(459, 272); + this->gboxParental->Size = System::Drawing::Size(398, 272); this->gboxParental->TabIndex = 33; this->gboxParental->TabStop = false; this->gboxParental->Text = L"リージョンとペアレンタルコントロール"; @@ -3167,7 +2980,7 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->gboxIcon->Controls->Add(this->rIsWirelessIcon); this->gboxIcon->Location = System::Drawing::Point(19, 114); this->gboxIcon->Name = L"gboxIcon"; - this->gboxIcon->Size = System::Drawing::Size(215, 116); + this->gboxIcon->Size = System::Drawing::Size(227, 116); this->gboxIcon->TabIndex = 32; this->gboxIcon->TabStop = false; this->gboxIcon->Text = L"メニュー上でのアイコン表示"; @@ -3209,7 +3022,7 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->gboxEULA->Controls->Add(this->cboxIsEULA); this->gboxEULA->Location = System::Drawing::Point(19, 60); this->gboxEULA->Name = L"gboxEULA"; - this->gboxEULA->Size = System::Drawing::Size(215, 48); + this->gboxEULA->Size = System::Drawing::Size(227, 48); this->gboxEULA->TabIndex = 31; this->gboxEULA->TabStop = false; this->gboxEULA->Text = L"EULA"; @@ -3453,8 +3266,8 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // // gridError // - dataGridViewCellStyle1->BackColor = System::Drawing::Color::White; - this->gridError->AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; + dataGridViewCellStyle2->BackColor = System::Drawing::Color::White; + this->gridError->AlternatingRowsDefaultCellStyle = dataGridViewCellStyle2; this->gridError->BackgroundColor = System::Drawing::SystemColors::Control; this->gridError->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize; this->gridError->Columns->AddRange(gcnew cli::array< System::Windows::Forms::DataGridViewColumn^ >(4) {this->colErrorName, @@ -3596,555 +3409,32 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // ---------------------------------------------- // 設定ファイルの読み込み - void loadInit(void) - { - System::Xml::XmlDocument ^doc = gcnew System::Xml::XmlDocument(); + void loadInit(void); - // xmlファイルの読み込み - try - { - doc->Load( "../resource/ini.xml" ); - } - catch( System::IO::FileNotFoundException ^s ) - { - (void)s; - this->sucMsg( "設定ファイルを開くことができませんでした。", "Setting file can't be opened." ); - return; - } - - // タグ : ルート - System::Xml::XmlElement ^root = doc->DocumentElement; - - // タグ - System::Boolean bReadOnly = MasterEditorTWL::isXmlEqual( root, "rw", "r" ); - if( bReadOnly ) - { - this->readOnly(); - } - - // タグ - System::Boolean bXML = MasterEditorTWL::isXmlEqual( root, "output", "XML" ); - - // タグ - System::Boolean bCheck = MasterEditorTWL::isXmlEqual( root, "spcheck", "ON" ); - - if( bCheck ) // チェックするときのみ追加チェック項目を設定 - { - // チェックするかどうか - this->hSrl->hMrcSpecialList->hIsCheck = gcnew System::Boolean( true ); - - // SDK - try - { - u32 major = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/sdk/major" ) ); - u32 minor = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/sdk/minor" ) ); - u32 relstep = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/sdk/relstep" ) ); - u32 sdkver = (major << 24) | (minor << 16) | (relstep & 0xFFFF); - this->hSrl->hMrcSpecialList->hSDKVer = gcnew System::UInt32( sdkver ); - } - catch ( System::Exception ^ex ) - { - (void)ex; - this->errMsg( "設定ファイル中のSDKバージョンが読み込めませんでした。バージョンは0とみなされます。", - "SDK ver. can't be read from setting file. Therefore it is set by 0." ); - this->hSrl->hMrcSpecialList->hSDKVer = gcnew System::UInt32( 0 ); - } - - // EULA - try - { - u8 eula = System::Byte::Parse( MasterEditorTWL::getXPathText( root, "/init/eula" ) ); - this->hSrl->hMrcSpecialList->hEULAVer = gcnew System::Byte( eula ); - } - catch ( System::Exception ^ex ) - { - (void)ex; - this->errMsg( "設定ファイル中のEULAバージョンが読み込めませんでした。バージョンは0とみなされます。", - "EULA ver. can't be read from setting file. Therefore it is set by 0." ); - this->hSrl->hMrcSpecialList->hEULAVer = gcnew System::Byte( 0 ); - } - - // Shared2File - try - { - System::Int32 i; - for( i=0; i < METWL_NUMOF_SHARED2FILES; i++ ) - { - u8 size = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/shared2/size" + i.ToString() ) ); - this->hSrl->hMrcSpecialList->hShared2SizeArray[i] = gcnew System::UInt32( size ); - } - } - catch ( System::Exception ^ex ) - { - (void)ex; - this->errMsg( "設定ファイル中のShared2ファイルサイズが読み込めませんでした。サイズはすべて0とみなされます。", - "One of shared2 file sizes can't be read from setting file. Therefore they are set by 0." ); - System::Int32 i; - for( i=0; i < METWL_NUMOF_SHARED2FILES; i++ ) - { - this->hSrl->hMrcSpecialList->hShared2SizeArray[i] = gcnew System::UInt32( 0 ); - } - } - } //if( bCheck ) - - if( bReadOnly || bXML | bCheck ) - { - System::String ^msgJ = gcnew System::String("動作モード:"); - System::String ^msgE = gcnew System::String("Processing Mode:"); - if( bReadOnly ) - { - msgJ += "\nリードオンリーモード"; - msgE += "\nRead Only Mode"; - } - if( bXML ) - { - msgJ += "\nXML出力モード"; - msgE += "\nXML Output Mode"; - } - if( bCheck ) - { - msgJ += "\n追加チェックモード"; - msgE += "\nExtra Check Mode"; - } - this->sucMsg( msgJ, msgE ); - } - } - - private: // SRLのオープン - System::Void loadSrl( System::String ^filename ) - { - ECSrlResult result = this->hSrl->readFromFile( filename ); - if( result != ECSrlResult::NOERROR ) - { - switch( result ) - { - case ECSrlResult::ERROR_PLATFORM: - this->errMsg( "本ツールはTWL対応ROM専用です。NTR専用ROMなどのTWL非対応ROMを読み込むことはできません。", - "This tool can only read TWL ROM. This can't read an other data e.g. NTR limited ROM." ); - break; + System::Void loadSrl( System::String ^filename ); - case ECSrlResult::ERROR_SIGN_DECRYPT: - case ECSrlResult::ERROR_SIGN_VERIFY: - this->errMsg( "不正なROMデータです。TWL対応ROMでないかROMデータが改ざんされている可能性があります。", - "Illegal ROM data. It is not for TWL ROM, or is altered illegally." ); - break; - - default: - this->errMsg( "ROMデータファイルの読み込みに失敗しました。\n再度「ROMデータを開く」を選択してROMデータを読み出してください。", - "Reading the ROM data file failed. \nPlease read a ROM data file again, with \"Open a ROM data file\"" ); - break; - } - return; - } - this->tboxFile->Text = filename; - - // GUIにROM情報を格納 - this->setSrlForms(); - - // 全体のCRCを算出 - u16 crc; - if( !getWholeCRCInFile( filename, &crc ) ) - { - this->errMsg( "ROMデータのCRC計算に失敗しました。ROMデータの読み込みはキャンセルされました。", - "Calculating CRC of the ROM data failed. Therefore reading ROM data is canceled." ); - return; - } - System::UInt16 ^hcrc = gcnew System::UInt16( crc ); - this->tboxWholeCRC->Clear(); - this->tboxWholeCRC->AppendText( "0x" ); - this->tboxWholeCRC->AppendText( hcrc->ToString("X") ); - - // 読み込み時エラーを登録する - this->rErrorReading->Checked = true; - this->setGridError(); - this->setGridWarn(); - //if( this->hSrl->hErrorList->Count > 0 ) - //{ - // this->errMsg( "ROMデータにエラーがあります。「エラー情報」タブをご確認ください。", - // "ROM data include error. Please look the tab \"Setting Error\"." ); - // return; - //} - return; - } // openSrl - - private: // SRLの保存 - System::Void saveSrl( System::String ^filename ) - { - // ROM情報をフォームから取得してSRLバイナリに反映させる - this->setSrlProperties(); - // マスタ書類情報をフォームから取得して書類に反映させる -> 必要なし - //this->setDeliverableProperties(); - - // ファイルをコピー - if( !(filename->Equals( this->tboxFile->Text )) ) - { - System::IO::File::Copy( this->tboxFile->Text, filename, true ); - } - - // コピーしたファイルにROMヘッダを上書き - if( this->hSrl->writeToFile( filename ) != ECSrlResult::NOERROR ) - { - this->errMsg( "ROMデータの保存に失敗しました。", "Saving the ROM data file failed." ); - return; - } - this->sucMsg( "ROMデータの保存が成功しました。", "Saving the ROM data file succeeded." ); - this->tboxFile->Text = filename; - - // 再リード - this->loadSrl( filename ); - } + System::Void saveSrl( System::String ^filename ); private: + // ---------------------------------------------- + // 一時ファイルの取り扱い + // ---------------------------------------------- + // 一時保存 - System::Void saveTmp( System::String ^filename ) - { - System::Xml::XmlDocument ^doc = gcnew System::Xml::XmlDocument(); + System::Void saveTmp( System::String ^filename ); - doc->AppendChild( doc->CreateXmlDeclaration("1.0","UTF-8",nullptr) ); - System::Xml::XmlElement ^root = doc->CreateElement( "MasterEditorTWL" ); - doc->AppendChild( root ); + // 一時ファイルを読み出す + void loadTmp( System::String ^filename ); - // SRLのパス - MasterEditorTWL::appendXmlTag( doc, root, "Srl", this->tboxFile->Text ); - - // 言語 - MasterEditorTWL::appendXmlTag( doc, root, "Lang", (this->stripItemJapanese->Checked)?"J":"E" ); - - // フォーム - System::Xml::XmlElement ^form = doc->CreateElement( "Form" ); - root->AppendChild( form ); - - MasterEditorTWL::appendXmlTag( doc, form, "ProductName", this->tboxProductName->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ProductCode1", this->tboxProductCode1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2", this->tboxProductCode2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ProductNameForeign", this->tboxProductNameForeign->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ProductCode1Foreign", this->tboxProductCode1Foreign->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2Foreign1", this->tboxProductCode2Foreign1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2Foreign2", this->tboxProductCode2Foreign2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2Foreign3", this->tboxProductCode2Foreign3->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "SubmitVersion", this->numSubmitVersion->Value.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "Backup", this->combBackup->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "BackupOther", this->tboxBackupOther->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "ReleaseForeign", (this->cboxReleaseForeign->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "Remarks", this->tboxCaption->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "SubmitWay", (this->rSubmitHand->Checked)?"Hand":"Mail" ); - if( this->rUsageSale->Checked ) - MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Sale" ); - else if( this->rUsageSample->Checked ) - MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Sample" ); - else if( this->rUsageDst->Checked ) - MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Dst" ); - else if( this->rUsageOther->Checked ) - MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Other" ); - MasterEditorTWL::appendXmlTag( doc, form, "PurposeOther", this->tboxUsageOther->Text ); - - MasterEditorTWL::appendXmlTag( doc, form, "Company1", this->tboxCompany1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Depart1", this->tboxDepart1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Name1", this->tboxPerson1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Furigana1", this->tboxFurigana1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Tel1", this->tboxTel1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Fax1", this->tboxFax1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Mail1", this->tboxMail1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "NTSC1", this->tboxNTSC1->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "InputPerson2", (this->cboxIsInputPerson2->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "Company2", this->tboxCompany2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Depart2", this->tboxDepart2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Name2", this->tboxPerson2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Furigana2", this->tboxFurigana2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Tel2", this->tboxTel2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Fax2", this->tboxFax2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "Mail2", this->tboxMail2->Text ); - MasterEditorTWL::appendXmlTag( doc, form, "NTSC2", this->tboxNTSC2->Text ); - - if( this->rIsWirelessIcon->Checked ) - MasterEditorTWL::appendXmlTag( doc, form, "DisplayIcon", "Wireless" ); - else if( this->rIsWiFiIcon->Checked ) - MasterEditorTWL::appendXmlTag( doc, form, "DisplayIcon", "WiFi" ); - else - MasterEditorTWL::appendXmlTag( doc, form, "DisplayIcon", "None" ); - - MasterEditorTWL::appendXmlTag( doc, form, "IsEULA", (this->cboxIsEULA->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "Region", this->combRegion->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RatingCERO", this->combCERO->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RpCERO", (this->cboxAlwaysCERO->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "EnableCERO", (this->cboxCERO->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "RatingESRB", this->combESRB->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RpESRB", (this->cboxAlwaysESRB->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "EnableESRB", (this->cboxESRB->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "RatingUSK", this->combUSK->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RpUSK", (this->cboxAlwaysUSK->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "EnableUSK", (this->cboxUSK->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "RatingPEGI", this->combPEGI->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RpPEGI", (this->cboxAlwaysPEGI->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "EnablePEGI", (this->cboxPEGI->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "RatingPEGIPRT", this->combPEGIPRT->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RpPEGIPRT", (this->cboxAlwaysPEGIPRT->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "EnablePEGIPRT", (this->cboxPEGIPRT->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "RatingPEGIBBFC", this->combPEGIBBFC->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RpPEGIBBFC", (this->cboxAlwaysPEGIBBFC->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "EnablePEGIBBFC", (this->cboxPEGIBBFC->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "RatingOFLC", this->combOFLC->SelectedIndex.ToString() ); - MasterEditorTWL::appendXmlTag( doc, form, "RpOFLC", (this->cboxAlwaysOFLC->Checked)?"Y":"N" ); - MasterEditorTWL::appendXmlTag( doc, form, "EnableOFLC", (this->cboxOFLC->Checked)?"Y":"N" ); - - doc->Save( filename ); - } //saveTmp() - - private: - void loadTmp( System::String ^filename ) - { - System::Xml::XmlDocument ^doc = gcnew System::Xml::XmlDocument; - doc->Load( filename ); - System::Xml::XmlElement ^root = doc->DocumentElement; - System::String ^text; - - // SRL - text = MasterEditorTWL::getXPathText( root, "/MasterEditorTWL/Srl" ); - if( !System::String::IsNullOrEmpty(text) ) // SRLファイル名がないときはスルー - { - this->loadSrl(text); - } - - // 言語 - text = MasterEditorTWL::getXPathText( root, "/MasterEditorTWL/Lang" ); - if( !System::String::IsNullOrEmpty(text) && text->Equals("E") ) - { - this->stripItemEnglish->Checked = true; - this->stripItemJapanese->Checked = false; - this->changeEnglish(); - } - else - { - this->stripItemEnglish->Checked = false; - this->stripItemJapanese->Checked = true; - this->changeJapanese(); - } - - // フォーム - this->parseTmp( root, "/MasterEditorTWL/Form/ProductName", this->tboxProductName ); - this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode1", this->tboxProductCode1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2", this->tboxProductCode2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/SubmitVersion", this->numSubmitVersion ); - this->parseTmp( root, "/MasterEditorTWL/Form/Backup", this->combBackup ); - - this->tboxBackupOther->Enabled = false; - this->tboxBackupOther->Clear(); - if( this->combBackup->SelectedIndex == (this->combBackup->Items->Count - 1) ) - { - this->parseTmp( root, "/MasterEditorTWL/Form/BackupOther", this->tboxBackupOther ); - this->tboxBackupOther->Enabled = true; - } - - cli::array ^rbuts; - cli::array ^strs; - - rbuts = gcnew cli::array{this->rSubmitHand, this->rSubmitPost}; - strs = gcnew cli::array{"Hand","Mail"}; - this->parseTmp( root, "/MasterEditorTWL/Form/SubmitWay", rbuts, strs ); - - rbuts = gcnew cli::array{this->rUsageSale, this->rUsageSample, this->rUsageDst, this->rUsageOther}; - strs = gcnew cli::array{"Sale","Sample","Dst","Other"}; - this->parseTmp( root, "/MasterEditorTWL/Form/Purpose", rbuts, strs ); - this->tboxUsageOther->Enabled = false; - this->tboxUsageOther->Clear(); - if( this->rUsageOther->Checked ) - { - this->tboxUsageOther->Enabled = true; - this->parseTmp( root, "/MasterEditorTWL/Form/PurposeOther", this->tboxUsageOther ); - } - - this->parseTmp( root, "/MasterEditorTWL/Form/ReleaseForeign", this->cboxReleaseForeign ); - this->tboxProductNameForeign->Enabled = false; - this->tboxProductCode1Foreign->Enabled = false; - this->tboxProductCode2Foreign1->Enabled = false; - this->tboxProductCode2Foreign2->Enabled = false; - this->tboxProductCode2Foreign3->Enabled = false; - this->tboxProductNameForeign->Clear(); - this->tboxProductCode1Foreign->Clear(); - this->tboxProductCode2Foreign1->Clear(); - this->tboxProductCode2Foreign2->Clear(); - this->tboxProductCode2Foreign3->Clear(); - if( this->cboxReleaseForeign->Checked ) - { - this->tboxProductNameForeign->Enabled = true; - this->tboxProductCode1Foreign->Enabled = true; - this->tboxProductCode2Foreign1->Enabled = true; - this->tboxProductCode2Foreign2->Enabled = true; - this->tboxProductCode2Foreign3->Enabled = true; - this->parseTmp( root, "/MasterEditorTWL/Form/ProductNameForeign", this->tboxProductNameForeign ); - this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode1Foreign", this->tboxProductCode1Foreign ); - this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2Foreign1", this->tboxProductCode2Foreign1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2Foreign2", this->tboxProductCode2Foreign2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2Foreign3", this->tboxProductCode2Foreign3 ); - } - this->parseTmp( root, "/MasterEditorTWL/Form/Remarks", this->tboxCaption ); - - this->parseTmp( root, "/MasterEditorTWL/Form/Company1", this->tboxCompany1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Depart1", this->tboxDepart1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Name1", this->tboxPerson1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Furigana1", this->tboxFurigana1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Tel1", this->tboxTel1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Fax1", this->tboxFax1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Mail1", this->tboxMail1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/NTSC1", this->tboxNTSC1 ); - this->parseTmp( root, "/MasterEditorTWL/Form/InputPerson2", this->cboxIsInputPerson2 ); - - this->parseTmp( root, "/MasterEditorTWL/Form/Company2", this->tboxCompany2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Depart2", this->tboxDepart2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Name2", this->tboxPerson2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Furigana2", this->tboxFurigana2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Tel2", this->tboxTel2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Fax2", this->tboxFax2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/Mail2", this->tboxMail2 ); - this->parseTmp( root, "/MasterEditorTWL/Form/NTSC2", this->tboxNTSC2 ); - - rbuts = gcnew cli::array{this->rIsWirelessIcon, this->rIsWiFiIcon, this->rIsNoIcon}; - strs = gcnew cli::array{"Wireless","WiFi","None"}; - this->parseTmp( root, "/MasterEditorTWL/Form/DisplayIcon", rbuts, strs ); - - this->parseTmp( root, "/MasterEditorTWL/Form/IsEULA", this->cboxIsEULA ); - this->parseTmp( root, "/MasterEditorTWL/Form/Region", this->combRegion ); - this->parseTmp( root, "/MasterEditorTWL/Form/RatingCERO", this->combCERO ); - this->parseTmp( root, "/MasterEditorTWL/Form/RpCERO", this->cboxAlwaysCERO ); - this->parseTmp( root, "/MasterEditorTWL/Form/EnableCERO", this->cboxCERO ); - this->parseTmp( root, "/MasterEditorTWL/Form/RatingESRB", this->combESRB ); - this->parseTmp( root, "/MasterEditorTWL/Form/RpESRB", this->cboxAlwaysESRB ); - this->parseTmp( root, "/MasterEditorTWL/Form/EnableESRB", this->cboxESRB ); - this->parseTmp( root, "/MasterEditorTWL/Form/RatingUSK", this->combUSK ); - this->parseTmp( root, "/MasterEditorTWL/Form/RpUSK", this->cboxAlwaysUSK ); - this->parseTmp( root, "/MasterEditorTWL/Form/EnableUSK", this->cboxUSK ); - this->parseTmp( root, "/MasterEditorTWL/Form/RatingPEGI", this->combPEGI ); - this->parseTmp( root, "/MasterEditorTWL/Form/RpPEGI", this->cboxAlwaysPEGI ); - this->parseTmp( root, "/MasterEditorTWL/Form/EnablePEGI", this->cboxPEGI ); - this->parseTmp( root, "/MasterEditorTWL/Form/RatingPEGIPRT", this->combPEGIPRT ); - this->parseTmp( root, "/MasterEditorTWL/Form/RpPEGIPRT", this->cboxAlwaysPEGIPRT ); - this->parseTmp( root, "/MasterEditorTWL/Form/EnablePEGIPRT", this->cboxPEGIPRT ); - this->parseTmp( root, "/MasterEditorTWL/Form/RatingPEGIBBFC", this->combPEGIBBFC ); - this->parseTmp( root, "/MasterEditorTWL/Form/RpPEGIBBFC", this->cboxAlwaysPEGIBBFC ); - this->parseTmp( root, "/MasterEditorTWL/Form/EnablePEGIBBFC", this->cboxPEGIBBFC ); - this->parseTmp( root, "/MasterEditorTWL/Form/RatingOFLC", this->combOFLC ); - this->parseTmp( root, "/MasterEditorTWL/Form/RpOFLC", this->cboxAlwaysOFLC ); - this->parseTmp( root, "/MasterEditorTWL/Form/EnableOFLC", this->cboxOFLC ); - - this->maskParentalForms(); // ペアレンタルコントロール情報をリージョンに合わせる - - } //loadTmp() - - private: // 一時保存情報をフォーム情報に変換 - System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::ComboBox ^comb ) - { - // コンボボックスの保存情報 - インデックスの範囲に含まれるか調べる(含まれない場合は-1) - System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); - if( System::String::IsNullOrEmpty( text ) ) - return false; - - try - { - System::Int32 index = System::Int32::Parse( text ); // テキストにはインデックスが保存されている - if( (0 <= index) && (index < comb->Items->Count) ) - { - comb->SelectedIndex = index; - return true; - } - else - { - comb->SelectedIndex = -1; - return false; - } - } - catch ( System::Exception ^ex ) // 改ざんされていたとき - { - (void)ex; - comb->SelectedIndex = -1; - return false; - } - return false; - } - System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::NumericUpDown ^num ) - { - // テキストボックスの保存情報 - そのまま代入(ただし最大を超える場合は0にする) - System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); - if( System::String::IsNullOrEmpty( text ) ) - return false; - - try - { - System::Int32 val = System::Int32::Parse( text ); // テキストには値が保存されている - if( (0 <= val) && (val <= num->Maximum) ) - { - num->Value = val; - return true; - } - else - { - num->Value = 0; - return false; - } - } - catch ( System::Exception ^ex ) // 改ざんされていたとき - { - (void)ex; - num->Value = 0; - return false; - } - return false; - } + System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::ComboBox ^comb ); + System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::NumericUpDown ^num ); System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, - cli::array^rbuts, cli::array^textCands ) - { - // ラジオボタンの保存情報 - テキスト候補に合致するか調べる(合致しない場合は先頭のラジオボタンをチェック) - System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); - if( System::String::IsNullOrEmpty( text ) ) - return false; - - System::Int32 i; - System::Boolean bSearch = false; - for( i=0; i < rbuts->Length; i++ ) // XML中のテキストがどのラジオボタンのテキストに合致するかチェック - { - rbuts[i]->Checked = false; - if( textCands[i]->Equals( text ) ) - { - rbuts[i]->Checked = true; - bSearch = true; - } - } - if( !bSearch ) // 合致しない場合は最初のラジオボタンをチェック - { - rbuts[0]->Checked = true; - } - return bSearch; - } - System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::CheckBox ^cbox ) - { - // チェックボタンの保存情報 - Y/Nを調べる(それ以外の場合にはチェックしない) - System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); - if( System::String::IsNullOrEmpty( text ) ) - return false; - - if( text->Equals("Y") ) - cbox->Checked = true; - else - cbox->Checked = false; // 不正な値も含む - return cbox->Checked; - } - System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::TextBox ^tbox ) - { - // テキストボックスの保存情報 - そのまま代入(ただし長さが合わない場合は空白にする) - System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); - if( System::String::IsNullOrEmpty( text ) ) - return false; - - if( text->Length > tbox->MaxLength ) - { - tbox->Text = gcnew System::String(""); - return false; - } - tbox->Text = text; - return true; - } + cli::array^rbuts, cli::array^textCands ); + System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::CheckBox ^cbox ); + System::Boolean parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::TextBox ^tbox ); private: // ---------------------------------------------- @@ -4160,26 +3450,12 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->rIsNoIcon->Enabled = false; this->combCERO->Enabled = false; - this->cboxCERO->Enabled = false; - this->cboxAlwaysCERO->Enabled = false; this->combESRB->Enabled = false; - this->cboxESRB->Enabled = false; - this->cboxAlwaysESRB->Enabled = false; this->combUSK->Enabled = false; - this->cboxUSK->Enabled = false; - this->cboxAlwaysUSK->Enabled = false; this->combPEGI->Enabled = false; - this->cboxPEGI->Enabled = false; - this->cboxAlwaysPEGI->Enabled = false; - this->combPEGIPRT->Enabled = false; - this->cboxPEGIPRT->Enabled = false; - this->cboxAlwaysPEGIPRT->Enabled = false; - this->combPEGIBBFC->Enabled = false; - this->cboxPEGIBBFC->Enabled = false; - this->cboxAlwaysPEGIBBFC->Enabled = false; + this->combPEGI_PRT->Enabled = false; + this->combPEGI_BBFC->Enabled = false; this->combOFLC->Enabled = false; - this->cboxOFLC->Enabled = false; - this->cboxAlwaysOFLC->Enabled = false; } private: @@ -4189,1076 +3465,72 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // ROM情報をフォームから取得してSRLクラスのプロパティに反映させる // (ROMヘッダへの反映やCRCと署名の再計算をしない) - void setSrlProperties(void) - { - // ROMヘッダの[0,0x160)の領域はRead Onlyで変更しない - - // TWL拡張領域のいくつかの情報をROMヘッダに反映させる - this->hSrl->hIsEULA = this->cboxIsEULA->Checked; - this->hSrl->hIsWiFiIcon = this->rIsWiFiIcon->Checked; - this->hSrl->hIsWirelessIcon = this->rIsWirelessIcon->Checked; - - // Srlクラスのプロパティへの反映 - this->setParentalSrlProperties(); - } + void setSrlProperties(void); // SRLのROM情報をフォームに反映させる(ファイルが読み込まれていることが前提) - void setSrlForms(void) - { - // NTR互換情報 - this->tboxTitleName->Text = this->hSrl->hTitleName; - this->tboxGameCode->Text = this->hSrl->hGameCode; - this->tboxMakerCode->Text = this->hSrl->hMakerCode; - this->tboxPlatform->Text = this->hSrl->hPlatform; - this->tboxRomSize->Text = this->hSrl->hRomSize; - this->tboxRomLatency->Text = this->hSrl->hLatency; - if( *(this->hSrl->hRomVersion) == 0xE0 ) - { - this->tboxRemasterVer->Text = gcnew System::String("E"); - this->cboxRemasterVerE->Checked = true; - } - else - { - this->tboxRemasterVer->Text = this->hSrl->hRomVersion->ToString(); - this->cboxRemasterVerE->Checked = false; - } - - this->tboxHeaderCRC->Clear(); - this->tboxHeaderCRC->AppendText( "0x" ); - this->tboxHeaderCRC->AppendText( this->hSrl->hHeaderCRC->ToString("X") ); - - if( this->hSrl->hPlatform == nullptr ) - { - this->errMsg( "プラットホーム指定が不正です。ROMデータのビルド設定を見直してください。", - "Illegal Platform: Please check build settings of the ROM data."); - } - - // TWL拡張情報 - this->tboxTitleIDLo->Text = this->hSrl->hTitleIDLo; - this->tboxTitleIDHi->Text = this->hSrl->hTitleIDHi->ToString("X8"); - this->tboxNormalRomOffset->Text = this->hSrl->hNormalRomOffset->ToString("X8"); - this->tboxKeyTableRomOffset->Text = this->hSrl->hKeyTableRomOffset->ToString("X8"); - this->tboxPublicSize->Text = MasterEditorTWL::transSizeToString( this->hSrl->hPublicSize ); - this->tboxPrivateSize->Text = MasterEditorTWL::transSizeToString( this->hSrl->hPrivateSize ); - this->cboxIsNormalJump->Checked = *(this->hSrl->hIsNormalJump); - this->cboxIsTmpJump->Checked = *(this->hSrl->hIsTmpJump); - this->cboxIsSubBanner->Checked = *(this->hSrl->hIsSubBanner); - this->cboxIsWL->Checked = *(this->hSrl->hIsWL); - if( *(this->hSrl->hIsCodecTWL) == true ) - { - this->tboxIsCodec->Text = gcnew System::String( "TWL" ); - } - else - { - this->tboxIsCodec->Text = gcnew System::String( "NTR" ); - } - this->cboxIsSD->Checked = *(this->hSrl->hIsSD); - this->cboxIsNAND->Checked = *(this->hSrl->hIsNAND); - if( *(this->hSrl->hIsGameCardNitro) == true ) - { - this->tboxIsGameCardOn->Text = gcnew System::String( "ON(NTR)" ); - } - else if( *(this->hSrl->hIsGameCardOn) == true ) - { - this->tboxIsGameCardOn->Text = gcnew System::String( "ON(normal)" ); - } - else - { - this->tboxIsGameCardOn->Text = gcnew System::String( "OFF" ); - } - this->cboxIsShared2->Checked = *(this->hSrl->hIsShared2); - this->tboxShared2Size0->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[0] ); - this->tboxShared2Size1->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[1] ); - this->tboxShared2Size2->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[2] ); - this->tboxShared2Size3->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[3] ); - this->tboxShared2Size4->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[4] ); - this->tboxShared2Size5->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[5] ); - - // アプリ種別 - if( *this->hSrl->hIsMediaNand ) - { - this->tboxMedia->Text = gcnew System::String( "NAND" ); - } - else - { - this->tboxMedia->Text = gcnew System::String( "Game Card" ); - } - - - if( *(this->hSrl->hIsAppLauncher) == true ) - { - this->tboxAppType->Text = gcnew System::String( "Launcher" ); - } - else if( *(this->hSrl->hIsAppSecure) == true ) - { - this->tboxAppType->Text = gcnew System::String( "Secure" ); - } - else if( *(this->hSrl->hIsAppSystem) == true ) - { - this->tboxAppType->Text = gcnew System::String( "System" ); - } - else if( *(this->hSrl->hIsAppUser) == true ) - { - this->tboxAppType->Text = gcnew System::String( "User" ); - } - else - { - this->tboxAppType->Text = gcnew System::String( "UNKNOWN" ); - } - - System::String ^appother = gcnew System::String(""); - if( *(this->hSrl->hIsLaunch) == false ) - { - appother += "Not-Launch.\r\n"; - } - if( *(this->hSrl->hIsDataOnly) == true ) - { - appother += "DataOnly.\r\n"; - } - this->tboxAppTypeOther->Text = appother; - - // アクセスコントロール その他 - System::String ^acc = gcnew System::String(""); - if( *(this->hSrl->hIsCommonClientKey) == true ) - { - acc += "commonClientKey.\r\n"; - } - if( *(this->hSrl->hIsAesSlotBForES) == true ) - { - acc += "AES-SlotB(ES).\r\n"; - } - if( *(this->hSrl->hIsAesSlotCForNAM) == true ) - { - acc += "AES-SlotC(NAM).\r\n"; - } - if( *(this->hSrl->hIsAesSlotBForJpegEnc) == true ) - { - acc += "AES-SlotB(JpegEnc.).\r\n"; - } - if( *(this->hSrl->hIsAesSlotAForSSL) == true ) - { - acc += "AES-SlotA(SSL).\r\n"; - } - if( *(this->hSrl->hIsCommonClientKeyForDebugger) == true ) - { - acc += "commonClientKey(Debug.).\r\n"; - } - this->tboxAccessOther->Text = acc; - - // 特殊な設定をテキストボックスに反映 - this->setSrlFormsCaptionEx(); - - // SDKバージョンとライブラリ - this->tboxSDK->Clear(); - if( this->hSrl->hSDKList != nullptr ) - { - for each( RCSDKVersion ^ver in this->hSrl->hSDKList ) - { - if( ver->IsStatic ) - this->tboxSDK->Text += ver->Version + " (main static)\r\n"; - else - this->tboxSDK->Text += ver->Version + "\r\n"; - } - } - this->gridLibrary->Rows->Clear(); - if( this->hSrl->hLicenseList != nullptr ) - { - for each( RCLicense ^lic in this->hSrl->hLicenseList ) - { - this->gridLibrary->Rows->Add( gcnew cli::array{lic->Publisher, lic->Name} ); - } - } - - // 編集可能情報 - this->cboxIsEULA->Checked = *(this->hSrl->hIsEULA); - if( ( *this->hSrl->hIsWiFiIcon && *this->hSrl->hIsWirelessIcon) || - (!(*this->hSrl->hIsWiFiIcon) && !(*this->hSrl->hIsWirelessIcon)) ) - { - this->rIsNoIcon->Checked = true; - } - else if( *(this->hSrl->hIsWiFiIcon) && !*(this->hSrl->hIsWirelessIcon) ) - { - this->rIsWiFiIcon->Checked = true; - } - else - { - this->rIsWirelessIcon->Checked = true; - } - this->setParentalForms(); // ペアレンタルコントロール関連 - } //setSrlForms() + void setSrlForms(void); // SRLの特殊な設定をフォームにセットする(言語切り替えで表示を変えたいので独立させる) - void setSrlFormsCaptionEx() - { - // 特殊な設定は備考欄に書き加えておく - this->tboxCaptionEx->Clear(); - if( (this->hSrl->hHasDSDLPlaySign != nullptr) && (*(this->hSrl->hHasDSDLPlaySign) == true) ) - { - if( this->stripItemJapanese->Checked == true ) - this->tboxCaptionEx->Text += gcnew System::String( "DSクローンブート対応.\r\n" ); - else - this->tboxCaptionEx->Text += gcnew System::String( "DS Clone Boot.\r\n" ); - } - if( (this->hSrl->hIsSCFGAccess != nullptr) && (*(this->hSrl->hIsSCFGAccess) == true) ) - { - if( this->stripItemJapanese->Checked == true ) - this->tboxCaptionEx->Text += gcnew System::String( "SCFGレジスタアクセス可能.\r\n" ); - else - this->tboxCaptionEx->Text += gcnew System::String( "SDFC Register Accessible.\r\n" ); - } - } + void setSrlFormsCaptionEx(); - // ペアレンタルコントロール情報はSRL内にあるが設定が大変なので切り出す + // フォームの入力をチェックする + System::Boolean checkSrlForms(void); - // ペアレンタルコントロール関連の情報をフォームから取得してSRLに反映させる - void setParentalSrlProperties(void) - { - // リージョン - this->hSrl->hIsRegionJapan = gcnew System::Boolean(false); - this->hSrl->hIsRegionAmerica = gcnew System::Boolean(false); - this->hSrl->hIsRegionEurope = gcnew System::Boolean(false); - this->hSrl->hIsRegionAustralia = gcnew System::Boolean(false); - switch( this->combRegion->SelectedIndex ) - { - case 0: - this->hSrl->hIsRegionJapan = gcnew System::Boolean(true); - break; + private: + // --------------------------------------------------------------------- + // ペアレンタルコントロール設定は複雑なので別に切り出す + // --------------------------------------------------------------------- - case 1: - this->hSrl->hIsRegionAmerica = gcnew System::Boolean(true); - break; + // フォーム入力をSRLに反映させる + void setParentalSrlProperties(void); - case 2: - this->hSrl->hIsRegionEurope = gcnew System::Boolean(true); - break; - - case 3: - this->hSrl->hIsRegionAustralia = gcnew System::Boolean(true); - break; - - case 4: - this->hSrl->hIsRegionEurope = gcnew System::Boolean(true); - this->hSrl->hIsRegionAustralia = gcnew System::Boolean(true); - break; - -#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - case 5: - this->hSrl->hIsRegionJapan = gcnew System::Boolean(true); - this->hSrl->hIsRegionAmerica = gcnew System::Boolean(true); - this->hSrl->hIsRegionEurope = gcnew System::Boolean(true); - this->hSrl->hIsRegionAustralia = gcnew System::Boolean(true); - break; -#endif - default: - break; - } - - System::Byte rating; - // CERO - switch( this->combCERO->SelectedIndex ) - { - case 0: rating = 0; break; - case 1: rating = 12; break; - case 2: rating = 15; break; - case 3: rating = 17; break; - case 4: rating = 18; break; - default: - rating = 0; // 未審査 - break; - } - this->hSrl->hArrayParentalRating[OS_TWL_PCTL_OGN_CERO] = gcnew System::Byte( rating ); - this->hSrl->hArrayParentalEffect[OS_TWL_PCTL_OGN_CERO] = gcnew System::Boolean( this->cboxCERO->Checked ); - this->hSrl->hArrayParentalAlways[OS_TWL_PCTL_OGN_CERO] = gcnew System::Boolean( this->cboxAlwaysCERO->Checked ); - - // ESRB - switch( this->combESRB->SelectedIndex ) - { - case 0: rating = 3; break; - case 1: rating = 6; break; - case 2: rating = 10; break; - case 3: rating = 13; break; - case 4: rating = 17; break; - default: - rating = 0; - break; - } - this->hSrl->hArrayParentalRating[OS_TWL_PCTL_OGN_ESRB] = gcnew System::Byte( rating ); - this->hSrl->hArrayParentalEffect[OS_TWL_PCTL_OGN_ESRB] = gcnew System::Boolean( this->cboxESRB->Checked ); - this->hSrl->hArrayParentalAlways[OS_TWL_PCTL_OGN_ESRB] = gcnew System::Boolean( this->cboxAlwaysESRB->Checked ); - - // USK - switch( this->combUSK->SelectedIndex ) - { - case 0: rating = 0; break; - case 1: rating = 6; break; - case 2: rating = 12; break; - case 3: rating = 16; break; - case 4: rating = 18; break; - default: - rating = 0; - break; - } - this->hSrl->hArrayParentalRating[OS_TWL_PCTL_OGN_USK] = gcnew System::Byte( rating ); - this->hSrl->hArrayParentalEffect[OS_TWL_PCTL_OGN_USK] = gcnew System::Boolean( this->cboxUSK->Checked ); - this->hSrl->hArrayParentalAlways[OS_TWL_PCTL_OGN_USK] = gcnew System::Boolean( this->cboxAlwaysUSK->Checked ); - - // PEGI - switch( this->combPEGI->SelectedIndex ) - { - case 0: rating = 3; break; - case 1: rating = 7; break; - case 2: rating = 12; break; - case 3: rating = 16; break; - case 4: rating = 18; break; - default: - rating = 0; - break; - } - this->hSrl->hArrayParentalRating[OS_TWL_PCTL_OGN_PEGI_GEN] = gcnew System::Byte( rating ); - this->hSrl->hArrayParentalEffect[OS_TWL_PCTL_OGN_PEGI_GEN] = gcnew System::Boolean( this->cboxPEGI->Checked ); - this->hSrl->hArrayParentalAlways[OS_TWL_PCTL_OGN_PEGI_GEN] = gcnew System::Boolean( this->cboxAlwaysPEGI->Checked ); - - // PEGIPRT - switch( this->combPEGIPRT->SelectedIndex ) - { - case 0: rating = 4; break; - case 1: rating = 6; break; - case 2: rating = 12; break; - case 3: rating = 16; break; - case 4: rating = 18; break; - default: - rating = 0; - break; - } - this->hSrl->hArrayParentalRating[OS_TWL_PCTL_OGN_PEGI_PRT] = gcnew System::Byte( rating ); - this->hSrl->hArrayParentalEffect[OS_TWL_PCTL_OGN_PEGI_PRT] = gcnew System::Boolean( this->cboxPEGIPRT->Checked ); - this->hSrl->hArrayParentalAlways[OS_TWL_PCTL_OGN_PEGI_PRT] = gcnew System::Boolean( this->cboxAlwaysPEGIPRT->Checked ); - - // PEGIBBFC - switch( this->combPEGIBBFC->SelectedIndex ) - { - case 0: rating = 3; break; - case 1: rating = 4; break; - case 2: rating = 7; break; - case 3: rating = 8; break; - case 4: rating = 12; break; - case 5: rating = 15; break; - case 6: rating = 16; break; - case 7: rating = 18; break; - default: - rating = 0; - break; - } - this->hSrl->hArrayParentalRating[OS_TWL_PCTL_OGN_PEGI_BBFC] = gcnew System::Byte( rating ); - this->hSrl->hArrayParentalEffect[OS_TWL_PCTL_OGN_PEGI_BBFC] = gcnew System::Boolean( this->cboxPEGIBBFC->Checked ); - this->hSrl->hArrayParentalAlways[OS_TWL_PCTL_OGN_PEGI_BBFC] = gcnew System::Boolean( this->cboxAlwaysPEGIBBFC->Checked ); - - // OFLC - switch( this->combOFLC->SelectedIndex ) - { - case 0: rating = 0; break; - case 1: rating = 7; break; - case 2: rating = 14; break; - case 3: rating = 15; break; - default: - rating = 0; - break; - } - this->hSrl->hArrayParentalRating[OS_TWL_PCTL_OGN_OFLC] = gcnew System::Byte( rating ); - this->hSrl->hArrayParentalEffect[OS_TWL_PCTL_OGN_OFLC] = gcnew System::Boolean( this->cboxOFLC->Checked ); - this->hSrl->hArrayParentalAlways[OS_TWL_PCTL_OGN_OFLC] = gcnew System::Boolean( this->cboxAlwaysOFLC->Checked ); - } //setParentalSrlProperties() - - // SRL内のペアレンタルコントロール情報を抜き出してフォームに反映させる - void setParentalForms(void) - { - System::Int32 index; - - // リージョン - System::Boolean isJapan = *(this->hSrl->hIsRegionJapan); - System::Boolean isAmerica = *(this->hSrl->hIsRegionAmerica); - System::Boolean isEurope = *(this->hSrl->hIsRegionEurope); - System::Boolean isAustralia = *(this->hSrl->hIsRegionAustralia); - if( isJapan && !isAmerica && !isEurope && !isAustralia ) - index = 0; - else if( !isJapan && isAmerica && !isEurope && !isAustralia ) - index = 1; - else if( !isJapan && !isAmerica && isEurope && !isAustralia ) - index = 2; - else if( !isJapan && !isAmerica && !isEurope && isAustralia ) - index = 3; - else if( !isJapan && !isAmerica && isEurope && isAustralia ) - index = 4; - else - index = -1; // 不正 -#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - if( isJapan && isAmerica && isEurope && isAustralia ) - index = 5; -#endif - this->combRegion->SelectedIndex = index; - this->maskParentalForms(); - - // CERO - switch( *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_CERO ]) ) - { - case 0: - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_CERO ]) ) // 全年齢か未審査か判定 - index = 0; - else - index = 5; - break; - case 12: index = 1; break; - case 15: index = 2; break; - case 17: index = 3; break; - case 18: index = 4; break; - default: - index = 5; // リード時のチェックがあるため起こり得ない - break; - } - this->combCERO->SelectedIndex = index; - this->cboxCERO->Checked = *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_CERO ]); - this->cboxAlwaysCERO->Checked = *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_CERO ]); - // ESRB - switch( *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_ESRB ]) ) - { - case 3: index = 0; break; - case 6: index = 1; break; - case 10: index = 2; break; - case 13: index = 3; break; - case 17: index = 4; break; - case 0: index = 5; break; // 0はデフォルト値なのでエラーメッセージを出さない(自動的に未審査扱い) - default: - index = 5; - break; - } - this->combESRB->SelectedIndex = index; - this->cboxESRB->Checked = *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_ESRB ]); - this->cboxAlwaysESRB->Checked = *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_ESRB ]); - // USK - switch( *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_USK ]) ) - { - case 0: - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_USK ]) ) - index = 0; - else - index = 5; - break; - case 6: index = 1; break; - case 12: index = 2; break; - case 16: index = 3; break; - case 18: index = 4; break; - default: - index = 5; - break; - } - this->combUSK->SelectedIndex = index; - this->cboxUSK->Checked = *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_USK ]); - this->cboxAlwaysUSK->Checked = *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_USK ]); - // PEGI_GEN - switch( *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_GEN ]) ) - { - case 3: index = 0; break; - case 7: index = 1; break; - case 12: index = 2; break; - case 16: index = 3; break; - case 18: index = 4; break; - case 0: index = 5; break; - default: - index = 5; - break; - } - this->combPEGI->SelectedIndex = index; - this->cboxPEGI->Checked = *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_GEN ]); - this->cboxAlwaysPEGI->Checked = *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_GEN ]); - // PEGI_PRT - switch( *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_PRT ]) ) - { - case 4: index = 0; break; - case 6: index = 1; break; - case 12: index = 2; break; - case 16: index = 3; break; - case 18: index = 4; break; - case 0: index = 5; break; - default: - index = 5; - break; - } - this->combPEGIPRT->SelectedIndex = index; - this->cboxPEGIPRT->Checked = *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_PRT ]); - this->cboxAlwaysPEGIPRT->Checked = *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_PRT ]); - // PEGI_BBFC - switch( *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_BBFC ]) ) - { - case 3: index = 0; break; - case 4: index = 1; break; - case 7: index = 2; break; - case 8: index = 3; break; - case 12: index = 4; break; - case 15: index = 5; break; - case 16: index = 6; break; - case 18: index = 7; break; - case 0: index = 8; break; - default: - index = 8; - break; - } - this->combPEGIBBFC->SelectedIndex = index; - this->cboxPEGIBBFC->Checked = *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_BBFC ]); - this->cboxAlwaysPEGIBBFC->Checked = *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_BBFC ]); - // OFLC - switch( *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_OFLC ]) ) - { - case 0: - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_OFLC ]) ) - index = 0; - else - index = 4; - break; - case 7: index = 1; break; - case 14: index = 2; break; - case 15: index = 3; break; - default: - index = 4; break; - break; - } - this->combOFLC->SelectedIndex = index; - this->cboxOFLC->Checked = *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_OFLC ]); - this->cboxAlwaysOFLC->Checked = *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_OFLC ]); - } //setParentalForms() + // SRL情報をフォームに反映させる + void setParentalForms(void); // リージョン情報からペアレンタルコントロールの編集可能団体をマスクする - void maskParentalForms(void) - { - this->enableParental( this->combCERO, this->cboxCERO, this->cboxAlwaysCERO, this->labCERO, nullptr ); - this->enableParental( this->combESRB, this->cboxESRB, this->cboxAlwaysESRB, this->labESRB, nullptr ); - this->enableParental( this->combUSK, this->cboxUSK, this->cboxAlwaysUSK, this->labUSK, nullptr ); - this->enableParental( this->combPEGI, this->cboxPEGI, this->cboxAlwaysPEGI, this->labPEGI, nullptr ); - this->enableParental( this->combPEGIPRT, this->cboxPEGIPRT, this->cboxAlwaysPEGIPRT, this->labPEGIPRT, nullptr ); - this->enableParental( this->combPEGIBBFC, this->cboxPEGIBBFC, this->cboxAlwaysPEGIBBFC, this->labPEGIBBFC, this->labPEGIBBFC2 ); - this->enableParental( this->combOFLC, this->cboxOFLC, this->cboxAlwaysOFLC, this->labOFLC, nullptr ); - switch( this->combRegion->SelectedIndex ) - { - case 0: - // 日本 - this->enableParental( this->combCERO, this->cboxCERO, this->cboxAlwaysCERO, this->labCERO, nullptr ); + void maskParentalForms(void); - this->disableParental( this->combESRB, this->cboxESRB, this->cboxAlwaysESRB, this->labESRB, nullptr ); - this->disableParental( this->combUSK, this->cboxUSK, this->cboxAlwaysUSK, this->labUSK, nullptr ); - this->disableParental( this->combPEGI, this->cboxPEGI, this->cboxAlwaysPEGI, this->labPEGI, nullptr ); - this->disableParental( this->combPEGIPRT, this->cboxPEGIPRT, this->cboxAlwaysPEGIPRT, this->labPEGIPRT, nullptr ); - this->disableParental( this->combPEGIBBFC, this->cboxPEGIBBFC, this->cboxAlwaysPEGIBBFC, this->labPEGIBBFC, this->labPEGIBBFC2 ); - this->disableParental( this->combOFLC, this->cboxOFLC, this->cboxAlwaysOFLC, this->labOFLC, nullptr ); - break; + // フォーム入力が正しいか書き込み前チェック + void checkParentalForms( System::Boolean inRegion, System::Windows::Forms::ComboBox ^comb, System::String ^msg ); - case 1: - // 米国 - this->disableParental( this->combCERO, this->cboxCERO, this->cboxAlwaysCERO, this->labCERO, nullptr ); - this->enableParental( this->combESRB, this->cboxESRB, this->cboxAlwaysESRB, this->labESRB, nullptr ); - this->disableParental( this->combUSK, this->cboxUSK, this->cboxAlwaysUSK, this->labUSK, nullptr ); - this->disableParental( this->combPEGI, this->cboxPEGI, this->cboxAlwaysPEGI, this->labPEGI, nullptr ); - this->disableParental( this->combPEGIPRT, this->cboxPEGIPRT, this->cboxAlwaysPEGIPRT, this->labPEGIPRT, nullptr ); - this->disableParental( this->combPEGIBBFC, this->cboxPEGIBBFC, this->cboxAlwaysPEGIBBFC, this->labPEGIBBFC, this->labPEGIBBFC2 ); - this->disableParental( this->combOFLC, this->cboxOFLC, this->cboxAlwaysOFLC, this->labOFLC, nullptr ); - break; + // クリアする + void clearParental( System::Windows::Forms::ComboBox ^comb ); - case 2: - // 欧州 - this->disableParental( this->combCERO, this->cboxCERO, this->cboxAlwaysCERO, this->labCERO, nullptr ); - this->disableParental( this->combESRB, this->cboxESRB, this->cboxAlwaysESRB, this->labESRB, nullptr ); - this->enableParental( this->combUSK, this->cboxUSK, this->cboxAlwaysUSK, this->labUSK, nullptr ); - this->enableParental( this->combPEGI, this->cboxPEGI, this->cboxAlwaysPEGI, this->labPEGI, nullptr ); - this->enableParental( this->combPEGIPRT, this->cboxPEGIPRT, this->cboxAlwaysPEGIPRT, this->labPEGIPRT, nullptr ); - this->enableParental( this->combPEGIBBFC, this->cboxPEGIBBFC, this->cboxAlwaysPEGIBBFC, this->labPEGIBBFC, this->labPEGIBBFC2 ); - this->disableParental( this->combOFLC, this->cboxOFLC, this->cboxAlwaysOFLC, this->labOFLC, nullptr ); - break; + // 編集できるようにする + void enableParental( System::Windows::Forms::ComboBox ^comb, + System::Windows::Forms::Label ^lab1, + System::Windows::Forms::Label ^lab2 ); - case 3: - // 豪州 - this->disableParental( this->combCERO, this->cboxCERO, this->cboxAlwaysCERO, this->labCERO, nullptr ); - this->disableParental( this->combESRB, this->cboxESRB, this->cboxAlwaysESRB, this->labESRB, nullptr ); - this->disableParental( this->combUSK, this->cboxUSK, this->cboxAlwaysUSK, this->labUSK, nullptr ); - this->disableParental( this->combPEGI, this->cboxPEGI, this->cboxAlwaysPEGI, this->labPEGI, nullptr ); - this->disableParental( this->combPEGIPRT, this->cboxPEGIPRT, this->cboxAlwaysPEGIPRT, this->labPEGIPRT, nullptr ); - this->disableParental( this->combPEGIBBFC, this->cboxPEGIBBFC, this->cboxAlwaysPEGIBBFC, this->labPEGIBBFC, this->labPEGIBBFC2 ); - this->enableParental( this->combOFLC, this->cboxOFLC, this->cboxAlwaysOFLC, this->labOFLC, nullptr ); - break; - - case 4: - // 欧州と豪州 - this->disableParental( this->combCERO, this->cboxCERO, this->cboxAlwaysCERO, this->labCERO, nullptr ); - this->disableParental( this->combESRB, this->cboxESRB, this->cboxAlwaysESRB, this->labESRB, nullptr ); - this->enableParental( this->combUSK, this->cboxUSK, this->cboxAlwaysUSK, this->labUSK, nullptr ); - this->enableParental( this->combPEGI, this->cboxPEGI, this->cboxAlwaysPEGI, this->labPEGI, nullptr ); - this->enableParental( this->combPEGIPRT, this->cboxPEGIPRT, this->cboxAlwaysPEGIPRT, this->labPEGIPRT, nullptr ); - this->enableParental( this->combPEGIBBFC, this->cboxPEGIBBFC, this->cboxAlwaysPEGIBBFC, this->labPEGIBBFC, this->labPEGIBBFC2 ); - this->enableParental( this->combOFLC, this->cboxOFLC, this->cboxAlwaysOFLC, this->labOFLC, nullptr ); - break; - - default: - break; - } - } //maskParentalForms() + // 編集できなくする + void disableParental( System::Windows::Forms::ComboBox ^comb, + System::Windows::Forms::Label ^lab1, + System::Windows::Forms::Label ^lab2 ); // ---------------------------------------------- - // SRL関連のフォームのチェック + // フォームのチェック // ---------------------------------------------- // テキスト入力がされているかチェック - System::Boolean checkTextForm( System::String ^formtext, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) - { - System::String ^msgJ = gcnew System::String( "入力されていません。" ); - System::String ^msgE = gcnew System::String( "No item is set. Please retry to input." ); + System::Boolean checkTextForm( System::String ^formtext, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ); - System::String ^tmp = formtext->Replace( " ", "" ); // スペースのみの文字列もエラー - if( (formtext == nullptr) || formtext->Equals("") || tmp->Equals("") ) - { - this->hErrorList->Add( gcnew RCMrcError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); - return false; - } - return true; - } // 数値入力が正常かどうかチェック System::Boolean checkNumRange( - System::Int32 val, System::Int32 min, System::Int32 max, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) - { - System::String ^msgJ = gcnew System::String( "値の範囲が不正です。やり直してください。" ); - System::String ^msgE = gcnew System::String( "Invalidate range of value. Please retry." ); + System::Int32 val, System::Int32 min, System::Int32 max, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ); - if( (val < min) || (max < val) ) - { - this->hErrorList->Add( gcnew RCMrcError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); - return false; - } - return true; - } System::Boolean checkNumRange( System::String ^strval, System::Int32 min, System::Int32 max, - System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) - { - try - { - System::Int32 i = System::Int32::Parse(strval); - return (this->checkNumRange( i, min, max, labelJ, labelE, affectRom )); - } - catch ( System::FormatException ^ex ) - { - (void)ex; - return (this->checkNumRange( max+1, min, max, labelJ, labelE, affectRom )); // 必ず失敗するように max+1 を検査 - } - } + System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ); // コンボボックスをチェック - System::Boolean checkBoxIndex( System::Windows::Forms::ComboBox ^box, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) - { - System::String ^msgJ = gcnew System::String( "選択されていません。" ); - System::String ^msgE = gcnew System::String( "One item is not selected." ); - - if( box->SelectedIndex < 0 ) - { - this->hErrorList->Add( gcnew RCMrcError( - labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); - } - return true; - } + System::Boolean checkBoxIndex( System::Windows::Forms::ComboBox ^box, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ); - // フォームの入力をチェックする - System::Boolean checkSrlForms(void) - { - // リージョン - if( this->checkBoxIndex( this->combRegion, LANG_REGION_J, LANG_REGION_E, true ) == false ) - return false; + // ----------------------------------------------------------------- + // 提出情報(SRLに影響しない箇所のみ)とフォーム間のデータのやりとり + // ----------------------------------------------------------------- - // リージョンを決める - System::Boolean bJapan = false; - System::Boolean bAmerica = false; - System::Boolean bEurope = false; - System::Boolean bAustralia = false; - switch( this->combRegion->SelectedIndex ) - { - case 0: - bJapan = true; - break; - case 1: - bAmerica = true; - break; - case 2: - bEurope = true; - break; - case 3: - bAustralia = true; - break; - case 4: - bEurope = true; - bAustralia = true; - break; + // 提出確認書にフォームを反映 + void setDeliverableProperties(void); -#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - case 5: - bJapan = true; - bAmerica = true; - bEurope = true; - bAustralia = true; - break; -#endif - default: - break; - } - - // ペアレンタルコントロール - this->checkParentalForms( bJapan, this->combCERO, this->cboxCERO, this->cboxAlwaysCERO, this->labCERO->Text ); - this->checkParentalForms( bAmerica, this->combESRB, this->cboxESRB, this->cboxAlwaysESRB, this->labESRB->Text ); - this->checkParentalForms( bEurope, this->combUSK, this->cboxUSK, this->cboxAlwaysUSK, this->labUSK->Text ); - this->checkParentalForms( bEurope, this->combPEGI, this->cboxPEGI, this->cboxAlwaysPEGI, this->labPEGI->Text ); - this->checkParentalForms( bEurope, this->combPEGIPRT, this->cboxPEGIPRT, this->cboxAlwaysPEGIPRT, this->labPEGIPRT->Text ); - this->checkParentalForms( bEurope, this->combPEGIBBFC, this->cboxPEGIBBFC, this->cboxAlwaysPEGIBBFC, - this->labPEGIBBFC->Text + " " + this->labPEGIBBFC2->Text ); - this->checkParentalForms( bAustralia, this->combOFLC, this->cboxOFLC, this->cboxAlwaysOFLC, this->labOFLC->Text ); - - // ひととおりエラー登録をした後で - // SRLバイナリに影響を与えるエラーが存在するかチェック -#ifdef METWL_LIGHT_CHECK - return this->isValidAffectRomModified(); -#else - return this->isValidAffectRom(); -#endif - } - - // ペアレンタルコントロール関連のフォーム入力が正しいか書き込み前チェック - void checkParentalForms( - System::Boolean inRegion, System::Windows::Forms::ComboBox ^comb, - System::Windows::Forms::CheckBox ^enable, System::Windows::Forms::CheckBox ^always, System::String ^msg ) - { - // リージョンに含まれていないとき: 0クリアが保証されるのでチェック必要なし - if( !inRegion ) - return; - - if( !enable->Checked ) // 有効フラグが立っていないとき - { - // 何も設定されていない - if( !always->Checked && (comb->SelectedIndex == (comb->Items->Count - 1)) ) - { - this->hWarnList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, - msg + ": レーティング審査を必要としないソフトであるとみなしてデータを保存します。", - "Parental Control", msg + ": Save ROM data as Game soft which needs rating examinination.", true, true ) ); - } - else - { - this->hErrorList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, - msg + ": 制限が無効であるにもかかわらずレーティング情報が設定されています。", - "Parental Control", msg + "Rating can be set only when control is enable.", true, true ) ); - } - } - else // 有効フラグが立っているとき - { - if( !always->Checked && (comb->SelectedIndex == (comb->Items->Count - 1)) ) - { - this->hErrorList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, - msg + ": 制限が有効であるにもかかわらずレーティング情報が設定されていません。", - "Parental Control", msg + ": Rating must be set when control is enable.", true, true ) ); - } - else if( always->Checked && (comb->SelectedIndex == (comb->Items->Count - 1)) ) - { - this->hWarnList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, - msg + ": Rating Pendingが指定されています。レーティング年齢が審査されしだい、再度、ROMを提出してください。", - "Parental Control", ": Rating Pending is setting. When rating age is examined, Please submit again.", true, true ) ); - } - else if( always->Checked && (comb->SelectedIndex != (comb->Items->Count - 1)) ) - { - this->hErrorList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, - msg + ": Rating Pending指定とレーティング年齢を同時に指定することはできません。", - "Parental Control", msg + ": Rating setting is either rating pending or rating age.", true, true ) ); - } - } - } //checkParentalForms() - - // ---------------------------------------------- - // マスタ書類情報(SRL影響なし)をフォームから取得 - // ---------------------------------------------- - - void setDeliverableProperties(void) - { - // 提出情報 - this->hDeliv->hProductName = this->tboxProductName->Text; - this->hDeliv->hProductCode1 = this->tboxProductCode1->Text; - this->hDeliv->hProductCode2 = this->tboxProductCode2->Text; - this->hDeliv->hReleaseForeign = gcnew System::Boolean( this->cboxReleaseForeign->Checked ); - if( this->cboxReleaseForeign->Checked == true ) - { - this->hDeliv->hProductNameForeign = this->tboxProductNameForeign->Text; - this->hDeliv->hProductCode1Foreign = this->tboxProductCode1Foreign->Text; - this->hDeliv->hProductCode2Foreign = gcnew System::String(""); - this->hDeliv->hProductCode2Foreign = this->tboxProductCode2Foreign1->Text; - if( !System::String::IsNullOrEmpty( this->tboxProductCode2Foreign2->Text ) ) - { - this->hDeliv->hProductCode2Foreign += ("/" + this->tboxProductCode2Foreign2->Text); - } - if( !System::String::IsNullOrEmpty( this->tboxProductCode2Foreign2->Text ) ) - { - this->hDeliv->hProductCode2Foreign += ("/" + this->tboxProductCode2Foreign3->Text); - } - } - else - { - this->hDeliv->hProductNameForeign = nullptr; - this->hDeliv->hProductCode1Foreign = nullptr; - this->hDeliv->hProductCode2Foreign = nullptr; - } - this->hDeliv->hReleaseYear = gcnew System::Int32( this->dateRelease->Value.Year ); - this->hDeliv->hReleaseMonth = gcnew System::Int32( this->dateRelease->Value.Month ); - this->hDeliv->hReleaseDay = gcnew System::Int32( this->dateRelease->Value.Day ); - this->hDeliv->hSubmitYear = gcnew System::Int32( this->dateSubmit->Value.Year ); - this->hDeliv->hSubmitMonth = gcnew System::Int32( this->dateSubmit->Value.Month ); - this->hDeliv->hSubmitDay = gcnew System::Int32( this->dateSubmit->Value.Day ); - this->hDeliv->hSubmitVersion = gcnew System::Int32( System::Decimal::ToInt32( this->numSubmitVersion->Value ) ); - // SDK - this->hDeliv->hSDK = nullptr; - if( this->hSrl->hSDKList ) - { - for each( RCSDKVersion ^sdk in this->hSrl->hSDKList ) // 書類には ARM9 static のバージョン情報を記入する - { - if( sdk->IsStatic ) - this->hDeliv->hSDK = sdk->Version; - } - } - if( this->hDeliv->hSDK == nullptr ) - { - this->hDeliv->hSDK = gcnew System::String( "Undefined" ); - } - // 提出方法 - if( this->rSubmitPost->Checked == true ) - { - this->hDeliv->hSubmitWay = this->rSubmitPost->Text; - } - else - { - this->hDeliv->hSubmitWay = this->rSubmitHand->Text; - } - // 用途 - if( this->rUsageSale->Checked == true ) - { - this->hDeliv->hUsage = this->rUsageSale->Text; - this->hDeliv->hUsageOther = nullptr; - } - else if( this->rUsageSample->Checked == true ) - { - this->hDeliv->hUsage = this->rUsageSample->Text; - this->hDeliv->hUsageOther = nullptr; - } - else if( this->rUsageDst->Checked == true ) - { - this->hDeliv->hUsage = this->rUsageDst->Text; - this->hDeliv->hUsageOther = nullptr; - } - else if( this->rUsageOther->Checked == true ) - { - this->hDeliv->hUsage = this->rUsageOther->Text; - this->hDeliv->hUsageOther = this->tboxUsageOther->Text; - } - - // 会社情報 - this->hDeliv->hCompany1 = this->tboxCompany1->Text + " " + this->tboxDepart1->Text; - this->hDeliv->hPerson1 = this->tboxPerson1->Text; - if( this->stripItemJapanese->Checked == true ) - { - this->hDeliv->hFurigana1 = this->tboxFurigana1->Text; - } - else - { - this->hDeliv->hFurigana1 = nullptr; - } - this->hDeliv->hTel1 = this->tboxTel1->Text; - this->hDeliv->hFax1 = this->tboxFax1->Text; - this->hDeliv->hMail1 = this->tboxMail1->Text; - this->hDeliv->hNTSC1 = this->tboxNTSC1->Text; - if( this->cboxIsInputPerson2->Checked == true ) - { - this->hDeliv->hCompany2 = this->tboxCompany2->Text + " " + this->tboxDepart2->Text; - this->hDeliv->hPerson2 = this->tboxPerson2->Text; - if( this->stripItemJapanese->Checked == true ) - { - this->hDeliv->hFurigana2 = this->tboxFurigana2->Text; - } - else - { - this->hDeliv->hFurigana2 = nullptr; - } - this->hDeliv->hTel2 = this->tboxTel2->Text; - this->hDeliv->hFax2 = this->tboxFax2->Text; - this->hDeliv->hMail2 = this->tboxMail2->Text; - this->hDeliv->hNTSC2 = this->tboxNTSC2->Text; - } - else - { - this->hDeliv->hCompany2 = nullptr; - this->hDeliv->hPerson2 = nullptr; - this->hDeliv->hFurigana2 = nullptr; - this->hDeliv->hTel2 = nullptr; - this->hDeliv->hFax2 = nullptr; - this->hDeliv->hMail2 = nullptr; - this->hDeliv->hNTSC2 = nullptr; - } - - // 備考 - System::String ^tmp = this->tboxCaption->Text->Replace( " ", "" ); - if( this->tboxCaption->Text->Equals("") || tmp->Equals("") ) // スペースのみの文字列は含めない - { - this->hDeliv->hCaption = nullptr; - } - else - { - this->hDeliv->hCaption = this->tboxCaption->Text; - } - // 備考欄に特殊な設定を追記 - tmp = this->tboxCaptionEx->Text->Replace( " ", "" ); - if( !(this->tboxCaptionEx->Text->Equals("")) && !(tmp->Equals("")) ) - { - this->hDeliv->hCaption += ("(" + this->tboxCaptionEx->Text + ")"); - } - - // 一部のROM情報を登録 - if( this->combBackup->SelectedIndex != (this->combBackup->Items->Count - 1) ) - { - if( this->combBackup->SelectedIndex > 0 ) - { - this->hDeliv->hBackupMemory = this->combBackup->SelectedItem->ToString(); - } - else - { - this->hDeliv->hBackupMemory = gcnew System::String(""); - } - } - else - { - this->hDeliv->hBackupMemory = this->tboxBackupOther->Text; - } - } - - // ---------------------------------------------- - // マスタ書類情報(SRL影響なし)のフォームチェック - // ---------------------------------------------- - - System::Boolean checkDeliverableForms(void) - { - // 不正な場合はダイアログで注意してreturn - - // 提出情報 - this->checkTextForm( this->tboxProductName->Text, LANG_PRODUCT_NAME_J, LANG_PRODUCT_NAME_E, false ); // SRL作成には問題のないエラー - this->checkTextForm( this->tboxProductCode1->Text, LANG_PRODUCT_CODE_J, LANG_PRODUCT_CODE_E, false ); - this->checkTextForm( this->tboxProductCode2->Text, LANG_PRODUCT_CODE_J, LANG_PRODUCT_CODE_E, false ); - if( this->cboxReleaseForeign->Checked == true ) - { - this->checkTextForm( this->tboxProductNameForeign->Text, LANG_PRODUCT_NAME_F_J, LANG_PRODUCT_NAME_F_E, false ); - this->checkTextForm( this->tboxProductCode1Foreign->Text, LANG_PRODUCT_CODE_F_J, LANG_PRODUCT_CODE_F_E, false ); - this->checkTextForm( this->tboxProductCode2Foreign1->Text, LANG_PRODUCT_CODE_F_J, LANG_PRODUCT_CODE_F_E, false ); - } - if( this->rUsageOther->Checked == true ) - { - this->checkTextForm( this->tboxUsageOther->Text, LANG_USAGE_J, LANG_USAGE_E, false ); - } - - // 会社情報 - this->checkTextForm( this->tboxPerson1->Text, LANG_PERSON_J, LANG_PERSON_E, false ); - this->checkTextForm( this->tboxCompany1->Text, LANG_COMPANY_J, LANG_COMPANY_E, false ); - this->checkTextForm( this->tboxDepart1->Text, LANG_DEPART_J, LANG_DEPART_E, false ); - if( this->stripItemJapanese->Checked == true ) - { - this->checkTextForm( this->tboxFurigana1->Text, LANG_FURIGANA_J, LANG_FURIGANA_J, false ); - } - this->checkTextForm( this->tboxTel1->Text, LANG_TEL_J, LANG_TEL_E, false ); - //this->checkTextForm( this->tboxFax1->Text, LANG_FAX_J, LANG_FAX_E, false ); - this->checkTextForm( this->tboxMail1->Text, LANG_MAIL_J, LANG_MAIL_E, false ); - //if( this->stripItemJapanese->Checked == true ) - //{ - // this->checkTextForm( this->tboxNTSC1->Text, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, false ); - //} - - if( this->cboxIsInputPerson2->Checked == true ) - { - this->checkTextForm( this->tboxPerson2->Text, LANG_PERSON_J, LANG_PERSON_E, false ); - this->checkTextForm( this->tboxCompany2->Text, LANG_COMPANY_J, LANG_COMPANY_E, false ); - this->checkTextForm( this->tboxDepart2->Text, LANG_DEPART_J, LANG_DEPART_E, false ); - if( this->stripItemJapanese->Checked == true ) - { - this->checkTextForm( this->tboxFurigana2->Text, LANG_FURIGANA_J, LANG_FURIGANA_J, false ); - } - this->checkTextForm( this->tboxTel2->Text, LANG_TEL_J, LANG_TEL_E, false ); - //this->checkTextForm( this->tboxFax2->Text, LANG_FAX_J, LANG_FAX_E, false ); - this->checkTextForm( this->tboxMail2->Text, LANG_MAIL_J, LANG_MAIL_E, false ); - //if( this->stripItemJapanese->Checked == true ) - //{ - // this->checkTextForm( this->tboxNTSC2->Text, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, false ); - //} - } - - // 一部のROM情報(SRLバイナリに反映されない情報)をここでチェックする - this->checkBoxIndex( this->combBackup, LANG_BACKUP_J, LANG_BACKUP_E, false ); - if( this->combBackup->SelectedIndex == (this->combBackup->Items->Count - 1) ) - { - this->checkTextForm( this->tboxBackupOther->Text, LANG_BACKUP_J, LANG_BACKUP_E, false ); - } - - // ひととおりエラー登録をした後で - // 書類上のエラー(SRLバイナリには影響しない)が存在するかチェック - return this->isValidOnlyDeliverable(); - } - - // ---------------------------------------------- - // エラー処理 - // ---------------------------------------------- - - // SRLには関係しない書類上のエラーをチェック - System::Boolean isValidOnlyDeliverable(void) - { - System::Int32 count = 0; - - // SRLクラスのエラーリストはすべてSRLに関係するのでチェックしない - // -> 入力エラーのみのチェックでよい - for each( RCMrcError ^err in this->hErrorList ) - { - if( !err->AffectRom ) - count++; - } - return (count == 0); - } - - // SRLのバイナリに影響する項目にエラーがあるかチェック - System::Boolean isValidAffectRom(void) - { - System::Int32 count = 0; - - // SRLクラスの修正不可エラーをカウント - // (修正可エラーは入力によって修正されてるかもしれないのでチェックしない) - for each( RCMrcError ^err in this->hSrl->hErrorList ) - { - if( !err->EnableModify ) // すべてSRLバイナリに影響する - count++; - } - - // SRLバイナリに影響するエラーの中で - // 修正可エラーがフォーム入力によって修正されているかカウント - // (エラーリストが更新されていることが前提) - for each( RCMrcError ^err in this->hErrorList ) - { - if( err->AffectRom ) // 修正不可エラーは存在しない - count++; - } - return (count == 0); - } - - // SRLのバイナリに影響する項目の中で修正可能なエラーだけをチェック - System::Boolean isValidAffectRomModified(void) - { - System::Int32 count = 0; - for each( RCMrcError ^err in this->hErrorList ) - { - if( err->AffectRom ) // 修正不可エラーは存在しない - count++; - } - return (count == 0); - } + // 提出情報のフォームチェック + System::Boolean checkDeliverableForms(void); // ---------------------------------------------- // ダイアログ @@ -5287,760 +3559,45 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; // ---------------------------------------------- // 日本語版と英語版でテキストボックスの文字列制限が変わる - void changeMaxLength( System::Windows::Forms::TextBox ^tbox, System::Int32 maxlen ) - { - if( tbox->Text->Length > maxlen ) - tbox->Text = ""; - - tbox->MaxLength = maxlen; - } + void changeMaxLength( System::Windows::Forms::TextBox ^tbox, System::Int32 maxlen ); // 日本語版への切り替え - void changeJapanese(void) - { - System::Int32 index; + void changeJapanese(void); - // 入力文字数制限を変更する - this->changeMaxLength( this->tboxCompany1, 25 ); - this->changeMaxLength( this->tboxDepart1, 25 ); - this->changeMaxLength( this->tboxPerson1, 15 ); - - // タイトルバー - this->stripFile->Text = gcnew System::String( "ファイル" ); - this->stripItemOpenRom->Text = gcnew System::String( "ROMデータを開く" ); - this->stripItemSaveTemp->Text = gcnew System::String( "提出情報を一時保存する" ); - this->stripItemLoadTemp->Text = gcnew System::String( "一時保存した提出情報を読み込む" ); - this->stripMaster->Text = gcnew System::String( "マスター" ); - this->stripItemSheet->Text = gcnew System::String( "提出確認書とマスターROMを作成する" ); - this->stripItemMasterRom->Text = gcnew System::String( "マスターROMのみを作成する" ); - - // 入力ファイル - this->labFile->Text = gcnew System::String( "ROMデータファイル" ); - - // タブ - this->tabRomInfo->Text = gcnew System::String( "ROM基本情報(確認用)" ); - this->tabTWLInfo->Text = gcnew System::String( "TWL拡張情報(確認用)" ); - this->tabRomEditInfo->Text = gcnew System::String( "ROM登録情報(編集可)" ); - this->tabSubmitInfo->Text = gcnew System::String( "提出情報(編集可)" ); - this->tabCompanyInfo->Text = gcnew System::String( "会社情報(編集可)" ); - this->tabErrorInfo->Text = gcnew System::String( "エラー情報(要修正)" ); - - // ガイド - this->tboxGuideRomInfo->Text = gcnew System::String( "このタブの情報は編集不可です。データに誤りがある場合にはROMデータの作成時の設定を見直してください。" ); - this->tboxGuideTWLInfo->Text = gcnew System::String( "このタブの情報は編集不可です。データに誤りがある場合にはROMデータの作成時の設定を見直してください。" ); - this->tboxGuideRomEditInfo->Text = gcnew System::String( "" ); - this->tboxGuideRomEditInfo->Text += "このタブの情報は提出確認書およびマスターROMの作成に必要です。編集してください。"; - this->tboxGuideRomEditInfo->Text += "\r\nこれらの情報はマスターROMの作成時にROMデータの中に登録されます。"; - this->tboxGuideSubmitInfo->Text = gcnew System::String( "このタブの情報は提出確認書の作成に必要です。入力してください。" ); - this->tboxGuideCompanyInfo->Text = gcnew System::String( "このタブの情報は提出確認書の作成に必要です。入力してください。" ); - this->tboxGuideErrorInfo->Text = gcnew System::String( "" ); - this->tboxGuideErrorInfo->Text += "このタブには読み込んだROMデータの問題と本プログラムでの入力ミスが列挙されます。"; - this->tboxGuideErrorInfo->Text += "\r\n赤文字の項目は、本プログラムで修正不可です。ROMデータ作成時の設定をご確認ください。"; - this->tboxGuideErrorInfo->Text += "\r\n青文字の項目は、本プログラムで修正できますが、修正がマスターROMに反映されます。"; - this->tboxGuideErrorInfo->Text += "\r\n黒文字の項目は、提出確認書にのみ反映され、マスターROMには反映されません。"; - - // SRL情報 - this->gboxSrl->Text = gcnew System::String( "ROMデータ情報" ); - this->labTitleName->Text = gcnew System::String( "ソフトタイトル" ); - this->labGameCode->Text = gcnew System::String( "イニシャルコード" ); - this->labMakerCode->Text = gcnew System::String( "メーカコード" ); - this->labPlatform->Text = gcnew System::String( "プラットフォーム" ); - this->labRomType->Text = gcnew System::String( "ROMタイプ設定" ); - this->labRomSize->Text = gcnew System::String( "ROM容量" ); - this->labRemasterVer->Text = gcnew System::String( "リマスターバージョン" ); - this->cboxRemasterVerE->Text = gcnew System::String( "E(準備版)" ); - this->labHeaderCRC->Text = gcnew System::String( "ヘッダCRC" ); - this->labRomCRC->Text = gcnew System::String( "全体のCRC" ); - index = this->combBackup->SelectedIndex; - - // バックアップメモリ - this->gboxProd->Text = gcnew System::String( "ROM生産情報(必ず入力してください)" ); - this->labBackup->Text = gcnew System::String( LANG_BACKUP_J ); - this->combBackup->Items->Clear(); - this->combBackup->Items->AddRange(gcnew cli::array< System::Object^ >(9) {L"4Kbit EEPROM", L"64Kbit EEPROM", L"512Kbit EEPROM", - L"256Kbit FRAM", L"2Mbit FLASH", L"4Mbit FLASH", L"8Mbit FLASH", L"なし", L"その他"}); - this->combBackup->SelectedIndex = index; - - // 提出情報 - this->labProductName->Text = gcnew System::String( LANG_PRODUCT_NAME_J ); - this->labProductCode->Text = gcnew System::String( LANG_PRODUCT_CODE_J ); - this->labReleaseDate->Text = gcnew System::String( LANG_RELEASE_DATE_J ); - this->labSubmiteDate->Text = gcnew System::String( LANG_SUBMIT_DATE_J ); - this->gboxSubmitWay->Text = gcnew System::String( LANG_SUBMIT_WAY_J ); - this->rSubmitPost->Text = gcnew System::String( LANG_SUBMIT_POST_J ); - this->rSubmitHand->Text = gcnew System::String( LANG_SUBMIT_HAND_J ); - this->gboxUsage->Text = gcnew System::String( LANG_USAGE_J ); - this->rUsageSale->Text = gcnew System::String( LANG_USAGE_SALE_J ); - this->rUsageSample->Text = gcnew System::String( LANG_USAGE_SAMPLE_J ); - this->rUsageDst->Text = gcnew System::String( LANG_USAGE_DST_J ); - this->rUsageOther->Text = gcnew System::String( LANG_USAGE_OTHER_J ); - this->labSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_J ); - this->labCapSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_CAP_J ); - this->gboxForeign->Text = gcnew System::String( LANG_F_J ); - this->labProductNameForeign->Text = gcnew System::String( LANG_PRODUCT_NAME_F_J ); - this->labProductCodeForeign->Text = gcnew System::String( LANG_PRODUCT_CODE_F_J ); - this->cboxReleaseForeign->Text = gcnew System::String( LANG_RELEASE_F_J ); - this->labMultiForeign1->Text = gcnew System::String( LANG_MULTI_F_J ); - this->labMultiForeign2->Text = gcnew System::String( LANG_MULTI_F_J ); - this->labCaption->Text = gcnew System::String( LANG_CAPTION_J ); - this->labProductNameLimit->Text = gcnew System::String( LANG_PRODUCT_LIMIT_J ); - this->labProductNameLimitForeign->Text = gcnew System::String( LANG_PRODUCT_LIMIT_J ); - - // 会社情報 - this->gboxPerson1->Text = gcnew System::String( LANG_PERSON_1_J ); - this->gboxPerson2->Text = gcnew System::String( LANG_PERSON_2_J ); - this->cboxIsInputPerson2->Text = gcnew System::String( LANG_INPUT_PERSON_2_J ); - this->labCompany1->Text = gcnew System::String( LANG_COMPANY_J ); - this->labDepart1->Text = gcnew System::String( LANG_DEPART_J ); - this->labPerson1->Text = gcnew System::String( LANG_PERSON_J ); - this->labCompany2->Text = gcnew System::String( LANG_COMPANY_J ); - this->labDepart2->Text = gcnew System::String( LANG_DEPART_J ); - this->labPerson2->Text = gcnew System::String( LANG_PERSON_J ); - this->labArbit1->Text = gcnew System::String( "(任意)" ); - this->labArbit2->Text = gcnew System::String( "(任意)" ); - this->labArbit3->Text = gcnew System::String( "(任意)" ); - this->labArbit4->Text = gcnew System::String( "(任意)" ); - // ふりがな情報を有効にする - this->tboxFurigana1->Enabled = true; - this->labFurigana1->Text = gcnew System::String( LANG_FURIGANA_J ); - this->tboxFurigana2->Enabled = true; - this->labFurigana2->Text = gcnew System::String( LANG_FURIGANA_J ); - // NTSC-UserIDも日本語版のみ - this->tboxNTSC1->Enabled = true; - this->tboxNTSC2->Enabled = true; - this->labNTSC1Pre->Text = gcnew System::String( LANG_NTSC_1_J ); - this->labNTSC1Sur->Text = gcnew System::String( LANG_NTSC_2_J ); - this->labNTSC2Pre->Text = gcnew System::String( LANG_NTSC_1_J ); - this->labNTSC2Sur->Text = gcnew System::String( LANG_NTSC_2_J ); - - // TWL仕様 - this->gboxTWLExInfo->Text = gcnew System::String( "TWL拡張情報" ); - this->labNormalRomOffset->Text = gcnew System::String( "TWLノーマル領域ROMオフセット" ); - this->labKeyTableRomOffset->Text = gcnew System::String( "TWL専用領域ROMオフセット" ); - this->cboxIsNormalJump->Text = gcnew System::String( "ノーマルジャンプ許可" ); - this->cboxIsTmpJump->Text = gcnew System::String( "tmpジャンプ許可" ); - this->cboxIsSubBanner->Text = gcnew System::String( "サブバナーファイル有効" ); - this->cboxIsWL->Text = gcnew System::String( "NTRホワイトリスト署名有効" ); - this->gboxAccess->Text = gcnew System::String( "アクセスコントロール情報" ); - this->cboxIsSD->Text = gcnew System::String( "SDカード" ); - this->cboxIsNAND->Text = gcnew System::String( "NANDフラッシュメモリ" ); - this->labIsGameCardOn->Text = gcnew System::String( "ゲームカード電源" ); - this->labAccessOther->Text = gcnew System::String( "その他" ); - this->gboxShared2Size->Text = gcnew System::String( "Shared2ファイルサイズ" ); - this->cboxIsShared2->Text = gcnew System::String( "Shared2ファイル使用" ); - this->labSDK->Text = gcnew System::String( "SDKバージョン" ); - this->labLib->Text = gcnew System::String( "使用ライブラリ" ); - this->labCaptionEx->Text = gcnew System::String( "特記事項" ); - - // SRL編集可能情報 - this->cboxIsEULA->Text = gcnew System::String( LANG_EULA_J ); - this->gboxIcon->Text = gcnew System::String( LANG_ICON_J ); - this->rIsWirelessIcon->Text = gcnew System::String( LANG_WIRELESS_ICON_J ); - this->rIsWiFiIcon->Text = gcnew System::String( LANG_WIFI_ICON_J ); - this->rIsNoIcon->Text = gcnew System::String( LANG_NO_ICON_J ); - this->labRegion->Text = gcnew System::String( LANG_REGION_J ); - - // リージョン - index = this->combRegion->SelectedIndex; - this->combRegion->Items->Clear(); - this->combRegion->Items->AddRange(gcnew cli::array< System::Object^ >(5) - {L"日本のみ", L"米国のみ", L"欧州のみ", L"豪州のみ", L"欧州および豪州"}); -#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - this->combRegion->Items->Add( gcnew System::String( L"全リージョン" ) ); -#endif - this->combRegion->SelectedIndex = index; - - // ペアレンタルコントロール - this->gboxParental->Text = gcnew System::String( LANG_REGION_PCTL_J ); - this->labParentalRating->Text = gcnew System::String( LANG_PCTL_RATING_J ); - this->labParentalEnable->Text = gcnew System::String( LANG_PCTL_ENABLE_J ); - this->labParentalForceEnable->Text = gcnew System::String( LANG_PCTL_ALWAYS_J ); - - index = this->combCERO->SelectedIndex; // いったんclearすると現在のindexに意味がなくなるので退避 - this->combCERO->Items->Clear(); - this->combCERO->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"A (全年齢)", L"B (12歳以上)", L"C (15歳以上)", L"D (17歳以上)", - L"Z (18歳以上)", L"未審査"}); - this->combCERO->SelectedIndex = index; - - index = this->combESRB->SelectedIndex; - this->combESRB->Items->Clear(); - this->combESRB->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"EC (3歳以上)", L"E (6歳以上)", L"E10+ (10歳以上)", L"T (13歳以上)", - L"M (17歳以上)", L"未審査"}); - this->combESRB->SelectedIndex = index; - - index = this->combUSK->SelectedIndex; - this->combUSK->Items->Clear(); - this->combUSK->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"年齢制限なし", L"6歳以上", L"12歳以上", L"16歳以上", L"青少年には不適切", - L"未審査"}); - this->combUSK->SelectedIndex = index; - - index = this->combPEGI->SelectedIndex; - this->combPEGI->Items->Clear(); - this->combPEGI->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"3歳以上", L"7歳以上", L"12歳以上", L"16歳以上", L"18歳以上", - L"未審査"}); - this->combPEGI->SelectedIndex = index; - - index = this->combPEGIPRT->SelectedIndex; - this->combPEGIPRT->Items->Clear(); - this->combPEGIPRT->Items->AddRange(gcnew cli::array< System::Object^ >(6) {L"4歳以上", L"6歳以上", L"12歳以上", L"16歳以上", L"18歳以上", - L"未審査"}); - this->combPEGIPRT->SelectedIndex = index; - - index = this->combPEGIBBFC->SelectedIndex; - this->combPEGIBBFC->Items->Clear(); - this->combPEGIBBFC->Items->AddRange(gcnew cli::array< System::Object^ >(9) {L"3歳以上", L"4歳以上推奨", L"7歳以上", L"8歳以上推奨", L"12歳以上", - L"15歳以上", L"16歳以上", L"18歳以上", L"未審査"}); - this->combPEGIBBFC->SelectedIndex = index; - - index = this->combOFLC->SelectedIndex; - this->combOFLC->Items->Clear(); - this->combOFLC->Items->AddRange(gcnew cli::array< System::Object^ >(5) {L"G", L"PG", L"M", L"MA15+", L"未審査"}); - this->combOFLC->SelectedIndex = index; - - // エラー情報 - this->labError->Text = gcnew System::String( "エラー(必ず修正してください。)" ); - this->colErrorName->HeaderText = gcnew System::String( "項目名" ); - this->colErrorBegin->HeaderText = gcnew System::String( "開始" ); - this->colErrorEnd->HeaderText = gcnew System::String( "終了" ); - this->colErrorCause->HeaderText = gcnew System::String( "要因" ); - - this->labWarn->Text = gcnew System::String( "警告(修正は必須ではありませんが情報に誤りがないかご確認ください。)" ); - this->colWarnName->HeaderText = gcnew System::String( "項目名" ); - this->colWarnBegin->HeaderText = gcnew System::String( "開始" ); - this->colWarnEnd->HeaderText = gcnew System::String( "終了" ); - this->colWarnCause->HeaderText = gcnew System::String( "要因" ); - - this->gboxErrorTiming->Text = gcnew System::String( "いつの情報を表示するか" ); - this->rErrorReading->Text = gcnew System::String( "ROMデータ読み込み時" ); - this->rErrorCurrent->Text = gcnew System::String( "現在の入力を反映" ); - - // 特殊な設定用のテキストボックスの表記を変更 - this->setSrlFormsCaptionEx(); - } - - private: // 英語版への切り替え - void changeEnglish(void) - { - System::Int32 index; - - // 入力文字数制限を変更する - this->changeMaxLength( this->tboxCompany1, 40 ); - this->changeMaxLength( this->tboxDepart1, 40 ); - this->changeMaxLength( this->tboxPerson1, 30 ); - - // タイトルバー - this->stripFile->Text = gcnew System::String( "File" ); - this->stripItemOpenRom->Text = gcnew System::String( "Open a ROM data file" ); - this->stripItemSaveTemp->Text = gcnew System::String( "Save a temporary info." ); - this->stripItemLoadTemp->Text = gcnew System::String( "Load a temporary info. saved previously" ); - this->stripMaster->Text = gcnew System::String( "Master" ); - this->stripItemSheet->Text = gcnew System::String( "Make a submission sheet and a master ROM data file" ); - this->stripItemMasterRom->Text = gcnew System::String( "Make a master ROM data file only" ); - - // 入力ファイル - this->labFile->Text = gcnew System::String( "ROM Data File" ); - - // タブ - this->tabRomInfo->Text = gcnew System::String( "ROM Info.(Read Only)" ); - this->tabTWLInfo->Text = gcnew System::String( "TWL Info.(Read Only)" ); - this->tabRomEditInfo->Text = gcnew System::String( "ROM Settings(Editable)" ); - this->tabSubmitInfo->Text = gcnew System::String( "Submission Info.(Editable)" ); - this->tabCompanyInfo->Text = gcnew System::String( "Company Info.(Editable)" ); - this->tabErrorInfo->Text = gcnew System::String( "Setting Error" ); - - // ガイド - this->tboxGuideRomInfo->Text = gcnew System::String( "This tab is for checking ROM data. When ROM data is illegal, please check settings of building ROM data" ); - this->tboxGuideTWLInfo->Text = gcnew System::String( "This tab is for checking ROM data. When ROM data is illegal, please check settings of building ROM data" ); - this->tboxGuideRomEditInfo->Text = gcnew System::String( "" ); - this->tboxGuideRomEditInfo->Text += "In making a master ROM data, these items will be registered in a master ROM data and a submission sheet."; - this->tboxGuideRomEditInfo->Text += "\r\nPlease edit certainly."; - this->tboxGuideSubmitInfo->Text = gcnew System::String( "These items are necessary for making a submission sheet. Please input." ); - this->tboxGuideCompanyInfo->Text = gcnew System::String( "These items are necessary for making a submission sheet. Please input." ); - this->tboxGuideErrorInfo->Text = gcnew System::String( "" ); - this->tboxGuideErrorInfo->Text += "This tab discribes errors in the ROM data file and edit mistakes."; - this->tboxGuideErrorInfo->Text += "\r\nItems highlighted by Red can't be modified by this program. Please modify build settings."; - this->tboxGuideErrorInfo->Text += "\r\nItems highlighted by Blue can be modified by this program and will register in a master ROM."; - this->tboxGuideErrorInfo->Text += "\r\nItems highlighted by Black are discribed in a submission sheet and aren't affect a master ROM."; - - // SRL情報 - this->gboxSrl->Text = gcnew System::String( "ROM Info." ); - this->labTitleName->Text = gcnew System::String( "Game Title" ); - this->labGameCode->Text = gcnew System::String( "Game Code" ); - this->labMakerCode->Text = gcnew System::String( "Maker Code" ); - this->labPlatform->Text = gcnew System::String( "Platform" ); - this->labRomType->Text = gcnew System::String( "ROM Type" ); - this->labRomSize->Text = gcnew System::String( "ROM Size" ); - this->labRemasterVer->Text = gcnew System::String( "Release Ver." ); - this->cboxRemasterVerE->Text = gcnew System::String( "E(Preliminary Ver.)" ); - this->labHeaderCRC->Text = gcnew System::String( "Header CRC" ); - this->labRomCRC->Text = gcnew System::String( "ROM CRC" ); - index = this->combBackup->SelectedIndex; - // バックアップメモリ - this->gboxProd->Text = gcnew System::String( "ROM Production Info." ); - this->labBackup->Text = gcnew System::String( LANG_BACKUP_E ); - this->combBackup->Items->Clear(); - this->combBackup->Items->AddRange(gcnew cli::array< System::Object^ >(9) {L"4Kbit EEPROM", L"64Kbit EEPROM", L"512Kbit EEPROM", - L"256Kbit FRAM", L"2Mbit FLASH", L"4Mbit FLASH", L"8Mbit FLASH", L"Nothing", L"Other"}); - this->combBackup->SelectedIndex = index; - - // 提出情報 - this->labProductName->Text = gcnew System::String( LANG_PRODUCT_NAME_E ); - this->labProductCode->Text = gcnew System::String( LANG_PRODUCT_CODE_E ); - this->labReleaseDate->Text = gcnew System::String( LANG_RELEASE_DATE_E ); - this->labSubmiteDate->Text = gcnew System::String( LANG_SUBMIT_DATE_E ); - this->gboxSubmitWay->Text = gcnew System::String( LANG_SUBMIT_WAY_E ); - this->rSubmitPost->Text = gcnew System::String( LANG_SUBMIT_POST_E ); - this->rSubmitHand->Text = gcnew System::String( LANG_SUBMIT_HAND_E ); - this->gboxUsage->Text = gcnew System::String( LANG_USAGE_E ); - this->rUsageSale->Text = gcnew System::String( LANG_USAGE_SALE_E ); - this->rUsageSample->Text = gcnew System::String( LANG_USAGE_SAMPLE_E ); - this->rUsageDst->Text = gcnew System::String( LANG_USAGE_DST_E ); - this->rUsageOther->Text = gcnew System::String( LANG_USAGE_OTHER_E ); - this->labSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_E ); - this->labCapSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_CAP_E ); - this->gboxForeign->Text = gcnew System::String( LANG_F_E ); - this->labProductNameForeign->Text = gcnew System::String( LANG_PRODUCT_NAME_F_E ); - this->labProductCodeForeign->Text = gcnew System::String( LANG_PRODUCT_CODE_F_E ); - this->cboxReleaseForeign->Text = gcnew System::String( LANG_RELEASE_F_E ); - this->labMultiForeign1->Text = gcnew System::String( LANG_MULTI_F_E ); - this->labMultiForeign2->Text = gcnew System::String( LANG_MULTI_F_E ); - this->labCaption->Text = gcnew System::String( LANG_CAPTION_E ); - this->labProductNameLimit->Text = gcnew System::String( LANG_PRODUCT_LIMIT_E ); - this->labProductNameLimitForeign->Text = gcnew System::String( LANG_PRODUCT_LIMIT_E ); - - // 会社情報 - this->gboxPerson1->Text = gcnew System::String( LANG_PERSON_1_E ); - this->gboxPerson2->Text = gcnew System::String( LANG_PERSON_2_E ); - this->cboxIsInputPerson2->Text = gcnew System::String( LANG_INPUT_PERSON_2_E ); - this->labCompany1->Text = gcnew System::String( LANG_COMPANY_E ); - this->labDepart1->Text = gcnew System::String( LANG_DEPART_E ); - this->labPerson1->Text = gcnew System::String( LANG_PERSON_E ); - this->labCompany2->Text = gcnew System::String( LANG_COMPANY_E ); - this->labDepart2->Text = gcnew System::String( LANG_DEPART_E ); - this->labPerson2->Text = gcnew System::String( LANG_PERSON_E ); - this->labArbit1->Text = gcnew System::String( "(Arbitrary)" ); - this->labArbit2->Text = gcnew System::String( "(Arbitrary)" ); - this->labArbit3->Text = gcnew System::String( "(Arbitrary)" ); - this->labArbit4->Text = gcnew System::String( "(Arbitrary)" ); - // ふりがな情報を削除 - this->tboxFurigana1->Clear(); - this->tboxFurigana1->Enabled = false; - this->labFurigana1->Text = gcnew System::String( LANG_FURIGANA_E ); - this->tboxFurigana2->Clear(); - this->tboxFurigana2->Enabled = false; - this->labFurigana2->Text = gcnew System::String( LANG_FURIGANA_E ); - this->tboxNTSC1->Enabled = false; - this->tboxNTSC1->Text = gcnew System::String(""); - this->tboxNTSC2->Enabled = false; - this->tboxNTSC2->Text = gcnew System::String(""); - this->labNTSC1Pre->Text = gcnew System::String( LANG_NTSC_1_E ); - this->labNTSC1Sur->Text = gcnew System::String( LANG_NTSC_2_E ); - this->labNTSC2Pre->Text = gcnew System::String( LANG_NTSC_1_E ); - this->labNTSC2Sur->Text = gcnew System::String( LANG_NTSC_2_E ); - - // TWL仕様 - this->gboxTWLExInfo->Text = gcnew System::String( "TWL Extended Info" ); - this->labNormalRomOffset->Text = gcnew System::String( "TWL Normal Area ROM Offset" ); - this->labKeyTableRomOffset->Text = gcnew System::String( "TWL Secure Area ROM Offset" ); - this->cboxIsNormalJump->Text = gcnew System::String( "Enable Normal App. Jump" ); - this->cboxIsTmpJump->Text = gcnew System::String( "Enable Temp. App. Jump" ); - this->cboxIsSubBanner->Text = gcnew System::String( "Enable SubBanner File" ); - this->cboxIsWL->Text = gcnew System::String( "Enable NTR WhiteList Signature" ); - this->gboxAccess->Text = gcnew System::String( "Access Control" ); - this->cboxIsSD->Text = gcnew System::String( "SD Card" ); - this->cboxIsNAND->Text = gcnew System::String( "NAND Flash Memory" ); - this->labIsGameCardOn->Text = gcnew System::String( "Card Power" ); - this->labAccessOther->Text = gcnew System::String( "Others" ); - this->gboxShared2Size->Text = gcnew System::String( "Size of Shared2 Files" ); - this->cboxIsShared2->Text = gcnew System::String( "Use Shared2 Files" ); - this->labSDK->Text = gcnew System::String( "SDK Ver." ); - this->labLib->Text = gcnew System::String( "Libraries used by the program" ); - this->labCaptionEx->Text = gcnew System::String( "Special Note" ); - - // SRL編集可能情報 - this->cboxIsEULA->Text = gcnew System::String( LANG_EULA_E ); - this->gboxIcon->Text = gcnew System::String( LANG_ICON_E ); - this->rIsWirelessIcon->Text = gcnew System::String( LANG_WIRELESS_ICON_E ); - this->rIsWiFiIcon->Text = gcnew System::String( LANG_WIFI_ICON_E ); - this->rIsNoIcon->Text = gcnew System::String( LANG_NO_ICON_E ); - this->labRegion->Text = gcnew System::String( LANG_REGION_E ); - - // リージョン - index = this->combRegion->SelectedIndex; - this->combRegion->Items->Clear(); - this->combRegion->Items->AddRange(gcnew cli::array< System::Object^ >(5) - {L"Japan Only", L"USA Only", L"Europe Only", L"Australia Only", L"Europe and Australia"}); -#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - this->combRegion->Items->Add( gcnew System::String( L"All Region" ) ); -#endif - this->combRegion->SelectedIndex = index; - - // ペアレンタルコントロール - this->gboxParental->Text = gcnew System::String( LANG_REGION_PCTL_E ); - this->labParentalRating->Text = gcnew System::String( LANG_PCTL_RATING_E ); - this->labParentalEnable->Text = gcnew System::String( LANG_PCTL_ENABLE_E ); - this->labParentalForceEnable->Text = gcnew System::String( LANG_PCTL_ALWAYS_E ); - - index = this->combCERO->SelectedIndex; // いったんclearすると現在のindexに意味がなくなるので退避 - this->combCERO->Items->Clear(); - this->combCERO->Items->AddRange(gcnew cli::array< System::Object^ >(6) - { L"A (All ages)", L"B (aged 12 or older)", L"C (aged 15 or older)", L"D (aged 17 or older)", L"Z (aged 18 or older)", L"Unexamined"}); - this->combCERO->SelectedIndex = index; - - index = this->combESRB->SelectedIndex; - this->combESRB->Items->Clear(); - this->combESRB->Items->AddRange(gcnew cli::array< System::Object^ >(6) - {L"EC (aged 3 or older)", L"E (aged 6 or older)", L"E10+ (aged 10 or older)", L"T (aged 13 or older)", L"M (aged 17 or older)", L"Unexamined"}); - this->combESRB->SelectedIndex = index; - - index = this->combUSK->SelectedIndex; - this->combUSK->Items->Clear(); - this->combUSK->Items->AddRange(gcnew cli::array< System::Object^ >(6) - {L"All ages", L"aged 6 or older", L"aged 12 or older", L"aged 16 or older", L"Inadequent for young", L"Unexamined"}); - this->combUSK->SelectedIndex = index; - - index = this->combPEGI->SelectedIndex; - this->combPEGI->Items->Clear(); - this->combPEGI->Items->AddRange(gcnew cli::array< System::Object^ >(6) - {L"aged 3 or older", L"aged 7 or older", L"aged 12 or older", L"aged 16 or older", L"aged 18 or older", L"Unexamined"}); - this->combPEGI->SelectedIndex = index; - - index = this->combPEGIPRT->SelectedIndex; - this->combPEGIPRT->Items->Clear(); - this->combPEGIPRT->Items->AddRange(gcnew cli::array< System::Object^ >(6) - {L"aged 4 or older", L"aged 6 or older", L"aged 12 or older", L"aged 16 or older", L"aged 18 or older", L"Unexamined"}); - this->combPEGIPRT->SelectedIndex = index; - - index = this->combPEGIBBFC->SelectedIndex; - this->combPEGIBBFC->Items->Clear(); - this->combPEGIBBFC->Items->AddRange(gcnew cli::array< System::Object^ >(9) - {L"aged 3 or older", L"aged 4 or older recommended", L"aged 7 or older", L"aged 8 or older recommended", - L"aged 12 or older", L"aged 15 or older", L"aged 16 or older", L"aged 18 or older", L"Unexamined"}); - this->combPEGIBBFC->SelectedIndex = index; - - index = this->combOFLC->SelectedIndex; - this->combOFLC->Items->Clear(); - this->combOFLC->Items->AddRange(gcnew cli::array< System::Object^ >(5) {L"G", L"PG", L"M", L"MA15+", L"Unexamined"}); - this->combOFLC->SelectedIndex = index; - - // エラー情報 - this->labError->Text = gcnew System::String( "Error Information(Modification is necessary.)" ); - this->colErrorName->HeaderText = gcnew System::String( "Name" ); - this->colErrorBegin->HeaderText = gcnew System::String( "Begin" ); - this->colErrorEnd->HeaderText = gcnew System::String( "End" ); - this->colErrorCause->HeaderText = gcnew System::String( "Reason" ); - - this->labWarn->Text = gcnew System::String( "Warning(Modification is not necessary. Please check validity of these information.)" ); - this->colWarnName->HeaderText = gcnew System::String( "Name" ); - this->colWarnBegin->HeaderText = gcnew System::String( "Begin" ); - this->colWarnEnd->HeaderText = gcnew System::String( "End" ); - this->colWarnCause->HeaderText = gcnew System::String( "Reason" ); - - this->gboxErrorTiming->Text = gcnew System::String( "Error Of Timing" ); - this->rErrorReading->Text = gcnew System::String( "When ROM data was read" ); - this->rErrorCurrent->Text = gcnew System::String( "In current settings" ); - - // 特殊な設定用のテキストボックスの表記を変更 - this->setSrlFormsCaptionEx(); - } + void changeEnglish(void); // -------------------------------------------------------- // エラー情報の登録 // -------------------------------------------------------- // 読み込み時エラーの登録 - public: - void setGridError( void ) - { - this->gridError->Rows->Clear(); - if( this->hSrl->hErrorList != nullptr ) - { - for each( RCMrcError ^err in this->hSrl->hErrorList ) - { - this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); - this->colorGridError( err ); - } - } - } - - void setGridWarn( void ) - { - this->gridWarn->Rows->Clear(); - if( this->hSrl->hWarnList != nullptr ) - { - for each( RCMrcError ^err in this->hSrl->hWarnList ) - { - this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); - this->colorGridWarn( err ); - } - } - } + void setGridError( void ); + void setGridWarn( void ); // 読み込み時に検出した修正可能エラーに現在の入力を反映 - public: - void overloadGridError( void ) - { - this->gridError->Rows->Clear(); - if( this->hSrl->hErrorList != nullptr ) - { - for each( RCMrcError ^err in this->hSrl->hErrorList ) - { - if( !err->EnableModify ) // 修正可能な情報は表示しない - { - this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); - this->colorGridError( err ); - } - } - } - if( this->hErrorList != nullptr ) - { - for each( RCMrcError ^err in this->hErrorList ) - { - this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); - this->colorGridError( err ); - } - } - } - void overloadGridWarn( void ) - { - this->gridWarn->Rows->Clear(); - if( this->hSrl->hWarnList != nullptr ) - { - for each( RCMrcError ^err in this->hSrl->hWarnList ) - { - if( !err->EnableModify ) - { - this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); - this->colorGridWarn( err ); - } - } - } - if( this->hWarnList != nullptr ) - { - for each( RCMrcError ^err in this->hWarnList ) - { - this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); - this->colorGridWarn( err ); - } - } - } + void overloadGridError( void ); + void overloadGridWarn( void ); // セルの色を変える - public: - void colorGridError( RCMrcError ^err ) - { - if( err->AffectRom && !err->EnableModify ) // SRLに関係ありで修正不可 - { - System::Int32 last = this->gridError->Rows->Count - 2; // 追加直後の行 - this->gridError->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Red; - } - else if( err->AffectRom && err->EnableModify ) // SRLに関係ありで修正可 - { - System::Int32 last = this->gridError->Rows->Count - 2; - this->gridError->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Blue; - } - } - void colorGridWarn( RCMrcError ^err ) - { - if( err->AffectRom && !err->EnableModify ) - { - System::Int32 last = this->gridWarn->Rows->Count - 2; - this->gridWarn->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Red; - } - else if( err->AffectRom && err->EnableModify ) - { - System::Int32 last = this->gridWarn->Rows->Count - 2; - this->gridWarn->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Blue; - } - } + void colorGridError( RCMrcError ^err ); + void colorGridWarn( RCMrcError ^err ); // まとめて更新 - public: - void updateGrid(void) - { - if( this->rErrorReading->Checked == true ) - { - this->setGridError(); - this->setGridWarn(); - } - else - { - if( !System::String::IsNullOrEmpty(this->tboxFile->Text) ) - { - this->hErrorList->Clear(); - this->hWarnList->Clear(); - this->checkSrlForms(); - this->checkDeliverableForms(); - this->overloadGridError(); - this->overloadGridWarn(); - } - } - } + void updateGrid(void); - ///////////////////////////////////////////// - // フォーム操作メソッド - ///////////////////////////////////////////// + // ---------------------------------------------- + // エラー処理 + // ---------------------------------------------- - // ファイルパス表示用テキストボックス - private: - // ドラッグされてまだマウスのボタンが離されていないとき - System::Void tboxFile_DragEnter(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) - { - if( e->Data->GetDataPresent( DataFormats::FileDrop ) ) - { - e->Effect = DragDropEffects::All; - } - } - // ドラッグされたあとマウスのボタンが離されたとき - System::Void tboxFile_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) - { - array ^files = dynamic_cast< array ^>(e->Data->GetData( DataFormats::FileDrop ) ); - String ^filename = files[0]; + // SRLには関係しない書類上のエラーをチェック + System::Boolean isValidOnlyDeliverable(void); - if( System::IO::File::Exists(filename) == false ) - { - this->errMsg( "ROMデータファイルが存在しませんので開くことができません。", - "The ROM data file is not found. Therefore the file can not be opened." ); - return; - } - this->loadSrl( filename ); // ドラッグアンドドロップの時点でボタンを押さなくてもファイルを開く - this->tboxFile->Text = filename; - //this->sucMsg( "ROMデータファイルのオープンに成功しました。", "The ROM data file is opened successfully." ); - } + // SRLのバイナリに影響する項目にエラーがあるかチェック + System::Boolean isValidAffectRom(void); - // チェックボタンを押したときに他のフォームを有効にする - private: - System::Void cboxIsInputPerson2_CheckedChanged(System::Object^ sender, System::EventArgs^ e) - { - this->gboxPerson2->Enabled = this->cboxIsInputPerson2->Checked; - if( this->cboxIsInputPerson2->Checked == true ) - { - if( (this->tboxCompany1->Text != nullptr) && !(this->tboxCompany1->Text->Equals("")) ) - { - this->tboxCompany2->Text = gcnew System::String( this->tboxCompany1->Text ); - } - if( (this->tboxDepart1->Text != nullptr) && !(this->tboxDepart1->Text->Equals("")) ) - { - this->tboxDepart2->Text = gcnew System::String( this->tboxDepart1->Text ); - } - } - else - { - this->tboxCompany2->Clear(); - this->tboxDepart2->Clear(); - this->tboxPerson2->Clear(); - this->tboxFurigana2->Clear(); - this->tboxTel2->Clear(); - this->tboxFax2->Clear(); - this->tboxMail2->Clear(); - this->tboxNTSC2->Clear(); - } - } - private: - System::Void rUsageOther_CheckedChanged(System::Object^ sender, System::EventArgs^ e) - { - this->tboxUsageOther->Enabled = this->rUsageOther->Checked; - if( this->rUsageOther->Checked == false ) - { - this->tboxUsageOther->Clear(); - } - } - private: - System::Void cboxRemasterVerE_CheckedChanged(System::Object^ sender, System::EventArgs^ e) - { - //this->numRemasterVer->Enabled = !(this->cboxRemasterVerE->Checked); - //if( this->cboxRemasterVerE->Checked == false ) - //{ - // this->numRemasterVer->Value = 0; - //} - } - private: - System::Void combBackup_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) - { - if( this->combBackup->SelectedIndex == (this->combBackup->Items->Count - 1) ) - { - this->tboxBackupOther->Enabled = true; - } - else - { - this->tboxBackupOther->Enabled = false; - this->tboxBackupOther->Clear(); - } - } - private: - // ペアレンタルコントロール情報をクリアする - void clearParental( System::Windows::Forms::ComboBox ^comb, - System::Windows::Forms::CheckBox ^enable, - System::Windows::Forms::CheckBox ^rp ) - { - comb->SelectedIndex = comb->Items->Count - 1; // 「未審査」にする - enable->Checked = false; - rp->Checked = false; - } - private: - // ペアレンタルコントロール情報を編集できるようにする - void enableParental( System::Windows::Forms::ComboBox ^comb, - System::Windows::Forms::CheckBox ^enable, - System::Windows::Forms::CheckBox ^rp, - System::Windows::Forms::Label ^lab1, - System::Windows::Forms::Label ^lab2 ) - { - comb->Enabled = true; - enable->Enabled = true; - rp->Enabled = true; - comb->Visible = true; - enable->Visible = true; - rp->Visible = true; - lab1->Visible = true; - if( lab2 != nullptr ) - { - lab2->Visible = true; - } - } - // ペアレンタルコントロール情報を編集できなくする - void disableParental( System::Windows::Forms::ComboBox ^comb, - System::Windows::Forms::CheckBox ^enable, - System::Windows::Forms::CheckBox ^rp, - System::Windows::Forms::Label ^lab1, - System::Windows::Forms::Label ^lab2 ) - { - this->clearParental( comb, enable, rp ); - comb->Enabled = false; - enable->Enabled = false; - rp->Enabled = false; - comb->Visible = false; - enable->Visible = false; - rp->Visible = false; - lab1->Visible = false; - if( lab2 != nullptr ) - { - lab2->Visible = false; - } - } - private: - System::Void combRegion_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) - { - this->maskParentalForms(); - } - - private: - System::Void cboxReleaseForeign_CheckedChanged(System::Object^ sender, System::EventArgs^ e) - { - this->tboxProductNameForeign->Enabled = this->cboxReleaseForeign->Checked; - this->tboxProductCode1Foreign->Enabled = this->cboxReleaseForeign->Checked; - this->tboxProductCode2Foreign1->Enabled = this->cboxReleaseForeign->Checked; - this->tboxProductCode2Foreign2->Enabled = this->cboxReleaseForeign->Checked; - this->tboxProductCode2Foreign3->Enabled = this->cboxReleaseForeign->Checked; - if( this->cboxReleaseForeign->Checked == false ) - { - this->tboxProductNameForeign->Clear(); - this->tboxProductCode1Foreign->Clear(); - this->tboxProductCode2Foreign1->Clear(); - this->tboxProductCode2Foreign2->Clear(); - this->tboxProductCode2Foreign3->Clear(); - } - } + // SRLのバイナリに影響する項目の中で修正可能なエラーだけをチェック + System::Boolean isValidAffectRomModified(void); ///////////////////////////////////////////// // タイトルバー操作メソッド @@ -6347,6 +3904,120 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->loadTmp( filename ); } //stripItemLoadTemp_Click() + ///////////////////////////////////////////// + // フォーム操作メソッド + ///////////////////////////////////////////// + + // ファイルパス表示用テキストボックス + private: + // ドラッグされてまだマウスのボタンが離されていないとき + System::Void tboxFile_DragEnter(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) + { + if( e->Data->GetDataPresent( DataFormats::FileDrop ) ) + { + e->Effect = DragDropEffects::All; + } + } + // ドラッグされたあとマウスのボタンが離されたとき + System::Void tboxFile_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) + { + array ^files = dynamic_cast< array ^>(e->Data->GetData( DataFormats::FileDrop ) ); + String ^filename = files[0]; + + if( System::IO::File::Exists(filename) == false ) + { + this->errMsg( "ROMデータファイルが存在しませんので開くことができません。", + "The ROM data file is not found. Therefore the file can not be opened." ); + return; + } + this->loadSrl( filename ); // ドラッグアンドドロップの時点でボタンを押さなくてもファイルを開く + this->tboxFile->Text = filename; + //this->sucMsg( "ROMデータファイルのオープンに成功しました。", "The ROM data file is opened successfully." ); + } + + // チェックボタンを押したときに他のフォームを有効にする + private: + System::Void cboxIsInputPerson2_CheckedChanged(System::Object^ sender, System::EventArgs^ e) + { + this->gboxPerson2->Enabled = this->cboxIsInputPerson2->Checked; + if( this->cboxIsInputPerson2->Checked == true ) + { + if( (this->tboxCompany1->Text != nullptr) && !(this->tboxCompany1->Text->Equals("")) ) + { + this->tboxCompany2->Text = gcnew System::String( this->tboxCompany1->Text ); + } + if( (this->tboxDepart1->Text != nullptr) && !(this->tboxDepart1->Text->Equals("")) ) + { + this->tboxDepart2->Text = gcnew System::String( this->tboxDepart1->Text ); + } + } + else + { + this->tboxCompany2->Clear(); + this->tboxDepart2->Clear(); + this->tboxPerson2->Clear(); + this->tboxFurigana2->Clear(); + this->tboxTel2->Clear(); + this->tboxFax2->Clear(); + this->tboxMail2->Clear(); + this->tboxNTSC2->Clear(); + } + } + private: + System::Void rUsageOther_CheckedChanged(System::Object^ sender, System::EventArgs^ e) + { + this->tboxUsageOther->Enabled = this->rUsageOther->Checked; + if( this->rUsageOther->Checked == false ) + { + this->tboxUsageOther->Clear(); + } + } + private: + System::Void cboxRemasterVerE_CheckedChanged(System::Object^ sender, System::EventArgs^ e) + { + //this->numRemasterVer->Enabled = !(this->cboxRemasterVerE->Checked); + //if( this->cboxRemasterVerE->Checked == false ) + //{ + // this->numRemasterVer->Value = 0; + //} + } + private: + System::Void combBackup_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) + { + if( this->combBackup->SelectedIndex == (this->combBackup->Items->Count - 1) ) + { + this->tboxBackupOther->Enabled = true; + } + else + { + this->tboxBackupOther->Enabled = false; + this->tboxBackupOther->Clear(); + } + } + private: + System::Void combRegion_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) + { + this->maskParentalForms(); + } + + private: + System::Void cboxReleaseForeign_CheckedChanged(System::Object^ sender, System::EventArgs^ e) + { + this->tboxProductNameForeign->Enabled = this->cboxReleaseForeign->Checked; + this->tboxProductCode1Foreign->Enabled = this->cboxReleaseForeign->Checked; + this->tboxProductCode2Foreign1->Enabled = this->cboxReleaseForeign->Checked; + this->tboxProductCode2Foreign2->Enabled = this->cboxReleaseForeign->Checked; + this->tboxProductCode2Foreign3->Enabled = this->cboxReleaseForeign->Checked; + if( this->cboxReleaseForeign->Checked == false ) + { + this->tboxProductNameForeign->Clear(); + this->tboxProductCode1Foreign->Clear(); + this->tboxProductCode2Foreign1->Clear(); + this->tboxProductCode2Foreign2->Clear(); + this->tboxProductCode2Foreign3->Clear(); + } + } + private: System::Void rErrorReading_CheckedChanged(System::Object^ sender, System::EventArgs^ e) { @@ -6393,7 +4064,6 @@ private: System::Windows::Forms::RadioButton^ rIsNoIcon; this->setParentalForms(); // ペアレンタルコントロール関連 } - }; // enf of ref class Form1 } // end of namespace MasterEditorTWL diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.resX b/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.resX index 1f0e93fa..302e29f7 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.resX +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.resX @@ -126,6 +126,24 @@ True + + True + + + True + + + True + + + True + + + True + + + True + True diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form_deliv.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_deliv.cpp new file mode 100644 index 00000000..eb9976fb --- /dev/null +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_deliv.cpp @@ -0,0 +1,251 @@ +// ---------------------------------------------- +// マスタ書類情報(SRL影響なし)をフォームから取得 +// ---------------------------------------------- + +#include "stdafx.h" +#include +#include "common.h" +#include "srl.h" +#include "deliverable.h" +#include "crc_whole.h" +#include "utility.h" +#include "lang.h" +#include "FormError.h" +#include "Form1.h" + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +using namespace MasterEditorTWL; + +void Form1::setDeliverableProperties(void) +{ + // 提出情報 + this->hDeliv->hProductName = this->tboxProductName->Text; + this->hDeliv->hProductCode1 = this->tboxProductCode1->Text; + this->hDeliv->hProductCode2 = this->tboxProductCode2->Text; + this->hDeliv->hReleaseForeign = gcnew System::Boolean( this->cboxReleaseForeign->Checked ); + if( this->cboxReleaseForeign->Checked == true ) + { + this->hDeliv->hProductNameForeign = this->tboxProductNameForeign->Text; + this->hDeliv->hProductCode1Foreign = this->tboxProductCode1Foreign->Text; + this->hDeliv->hProductCode2Foreign = gcnew System::String(""); + this->hDeliv->hProductCode2Foreign = this->tboxProductCode2Foreign1->Text; + if( !System::String::IsNullOrEmpty( this->tboxProductCode2Foreign2->Text ) ) + { + this->hDeliv->hProductCode2Foreign += ("/" + this->tboxProductCode2Foreign2->Text); + } + if( !System::String::IsNullOrEmpty( this->tboxProductCode2Foreign2->Text ) ) + { + this->hDeliv->hProductCode2Foreign += ("/" + this->tboxProductCode2Foreign3->Text); + } + } + else + { + this->hDeliv->hProductNameForeign = nullptr; + this->hDeliv->hProductCode1Foreign = nullptr; + this->hDeliv->hProductCode2Foreign = nullptr; + } + this->hDeliv->hReleaseYear = gcnew System::Int32( this->dateRelease->Value.Year ); + this->hDeliv->hReleaseMonth = gcnew System::Int32( this->dateRelease->Value.Month ); + this->hDeliv->hReleaseDay = gcnew System::Int32( this->dateRelease->Value.Day ); + this->hDeliv->hSubmitYear = gcnew System::Int32( this->dateSubmit->Value.Year ); + this->hDeliv->hSubmitMonth = gcnew System::Int32( this->dateSubmit->Value.Month ); + this->hDeliv->hSubmitDay = gcnew System::Int32( this->dateSubmit->Value.Day ); + this->hDeliv->hSubmitVersion = gcnew System::Int32( System::Decimal::ToInt32( this->numSubmitVersion->Value ) ); + // SDK + this->hDeliv->hSDK = nullptr; + if( this->hSrl->hSDKList ) + { + for each( RCSDKVersion ^sdk in this->hSrl->hSDKList ) // 書類には ARM9 static のバージョン情報を記入する + { + if( sdk->IsStatic ) + this->hDeliv->hSDK = sdk->Version; + } + } + if( this->hDeliv->hSDK == nullptr ) + { + this->hDeliv->hSDK = gcnew System::String( "Undefined" ); + } + // 提出方法 + if( this->rSubmitPost->Checked == true ) + { + this->hDeliv->hSubmitWay = this->rSubmitPost->Text; + } + else + { + this->hDeliv->hSubmitWay = this->rSubmitHand->Text; + } + // 用途 + if( this->rUsageSale->Checked == true ) + { + this->hDeliv->hUsage = this->rUsageSale->Text; + this->hDeliv->hUsageOther = nullptr; + } + else if( this->rUsageSample->Checked == true ) + { + this->hDeliv->hUsage = this->rUsageSample->Text; + this->hDeliv->hUsageOther = nullptr; + } + else if( this->rUsageDst->Checked == true ) + { + this->hDeliv->hUsage = this->rUsageDst->Text; + this->hDeliv->hUsageOther = nullptr; + } + else if( this->rUsageOther->Checked == true ) + { + this->hDeliv->hUsage = this->rUsageOther->Text; + this->hDeliv->hUsageOther = this->tboxUsageOther->Text; + } + + // 会社情報 + this->hDeliv->hCompany1 = this->tboxCompany1->Text + " " + this->tboxDepart1->Text; + this->hDeliv->hPerson1 = this->tboxPerson1->Text; + if( this->stripItemJapanese->Checked == true ) + { + this->hDeliv->hFurigana1 = this->tboxFurigana1->Text; + } + else + { + this->hDeliv->hFurigana1 = nullptr; + } + this->hDeliv->hTel1 = this->tboxTel1->Text; + this->hDeliv->hFax1 = this->tboxFax1->Text; + this->hDeliv->hMail1 = this->tboxMail1->Text; + this->hDeliv->hNTSC1 = this->tboxNTSC1->Text; + if( this->cboxIsInputPerson2->Checked == true ) + { + this->hDeliv->hCompany2 = this->tboxCompany2->Text + " " + this->tboxDepart2->Text; + this->hDeliv->hPerson2 = this->tboxPerson2->Text; + if( this->stripItemJapanese->Checked == true ) + { + this->hDeliv->hFurigana2 = this->tboxFurigana2->Text; + } + else + { + this->hDeliv->hFurigana2 = nullptr; + } + this->hDeliv->hTel2 = this->tboxTel2->Text; + this->hDeliv->hFax2 = this->tboxFax2->Text; + this->hDeliv->hMail2 = this->tboxMail2->Text; + this->hDeliv->hNTSC2 = this->tboxNTSC2->Text; + } + else + { + this->hDeliv->hCompany2 = nullptr; + this->hDeliv->hPerson2 = nullptr; + this->hDeliv->hFurigana2 = nullptr; + this->hDeliv->hTel2 = nullptr; + this->hDeliv->hFax2 = nullptr; + this->hDeliv->hMail2 = nullptr; + this->hDeliv->hNTSC2 = nullptr; + } + + // 備考 + System::String ^tmp = this->tboxCaption->Text->Replace( " ", "" ); + if( this->tboxCaption->Text->Equals("") || tmp->Equals("") ) // スペースのみの文字列は含めない + { + this->hDeliv->hCaption = nullptr; + } + else + { + this->hDeliv->hCaption = this->tboxCaption->Text; + } + // 備考欄に特殊な設定を追記 + tmp = this->tboxCaptionEx->Text->Replace( " ", "" ); + if( !(this->tboxCaptionEx->Text->Equals("")) && !(tmp->Equals("")) ) + { + this->hDeliv->hCaption += ("(" + this->tboxCaptionEx->Text + ")"); + } + + // 一部のROM情報を登録 + if( this->combBackup->SelectedIndex != (this->combBackup->Items->Count - 1) ) + { + if( this->combBackup->SelectedIndex > 0 ) + { + this->hDeliv->hBackupMemory = this->combBackup->SelectedItem->ToString(); + } + else + { + this->hDeliv->hBackupMemory = gcnew System::String(""); + } + } + else + { + this->hDeliv->hBackupMemory = this->tboxBackupOther->Text; + } +} + +// ---------------------------------------------- +// マスタ書類情報(SRL影響なし)のフォームチェック +// ---------------------------------------------- + +System::Boolean Form1::checkDeliverableForms(void) +{ + // 不正な場合はダイアログで注意してreturn + + // 提出情報 + this->checkTextForm( this->tboxProductName->Text, LANG_PRODUCT_NAME_J, LANG_PRODUCT_NAME_E, false ); // SRL作成には問題のないエラー + this->checkTextForm( this->tboxProductCode1->Text, LANG_PRODUCT_CODE_J, LANG_PRODUCT_CODE_E, false ); + this->checkTextForm( this->tboxProductCode2->Text, LANG_PRODUCT_CODE_J, LANG_PRODUCT_CODE_E, false ); + if( this->cboxReleaseForeign->Checked == true ) + { + this->checkTextForm( this->tboxProductNameForeign->Text, LANG_PRODUCT_NAME_F_J, LANG_PRODUCT_NAME_F_E, false ); + this->checkTextForm( this->tboxProductCode1Foreign->Text, LANG_PRODUCT_CODE_F_J, LANG_PRODUCT_CODE_F_E, false ); + this->checkTextForm( this->tboxProductCode2Foreign1->Text, LANG_PRODUCT_CODE_F_J, LANG_PRODUCT_CODE_F_E, false ); + } + if( this->rUsageOther->Checked == true ) + { + this->checkTextForm( this->tboxUsageOther->Text, LANG_USAGE_J, LANG_USAGE_E, false ); + } + + // 会社情報 + this->checkTextForm( this->tboxPerson1->Text, LANG_PERSON_J, LANG_PERSON_E, false ); + this->checkTextForm( this->tboxCompany1->Text, LANG_COMPANY_J, LANG_COMPANY_E, false ); + this->checkTextForm( this->tboxDepart1->Text, LANG_DEPART_J, LANG_DEPART_E, false ); + if( this->stripItemJapanese->Checked == true ) + { + this->checkTextForm( this->tboxFurigana1->Text, LANG_FURIGANA_J, LANG_FURIGANA_J, false ); + } + this->checkTextForm( this->tboxTel1->Text, LANG_TEL_J, LANG_TEL_E, false ); + //this->checkTextForm( this->tboxFax1->Text, LANG_FAX_J, LANG_FAX_E, false ); + this->checkTextForm( this->tboxMail1->Text, LANG_MAIL_J, LANG_MAIL_E, false ); + //if( this->stripItemJapanese->Checked == true ) + //{ + // this->checkTextForm( this->tboxNTSC1->Text, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, false ); + //} + + if( this->cboxIsInputPerson2->Checked == true ) + { + this->checkTextForm( this->tboxPerson2->Text, LANG_PERSON_J, LANG_PERSON_E, false ); + this->checkTextForm( this->tboxCompany2->Text, LANG_COMPANY_J, LANG_COMPANY_E, false ); + this->checkTextForm( this->tboxDepart2->Text, LANG_DEPART_J, LANG_DEPART_E, false ); + if( this->stripItemJapanese->Checked == true ) + { + this->checkTextForm( this->tboxFurigana2->Text, LANG_FURIGANA_J, LANG_FURIGANA_J, false ); + } + this->checkTextForm( this->tboxTel2->Text, LANG_TEL_J, LANG_TEL_E, false ); + //this->checkTextForm( this->tboxFax2->Text, LANG_FAX_J, LANG_FAX_E, false ); + this->checkTextForm( this->tboxMail2->Text, LANG_MAIL_J, LANG_MAIL_E, false ); + //if( this->stripItemJapanese->Checked == true ) + //{ + // this->checkTextForm( this->tboxNTSC2->Text, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, LANG_NTSC_1_J + " " + LANG_NTSC_2_J, false ); + //} + } + + // 一部のROM情報(SRLバイナリに反映されない情報)をここでチェックする + this->checkBoxIndex( this->combBackup, LANG_BACKUP_J, LANG_BACKUP_E, false ); + if( this->combBackup->SelectedIndex == (this->combBackup->Items->Count - 1) ) + { + this->checkTextForm( this->tboxBackupOther->Text, LANG_BACKUP_J, LANG_BACKUP_E, false ); + } + + // ひととおりエラー登録をした後で + // 書類上のエラー(SRLバイナリには影響しない)が存在するかチェック + return this->isValidOnlyDeliverable(); +} + +// end of file \ No newline at end of file diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form_file.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_file.cpp new file mode 100644 index 00000000..71f64780 --- /dev/null +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_file.cpp @@ -0,0 +1,221 @@ +// ---------------------------------------------- +// ファイルのR/W +// ---------------------------------------------- + +#include "stdafx.h" +#include +#include "common.h" +#include "srl.h" +#include "deliverable.h" +#include "crc_whole.h" +#include "utility.h" +#include "lang.h" +#include "FormError.h" +#include "Form1.h" + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +using namespace MasterEditorTWL; + +// 設定ファイルの読み込み +void Form1::loadInit(void) +{ + System::Xml::XmlDocument ^doc = gcnew System::Xml::XmlDocument(); + + // xmlファイルの読み込み + try + { + doc->Load( "../resource/ini.xml" ); + } + catch( System::IO::FileNotFoundException ^s ) + { + (void)s; + this->sucMsg( "設定ファイルを開くことができませんでした。", "Setting file can't be opened." ); + return; + } + + // タグ : ルート + System::Xml::XmlElement ^root = doc->DocumentElement; + + // タグ + System::Boolean bReadOnly = MasterEditorTWL::isXmlEqual( root, "rw", "r" ); + if( bReadOnly ) + { + this->readOnly(); + } + + // タグ + System::Boolean bXML = MasterEditorTWL::isXmlEqual( root, "output", "XML" ); + + // タグ + System::Boolean bCheck = MasterEditorTWL::isXmlEqual( root, "spcheck", "ON" ); + + if( bCheck ) // チェックするときのみ追加チェック項目を設定 + { + // チェックするかどうか + this->hSrl->hMrcSpecialList->hIsCheck = gcnew System::Boolean( true ); + + // SDK + try + { + u32 major = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/sdk/major" ) ); + u32 minor = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/sdk/minor" ) ); + u32 relstep = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/sdk/relstep" ) ); + u32 sdkver = (major << 24) | (minor << 16) | (relstep & 0xFFFF); + this->hSrl->hMrcSpecialList->hSDKVer = gcnew System::UInt32( sdkver ); + } + catch ( System::Exception ^ex ) + { + (void)ex; + this->errMsg( "設定ファイル中のSDKバージョンが読み込めませんでした。バージョンは0とみなされます。", + "SDK ver. can't be read from setting file. Therefore it is set by 0." ); + this->hSrl->hMrcSpecialList->hSDKVer = gcnew System::UInt32( 0 ); + } + + // EULA + try + { + u8 eula = System::Byte::Parse( MasterEditorTWL::getXPathText( root, "/init/eula" ) ); + this->hSrl->hMrcSpecialList->hEULAVer = gcnew System::Byte( eula ); + } + catch ( System::Exception ^ex ) + { + (void)ex; + this->errMsg( "設定ファイル中のEULAバージョンが読み込めませんでした。バージョンは0とみなされます。", + "EULA ver. can't be read from setting file. Therefore it is set by 0." ); + this->hSrl->hMrcSpecialList->hEULAVer = gcnew System::Byte( 0 ); + } + + // Shared2File + try + { + System::Int32 i; + for( i=0; i < METWL_NUMOF_SHARED2FILES; i++ ) + { + u8 size = System::UInt32::Parse( MasterEditorTWL::getXPathText( root, "/init/shared2/size" + i.ToString() ) ); + this->hSrl->hMrcSpecialList->hShared2SizeArray[i] = gcnew System::UInt32( size ); + } + } + catch ( System::Exception ^ex ) + { + (void)ex; + this->errMsg( "設定ファイル中のShared2ファイルサイズが読み込めませんでした。サイズはすべて0とみなされます。", + "One of shared2 file sizes can't be read from setting file. Therefore they are set by 0." ); + System::Int32 i; + for( i=0; i < METWL_NUMOF_SHARED2FILES; i++ ) + { + this->hSrl->hMrcSpecialList->hShared2SizeArray[i] = gcnew System::UInt32( 0 ); + } + } + } //if( bCheck ) + + if( bReadOnly || bXML | bCheck ) + { + System::String ^msgJ = gcnew System::String("動作モード:"); + System::String ^msgE = gcnew System::String("Processing Mode:"); + if( bReadOnly ) + { + msgJ += "\nリードオンリーモード"; + msgE += "\nRead Only Mode"; + } + if( bXML ) + { + msgJ += "\nXML出力モード"; + msgE += "\nXML Output Mode"; + } + if( bCheck ) + { + msgJ += "\n追加チェックモード"; + msgE += "\nExtra Check Mode"; + } + this->sucMsg( msgJ, msgE ); + } +} // loadInit() + +// SRLのオープン +System::Void Form1::loadSrl( System::String ^filename ) +{ + ECSrlResult result = this->hSrl->readFromFile( filename ); + if( result != ECSrlResult::NOERROR ) + { + switch( result ) + { + case ECSrlResult::ERROR_PLATFORM: + this->errMsg( "本ツールはTWL対応ROM専用です。NTR専用ROMなどのTWL非対応ROMを読み込むことはできません。", + "This tool can only read TWL ROM. This can't read an other data e.g. NTR limited ROM." ); + break; + + case ECSrlResult::ERROR_SIGN_DECRYPT: + case ECSrlResult::ERROR_SIGN_VERIFY: + this->errMsg( "不正なROMデータです。TWL対応ROMでないかROMデータが改ざんされている可能性があります。", + "Illegal ROM data. It is not for TWL ROM, or is altered illegally." ); + break; + + default: + this->errMsg( "ROMデータファイルの読み込みに失敗しました。\n再度「ROMデータを開く」を選択してROMデータを読み出してください。", + "Reading the ROM data file failed. \nPlease read a ROM data file again, with \"Open a ROM data file\"" ); + break; + } + return; + } + this->tboxFile->Text = filename; + + // GUIにROM情報を格納 + this->setSrlForms(); + + // 全体のCRCを算出 + u16 crc; + if( !getWholeCRCInFile( filename, &crc ) ) + { + this->errMsg( "ROMデータのCRC計算に失敗しました。ROMデータの読み込みはキャンセルされました。", + "Calculating CRC of the ROM data failed. Therefore reading ROM data is canceled." ); + return; + } + System::UInt16 ^hcrc = gcnew System::UInt16( crc ); + this->tboxWholeCRC->Clear(); + this->tboxWholeCRC->AppendText( "0x" ); + this->tboxWholeCRC->AppendText( hcrc->ToString("X") ); + + // 読み込み時エラーを登録する + this->rErrorReading->Checked = true; + this->setGridError(); + this->setGridWarn(); + //if( this->hSrl->hErrorList->Count > 0 ) + //{ + // this->errMsg( "ROMデータにエラーがあります。「エラー情報」タブをご確認ください。", + // "ROM data include error. Please look the tab \"Setting Error\"." ); + // return; + //} + return; +} // loadSrl() + +// SRLの保存 +System::Void Form1::saveSrl( System::String ^filename ) +{ + // ROM情報をフォームから取得してSRLバイナリに反映させる + this->setSrlProperties(); + // マスタ書類情報をフォームから取得して書類に反映させる -> 必要なし + //this->setDeliverableProperties(); + + // ファイルをコピー + if( !(filename->Equals( this->tboxFile->Text )) ) + { + System::IO::File::Copy( this->tboxFile->Text, filename, true ); + } + + // コピーしたファイルにROMヘッダを上書き + if( this->hSrl->writeToFile( filename ) != ECSrlResult::NOERROR ) + { + this->errMsg( "ROMデータの保存に失敗しました。", "Saving the ROM data file failed." ); + return; + } + this->sucMsg( "ROMデータの保存が成功しました。", "Saving the ROM data file succeeded." ); + this->tboxFile->Text = filename; + + // 再リード + this->loadSrl( filename ); +} // saveSrl() diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form_lang.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_lang.cpp new file mode 100644 index 00000000..78be888f --- /dev/null +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_lang.cpp @@ -0,0 +1,480 @@ +// ---------------------------------------------- +// 日英両対応 +// ---------------------------------------------- + +#include "stdafx.h" +#include +#include "common.h" +#include "srl.h" +#include "deliverable.h" +#include "crc_whole.h" +#include "utility.h" +#include "lang.h" +#include "FormError.h" +#include "Form1.h" + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +using namespace MasterEditorTWL; + +// 日本語版と英語版でテキストボックスの文字列制限が変わる +void Form1::changeMaxLength( System::Windows::Forms::TextBox ^tbox, System::Int32 maxlen ) +{ + if( tbox->Text->Length > maxlen ) + tbox->Text = ""; + + tbox->MaxLength = maxlen; +} + +// 日本語版への切り替え +void Form1::changeJapanese(void) +{ + System::Int32 index; + + // 入力文字数制限を変更する + this->changeMaxLength( this->tboxCompany1, 25 ); + this->changeMaxLength( this->tboxDepart1, 25 ); + this->changeMaxLength( this->tboxPerson1, 15 ); + + // タイトルバー + this->stripFile->Text = gcnew System::String( "ファイル" ); + this->stripItemOpenRom->Text = gcnew System::String( "ROMデータを開く" ); + this->stripItemSaveTemp->Text = gcnew System::String( "提出情報を一時保存する" ); + this->stripItemLoadTemp->Text = gcnew System::String( "一時保存した提出情報を読み込む" ); + this->stripMaster->Text = gcnew System::String( "マスター" ); + this->stripItemSheet->Text = gcnew System::String( "提出確認書とマスターROMを作成する" ); + this->stripItemMasterRom->Text = gcnew System::String( "マスターROMのみを作成する" ); + + // 入力ファイル + this->labFile->Text = gcnew System::String( "ROMデータファイル" ); + + // タブ + this->tabRomInfo->Text = gcnew System::String( "ROM基本情報(確認用)" ); + this->tabTWLInfo->Text = gcnew System::String( "TWL拡張情報(確認用)" ); + this->tabRomEditInfo->Text = gcnew System::String( "ROM登録情報(編集可)" ); + this->tabSubmitInfo->Text = gcnew System::String( "提出情報(編集可)" ); + this->tabCompanyInfo->Text = gcnew System::String( "会社情報(編集可)" ); + this->tabErrorInfo->Text = gcnew System::String( "エラー情報(要修正)" ); + + // ガイド + this->tboxGuideRomInfo->Text = gcnew System::String( "このタブの情報は編集不可です。データに誤りがある場合にはROMデータの作成時の設定を見直してください。" ); + this->tboxGuideTWLInfo->Text = gcnew System::String( "このタブの情報は編集不可です。データに誤りがある場合にはROMデータの作成時の設定を見直してください。" ); + this->tboxGuideRomEditInfo->Text = gcnew System::String( "" ); + this->tboxGuideRomEditInfo->Text += "このタブの情報は提出確認書およびマスターROMの作成に必要です。編集してください。"; + this->tboxGuideRomEditInfo->Text += "\r\n(マスターROMの作成をするまでROMデータの中には登録されません。)"; + this->tboxGuideSubmitInfo->Text = gcnew System::String( "このタブの情報は提出確認書の作成に必要です。入力してください。" ); + this->tboxGuideCompanyInfo->Text = gcnew System::String( "このタブの情報は提出確認書の作成に必要です。入力してください。" ); + this->tboxGuideErrorInfo->Text = gcnew System::String( "" ); + this->tboxGuideErrorInfo->Text += "このタブには読み込んだROMデータの問題と本プログラムでの入力ミスが列挙されます。"; + this->tboxGuideErrorInfo->Text += "\r\n赤文字の項目は、本プログラムで修正不可です。ROMデータ作成時の設定をご確認ください。"; + this->tboxGuideErrorInfo->Text += "\r\n青文字の項目は、本プログラムで修正できますが、修正がマスターROMに反映されます。"; + this->tboxGuideErrorInfo->Text += "\r\n黒文字の項目は、提出確認書にのみ反映され、マスターROMには反映されません。"; + + // SRL情報 + this->gboxSrl->Text = gcnew System::String( "ROMデータ情報" ); + this->labTitleName->Text = gcnew System::String( "ソフトタイトル" ); + this->labGameCode->Text = gcnew System::String( "イニシャルコード" ); + this->labMakerCode->Text = gcnew System::String( "メーカコード" ); + this->labPlatform->Text = gcnew System::String( "プラットフォーム" ); + this->labRomType->Text = gcnew System::String( "ROMタイプ設定" ); + this->labRomSize->Text = gcnew System::String( "ROM容量" ); + this->labRemasterVer->Text = gcnew System::String( "リマスターバージョン" ); + this->cboxRemasterVerE->Text = gcnew System::String( "E(準備版)" ); + this->labHeaderCRC->Text = gcnew System::String( "ヘッダCRC" ); + this->labRomCRC->Text = gcnew System::String( "全体のCRC" ); + index = this->combBackup->SelectedIndex; + + // バックアップメモリ + this->gboxProd->Text = gcnew System::String( "ROM生産情報(必ず入力してください)" ); + this->labBackup->Text = gcnew System::String( LANG_BACKUP_J ); + this->combBackup->Items->Clear(); + this->combBackup->Items->AddRange(gcnew cli::array< System::Object^ >(9) {L"4Kbit EEPROM", L"64Kbit EEPROM", L"512Kbit EEPROM", + L"256Kbit FRAM", L"2Mbit FLASH", L"4Mbit FLASH", L"8Mbit FLASH", L"なし", L"その他"}); + this->combBackup->SelectedIndex = index; + + // 提出情報 + this->labProductName->Text = gcnew System::String( LANG_PRODUCT_NAME_J ); + this->labProductCode->Text = gcnew System::String( LANG_PRODUCT_CODE_J ); + this->labReleaseDate->Text = gcnew System::String( LANG_RELEASE_DATE_J ); + this->labSubmiteDate->Text = gcnew System::String( LANG_SUBMIT_DATE_J ); + this->gboxSubmitWay->Text = gcnew System::String( LANG_SUBMIT_WAY_J ); + this->rSubmitPost->Text = gcnew System::String( LANG_SUBMIT_POST_J ); + this->rSubmitHand->Text = gcnew System::String( LANG_SUBMIT_HAND_J ); + this->gboxUsage->Text = gcnew System::String( LANG_USAGE_J ); + this->rUsageSale->Text = gcnew System::String( LANG_USAGE_SALE_J ); + this->rUsageSample->Text = gcnew System::String( LANG_USAGE_SAMPLE_J ); + this->rUsageDst->Text = gcnew System::String( LANG_USAGE_DST_J ); + this->rUsageOther->Text = gcnew System::String( LANG_USAGE_OTHER_J ); + this->labSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_J ); + this->labCapSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_CAP_J ); + this->gboxForeign->Text = gcnew System::String( LANG_F_J ); + this->labProductNameForeign->Text = gcnew System::String( LANG_PRODUCT_NAME_F_J ); + this->labProductCodeForeign->Text = gcnew System::String( LANG_PRODUCT_CODE_F_J ); + this->cboxReleaseForeign->Text = gcnew System::String( LANG_RELEASE_F_J ); + this->labMultiForeign1->Text = gcnew System::String( LANG_MULTI_F_J ); + this->labMultiForeign2->Text = gcnew System::String( LANG_MULTI_F_J ); + this->labCaption->Text = gcnew System::String( LANG_CAPTION_J ); + this->labProductNameLimit->Text = gcnew System::String( LANG_PRODUCT_LIMIT_J ); + this->labProductNameLimitForeign->Text = gcnew System::String( LANG_PRODUCT_LIMIT_J ); + + // 会社情報 + this->gboxPerson1->Text = gcnew System::String( LANG_PERSON_1_J ); + this->gboxPerson2->Text = gcnew System::String( LANG_PERSON_2_J ); + this->cboxIsInputPerson2->Text = gcnew System::String( LANG_INPUT_PERSON_2_J ); + this->labCompany1->Text = gcnew System::String( LANG_COMPANY_J ); + this->labDepart1->Text = gcnew System::String( LANG_DEPART_J ); + this->labPerson1->Text = gcnew System::String( LANG_PERSON_J ); + this->labCompany2->Text = gcnew System::String( LANG_COMPANY_J ); + this->labDepart2->Text = gcnew System::String( LANG_DEPART_J ); + this->labPerson2->Text = gcnew System::String( LANG_PERSON_J ); + this->labArbit1->Text = gcnew System::String( "(任意)" ); + this->labArbit2->Text = gcnew System::String( "(任意)" ); + this->labArbit3->Text = gcnew System::String( "(任意)" ); + this->labArbit4->Text = gcnew System::String( "(任意)" ); + // ふりがな情報を有効にする + this->tboxFurigana1->Enabled = true; + this->labFurigana1->Text = gcnew System::String( LANG_FURIGANA_J ); + this->tboxFurigana2->Enabled = true; + this->labFurigana2->Text = gcnew System::String( LANG_FURIGANA_J ); + // NTSC-UserIDも日本語版のみ + this->tboxNTSC1->Enabled = true; + this->tboxNTSC2->Enabled = true; + this->labNTSC1Pre->Text = gcnew System::String( LANG_NTSC_1_J ); + this->labNTSC1Sur->Text = gcnew System::String( LANG_NTSC_2_J ); + this->labNTSC2Pre->Text = gcnew System::String( LANG_NTSC_1_J ); + this->labNTSC2Sur->Text = gcnew System::String( LANG_NTSC_2_J ); + + // TWL仕様 + this->gboxTWLExInfo->Text = gcnew System::String( "TWL拡張情報" ); + this->labNormalRomOffset->Text = gcnew System::String( "TWLノーマル領域ROMオフセット" ); + this->labKeyTableRomOffset->Text = gcnew System::String( "TWL専用領域ROMオフセット" ); + this->cboxIsNormalJump->Text = gcnew System::String( "ノーマルジャンプ許可" ); + this->cboxIsTmpJump->Text = gcnew System::String( "tmpジャンプ許可" ); + this->cboxIsSubBanner->Text = gcnew System::String( "サブバナーファイル有効" ); + this->cboxIsWL->Text = gcnew System::String( "NTRホワイトリスト署名有効" ); + this->gboxAccess->Text = gcnew System::String( "アクセスコントロール情報" ); + this->cboxIsSD->Text = gcnew System::String( "SDカード" ); + this->cboxIsNAND->Text = gcnew System::String( "NANDフラッシュメモリ" ); + this->labIsGameCardOn->Text = gcnew System::String( "ゲームカード電源" ); + this->labAccessOther->Text = gcnew System::String( "その他" ); + this->gboxShared2Size->Text = gcnew System::String( "Shared2ファイルサイズ" ); + this->cboxIsShared2->Text = gcnew System::String( "Shared2ファイル使用" ); + this->labSDK->Text = gcnew System::String( "SDKバージョン" ); + this->labLib->Text = gcnew System::String( "使用ライブラリ" ); + this->labCaptionEx->Text = gcnew System::String( "特記事項" ); + + // SRL編集可能情報 + this->cboxIsEULA->Text = gcnew System::String( LANG_EULA_J ); + this->gboxIcon->Text = gcnew System::String( LANG_ICON_J ); + this->rIsWirelessIcon->Text = gcnew System::String( LANG_WIRELESS_ICON_J ); + this->rIsWiFiIcon->Text = gcnew System::String( LANG_WIFI_ICON_J ); + this->rIsNoIcon->Text = gcnew System::String( LANG_NO_ICON_J ); + this->labRegion->Text = gcnew System::String( LANG_REGION_J ); + + // リージョン + index = this->combRegion->SelectedIndex; + this->combRegion->Items->Clear(); + this->combRegion->Items->AddRange(gcnew cli::array< System::Object^ >(5) + {L"日本のみ", L"米国のみ", L"欧州のみ", L"豪州のみ", L"欧州および豪州"}); +#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) + this->combRegion->Items->Add( gcnew System::String( L"全リージョン" ) ); +#endif + this->combRegion->SelectedIndex = index; + + //// ペアレンタルコントロール + this->gboxParental->Text = gcnew System::String( LANG_REGION_PCTL_J ); + this->labParentalRating->Text = gcnew System::String( LANG_PCTL_RATING_J ); + + index = this->combCERO->SelectedIndex; // いったんclearすると現在のindexに意味がなくなるので退避 + this->combCERO->Items->Clear(); + this->combCERO->Items->AddRange(gcnew cli::array< System::Object^ >(6) + {L"A (全年齢)", L"B (12歳以上)", L"C (15歳以上)", L"D (17歳以上)", L"Z (18歳以上)", L"審査中"}); + this->combCERO->SelectedIndex = index; + + index = this->combESRB->SelectedIndex; + this->combESRB->Items->Clear(); + this->combESRB->Items->AddRange(gcnew cli::array< System::Object^ >(7) + {L"年齢制限なし", L"EC (3歳以上)", L"E (6歳以上)", L"E10+ (10歳以上)", L"T (13歳以上)", L"M (17歳以上)", L"審査中"}); + this->combESRB->SelectedIndex = index; + + index = this->combUSK->SelectedIndex; + this->combUSK->Items->Clear(); + this->combUSK->Items->AddRange(gcnew cli::array< System::Object^ >(6) + {L"年齢制限なし", L"6歳以上", L"12歳以上", L"16歳以上", L"青少年には不適切", L"審査中"}); + this->combUSK->SelectedIndex = index; + + index = this->combPEGI->SelectedIndex; + this->combPEGI->Items->Clear(); + this->combPEGI->Items->AddRange(gcnew cli::array< System::Object^ >(7) + {L"年齢制限なし", L"3歳以上", L"7歳以上", L"12歳以上", L"16歳以上", L"18歳以上", L"審査中"}); + this->combPEGI->SelectedIndex = index; + + index = this->combPEGI_PRT->SelectedIndex; + this->combPEGI_PRT->Items->Clear(); + this->combPEGI_PRT->Items->AddRange(gcnew cli::array< System::Object^ >(7) + {L"年齢制限なし", L"4歳以上", L"6歳以上", L"12歳以上", L"16歳以上", L"18歳以上", L"審査中"}); + this->combPEGI_PRT->SelectedIndex = index; + + index = this->combPEGI_BBFC->SelectedIndex; + this->combPEGI_BBFC->Items->Clear(); + this->combPEGI_BBFC->Items->AddRange(gcnew cli::array< System::Object^ >(10) + {L"年齢制限なし", L"3歳以上", L"4歳以上推奨", L"7歳以上", L"8歳以上推奨", L"12歳以上", L"15歳以上", L"16歳以上", L"18歳以上", L"審査中"}); + this->combPEGI_BBFC->SelectedIndex = index; + + index = this->combOFLC->SelectedIndex; + this->combOFLC->Items->Clear(); + this->combOFLC->Items->AddRange(gcnew cli::array< System::Object^ >(6) + {L"年齢制限なし", L"G", L"PG", L"M", L"MA15+", L"審査中"}); + this->combOFLC->SelectedIndex = index; + + // エラー情報 + this->labError->Text = gcnew System::String( "エラー(必ず修正してください。)" ); + this->colErrorName->HeaderText = gcnew System::String( "項目名" ); + this->colErrorBegin->HeaderText = gcnew System::String( "開始" ); + this->colErrorEnd->HeaderText = gcnew System::String( "終了" ); + this->colErrorCause->HeaderText = gcnew System::String( "要因" ); + + this->labWarn->Text = gcnew System::String( "警告(修正は必須ではありませんが情報に誤りがないかご確認ください。)" ); + this->colWarnName->HeaderText = gcnew System::String( "項目名" ); + this->colWarnBegin->HeaderText = gcnew System::String( "開始" ); + this->colWarnEnd->HeaderText = gcnew System::String( "終了" ); + this->colWarnCause->HeaderText = gcnew System::String( "要因" ); + + this->gboxErrorTiming->Text = gcnew System::String( "いつの情報を表示するか" ); + this->rErrorReading->Text = gcnew System::String( "ROMデータ読み込み時" ); + this->rErrorCurrent->Text = gcnew System::String( "現在の入力を反映" ); + + // 特殊な設定用のテキストボックスの表記を変更 + this->setSrlFormsCaptionEx(); +} + +// 英語版への切り替え +void Form1::changeEnglish(void) +{ + System::Int32 index; + + // 入力文字数制限を変更する + this->changeMaxLength( this->tboxCompany1, 40 ); + this->changeMaxLength( this->tboxDepart1, 40 ); + this->changeMaxLength( this->tboxPerson1, 30 ); + + // タイトルバー + this->stripFile->Text = gcnew System::String( "File" ); + this->stripItemOpenRom->Text = gcnew System::String( "Open a ROM data file" ); + this->stripItemSaveTemp->Text = gcnew System::String( "Save a temporary info." ); + this->stripItemLoadTemp->Text = gcnew System::String( "Load a temporary info. saved previously" ); + this->stripMaster->Text = gcnew System::String( "Master" ); + this->stripItemSheet->Text = gcnew System::String( "Make a submission sheet and a master ROM data file" ); + this->stripItemMasterRom->Text = gcnew System::String( "Make a master ROM data file only" ); + + // 入力ファイル + this->labFile->Text = gcnew System::String( "ROM Data File" ); + + // タブ + this->tabRomInfo->Text = gcnew System::String( "ROM Info.(Read Only)" ); + this->tabTWLInfo->Text = gcnew System::String( "TWL Info.(Read Only)" ); + this->tabRomEditInfo->Text = gcnew System::String( "ROM Settings(Editable)" ); + this->tabSubmitInfo->Text = gcnew System::String( "Submission Info.(Editable)" ); + this->tabCompanyInfo->Text = gcnew System::String( "Company Info.(Editable)" ); + this->tabErrorInfo->Text = gcnew System::String( "Setting Error" ); + + // ガイド + this->tboxGuideRomInfo->Text = gcnew System::String( "This tab is for checking ROM data. When ROM data is illegal, please check settings of building ROM data" ); + this->tboxGuideTWLInfo->Text = gcnew System::String( "This tab is for checking ROM data. When ROM data is illegal, please check settings of building ROM data" ); + this->tboxGuideRomEditInfo->Text = gcnew System::String( "" ); + this->tboxGuideRomEditInfo->Text += "These items is necessary not only to make a submission sheet and but also to make a master ROM data. Please edit certainly."; + this->tboxGuideRomEditInfo->Text += "\r\n(In making a master ROM data, these info will be registered in it.)"; + this->tboxGuideSubmitInfo->Text = gcnew System::String( "These items are necessary for making a submission sheet. Please input." ); + this->tboxGuideCompanyInfo->Text = gcnew System::String( "These items are necessary for making a submission sheet. Please input." ); + this->tboxGuideErrorInfo->Text = gcnew System::String( "" ); + this->tboxGuideErrorInfo->Text += "This tab discribes errors in the ROM data file and edit mistakes."; + this->tboxGuideErrorInfo->Text += "\r\nItems highlighted by Red can't be modified by this program. Please modify build settings."; + this->tboxGuideErrorInfo->Text += "\r\nItems highlighted by Blue can be modified by this program and will register in a master ROM."; + this->tboxGuideErrorInfo->Text += "\r\nItems highlighted by Black are discribed in a submission sheet and aren't affect a master ROM."; + + // SRL情報 + this->gboxSrl->Text = gcnew System::String( "ROM Info." ); + this->labTitleName->Text = gcnew System::String( "Game Title" ); + this->labGameCode->Text = gcnew System::String( "Game Code" ); + this->labMakerCode->Text = gcnew System::String( "Maker Code" ); + this->labPlatform->Text = gcnew System::String( "Platform" ); + this->labRomType->Text = gcnew System::String( "ROM Type" ); + this->labRomSize->Text = gcnew System::String( "ROM Size" ); + this->labRemasterVer->Text = gcnew System::String( "Release Ver." ); + this->cboxRemasterVerE->Text = gcnew System::String( "E(Preliminary Ver.)" ); + this->labHeaderCRC->Text = gcnew System::String( "Header CRC" ); + this->labRomCRC->Text = gcnew System::String( "ROM CRC" ); + index = this->combBackup->SelectedIndex; + // バックアップメモリ + this->gboxProd->Text = gcnew System::String( "ROM Production Info." ); + this->labBackup->Text = gcnew System::String( LANG_BACKUP_E ); + this->combBackup->Items->Clear(); + this->combBackup->Items->AddRange(gcnew cli::array< System::Object^ >(9) {L"4Kbit EEPROM", L"64Kbit EEPROM", L"512Kbit EEPROM", + L"256Kbit FRAM", L"2Mbit FLASH", L"4Mbit FLASH", L"8Mbit FLASH", L"Nothing", L"Other"}); + this->combBackup->SelectedIndex = index; + + // 提出情報 + this->labProductName->Text = gcnew System::String( LANG_PRODUCT_NAME_E ); + this->labProductCode->Text = gcnew System::String( LANG_PRODUCT_CODE_E ); + this->labReleaseDate->Text = gcnew System::String( LANG_RELEASE_DATE_E ); + this->labSubmiteDate->Text = gcnew System::String( LANG_SUBMIT_DATE_E ); + this->gboxSubmitWay->Text = gcnew System::String( LANG_SUBMIT_WAY_E ); + this->rSubmitPost->Text = gcnew System::String( LANG_SUBMIT_POST_E ); + this->rSubmitHand->Text = gcnew System::String( LANG_SUBMIT_HAND_E ); + this->gboxUsage->Text = gcnew System::String( LANG_USAGE_E ); + this->rUsageSale->Text = gcnew System::String( LANG_USAGE_SALE_E ); + this->rUsageSample->Text = gcnew System::String( LANG_USAGE_SAMPLE_E ); + this->rUsageDst->Text = gcnew System::String( LANG_USAGE_DST_E ); + this->rUsageOther->Text = gcnew System::String( LANG_USAGE_OTHER_E ); + this->labSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_E ); + this->labCapSubmitVer->Text = gcnew System::String( LANG_SUBMIT_VER_CAP_E ); + this->gboxForeign->Text = gcnew System::String( LANG_F_E ); + this->labProductNameForeign->Text = gcnew System::String( LANG_PRODUCT_NAME_F_E ); + this->labProductCodeForeign->Text = gcnew System::String( LANG_PRODUCT_CODE_F_E ); + this->cboxReleaseForeign->Text = gcnew System::String( LANG_RELEASE_F_E ); + this->labMultiForeign1->Text = gcnew System::String( LANG_MULTI_F_E ); + this->labMultiForeign2->Text = gcnew System::String( LANG_MULTI_F_E ); + this->labCaption->Text = gcnew System::String( LANG_CAPTION_E ); + this->labProductNameLimit->Text = gcnew System::String( LANG_PRODUCT_LIMIT_E ); + this->labProductNameLimitForeign->Text = gcnew System::String( LANG_PRODUCT_LIMIT_E ); + + // 会社情報 + this->gboxPerson1->Text = gcnew System::String( LANG_PERSON_1_E ); + this->gboxPerson2->Text = gcnew System::String( LANG_PERSON_2_E ); + this->cboxIsInputPerson2->Text = gcnew System::String( LANG_INPUT_PERSON_2_E ); + this->labCompany1->Text = gcnew System::String( LANG_COMPANY_E ); + this->labDepart1->Text = gcnew System::String( LANG_DEPART_E ); + this->labPerson1->Text = gcnew System::String( LANG_PERSON_E ); + this->labCompany2->Text = gcnew System::String( LANG_COMPANY_E ); + this->labDepart2->Text = gcnew System::String( LANG_DEPART_E ); + this->labPerson2->Text = gcnew System::String( LANG_PERSON_E ); + this->labArbit1->Text = gcnew System::String( "(Arbitrary)" ); + this->labArbit2->Text = gcnew System::String( "(Arbitrary)" ); + this->labArbit3->Text = gcnew System::String( "(Arbitrary)" ); + this->labArbit4->Text = gcnew System::String( "(Arbitrary)" ); + // ふりがな情報を削除 + this->tboxFurigana1->Clear(); + this->tboxFurigana1->Enabled = false; + this->labFurigana1->Text = gcnew System::String( LANG_FURIGANA_E ); + this->tboxFurigana2->Clear(); + this->tboxFurigana2->Enabled = false; + this->labFurigana2->Text = gcnew System::String( LANG_FURIGANA_E ); + this->tboxNTSC1->Enabled = false; + this->tboxNTSC1->Text = gcnew System::String(""); + this->tboxNTSC2->Enabled = false; + this->tboxNTSC2->Text = gcnew System::String(""); + this->labNTSC1Pre->Text = gcnew System::String( LANG_NTSC_1_E ); + this->labNTSC1Sur->Text = gcnew System::String( LANG_NTSC_2_E ); + this->labNTSC2Pre->Text = gcnew System::String( LANG_NTSC_1_E ); + this->labNTSC2Sur->Text = gcnew System::String( LANG_NTSC_2_E ); + + // TWL仕様 + this->gboxTWLExInfo->Text = gcnew System::String( "TWL Extended Info" ); + this->labNormalRomOffset->Text = gcnew System::String( "TWL Normal Area ROM Offset" ); + this->labKeyTableRomOffset->Text = gcnew System::String( "TWL Secure Area ROM Offset" ); + this->cboxIsNormalJump->Text = gcnew System::String( "Enable Normal App. Jump" ); + this->cboxIsTmpJump->Text = gcnew System::String( "Enable Temp. App. Jump" ); + this->cboxIsSubBanner->Text = gcnew System::String( "Enable SubBanner File" ); + this->cboxIsWL->Text = gcnew System::String( "Enable NTR WhiteList Signature" ); + this->gboxAccess->Text = gcnew System::String( "Access Control" ); + this->cboxIsSD->Text = gcnew System::String( "SD Card" ); + this->cboxIsNAND->Text = gcnew System::String( "NAND Flash Memory" ); + this->labIsGameCardOn->Text = gcnew System::String( "Card Power" ); + this->labAccessOther->Text = gcnew System::String( "Others" ); + this->gboxShared2Size->Text = gcnew System::String( "Size of Shared2 Files" ); + this->cboxIsShared2->Text = gcnew System::String( "Use Shared2 Files" ); + this->labSDK->Text = gcnew System::String( "SDK Ver." ); + this->labLib->Text = gcnew System::String( "Libraries used by the program" ); + this->labCaptionEx->Text = gcnew System::String( "Special Note" ); + + // SRL編集可能情報 + this->cboxIsEULA->Text = gcnew System::String( LANG_EULA_E ); + this->gboxIcon->Text = gcnew System::String( LANG_ICON_E ); + this->rIsWirelessIcon->Text = gcnew System::String( LANG_WIRELESS_ICON_E ); + this->rIsWiFiIcon->Text = gcnew System::String( LANG_WIFI_ICON_E ); + this->rIsNoIcon->Text = gcnew System::String( LANG_NO_ICON_E ); + this->labRegion->Text = gcnew System::String( LANG_REGION_E ); + + // リージョン + index = this->combRegion->SelectedIndex; + this->combRegion->Items->Clear(); + this->combRegion->Items->AddRange(gcnew cli::array< System::Object^ >(5) + {L"Japan Only", L"USA Only", L"Europe Only", L"Australia Only", L"Europe and Australia"}); +#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) + this->combRegion->Items->Add( gcnew System::String( L"All Region" ) ); +#endif + this->combRegion->SelectedIndex = index; + + //// ペアレンタルコントロール + this->gboxParental->Text = gcnew System::String( LANG_REGION_PCTL_E ); + this->labParentalRating->Text = gcnew System::String( LANG_PCTL_RATING_E ); + + index = this->combCERO->SelectedIndex; // いったんclearすると現在のindexに意味がなくなるので退避 + this->combCERO->Items->Clear(); + this->combCERO->Items->AddRange(gcnew cli::array< System::Object^ >(6) + {L"A (All ages)", L"B (aged 12 or older)", L"C (aged 15 or older)", L"D (aged 17 or older)", L"Z (aged 18 or older)", L"Rating Pending"}); + this->combCERO->SelectedIndex = index; + + index = this->combESRB->SelectedIndex; + this->combESRB->Items->Clear(); + this->combESRB->Items->AddRange(gcnew cli::array< System::Object^ >(7) + {L"All ages", L"EC (aged 3 or older)", L"E (aged 6 or older)", L"E10+ (aged 10 or older)", L"T (aged 13 or older)", L"M (aged 17 or older)", L"Rating Pending"}); + this->combESRB->SelectedIndex = index; + + index = this->combUSK->SelectedIndex; + this->combUSK->Items->Clear(); + this->combUSK->Items->AddRange(gcnew cli::array< System::Object^ >(6) + {L"All ages", L"aged 6 or older", L"aged 12 or older", L"aged 16 or older", L"Inadequent for young", L"Rating Pending"}); + this->combUSK->SelectedIndex = index; + + index = this->combPEGI->SelectedIndex; + this->combPEGI->Items->Clear(); + this->combPEGI->Items->AddRange(gcnew cli::array< System::Object^ >(7) + {L"All ages", L"aged 3 or older", L"aged 7 or older", L"aged 12 or older", L"aged 16 or older", L"aged 18 or older", L"Rating Pending"}); + this->combPEGI->SelectedIndex = index; + + index = this->combPEGI_PRT->SelectedIndex; + this->combPEGI_PRT->Items->Clear(); + this->combPEGI_PRT->Items->AddRange(gcnew cli::array< System::Object^ >(7) + {L"All ages", L"aged 4 or older", L"aged 6 or older", L"aged 12 or older", L"aged 16 or older", L"aged 18 or older", L"Rating Pending"}); + this->combPEGI_PRT->SelectedIndex = index; + + index = this->combPEGI_BBFC->SelectedIndex; + this->combPEGI_BBFC->Items->Clear(); + this->combPEGI_BBFC->Items->AddRange(gcnew cli::array< System::Object^ >(10) + {L"All ages", L"aged 3 or older", L"aged 4 or older recommended", L"aged 7 or older", L"aged 8 or older recommended", + L"aged 12 or older", L"aged 15 or older", L"aged 16 or older", L"aged 18 or older", L"Rating Pending"}); + this->combPEGI_BBFC->SelectedIndex = index; + + index = this->combOFLC->SelectedIndex; + this->combOFLC->Items->Clear(); + this->combOFLC->Items->AddRange(gcnew cli::array< System::Object^ >(6) + {L"All ages", L"G", L"PG", L"M", L"MA15+", L"Rating Pending"}); + this->combOFLC->SelectedIndex = index; + + // エラー情報 + this->labError->Text = gcnew System::String( "Error Information(Modification is necessary.)" ); + this->colErrorName->HeaderText = gcnew System::String( "Name" ); + this->colErrorBegin->HeaderText = gcnew System::String( "Begin" ); + this->colErrorEnd->HeaderText = gcnew System::String( "End" ); + this->colErrorCause->HeaderText = gcnew System::String( "Reason" ); + + this->labWarn->Text = gcnew System::String( "Warning(Modification is not necessary. Please check validity of these information.)" ); + this->colWarnName->HeaderText = gcnew System::String( "Name" ); + this->colWarnBegin->HeaderText = gcnew System::String( "Begin" ); + this->colWarnEnd->HeaderText = gcnew System::String( "End" ); + this->colWarnCause->HeaderText = gcnew System::String( "Reason" ); + + this->gboxErrorTiming->Text = gcnew System::String( "Error Of Timing" ); + this->rErrorReading->Text = gcnew System::String( "When ROM data was read" ); + this->rErrorCurrent->Text = gcnew System::String( "In current settings" ); + + // 特殊な設定用のテキストボックスの表記を変更 + this->setSrlFormsCaptionEx(); +} + +// end of file \ No newline at end of file diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form_pctl.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_pctl.cpp new file mode 100644 index 00000000..d1d64cea --- /dev/null +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_pctl.cpp @@ -0,0 +1,187 @@ +// --------------------------------------------------------------------- +// ペアレンタルコントロール設定は複雑なので外部ファイルに切り出す +// --------------------------------------------------------------------- + +#include "stdafx.h" +#include +#include "common.h" +#include "srl.h" +#include "deliverable.h" +#include "crc_whole.h" +#include "utility.h" +#include "lang.h" +#include "FormError.h" +#include "Form1.h" + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +using namespace MasterEditorTWL; + +// フォーム入力をSRLに反映させる +void Form1::setParentalSrlProperties(void) +{ + // 各団体のフォーム入力を反映 + this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_CERO ] = this->combCERO->SelectedIndex; + this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_ESRB ] = this->combESRB->SelectedIndex; + this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_USK ] = this->combUSK->SelectedIndex; + this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_PEGI_GEN ] = this->combPEGI->SelectedIndex; + this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_PEGI_PRT ] = this->combPEGI_PRT->SelectedIndex; + this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_PEGI_BBFC ] = this->combPEGI_BBFC->SelectedIndex; + this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_OFLC ] = this->combOFLC->SelectedIndex; +} //setParentalSrlProperties() + +// SRL内のペアレンタルコントロール情報を抜き出してフォームに反映させる +void Form1::setParentalForms(void) +{ + // 各団体のコンボボックスのインデックスを設定 + this->combCERO->SelectedIndex = this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_CERO ]; + this->combESRB->SelectedIndex = this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_ESRB ]; + this->combUSK->SelectedIndex = this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_USK ]; + this->combPEGI->SelectedIndex = this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_PEGI_GEN ]; + this->combPEGI_PRT->SelectedIndex = this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_PEGI_PRT ]; + this->combPEGI_BBFC->SelectedIndex = this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_PEGI_BBFC ]; + this->combOFLC->SelectedIndex = this->hSrl->hArrayParentalIndex[ OS_TWL_PCTL_OGN_OFLC ]; +} //setParentalForms() + +// リージョン情報からペアレンタルコントロールの編集可能団体をマスクする +void Form1::maskParentalForms(void) +{ + this->enableParental( this->combCERO, this->labCERO, nullptr ); + this->enableParental( this->combESRB, this->labESRB, nullptr ); + this->enableParental( this->combUSK, this->labUSK, nullptr ); + this->enableParental( this->combPEGI, this->labPEGI, nullptr ); + this->enableParental( this->combPEGI_PRT, this->labPEGI_PRT, nullptr ); + this->enableParental( this->combPEGI_BBFC, this->labPEGI_BBFC, nullptr ); + this->enableParental( this->combOFLC, this->labOFLC, nullptr ); + switch( this->combRegion->SelectedIndex ) + { + case 0: + // 日本 + this->enableParental( this->combCERO, this->labCERO, nullptr ); + this->disableParental( this->combESRB, this->labESRB, nullptr ); + this->disableParental( this->combUSK, this->labUSK, nullptr ); + this->disableParental( this->combPEGI, this->labPEGI, nullptr ); + this->disableParental( this->combPEGI_PRT, this->labPEGI_PRT, nullptr ); + this->disableParental( this->combPEGI_BBFC, this->labPEGI_BBFC, nullptr ); + this->disableParental( this->combOFLC, this->labOFLC, nullptr ); + break; + + case 1: + // 米国 + this->disableParental( this->combCERO, this->labCERO, nullptr ); + this->enableParental( this->combESRB, this->labESRB, nullptr ); + this->disableParental( this->combUSK, this->labUSK, nullptr ); + this->disableParental( this->combPEGI, this->labPEGI, nullptr ); + this->disableParental( this->combPEGI_PRT, this->labPEGI_PRT, nullptr ); + this->disableParental( this->combPEGI_BBFC, this->labPEGI_BBFC, nullptr ); + this->disableParental( this->combOFLC, this->labOFLC, nullptr ); + break; + + case 2: + // 欧州 + this->disableParental( this->combCERO, this->labCERO, nullptr ); + this->disableParental( this->combESRB, this->labESRB, nullptr ); + this->enableParental( this->combUSK, this->labUSK, nullptr ); + this->enableParental( this->combPEGI, this->labPEGI, nullptr ); + this->enableParental( this->combPEGI_PRT, this->labPEGI_PRT, nullptr ); + this->enableParental( this->combPEGI_BBFC, this->labPEGI_BBFC, nullptr ); + this->disableParental( this->combOFLC, this->labOFLC, nullptr ); + break; + + case 3: + // 豪州 + this->disableParental( this->combCERO, this->labCERO, nullptr ); + this->disableParental( this->combESRB, this->labESRB, nullptr ); + this->disableParental( this->combUSK, this->labUSK, nullptr ); + this->disableParental( this->combPEGI, this->labPEGI, nullptr ); + this->disableParental( this->combPEGI_PRT, this->labPEGI_PRT, nullptr ); + this->disableParental( this->combPEGI_BBFC, this->labPEGI_BBFC, nullptr ); + this->enableParental( this->combOFLC, this->labOFLC, nullptr ); + break; + + case 4: + // 欧州と豪州 + this->disableParental( this->combCERO, this->labCERO, nullptr ); + this->disableParental( this->combESRB, this->labESRB, nullptr ); + this->enableParental( this->combUSK, this->labUSK, nullptr ); + this->enableParental( this->combPEGI, this->labPEGI, nullptr ); + this->enableParental( this->combPEGI_PRT, this->labPEGI_PRT, nullptr ); + this->enableParental( this->combPEGI_BBFC, this->labPEGI_BBFC, nullptr ); + this->enableParental( this->combOFLC, this->labOFLC, nullptr ); + break; + + // 全リージョンのときは何もdisableにしない + default: + break; + } +} //maskParentalForms() + +// ペアレンタルコントロール関連のフォーム入力が正しいか書き込み前チェック +void Form1::checkParentalForms( System::Boolean inRegion, System::Windows::Forms::ComboBox ^comb, System::String ^msg ) +{ + // リージョンに含まれていないとき: 0クリアが保証されるのでチェック必要なし + if( !inRegion ) + return; + + // 設定されていないときエラー + if( (comb->SelectedIndex < 0) || (comb->SelectedIndex >= comb->Items->Count) ) + { + this->hErrorList->Add( gcnew RCMrcError( + "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, + msg + ": レーティングを選択してください。", + "Parental Control", + msg + ": Rating Pending is setting. When rating age is examined, Please submit again.", true, true ) ); + } + + // 審査中のとき警告 + if( comb->SelectedIndex == (comb->Items->Count - 1) ) + { + this->hWarnList->Add( gcnew RCMrcError( + "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, + msg + ": 審査中指定がされています。審査が決まりしだい、再提出してください。", + "Parental Control", msg + ": Save ROM data as Game soft which needs rating examinination.", true, true ) ); + } +} //checkParentalForms() + + +// ペアレンタルコントロール情報をクリアする +void Form1::clearParental( System::Windows::Forms::ComboBox ^comb ) +{ + comb->SelectedIndex = -1; // 空白にする +} + + +// ペアレンタルコントロール情報を編集できるようにする +void Form1::enableParental( System::Windows::Forms::ComboBox ^comb, + System::Windows::Forms::Label ^lab1, + System::Windows::Forms::Label ^lab2 ) +{ + comb->Enabled = true; + comb->Visible = true; + lab1->Visible = true; + if( lab2 != nullptr ) + { + lab2->Visible = true; + } +} + +// ペアレンタルコントロール情報を編集できなくする +void Form1::disableParental( System::Windows::Forms::ComboBox ^comb, + System::Windows::Forms::Label ^lab1, + System::Windows::Forms::Label ^lab2 ) +{ + this->clearParental( comb ); + comb->Enabled = false; + comb->Visible = false; + lab1->Visible = false; + if( lab2 != nullptr ) + { + lab2->Visible = false; + } +} + +// end of file \ No newline at end of file diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form_srl.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_srl.cpp new file mode 100644 index 00000000..e8c05b4b --- /dev/null +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_srl.cpp @@ -0,0 +1,369 @@ +// ---------------------------------------------- +// フォームとSRL内情報とのデータのやりとり +// ---------------------------------------------- + +#include "stdafx.h" +#include +#include "common.h" +#include "srl.h" +#include "deliverable.h" +#include "crc_whole.h" +#include "utility.h" +#include "lang.h" +#include "FormError.h" +#include "Form1.h" + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +using namespace MasterEditorTWL; + +// ROM情報をフォームから取得してSRLクラスのプロパティに反映させる +// (ROMヘッダへの反映やCRCと署名の再計算をしない) +void Form1::setSrlProperties(void) +{ + // ROMヘッダの[0,0x160)の領域はRead Onlyで変更しない + + // TWL拡張領域のいくつかの情報をROMヘッダに反映させる + this->hSrl->hIsEULA = this->cboxIsEULA->Checked; + this->hSrl->hIsWiFiIcon = this->rIsWiFiIcon->Checked; + this->hSrl->hIsWirelessIcon = this->rIsWirelessIcon->Checked; + + // リージョン + this->hSrl->hIsRegionJapan = gcnew System::Boolean(false); + this->hSrl->hIsRegionAmerica = gcnew System::Boolean(false); + this->hSrl->hIsRegionEurope = gcnew System::Boolean(false); + this->hSrl->hIsRegionAustralia = gcnew System::Boolean(false); + switch( this->combRegion->SelectedIndex ) + { + case 0: + this->hSrl->hIsRegionJapan = gcnew System::Boolean(true); + break; + + case 1: + this->hSrl->hIsRegionAmerica = gcnew System::Boolean(true); + break; + + case 2: + this->hSrl->hIsRegionEurope = gcnew System::Boolean(true); + break; + + case 3: + this->hSrl->hIsRegionAustralia = gcnew System::Boolean(true); + break; + + case 4: + this->hSrl->hIsRegionEurope = gcnew System::Boolean(true); + this->hSrl->hIsRegionAustralia = gcnew System::Boolean(true); + break; + +#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) + case 5: + this->hSrl->hIsRegionJapan = gcnew System::Boolean(true); + this->hSrl->hIsRegionAmerica = gcnew System::Boolean(true); + this->hSrl->hIsRegionEurope = gcnew System::Boolean(true); + this->hSrl->hIsRegionAustralia = gcnew System::Boolean(true); + break; +#endif //defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) + default: + break; + } + + // ペアレンタルコントロール + this->setParentalSrlProperties(); +} //setSrlProperties() + +// SRLのROM情報をフォームに反映させる(ファイルが読み込まれていることが前提) +void Form1::setSrlForms(void) +{ + // NTR互換情報 + this->tboxTitleName->Text = this->hSrl->hTitleName; + this->tboxGameCode->Text = this->hSrl->hGameCode; + this->tboxMakerCode->Text = this->hSrl->hMakerCode; + this->tboxPlatform->Text = this->hSrl->hPlatform; + this->tboxRomSize->Text = this->hSrl->hRomSize; + this->tboxRomLatency->Text = this->hSrl->hLatency; + if( *(this->hSrl->hRomVersion) == 0xE0 ) + { + this->tboxRemasterVer->Text = gcnew System::String("E"); + this->cboxRemasterVerE->Checked = true; + } + else + { + this->tboxRemasterVer->Text = this->hSrl->hRomVersion->ToString(); + this->cboxRemasterVerE->Checked = false; + } + + this->tboxHeaderCRC->Clear(); + this->tboxHeaderCRC->AppendText( "0x" ); + this->tboxHeaderCRC->AppendText( this->hSrl->hHeaderCRC->ToString("X") ); + + if( this->hSrl->hPlatform == nullptr ) + { + this->errMsg( "プラットホーム指定が不正です。ROMデータのビルド設定を見直してください。", + "Illegal Platform: Please check build settings of the ROM data."); + } + + // TWL拡張情報 + this->tboxTitleIDLo->Text = this->hSrl->hTitleIDLo; + this->tboxTitleIDHi->Text = this->hSrl->hTitleIDHi->ToString("X8"); + this->tboxNormalRomOffset->Text = this->hSrl->hNormalRomOffset->ToString("X8"); + this->tboxKeyTableRomOffset->Text = this->hSrl->hKeyTableRomOffset->ToString("X8"); + this->tboxPublicSize->Text = MasterEditorTWL::transSizeToString( this->hSrl->hPublicSize ); + this->tboxPrivateSize->Text = MasterEditorTWL::transSizeToString( this->hSrl->hPrivateSize ); + this->cboxIsNormalJump->Checked = *(this->hSrl->hIsNormalJump); + this->cboxIsTmpJump->Checked = *(this->hSrl->hIsTmpJump); + this->cboxIsSubBanner->Checked = *(this->hSrl->hIsSubBanner); + this->cboxIsWL->Checked = *(this->hSrl->hIsWL); + if( *(this->hSrl->hIsCodecTWL) == true ) + { + this->tboxIsCodec->Text = gcnew System::String( "TWL" ); + } + else + { + this->tboxIsCodec->Text = gcnew System::String( "NTR" ); + } + this->cboxIsSD->Checked = *(this->hSrl->hIsSD); + this->cboxIsNAND->Checked = *(this->hSrl->hIsNAND); + if( *(this->hSrl->hIsGameCardNitro) == true ) + { + this->tboxIsGameCardOn->Text = gcnew System::String( "ON(NTR)" ); + } + else if( *(this->hSrl->hIsGameCardOn) == true ) + { + this->tboxIsGameCardOn->Text = gcnew System::String( "ON(normal)" ); + } + else + { + this->tboxIsGameCardOn->Text = gcnew System::String( "OFF" ); + } + this->cboxIsShared2->Checked = *(this->hSrl->hIsShared2); + this->tboxShared2Size0->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[0] ); + this->tboxShared2Size1->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[1] ); + this->tboxShared2Size2->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[2] ); + this->tboxShared2Size3->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[3] ); + this->tboxShared2Size4->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[4] ); + this->tboxShared2Size5->Text = MasterEditorTWL::transSizeToString( this->hSrl->hShared2SizeArray[5] ); + + // アプリ種別 + if( *this->hSrl->hIsMediaNand ) + { + this->tboxMedia->Text = gcnew System::String( "NAND" ); + } + else + { + this->tboxMedia->Text = gcnew System::String( "Game Card" ); + } + + + if( *(this->hSrl->hIsAppLauncher) == true ) + { + this->tboxAppType->Text = gcnew System::String( "Launcher" ); + } + else if( *(this->hSrl->hIsAppSecure) == true ) + { + this->tboxAppType->Text = gcnew System::String( "Secure" ); + } + else if( *(this->hSrl->hIsAppSystem) == true ) + { + this->tboxAppType->Text = gcnew System::String( "System" ); + } + else if( *(this->hSrl->hIsAppUser) == true ) + { + this->tboxAppType->Text = gcnew System::String( "User" ); + } + else + { + this->tboxAppType->Text = gcnew System::String( "UNKNOWN" ); + } + + System::String ^appother = gcnew System::String(""); + if( *(this->hSrl->hIsLaunch) == false ) + { + appother += "Not-Launch.\r\n"; + } + if( *(this->hSrl->hIsDataOnly) == true ) + { + appother += "DataOnly.\r\n"; + } + this->tboxAppTypeOther->Text = appother; + + // アクセスコントロール その他 + System::String ^acc = gcnew System::String(""); + if( *(this->hSrl->hIsCommonClientKey) == true ) + { + acc += "commonClientKey.\r\n"; + } + if( *(this->hSrl->hIsAesSlotBForES) == true ) + { + acc += "AES-SlotB(ES).\r\n"; + } + if( *(this->hSrl->hIsAesSlotCForNAM) == true ) + { + acc += "AES-SlotC(NAM).\r\n"; + } + if( *(this->hSrl->hIsAesSlotBForJpegEnc) == true ) + { + acc += "AES-SlotB(JpegEnc.).\r\n"; + } + if( *(this->hSrl->hIsAesSlotAForSSL) == true ) + { + acc += "AES-SlotA(SSL).\r\n"; + } + if( *(this->hSrl->hIsCommonClientKeyForDebugger) == true ) + { + acc += "commonClientKey(Debug.).\r\n"; + } + this->tboxAccessOther->Text = acc; + + // 特殊な設定をテキストボックスに反映 + this->setSrlFormsCaptionEx(); + + // SDKバージョンとライブラリ + this->tboxSDK->Clear(); + if( this->hSrl->hSDKList != nullptr ) + { + for each( RCSDKVersion ^ver in this->hSrl->hSDKList ) + { + if( ver->IsStatic ) + this->tboxSDK->Text += ver->Version + " (main static)\r\n"; + else + this->tboxSDK->Text += ver->Version + "\r\n"; + } + } + this->gridLibrary->Rows->Clear(); + if( this->hSrl->hLicenseList != nullptr ) + { + for each( RCLicense ^lic in this->hSrl->hLicenseList ) + { + this->gridLibrary->Rows->Add( gcnew cli::array{lic->Publisher, lic->Name} ); + } + } + + // 編集可能情報 + this->cboxIsEULA->Checked = *(this->hSrl->hIsEULA); + if( ( *this->hSrl->hIsWiFiIcon && *this->hSrl->hIsWirelessIcon) || + (!(*this->hSrl->hIsWiFiIcon) && !(*this->hSrl->hIsWirelessIcon)) ) + { + this->rIsNoIcon->Checked = true; + } + else if( *(this->hSrl->hIsWiFiIcon) && !*(this->hSrl->hIsWirelessIcon) ) + { + this->rIsWiFiIcon->Checked = true; + } + else + { + this->rIsWirelessIcon->Checked = true; + } + System::Boolean isJapan = *(this->hSrl->hIsRegionJapan); // リージョン + System::Boolean isAmerica = *(this->hSrl->hIsRegionAmerica); + System::Boolean isEurope = *(this->hSrl->hIsRegionEurope); + System::Boolean isAustralia = *(this->hSrl->hIsRegionAustralia); + System::Int32 index; + if( isJapan && !isAmerica && !isEurope && !isAustralia ) + index = 0; + else if( !isJapan && isAmerica && !isEurope && !isAustralia ) + index = 1; + else if( !isJapan && !isAmerica && isEurope && !isAustralia ) + index = 2; + else if( !isJapan && !isAmerica && !isEurope && isAustralia ) + index = 3; + else if( !isJapan && !isAmerica && isEurope && isAustralia ) + index = 4; + else + index = -1; // 不正 +#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) +if( isJapan && isAmerica && isEurope && isAustralia ) +index = 5; +#endif + this->combRegion->SelectedIndex = index; + this->maskParentalForms(); + this->setParentalForms(); // ペアレンタルコントロール関連 +} // setSrlForms() + +// SRLの特殊な設定をフォームにセットする(言語切り替えで表示を変えたいので独立させる) +void Form1::setSrlFormsCaptionEx() +{ + // 特殊な設定は備考欄に書き加えておく + this->tboxCaptionEx->Clear(); + if( (this->hSrl->hHasDSDLPlaySign != nullptr) && (*(this->hSrl->hHasDSDLPlaySign) == true) ) + { + if( this->stripItemJapanese->Checked == true ) + this->tboxCaptionEx->Text += gcnew System::String( "DSクローンブート対応.\r\n" ); + else + this->tboxCaptionEx->Text += gcnew System::String( "DS Clone Boot.\r\n" ); + } + if( (this->hSrl->hIsSCFGAccess != nullptr) && (*(this->hSrl->hIsSCFGAccess) == true) ) + { + if( this->stripItemJapanese->Checked == true ) + this->tboxCaptionEx->Text += gcnew System::String( "SCFGレジスタアクセス可能.\r\n" ); + else + this->tboxCaptionEx->Text += gcnew System::String( "SDFC Register Accessible.\r\n" ); + } +} // setSrlFormsCaptionEx() + +// フォームの入力をチェックする +System::Boolean Form1::checkSrlForms(void) +{ + // リージョン + if( this->checkBoxIndex( this->combRegion, LANG_REGION_J, LANG_REGION_E, true ) == false ) + return false; + + // リージョンを決める + System::Boolean bJapan = false; + System::Boolean bAmerica = false; + System::Boolean bEurope = false; + System::Boolean bAustralia = false; + switch( this->combRegion->SelectedIndex ) + { + case 0: + bJapan = true; + break; + case 1: + bAmerica = true; + break; + case 2: + bEurope = true; + break; + case 3: + bAustralia = true; + break; + case 4: + bEurope = true; + bAustralia = true; + break; + +#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) + case 5: + bJapan = true; + bAmerica = true; + bEurope = true; + bAustralia = true; + break; +#endif + default: + break; + } + + // ペアレンタルコントロール + this->checkParentalForms( bJapan, this->combCERO, this->labCERO->Text ); + this->checkParentalForms( bAmerica, this->combESRB, this->labESRB->Text ); + this->checkParentalForms( bEurope, this->combUSK, this->labUSK->Text ); + this->checkParentalForms( bEurope, this->combPEGI, this->labPEGI->Text ); + this->checkParentalForms( bEurope, this->combPEGI_PRT, this->labPEGI_PRT->Text ); + this->checkParentalForms( bEurope, this->combPEGI_BBFC, this->labPEGI_BBFC->Text ); + this->checkParentalForms( bAustralia, this->combOFLC, this->labOFLC->Text ); + + // ひととおりエラー登録をした後で + // SRLバイナリに影響を与えるエラーが存在するかチェック +#ifdef METWL_LIGHT_CHECK + return this->isValidAffectRomModified(); +#else + return this->isValidAffectRom(); +#endif +} // checkSrlForms() + +// end of file \ No newline at end of file diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form_tmp.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_tmp.cpp new file mode 100644 index 00000000..bcdb0689 --- /dev/null +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_tmp.cpp @@ -0,0 +1,342 @@ +// ---------------------------------------------- +// 一時ファイルの取り扱い +// ---------------------------------------------- + +#include "stdafx.h" +#include +#include "common.h" +#include "srl.h" +#include "deliverable.h" +#include "crc_whole.h" +#include "utility.h" +#include "lang.h" +#include "FormError.h" +#include "Form1.h" + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +using namespace MasterEditorTWL; + +// 一時保存 +System::Void Form1::saveTmp( System::String ^filename ) +{ + System::Xml::XmlDocument ^doc = gcnew System::Xml::XmlDocument(); + + doc->AppendChild( doc->CreateXmlDeclaration("1.0","UTF-8",nullptr) ); + System::Xml::XmlElement ^root = doc->CreateElement( "MasterEditorTWL" ); + doc->AppendChild( root ); + + // SRLのパス + MasterEditorTWL::appendXmlTag( doc, root, "Srl", this->tboxFile->Text ); + + // 言語 + MasterEditorTWL::appendXmlTag( doc, root, "Lang", (this->stripItemJapanese->Checked)?"J":"E" ); + + // フォーム + System::Xml::XmlElement ^form = doc->CreateElement( "Form" ); + root->AppendChild( form ); + + MasterEditorTWL::appendXmlTag( doc, form, "ProductName", this->tboxProductName->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ProductCode1", this->tboxProductCode1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2", this->tboxProductCode2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ProductNameForeign", this->tboxProductNameForeign->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ProductCode1Foreign", this->tboxProductCode1Foreign->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2Foreign1", this->tboxProductCode2Foreign1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2Foreign2", this->tboxProductCode2Foreign2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ProductCode2Foreign3", this->tboxProductCode2Foreign3->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "SubmitVersion", this->numSubmitVersion->Value.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "Backup", this->combBackup->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "BackupOther", this->tboxBackupOther->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "ReleaseForeign", (this->cboxReleaseForeign->Checked)?"Y":"N" ); + MasterEditorTWL::appendXmlTag( doc, form, "Remarks", this->tboxCaption->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "SubmitWay", (this->rSubmitHand->Checked)?"Hand":"Mail" ); + if( this->rUsageSale->Checked ) + MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Sale" ); + else if( this->rUsageSample->Checked ) + MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Sample" ); + else if( this->rUsageDst->Checked ) + MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Dst" ); + else if( this->rUsageOther->Checked ) + MasterEditorTWL::appendXmlTag( doc, form, "Purpose", "Other" ); + MasterEditorTWL::appendXmlTag( doc, form, "PurposeOther", this->tboxUsageOther->Text ); + + MasterEditorTWL::appendXmlTag( doc, form, "Company1", this->tboxCompany1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Depart1", this->tboxDepart1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Name1", this->tboxPerson1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Furigana1", this->tboxFurigana1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Tel1", this->tboxTel1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Fax1", this->tboxFax1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Mail1", this->tboxMail1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "NTSC1", this->tboxNTSC1->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "InputPerson2", (this->cboxIsInputPerson2->Checked)?"Y":"N" ); + MasterEditorTWL::appendXmlTag( doc, form, "Company2", this->tboxCompany2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Depart2", this->tboxDepart2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Name2", this->tboxPerson2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Furigana2", this->tboxFurigana2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Tel2", this->tboxTel2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Fax2", this->tboxFax2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "Mail2", this->tboxMail2->Text ); + MasterEditorTWL::appendXmlTag( doc, form, "NTSC2", this->tboxNTSC2->Text ); + + if( this->rIsWirelessIcon->Checked ) + MasterEditorTWL::appendXmlTag( doc, form, "DisplayIcon", "Wireless" ); + else if( this->rIsWiFiIcon->Checked ) + MasterEditorTWL::appendXmlTag( doc, form, "DisplayIcon", "WiFi" ); + else + MasterEditorTWL::appendXmlTag( doc, form, "DisplayIcon", "None" ); + + MasterEditorTWL::appendXmlTag( doc, form, "IsEULA", (this->cboxIsEULA->Checked)?"Y":"N" ); + MasterEditorTWL::appendXmlTag( doc, form, "Region", this->combRegion->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "RatingCERO", this->combCERO->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "RatingESRB", this->combESRB->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "RatingUSK", this->combUSK->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "RatingPEGI", this->combPEGI->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "RatingPEGI_PRT", this->combPEGI_PRT->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "RatingPEGI_BBFC", this->combPEGI_BBFC->SelectedIndex.ToString() ); + MasterEditorTWL::appendXmlTag( doc, form, "RatingOFLC", this->combOFLC->SelectedIndex.ToString() ); + + doc->Save( filename ); +} //saveTmp() + +// 一時ファイルの読み出し +void Form1::loadTmp( System::String ^filename ) +{ + System::Xml::XmlDocument ^doc = gcnew System::Xml::XmlDocument; + doc->Load( filename ); + System::Xml::XmlElement ^root = doc->DocumentElement; + System::String ^text; + + // SRL + text = MasterEditorTWL::getXPathText( root, "/MasterEditorTWL/Srl" ); + if( !System::String::IsNullOrEmpty(text) ) // SRLファイル名がないときはスルー + { + this->loadSrl(text); + } + + // 言語 + text = MasterEditorTWL::getXPathText( root, "/MasterEditorTWL/Lang" ); + if( !System::String::IsNullOrEmpty(text) && text->Equals("E") ) + { + this->stripItemEnglish->Checked = true; + this->stripItemJapanese->Checked = false; + this->changeEnglish(); + } + else + { + this->stripItemEnglish->Checked = false; + this->stripItemJapanese->Checked = true; + this->changeJapanese(); + } + + // フォーム + this->parseTmp( root, "/MasterEditorTWL/Form/ProductName", this->tboxProductName ); + this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode1", this->tboxProductCode1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2", this->tboxProductCode2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/SubmitVersion", this->numSubmitVersion ); + this->parseTmp( root, "/MasterEditorTWL/Form/Backup", this->combBackup ); + + this->tboxBackupOther->Enabled = false; + this->tboxBackupOther->Clear(); + if( this->combBackup->SelectedIndex == (this->combBackup->Items->Count - 1) ) + { + this->parseTmp( root, "/MasterEditorTWL/Form/BackupOther", this->tboxBackupOther ); + this->tboxBackupOther->Enabled = true; + } + + cli::array ^rbuts; + cli::array ^strs; + + rbuts = gcnew cli::array{this->rSubmitHand, this->rSubmitPost}; + strs = gcnew cli::array{"Hand","Mail"}; + this->parseTmp( root, "/MasterEditorTWL/Form/SubmitWay", rbuts, strs ); + + rbuts = gcnew cli::array{this->rUsageSale, this->rUsageSample, this->rUsageDst, this->rUsageOther}; + strs = gcnew cli::array{"Sale","Sample","Dst","Other"}; + this->parseTmp( root, "/MasterEditorTWL/Form/Purpose", rbuts, strs ); + this->tboxUsageOther->Enabled = false; + this->tboxUsageOther->Clear(); + if( this->rUsageOther->Checked ) + { + this->tboxUsageOther->Enabled = true; + this->parseTmp( root, "/MasterEditorTWL/Form/PurposeOther", this->tboxUsageOther ); + } + + this->parseTmp( root, "/MasterEditorTWL/Form/ReleaseForeign", this->cboxReleaseForeign ); + this->tboxProductNameForeign->Enabled = false; + this->tboxProductCode1Foreign->Enabled = false; + this->tboxProductCode2Foreign1->Enabled = false; + this->tboxProductCode2Foreign2->Enabled = false; + this->tboxProductCode2Foreign3->Enabled = false; + this->tboxProductNameForeign->Clear(); + this->tboxProductCode1Foreign->Clear(); + this->tboxProductCode2Foreign1->Clear(); + this->tboxProductCode2Foreign2->Clear(); + this->tboxProductCode2Foreign3->Clear(); + if( this->cboxReleaseForeign->Checked ) + { + this->tboxProductNameForeign->Enabled = true; + this->tboxProductCode1Foreign->Enabled = true; + this->tboxProductCode2Foreign1->Enabled = true; + this->tboxProductCode2Foreign2->Enabled = true; + this->tboxProductCode2Foreign3->Enabled = true; + this->parseTmp( root, "/MasterEditorTWL/Form/ProductNameForeign", this->tboxProductNameForeign ); + this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode1Foreign", this->tboxProductCode1Foreign ); + this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2Foreign1", this->tboxProductCode2Foreign1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2Foreign2", this->tboxProductCode2Foreign2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/ProductCode2Foreign3", this->tboxProductCode2Foreign3 ); + } + this->parseTmp( root, "/MasterEditorTWL/Form/Remarks", this->tboxCaption ); + + this->parseTmp( root, "/MasterEditorTWL/Form/Company1", this->tboxCompany1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Depart1", this->tboxDepart1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Name1", this->tboxPerson1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Furigana1", this->tboxFurigana1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Tel1", this->tboxTel1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Fax1", this->tboxFax1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Mail1", this->tboxMail1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/NTSC1", this->tboxNTSC1 ); + this->parseTmp( root, "/MasterEditorTWL/Form/InputPerson2", this->cboxIsInputPerson2 ); + + this->parseTmp( root, "/MasterEditorTWL/Form/Company2", this->tboxCompany2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Depart2", this->tboxDepart2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Name2", this->tboxPerson2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Furigana2", this->tboxFurigana2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Tel2", this->tboxTel2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Fax2", this->tboxFax2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/Mail2", this->tboxMail2 ); + this->parseTmp( root, "/MasterEditorTWL/Form/NTSC2", this->tboxNTSC2 ); + + rbuts = gcnew cli::array{this->rIsWirelessIcon, this->rIsWiFiIcon, this->rIsNoIcon}; + strs = gcnew cli::array{"Wireless","WiFi","None"}; + this->parseTmp( root, "/MasterEditorTWL/Form/DisplayIcon", rbuts, strs ); + + this->parseTmp( root, "/MasterEditorTWL/Form/IsEULA", this->cboxIsEULA ); + this->parseTmp( root, "/MasterEditorTWL/Form/Region", this->combRegion ); + this->parseTmp( root, "/MasterEditorTWL/Form/RatingCERO", this->combCERO ); + this->parseTmp( root, "/MasterEditorTWL/Form/RatingESRB", this->combESRB ); + this->parseTmp( root, "/MasterEditorTWL/Form/RatingUSK", this->combUSK ); + this->parseTmp( root, "/MasterEditorTWL/Form/RatingPEGI", this->combPEGI ); + this->parseTmp( root, "/MasterEditorTWL/Form/RatingPEGI_PRT", this->combPEGI_PRT ); + this->parseTmp( root, "/MasterEditorTWL/Form/RatingPEGI_BBFC", this->combPEGI_BBFC ); + this->parseTmp( root, "/MasterEditorTWL/Form/RatingOFLC", this->combOFLC ); + + this->maskParentalForms(); // ペアレンタルコントロール情報をリージョンに合わせる + +} //loadTmp() + +// 一時保存情報をフォーム情報に変換 +System::Boolean Form1::parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::ComboBox ^comb ) +{ + // コンボボックスの保存情報 - インデックスの範囲に含まれるか調べる(含まれない場合は-1) + System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); + if( System::String::IsNullOrEmpty( text ) ) + return false; + + try + { + System::Int32 index = System::Int32::Parse( text ); // テキストにはインデックスが保存されている + if( (0 <= index) && (index < comb->Items->Count) ) + { + comb->SelectedIndex = index; + return true; + } + else + { + comb->SelectedIndex = -1; + return false; + } + } + catch ( System::Exception ^ex ) // 改ざんされていたとき + { + (void)ex; + comb->SelectedIndex = -1; + return false; + } + return false; +} +System::Boolean Form1::parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::NumericUpDown ^num ) +{ + // テキストボックスの保存情報 - そのまま代入(ただし最大を超える場合は0にする) + System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); + if( System::String::IsNullOrEmpty( text ) ) + return false; + + try + { + System::Int32 val = System::Int32::Parse( text ); // テキストには値が保存されている + if( (0 <= val) && (val <= num->Maximum) ) + { + num->Value = val; + return true; + } + else + { + num->Value = 0; + return false; + } + } + catch ( System::Exception ^ex ) // 改ざんされていたとき + { + (void)ex; + num->Value = 0; + return false; + } + return false; +} +System::Boolean Form1::parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, + cli::array^rbuts, cli::array^textCands ) +{ + // ラジオボタンの保存情報 - テキスト候補に合致するか調べる(合致しない場合は先頭のラジオボタンをチェック) + System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); + if( System::String::IsNullOrEmpty( text ) ) + return false; + + System::Int32 i; + System::Boolean bSearch = false; + for( i=0; i < rbuts->Length; i++ ) // XML中のテキストがどのラジオボタンのテキストに合致するかチェック + { + rbuts[i]->Checked = false; + if( textCands[i]->Equals( text ) ) + { + rbuts[i]->Checked = true; + bSearch = true; + } + } + if( !bSearch ) // 合致しない場合は最初のラジオボタンをチェック + { + rbuts[0]->Checked = true; + } + return bSearch; +} +System::Boolean Form1::parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::CheckBox ^cbox ) +{ + // チェックボタンの保存情報 - Y/Nを調べる(それ以外の場合にはチェックしない) + System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); + if( System::String::IsNullOrEmpty( text ) ) + return false; + + if( text->Equals("Y") ) + cbox->Checked = true; + else + cbox->Checked = false; // 不正な値も含む + return cbox->Checked; +} +System::Boolean Form1::parseTmp( System::Xml::XmlElement ^root, System::String ^xpath, System::Windows::Forms::TextBox ^tbox ) +{ + // テキストボックスの保存情報 - そのまま代入(ただし長さが合わない場合は空白にする) + System::String ^text = MasterEditorTWL::getXPathText( root, xpath ); + if( System::String::IsNullOrEmpty( text ) ) + return false; + + if( text->Length > tbox->MaxLength ) + { + tbox->Text = gcnew System::String(""); + return false; + } + tbox->Text = text; + return true; +} diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form_util.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_util.cpp new file mode 100644 index 00000000..6c67019d --- /dev/null +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form_util.cpp @@ -0,0 +1,265 @@ +#include "stdafx.h" +#include +#include "common.h" +#include "srl.h" +#include "deliverable.h" +#include "crc_whole.h" +#include "utility.h" +#include "lang.h" +#include "FormError.h" +#include "Form1.h" + +using namespace System; +using namespace System::ComponentModel; +using namespace System::Collections; +using namespace System::Windows::Forms; +using namespace System::Data; +using namespace System::Drawing; +using namespace MasterEditorTWL; + +// ---------------------------------------------- +// フォームのチェック +// ---------------------------------------------- + +// テキスト入力がされているかチェック +System::Boolean Form1::checkTextForm( System::String ^formtext, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) +{ + System::String ^msgJ = gcnew System::String( "入力されていません。" ); + System::String ^msgE = gcnew System::String( "No item is set. Please retry to input." ); + + System::String ^tmp = formtext->Replace( " ", "" ); // スペースのみの文字列もエラー + if( (formtext == nullptr) || formtext->Equals("") || tmp->Equals("") ) + { + this->hErrorList->Add( gcnew RCMrcError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); + return false; + } + return true; +} +// 数値入力が正常かどうかチェック +System::Boolean Form1::checkNumRange( + System::Int32 val, System::Int32 min, System::Int32 max, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) +{ + System::String ^msgJ = gcnew System::String( "値の範囲が不正です。やり直してください。" ); + System::String ^msgE = gcnew System::String( "Invalidate range of value. Please retry." ); + + if( (val < min) || (max < val) ) + { + this->hErrorList->Add( gcnew RCMrcError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); + return false; + } + return true; +} +System::Boolean Form1::checkNumRange( System::String ^strval, System::Int32 min, System::Int32 max, + System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) +{ + try + { + System::Int32 i = System::Int32::Parse(strval); + return (this->checkNumRange( i, min, max, labelJ, labelE, affectRom )); + } + catch ( System::FormatException ^ex ) + { + (void)ex; + return (this->checkNumRange( max+1, min, max, labelJ, labelE, affectRom )); // 必ず失敗するように max+1 を検査 + } +} +// コンボボックスをチェック +System::Boolean Form1::checkBoxIndex( System::Windows::Forms::ComboBox ^box, System::String ^labelJ, System::String ^labelE, System::Boolean affectRom ) +{ + System::String ^msgJ = gcnew System::String( "選択されていません。" ); + System::String ^msgE = gcnew System::String( "One item is not selected." ); + + if( box->SelectedIndex < 0 ) + { + this->hErrorList->Add( gcnew RCMrcError( + labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); + } + return true; +} + + +// -------------------------------------------------------- +// エラー情報の登録 +// -------------------------------------------------------- + +// 読み込み時エラーの登録 +void Form1::setGridError( void ) +{ + this->gridError->Rows->Clear(); + if( this->hSrl->hErrorList != nullptr ) + { + for each( RCMrcError ^err in this->hSrl->hErrorList ) + { + this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); + this->colorGridError( err ); + } + } +} + +void Form1::setGridWarn( void ) +{ + this->gridWarn->Rows->Clear(); + if( this->hSrl->hWarnList != nullptr ) + { + for each( RCMrcError ^err in this->hSrl->hWarnList ) + { + this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); + this->colorGridWarn( err ); + } + } +} + +// 読み込み時に検出した修正可能エラーに現在の入力を反映 +void Form1::overloadGridError( void ) +{ + this->gridError->Rows->Clear(); + if( this->hSrl->hErrorList != nullptr ) + { + for each( RCMrcError ^err in this->hSrl->hErrorList ) + { + if( !err->EnableModify ) // 修正可能な情報は表示しない + { + this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); + this->colorGridError( err ); + } + } + } + if( this->hErrorList != nullptr ) + { + for each( RCMrcError ^err in this->hErrorList ) + { + this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); + this->colorGridError( err ); + } + } +} +void Form1::overloadGridWarn( void ) +{ + this->gridWarn->Rows->Clear(); + if( this->hSrl->hWarnList != nullptr ) + { + for each( RCMrcError ^err in this->hSrl->hWarnList ) + { + if( !err->EnableModify ) + { + this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); + this->colorGridWarn( err ); + } + } + } + if( this->hWarnList != nullptr ) + { + for each( RCMrcError ^err in this->hWarnList ) + { + this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); + this->colorGridWarn( err ); + } + } +} + +// セルの色を変える +void Form1::colorGridError( RCMrcError ^err ) +{ + if( err->AffectRom && !err->EnableModify ) // SRLに関係ありで修正不可 + { + System::Int32 last = this->gridError->Rows->Count - 2; // 追加直後の行 + this->gridError->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Red; + } + else if( err->AffectRom && err->EnableModify ) // SRLに関係ありで修正可 + { + System::Int32 last = this->gridError->Rows->Count - 2; + this->gridError->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Blue; + } +} +void Form1::colorGridWarn( RCMrcError ^err ) +{ + if( err->AffectRom && !err->EnableModify ) + { + System::Int32 last = this->gridWarn->Rows->Count - 2; + this->gridWarn->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Red; + } + else if( err->AffectRom && err->EnableModify ) + { + System::Int32 last = this->gridWarn->Rows->Count - 2; + this->gridWarn->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Blue; + } +} + +// まとめて更新 +void Form1::updateGrid(void) +{ + if( this->rErrorReading->Checked == true ) + { + this->setGridError(); + this->setGridWarn(); + } + else + { + if( !System::String::IsNullOrEmpty(this->tboxFile->Text) ) + { + this->hErrorList->Clear(); + this->hWarnList->Clear(); + this->checkSrlForms(); + this->checkDeliverableForms(); + this->overloadGridError(); + this->overloadGridWarn(); + } + } +} + +// ---------------------------------------------- +// エラーカウント +// ---------------------------------------------- + +// SRLには関係しない書類上のエラーをチェック +System::Boolean Form1::isValidOnlyDeliverable(void) +{ + System::Int32 count = 0; + + // SRLクラスのエラーリストはすべてSRLに関係するのでチェックしない + // -> 入力エラーのみのチェックでよい + for each( RCMrcError ^err in this->hErrorList ) + { + if( !err->AffectRom ) + count++; + } + return (count == 0); +} + +// SRLのバイナリに影響する項目にエラーがあるかチェック +System::Boolean Form1::isValidAffectRom(void) +{ + System::Int32 count = 0; + + // SRLクラスの修正不可エラーをカウント + // (修正可エラーは入力によって修正されてるかもしれないのでチェックしない) + for each( RCMrcError ^err in this->hSrl->hErrorList ) + { + if( !err->EnableModify ) // すべてSRLバイナリに影響する + count++; + } + + // SRLバイナリに影響するエラーの中で + // 修正可エラーがフォーム入力によって修正されているかカウント + // (エラーリストが更新されていることが前提) + for each( RCMrcError ^err in this->hErrorList ) + { + if( err->AffectRom ) // 修正不可エラーは存在しない + count++; + } + return (count == 0); +} + +// SRLのバイナリに影響する項目の中で修正可能なエラーだけをチェック +System::Boolean Form1::isValidAffectRomModified(void) +{ + System::Int32 count = 0; + for each( RCMrcError ^err in this->hErrorList ) + { + if( err->AffectRom ) // 修正不可エラーは存在しない + count++; + } + return (count == 0); +} + +// end of file \ No newline at end of file diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/MasterEditorTWL.vcproj b/build/tools/MasterEditorTWL/MasterEditorTWL/MasterEditorTWL.vcproj index 4b89ddd6..09282b08 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/MasterEditorTWL.vcproj +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/MasterEditorTWL.vcproj @@ -211,6 +211,34 @@ RelativePath=".\deliverable.cpp" > + + + + + + + + + + + + + + diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/common.h b/build/tools/MasterEditorTWL/MasterEditorTWL/common.h index e2e78776..fec3da49 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/common.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/common.h @@ -1,7 +1,7 @@ #pragma once #define METWL_WHETHER_PLATFORM_CHECK // プラットフォームがTWL対応以外かどうかをチェックする -//#define METWL_WHETHER_SIGN_DECRYPT // 署名を外してダイジェストをベリファイする +#define METWL_WHETHER_SIGN_DECRYPT // 署名を外してダイジェストをベリファイする #define METWL_WHETHER_MRC // MRC機能を含めるか //#define METWL_LIGHT_CHECK // 提出条件を緩くするか diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp index 7f613e24..5483eb1b 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp @@ -491,194 +491,194 @@ ECDeliverableResult RCDeliverable::writeSpreadsheet( } // ペアレンタルコントロール - if( node->FirstChild->Value->Equals( "TagRatingCERO" ) ) - { - node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_CERO ]->ToString(); - } - if( node->FirstChild->Value->Equals( "TagRatingCEROStr" ) ) - { - node->FirstChild->Value = MasterEditorTWL::transRatingToString( - OS_TWL_PCTL_OGN_CERO, - *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_CERO ]), - *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_CERO ]), - english ); - } - if( node->FirstChild->Value->Equals( "TagEnableCERO" ) ) - { - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_CERO ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } - if( node->FirstChild->Value->Equals( "TagAlwaysCERO" ) ) - { - if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_CERO ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } + //if( node->FirstChild->Value->Equals( "TagRatingCERO" ) ) + //{ + // node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_CERO ]->ToString(); + //} + //if( node->FirstChild->Value->Equals( "TagRatingCEROStr" ) ) + //{ + // node->FirstChild->Value = MasterEditorTWL::transRatingToString( + // OS_TWL_PCTL_OGN_CERO, + // *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_CERO ]), + // *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_CERO ]), + // english ); + //} + //if( node->FirstChild->Value->Equals( "TagEnableCERO" ) ) + //{ + // if( *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_CERO ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} + //if( node->FirstChild->Value->Equals( "TagAlwaysCERO" ) ) + //{ + // if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_CERO ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} - if( node->FirstChild->Value->Equals( "TagRatingESRB" ) ) - { - node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_ESRB ]->ToString(); - } - if( node->FirstChild->Value->Equals( "TagRatingESRBStr" ) ) - { - node->FirstChild->Value = MasterEditorTWL::transRatingToString( - OS_TWL_PCTL_OGN_ESRB, - *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_ESRB ]), - *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_ESRB ]), - english ); - } - if( node->FirstChild->Value->Equals( "TagEnableESRB" ) ) - { - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_ESRB ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } - if( node->FirstChild->Value->Equals( "TagAlwaysESRB" ) ) - { - if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_ESRB ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } + //if( node->FirstChild->Value->Equals( "TagRatingESRB" ) ) + //{ + // node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_ESRB ]->ToString(); + //} + //if( node->FirstChild->Value->Equals( "TagRatingESRBStr" ) ) + //{ + // node->FirstChild->Value = MasterEditorTWL::transRatingToString( + // OS_TWL_PCTL_OGN_ESRB, + // *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_ESRB ]), + // *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_ESRB ]), + // english ); + //} + //if( node->FirstChild->Value->Equals( "TagEnableESRB" ) ) + //{ + // if( *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_ESRB ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} + //if( node->FirstChild->Value->Equals( "TagAlwaysESRB" ) ) + //{ + // if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_ESRB ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} - if( node->FirstChild->Value->Equals( "TagRatingUSK" ) ) - { - node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_USK ]->ToString(); - } - if( node->FirstChild->Value->Equals( "TagRatingUSKStr" ) ) - { - node->FirstChild->Value = MasterEditorTWL::transRatingToString( - OS_TWL_PCTL_OGN_USK, - *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_USK ]), - *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_USK ]), - english ); - } - if( node->FirstChild->Value->Equals( "TagEnableUSK" ) ) - { - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_USK ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } - if( node->FirstChild->Value->Equals( "TagAlwaysUSK" ) ) - { - if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_USK ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } + //if( node->FirstChild->Value->Equals( "TagRatingUSK" ) ) + //{ + // node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_USK ]->ToString(); + //} + //if( node->FirstChild->Value->Equals( "TagRatingUSKStr" ) ) + //{ + // node->FirstChild->Value = MasterEditorTWL::transRatingToString( + // OS_TWL_PCTL_OGN_USK, + // *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_USK ]), + // *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_USK ]), + // english ); + //} + //if( node->FirstChild->Value->Equals( "TagEnableUSK" ) ) + //{ + // if( *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_USK ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} + //if( node->FirstChild->Value->Equals( "TagAlwaysUSK" ) ) + //{ + // if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_USK ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} - if( node->FirstChild->Value->Equals( "TagRatingPEGI" ) ) - { - node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_GEN ]->ToString(); - } - if( node->FirstChild->Value->Equals( "TagRatingPEGIStr" ) ) - { - node->FirstChild->Value = MasterEditorTWL::transRatingToString( - OS_TWL_PCTL_OGN_PEGI_GEN, - *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_GEN ]), - *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_GEN ]), - english ); - } - if( node->FirstChild->Value->Equals( "TagEnablePEGI" ) ) - { - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_GEN ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } - if( node->FirstChild->Value->Equals( "TagAlwaysPEGI" ) ) - { - if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_GEN ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } + //if( node->FirstChild->Value->Equals( "TagRatingPEGI" ) ) + //{ + // node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_GEN ]->ToString(); + //} + //if( node->FirstChild->Value->Equals( "TagRatingPEGIStr" ) ) + //{ + // node->FirstChild->Value = MasterEditorTWL::transRatingToString( + // OS_TWL_PCTL_OGN_PEGI_GEN, + // *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_PEGI_GEN ]), + // *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_GEN ]), + // english ); + //} + //if( node->FirstChild->Value->Equals( "TagEnablePEGI" ) ) + //{ + // if( *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_PEGI_GEN ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} + //if( node->FirstChild->Value->Equals( "TagAlwaysPEGI" ) ) + //{ + // if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_GEN ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} - if( node->FirstChild->Value->Equals( "TagRatingPEGIPRT" ) ) - { - node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_PRT ]->ToString(); - } - if( node->FirstChild->Value->Equals( "TagRatingPEGIPRTStr" ) ) - { - node->FirstChild->Value = MasterEditorTWL::transRatingToString( - OS_TWL_PCTL_OGN_PEGI_PRT, - *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_PRT ]), - *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_PRT ]), - english ); - } - if( node->FirstChild->Value->Equals( "TagEnablePEGIPRT" ) ) - { - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_PRT ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } - if( node->FirstChild->Value->Equals( "TagAlwaysPEGIPRT" ) ) - { - if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_PRT ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } + //if( node->FirstChild->Value->Equals( "TagRatingPEGI_PRT" ) ) + //{ + // node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_PRT ]->ToString(); + //} + //if( node->FirstChild->Value->Equals( "TagRatingPEGI_PRTStr" ) ) + //{ + // node->FirstChild->Value = MasterEditorTWL::transRatingToString( + // OS_TWL_PCTL_OGN_PEGI_PRT, + // *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_PEGI_PRT ]), + // *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_PRT ]), + // english ); + //} + //if( node->FirstChild->Value->Equals( "TagEnablePEGI_PRT" ) ) + //{ + // if( *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_PEGI_PRT ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} + //if( node->FirstChild->Value->Equals( "TagAlwaysPEGI_PRT" ) ) + //{ + // if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_PRT ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} - if( node->FirstChild->Value->Equals( "TagRatingPEGIBBFC" ) ) - { - node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_BBFC ]->ToString(); - } - if( node->FirstChild->Value->Equals( "TagRatingPEGIBBFCStr" ) ) - { - node->FirstChild->Value = MasterEditorTWL::transRatingToString( - OS_TWL_PCTL_OGN_PEGI_BBFC, - *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_BBFC ]), - *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_BBFC ]), - english ); - } - if( node->FirstChild->Value->Equals( "TagEnablePEGIBBFC" ) ) - { - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_PEGI_BBFC ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } - if( node->FirstChild->Value->Equals( "TagAlwaysPEGIBBFC" ) ) - { - if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_BBFC ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } + //if( node->FirstChild->Value->Equals( "TagRatingPEGI_BBFC" ) ) + //{ + // node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_BBFC ]->ToString(); + //} + //if( node->FirstChild->Value->Equals( "TagRatingPEGI_BBFCStr" ) ) + //{ + // node->FirstChild->Value = MasterEditorTWL::transRatingToString( + // OS_TWL_PCTL_OGN_PEGI_BBFC, + // *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_PEGI_BBFC ]), + // *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_PEGI_BBFC ]), + // english ); + //} + //if( node->FirstChild->Value->Equals( "TagEnablePEGI_BBFC" ) ) + //{ + // if( *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_PEGI_BBFC ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} + //if( node->FirstChild->Value->Equals( "TagAlwaysPEGI_BBFC" ) ) + //{ + // if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_PEGI_BBFC ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} - if( node->FirstChild->Value->Equals( "TagRatingOFLC" ) ) - { - node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_OFLC ]->ToString(); - } - if( node->FirstChild->Value->Equals( "TagRatingOFLCStr" ) ) - { - node->FirstChild->Value = MasterEditorTWL::transRatingToString( - OS_TWL_PCTL_OGN_OFLC, - *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_OFLC ]), - *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_OFLC ]), - english ); - } - if( node->FirstChild->Value->Equals( "TagEnableOFLC" ) ) - { - if( *(hSrl->hArrayParentalEffect[ OS_TWL_PCTL_OGN_OFLC ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } - if( node->FirstChild->Value->Equals( "TagAlwaysOFLC" ) ) - { - if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_OFLC ]) ) - node->FirstChild->Value = gcnew System::String( "○" ); - else - node->FirstChild->Value = nullptr; - } + //if( node->FirstChild->Value->Equals( "TagRatingOFLC" ) ) + //{ + // node->FirstChild->Value = hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_OFLC ]->ToString(); + //} + //if( node->FirstChild->Value->Equals( "TagRatingOFLCStr" ) ) + //{ + // node->FirstChild->Value = MasterEditorTWL::transRatingToString( + // OS_TWL_PCTL_OGN_OFLC, + // *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_OFLC ]), + // *(hSrl->hArrayParentalRating[ OS_TWL_PCTL_OGN_OFLC ]), + // english ); + //} + //if( node->FirstChild->Value->Equals( "TagEnableOFLC" ) ) + //{ + // if( *(hSrl->hArrayParentalEnable[ OS_TWL_PCTL_OGN_OFLC ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} + //if( node->FirstChild->Value->Equals( "TagAlwaysOFLC" ) ) + //{ + // if( *(hSrl->hArrayParentalAlways[ OS_TWL_PCTL_OGN_OFLC ]) ) + // node->FirstChild->Value = gcnew System::String( "○" ); + // else + // node->FirstChild->Value = nullptr; + //} // ROM内登録データを1バイトずつ表に書き込む if( node->FirstChild->Value->Equals( "TagRomVersionHex" ) ) diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/lang.h b/build/tools/MasterEditorTWL/MasterEditorTWL/lang.h index 47867ce5..682af2e6 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/lang.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/lang.h @@ -93,6 +93,6 @@ #define LANG_NO_ICON_E ("Display No Icon") #define LANG_REGION_PCTL_E ("Card Region and Parental Control") #define LANG_REGION_E ("Card Region") -#define LANG_PCTL_RATING_E ("Rating Age") +#define LANG_PCTL_RATING_E ("Rating Information") #define LANG_PCTL_ENABLE_E ("Enable Control") #define LANG_PCTL_ALWAYS_E ("Rating Pending") diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp index ef97650f..7961e912 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp @@ -77,6 +77,14 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename ) } } + // エラーリストをクリア + this->hErrorList = gcnew System::Collections::Generic::List; + this->hWarnList = gcnew System::Collections::Generic::List; + this->hParentalErrorList = gcnew System::Collections::Generic::List; + this->hErrorList->Clear(); + this->hWarnList->Clear(); + this->hParentalErrorList->Clear(); + // ROMヘッダの値をROM固有情報フィールドに反映させる (void)this->setRomInfo(); @@ -182,21 +190,6 @@ ECSrlResult RCSrl::setRomInfo(void) break; } - // ペアレンタルコントロール - this->hArrayParentalRating = gcnew cli::array(PARENTAL_CONTROL_INFO_SIZE); - this->hArrayParentalEffect = gcnew cli::array(PARENTAL_CONTROL_INFO_SIZE); - this->hArrayParentalAlways = gcnew cli::array(PARENTAL_CONTROL_INFO_SIZE); - for( i=0; i < PARENTAL_CONTROL_INFO_SIZE; i++ ) - { - System::Byte rating = this->pRomHeader->s.parental_control_rating_info[i] & OS_TWL_PCTL_OGNINFO_AGE_MASK; - System::Boolean effect = ((this->pRomHeader->s.parental_control_rating_info[i] & OS_TWL_PCTL_OGNINFO_ENABLE_MASK) != 0)?true:false; - System::Boolean force = ((this->pRomHeader->s.parental_control_rating_info[i] & OS_TWL_PCTL_OGNINFO_ALWAYS_MASK) != 0)?true:false; - - this->hArrayParentalRating[i] = gcnew System::Byte( rating ); - this->hArrayParentalEffect[i] = gcnew System::Boolean( effect ); - this->hArrayParentalAlways[i] = gcnew System::Boolean( force ); - } - // TWL専用情報 this->hIsNormalJump = gcnew System::Boolean( (this->pRomHeader->s.permit_landing_normal_jump != 0)?true:false ); this->hIsTmpJump = gcnew System::Boolean( (this->pRomHeader->s.permit_landing_tmp_jump != 0)?true:false ); @@ -324,15 +317,142 @@ ECSrlResult RCSrl::setRomInfo(void) this->hIsRegionEurope = gcnew System::Boolean( ((map & METWL_MASK_REGION_EUROPE) != 0)?true:false ); this->hIsRegionAustralia = gcnew System::Boolean( ((map & METWL_MASK_REGION_AUSTRALIA) != 0)?true:false ); + // ペアレンタルコントロール + this->setParentalControlInfo(); + return ECSrlResult::NOERROR; } // ECSrlResult RCSrl::setRomInfo(void) +// ROMヘッダ内のペアレンタルコントロール情報をフィールドに反映させる +void RCSrl::setParentalControlInfo(void) +{ + // リージョンに含まれていないものは読み込まない + this->hArrayParentalIndex = gcnew cli::array(PARENTAL_CONTROL_INFO_SIZE); + + int i; + for( i=0; i < PARENTAL_CONTROL_INFO_SIZE; i++ ) + { + this->hArrayParentalIndex[i] = -1; + } + + // リージョンに含まれている団体をリストアップ + u32 region = this->pRomHeader->s.card_region_bitmap; + switch( region ) + { + case METWL_MASK_REGION_JAPAN: + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_CERO ); // リージョンに含まれない団体の情報は読み込まない + break; + + case METWL_MASK_REGION_AMERICA: + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_ESRB ); + break; + + case METWL_MASK_REGION_EUROPE: + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_USK ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_GEN ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_PRT ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_BBFC ); + break; + + case METWL_MASK_REGION_AUSTRALIA: + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_OFLC ); + break; + + case (METWL_MASK_REGION_EUROPE|METWL_MASK_REGION_AUSTRALIA): + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_USK ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_GEN ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_PRT ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_BBFC ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_OFLC ); + break; + +#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) + case METWL_MASK_REGION_ALL: + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_CERO ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_ESRB ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_USK ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_GEN ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_PRT ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_PEGI_BBFC ); + this->setOneRatingOrgInfo( OS_TWL_PCTL_OGN_OFLC ); + break; +#endif //#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) + + default: + this->hParentalErrorList->Add( gcnew RCMrcError( + "カードリージョン", 0x1b0, 0x1b3, "仕向地の組み合わせが不正です。ペアレンタルコントロール情報は無視して読み込まれました。", + "Card Region", "Illigal Region. Parental Control Information is ignored in reading.", true, true ) ); + break; + } +} + +// 団体のレーティング情報からコンボボックスのインデックスを決定する +void RCSrl::setOneRatingOrgInfo( int ogn ) +{ + System::Boolean enable = ((this->pRomHeader->s.parental_control_rating_info[ ogn ] & OS_TWL_PCTL_OGNINFO_ENABLE_MASK) != 0)?true:false; + System::Boolean rp = ((this->pRomHeader->s.parental_control_rating_info[ ogn ] & OS_TWL_PCTL_OGNINFO_ALWAYS_MASK) != 0)?true:false; + System::Byte age = this->pRomHeader->s.parental_control_rating_info[ ogn ] & OS_TWL_PCTL_OGNINFO_AGE_MASK; + + cli::array ^ages = MasterEditorTWL::getOgnRatingAges( ogn ); + System::String ^name = MasterEditorTWL::getOgnName( ogn ); + + int index = -1; + if( !enable ) // 未定義 + { + index = -1; + this->hParentalErrorList->Add( gcnew RCMrcError( + "ペアレンタルコントロール情報", 0x2f0, 0x2ff, + name + ": 未定義です。", + "Parental Control Info.", + name + ": Undefined.", true, true ) ); + } + else + { + if( rp ) // 審査中 + { + if( age == 0 ) // 年齢が0のときは審査中とみなす + { + index = ages->Length; // 配列の最後の要素の次が「審査中」 + } + else + { + index = -1; // それ以外はエラー + this->hParentalErrorList->Add( gcnew RCMrcError( + "ペアレンタルコントロール情報", 0x2f0, 0x2ff, + name + ": 審査中指定とレーティング年齢が同時に設定されています。", + "Parental Control Info.", + name + ": Both the Rating-Peding setting and the rating age are setting.", true, true ) ); + } + } + else + { + index = -1; // 団体が認めていない年齢が格納されているときエラー + int i; + for( i=0; i < ages->Length; i++ ) + { + if( age == ages[i] ) + { + index = i; + } + } + if( index < 0 ) + { + this->hParentalErrorList->Add( gcnew RCMrcError( + "ペアレンタルコントロール情報", 0x2f0, 0x2ff, + name + ": レーティング年齢が団体によって指定された値ではありません。", + "Parental Control Info.", + name + ": An age isn't accepted by the organization.", true, true ) ); + } + } + } + this->hArrayParentalIndex[ ogn ] = index; +} + // // ROMヘッダにROM固有情報フィールドの値を反映させる // ECSrlResult RCSrl::setRomHeader(void) { - System::Int32 i; ECSrlResult result; // ROMヘッダの[0,0x160)の領域はRead Onlyで変更しない @@ -359,21 +479,7 @@ ECSrlResult RCSrl::setRomHeader(void) this->pRomHeader->s.card_region_bitmap = map; // ペアレンタルコントロール - for( i=0; i < PARENTAL_CONTROL_INFO_SIZE; i++ ) - { - System::Byte effect = 0; - System::Byte force = 0; - if( this->hArrayParentalEffect[i]->Equals(true) ) - { - effect = OS_TWL_PCTL_OGNINFO_ENABLE_MASK; - } - if( this->hArrayParentalAlways[i]->Equals(true) ) - { - force = OS_TWL_PCTL_OGNINFO_ALWAYS_MASK; - } - - this->pRomHeader->s.parental_control_rating_info[i] = effect | force | *(this->hArrayParentalRating[i]); - } + this->setParentalControlHeader(); // ROMヘッダのCRCと署名を更新する result = this->calcRomHeaderCRC(); @@ -390,6 +496,35 @@ ECSrlResult RCSrl::setRomHeader(void) return ECSrlResult::NOERROR; } // ECSrlResult RCSrl::setRomHeader(void) +// ペアレンタルコントロールのプロパティをROMヘッダに反映させる +void RCSrl::setParentalControlHeader(void) +{ + int i; + for( i=0; i < PARENTAL_CONTROL_INFO_SIZE; i++ ) + { + cli::array ^ages = MasterEditorTWL::getOgnRatingAges( i ); // 設定可能年齢リストを取得 + + u8 rating; + if( this->hArrayParentalIndex[i] < 0 ) // 未定義 + { + rating = 0x00; + } + else + { + int index = this->hArrayParentalIndex[i]; + if( index == ages->Length ) // 審査中 + { + rating = OS_TWL_PCTL_OGNINFO_ENABLE_MASK | OS_TWL_PCTL_OGNINFO_ALWAYS_MASK; + } + else // レーティング年齢を設定 + { + rating = OS_TWL_PCTL_OGNINFO_ALWAYS_MASK | ages[ index ]; + } + } + this->pRomHeader->s.parental_control_rating_info[i] = rating; + } +} + // // ヘッダのCRCを算出 // @@ -749,12 +884,6 @@ ECSrlResult RCSrl::searchLicenses(FILE *fp) // ECSrlResult RCSrl::mrc( FILE *fp ) { - this->hErrorList = gcnew System::Collections::Generic::List; - this->hWarnList = gcnew System::Collections::Generic::List; - - this->hErrorList->Clear(); - this->hWarnList->Clear(); - #ifdef METWL_WHETHER_MRC ECSrlResult result; result = this->mrcNTR( fp ); @@ -767,6 +896,7 @@ ECSrlResult RCSrl::mrc( FILE *fp ) { return result; } + this->hErrorList->AddRange( this->hParentalErrorList ); // ペアレンタルコントロールのリストは別につくっているので追加 #endif return ECSrlResult::NOERROR; } @@ -1332,12 +1462,6 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) false, true ) ); } - ECSrlResult pctl = this->mrcTWLParentalControl(); - if( pctl != ECSrlResult::NOERROR ) - { - return pctl; - } - this->mrcBanner( fp ); // 追加チェック @@ -1378,269 +1502,6 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) return ECSrlResult::NOERROR; } // mrcTWL() -// PCTL専用 -ECSrlResult RCSrl::mrcTWLParentalControl(void) -{ - // リージョンが正常か - u32 region = this->pRomHeader->s.card_region_bitmap; - if( !this->mrcRegion( region ) ) - { - return ECSrlResult::NOERROR; // これ以上チェックしない - } - - // リージョンに含まれている団体/含まれていない団体の設定をチェック - this->mrcRegionOrganization( region ); - - return ECSrlResult::NOERROR; -} //mrcParentalControl() - -// PCTLチェックの一部 リージョンが正常かチェック -System::Boolean RCSrl::mrcRegion( System::UInt32 region ) -{ - System::Boolean bRegionResult = true; // リージョン設定が正常であるか - if( (region != METWL_MASK_REGION_JAPAN) && (region != METWL_MASK_REGION_AMERICA) && - (region != METWL_MASK_REGION_EUROPE) && (region != METWL_MASK_REGION_AUSTRALIA) && - (region != (METWL_MASK_REGION_EUROPE | METWL_MASK_REGION_AUSTRALIA)) ) - { -#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - if( region != METWL_MASK_REGION_ALL ) // オールリージョンを許す - { - this->hErrorList->Add( gcnew RCMrcError( - "カードリージョン", 0x1b0, 0x1b3, "仕向地の組み合わせが不正です。本ツールを用いて修正できます。", - "Card Region", "Illigal Region. This tool can modify this information.", true, true ) ); - bRegionResult = false; - } -#else - { - this->hErrorList->Add( gcnew RCMrcError( - "カードリージョン", 0x1b0, 0x1b3, "仕向地の組み合わせが不正です。本ツールを用いて修正してください。", - "Card Region", "Illigal Region. Please modify this information using this tool.", true, true ) ); - bRegionResult = false; - } -#endif - } - // リージョンが不正のときすべてのPCTL情報をクリア(ROMヘッダには影響しない) - if( !bRegionResult ) - { - int i; - for( i=0; i < PARENTAL_CONTROL_INFO_SIZE; i++ ) - { - this->clearParentalControl( i ); - } - this->hWarnList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", 0x2f0, 0x2ff, - "仕向地の設定が不正のため、ROMデータ内のすべてのレーティング団体の情報を無視して読み込みました。本ツールを用いて修正してください。", - "Parental Control", - "Illigal region. In reading, therefore, settings for all rating organizations are ignored. Please set this infomation using this tool.", - true, true ) ); - } - return bRegionResult; -} - -// PCTLチェックの一部 リージョンに含まれる団体/含まれない団体の設定をチェック -void RCSrl::mrcRegionOrganization( System::UInt32 region ) -{ - // 表示用の団体ラベル - cli::array ^ognArray = gcnew cli::array(PARENTAL_CONTROL_INFO_SIZE); - System::Int32 i; - for( i=0; i < PARENTAL_CONTROL_INFO_SIZE; i++ ) - { - switch(i) - { - case OS_TWL_PCTL_OGN_CERO: - ognArray[i] = gcnew System::String( "CERO: " ); - break; - case OS_TWL_PCTL_OGN_ESRB: - ognArray[i] = gcnew System::String( "ESRB: " ); - break; - case OS_TWL_PCTL_OGN_USK: - ognArray[i] = gcnew System::String( "USK: " ); - break; - case OS_TWL_PCTL_OGN_PEGI_GEN: - ognArray[i] = gcnew System::String( "PEGI(General): " ); - break; - case OS_TWL_PCTL_OGN_PEGI_PRT: - ognArray[i] = gcnew System::String( "PEGI(Portugal): " ); - break; - case OS_TWL_PCTL_OGN_PEGI_BBFC: - ognArray[i] = gcnew System::String( "PEGI and BBFC: " ); - break; - case OS_TWL_PCTL_OGN_OFLC: - ognArray[i] = gcnew System::String( "OFLC: " ); - break; - } - } - - // リージョンに含まれる団体と含まれない団体をリスト化する - System::Collections::Generic::List ^inList = gcnew System::Collections::Generic::List(); - inList->Clear(); - System::Collections::Generic::List ^exList = gcnew System::Collections::Generic::List(); - exList->Clear(); - - switch( region ) - { - case METWL_MASK_REGION_JAPAN: - inList->Add( OS_TWL_PCTL_OGN_CERO ); // 含まれるリスト - exList->Add( OS_TWL_PCTL_OGN_ESRB ); // 含まれないリスト - exList->Add( OS_TWL_PCTL_OGN_USK ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_GEN ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_PRT ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_BBFC ); - exList->Add( OS_TWL_PCTL_OGN_OFLC ); - break; - - case METWL_MASK_REGION_AMERICA: - exList->Add( OS_TWL_PCTL_OGN_CERO ); - inList->Add( OS_TWL_PCTL_OGN_ESRB ); - exList->Add( OS_TWL_PCTL_OGN_USK ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_GEN ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_PRT ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_BBFC ); - exList->Add( OS_TWL_PCTL_OGN_OFLC ); - break; - - case METWL_MASK_REGION_EUROPE: - exList->Add( OS_TWL_PCTL_OGN_CERO ); - exList->Add( OS_TWL_PCTL_OGN_ESRB ); - inList->Add( OS_TWL_PCTL_OGN_USK ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_GEN ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_PRT ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_BBFC ); - exList->Add( OS_TWL_PCTL_OGN_OFLC ); - break; - - case METWL_MASK_REGION_AUSTRALIA: - exList->Add( OS_TWL_PCTL_OGN_CERO ); - exList->Add( OS_TWL_PCTL_OGN_ESRB ); - exList->Add( OS_TWL_PCTL_OGN_USK ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_GEN ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_PRT ); - exList->Add( OS_TWL_PCTL_OGN_PEGI_BBFC ); - inList->Add( OS_TWL_PCTL_OGN_OFLC ); - break; - - case (METWL_MASK_REGION_EUROPE|METWL_MASK_REGION_AUSTRALIA): - exList->Add( OS_TWL_PCTL_OGN_CERO ); - exList->Add( OS_TWL_PCTL_OGN_ESRB ); - inList->Add( OS_TWL_PCTL_OGN_USK ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_GEN ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_PRT ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_BBFC ); - inList->Add( OS_TWL_PCTL_OGN_OFLC ); - break; - -#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - case METWL_MASK_REGION_ALL: - inList->Add( OS_TWL_PCTL_OGN_CERO ); - inList->Add( OS_TWL_PCTL_OGN_ESRB ); - inList->Add( OS_TWL_PCTL_OGN_USK ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_GEN ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_PRT ); - inList->Add( OS_TWL_PCTL_OGN_PEGI_BBFC ); - inList->Add( OS_TWL_PCTL_OGN_OFLC ); - break; -#endif //#if defined(METWL_VER_APPTYPE_SYSTEM) || defined(METWL_VER_APPTYPE_SECURE) || defined(METWL_VER_APPTYPE_LAUNCHER) - } - - // リージョンに含まれる団体の情報が正しいか調べる - for each ( System::Byte ogn in inList ) - { - this->mrcRating( ogn ); - } - - // リージョンに含まれない団体の情報は無視する - for each ( System::Byte ogn in exList ) - { - this->clearParentalControl( ogn ); - } -} //mrcRegion - -// レーティング値が正常かどうかチェック -void RCSrl::mrcRating( System::Byte ogn ) -{ - System::String ^warnDisableJ = gcnew System::String( "制限が無効であるにもかかわらずレーティングが設定されていため、レーティングを無視して読み込みました。本ツールを用いて修正してください。" ); - System::String ^warnDisableE = gcnew System::String( "Rating can't be set when control isn't enable. rating setting is ignored. Please set this infomation using this tool." ); - System::String ^warnIllegalJ = gcnew System::String( "レーティング情報が不正であるため、無視して読み込みました。本ツールを用いて修正してください。" ); - System::String ^warnIllegalE = gcnew System::String( "Illegal rating. rating setting is ignored. Please set this information using this tool." ); - System::String ^warnPendingJ = gcnew System::String( "Rating Pendingが指定されています。この指定とレーティング値は同時に設定できないため、レーティング値を無視して読み込みました。" ); - System::String ^warnPendingE = gcnew System::String( "Rating Pending is setting. It is exclusive a rating age. The age is ignored." ); - - cli::array ^ognArray = gcnew cli::array(PARENTAL_CONTROL_INFO_SIZE); - System::Int32 i; - for( i=0; i < PARENTAL_CONTROL_INFO_SIZE; i++ ) - { - switch(i) - { - case OS_TWL_PCTL_OGN_CERO: - ognArray[i] = gcnew System::String( "CERO: " ); - break; - case OS_TWL_PCTL_OGN_ESRB: - ognArray[i] = gcnew System::String( "ESRB: " ); - break; - case OS_TWL_PCTL_OGN_USK: - ognArray[i] = gcnew System::String( "USK: " ); - break; - case OS_TWL_PCTL_OGN_PEGI_GEN: - ognArray[i] = gcnew System::String( "PEGI(General): " ); - break; - case OS_TWL_PCTL_OGN_PEGI_PRT: - ognArray[i] = gcnew System::String( "PEGI(Portugal): " ); - break; - case OS_TWL_PCTL_OGN_PEGI_BBFC: - ognArray[i] = gcnew System::String( "PEGI and BBFC: " ); - break; - case OS_TWL_PCTL_OGN_OFLC: - ognArray[i] = gcnew System::String( "OFLC: " ); - break; - } - } - - if( *(this->hArrayParentalEffect[ ogn ]) == false ) - { - if( *this->hArrayParentalAlways[ ogn ] || (*this->hArrayParentalRating[ ogn ] != 0 ) ) - { - this->hWarnList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", 0x2f0, 0x2ff, ognArray[ ogn ] + warnDisableJ, - "Parental Control", ognArray[ ogn ] + warnDisableE, true, true ) ); - this->clearParentalControl( ogn ); - } - } - else - { - // 間違っていたら"未審査"が返ってくる - System::String ^str = - MasterEditorTWL::transRatingToString( ogn, true, *(this->hArrayParentalRating[ogn]), false ); - - if( *(this->hArrayParentalAlways[ogn]) == false ) - { - // RPが立っていないときレーティング値が設定されていなかったらダメ - if( (str != nullptr) && str->Equals( L"未審査" ) ) - { - this->hWarnList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", 0x2f0, 0x2ff, ognArray[ ogn ] + warnIllegalJ, - "Parental Control", ognArray[ ogn ] + warnIllegalE, true, true ) ); - this->clearParentalControl( ogn ); - } - } - else - { - // RPが立っていたら問答無用に警告 - this->hWarnList->Add( gcnew RCMrcError( - "ペアレンタルコントロール情報", 0x2f0, 0x2ff, ognArray[ ogn ] + warnPendingJ, - "Parental Control", ognArray[ ogn ] + warnPendingE, true, true ) ); - this->clearParentalControl( ogn ); - } - } -} //mrcRating() - -// ペアレンタルコントロールのクリア -void RCSrl::clearParentalControl( System::Byte ogn ) -{ - this->hArrayParentalRating[ ogn ] = gcnew System::Byte( 0x00 ); - this->hArrayParentalEffect[ ogn ] = gcnew System::Boolean( false ); - this->hArrayParentalAlways[ ogn ] = gcnew System::Boolean( false ); -} - // パディングのチェック void RCSrl::mrcPadding(FILE *fp) { diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h index 1a90662d..7059b06f 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h @@ -260,9 +260,7 @@ namespace MasterEditorTWL property System::String ^hLatency; // MROM/1TROM/Illegal // ペアレンタルコントロール - property cli::array ^hArrayParentalRating; // 各団体での制限年齢 - property cli::array ^hArrayParentalEffect; // 制限有効フラグ - property cli::array ^hArrayParentalAlways; // 制限強制有効フラグ + property cli::array ^hArrayParentalIndex; // 表示用のコンボボックスのインデックス // TWL専用情報 一部編集可能 property System::UInt32 ^hNormalRomOffset; @@ -322,6 +320,7 @@ namespace MasterEditorTWL // MRC機能でチェックされたエラー情報のリスト property System::Collections::Generic::List ^hErrorList; property System::Collections::Generic::List ^hWarnList; + property System::Collections::Generic::List ^hParentalErrorList; // ペアレンタルコントロールのチェックはsetと同時に行なう // MRC追加項目 property RCMrcSpecialList ^hMrcSpecialList; @@ -341,13 +340,18 @@ namespace MasterEditorTWL // ECSrlResult readFromFile ( System::String ^filename ); ECSrlResult writeToFile( System::String ^filename ); - + // internal method private: // ROM固有情報とROMヘッダの設定 ECSrlResult setRomInfo(void); // ROMヘッダから取得したROM固有情報をフィールドに反映させる ECSrlResult setRomHeader(void); // ROMヘッダにROM固有情報フィールドの値を反映させる + // ペアレンタルコントロールの設定 + void setParentalControlInfo(void); + void setOneRatingOrgInfo( int ogn ); + void setParentalControlHeader(void); + // ROMヘッダの更新 ECSrlResult calcRomHeaderCRC(void); // ROMヘッダのCRCを再計算 ECSrlResult signRomHeader(void); // ROMヘッダ更新後の再署名 @@ -364,16 +368,9 @@ namespace MasterEditorTWL ECSrlResult mrc( FILE *fp ); ECSrlResult mrcNTR( FILE *fp ); ECSrlResult mrcTWL( FILE *fp ); - ECSrlResult mrcTWLParentalControl(void); - System::Boolean mrcRegion( System::UInt32 region ); // @ret リージョンが正しいかどうか - void mrcRegionOrganization( System::UInt32 region ); - void mrcRating( System::Byte ogn ); void mrcPadding( FILE *fp ); void mrcBanner( FILE *fp ); - // utility - void clearParentalControl( System::Byte ogn ); - }; // end of ref class RCSrl } // end of namespace MasterEditorTWL diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp index 1decb2da..8cc19875 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp @@ -340,6 +340,78 @@ System::String^ MasterEditorTWL::transRatingToString( System::Byte ogn, System:: return str; } // MasterEditorTWL::transRatingToString +// 設定可能なインデックスのリストを取得する +cli::array^ MasterEditorTWL::getOgnRatingAges( int ogn ) +{ + cli::array ^ages = gcnew cli::array{0}; + + if( ogn == OS_TWL_PCTL_OGN_CERO ) + { + ages = gcnew cli::array{0,12,15,17,18}; + } + else if( ogn == OS_TWL_PCTL_OGN_ESRB ) + { + ages = gcnew cli::array{0,3,6,10,13,17}; + } + else if( ogn == OS_TWL_PCTL_OGN_USK ) + { + ages = gcnew cli::array{0,6,12,16,18}; + } + else if( ogn == OS_TWL_PCTL_OGN_PEGI_GEN ) + { + ages = gcnew cli::array{0,3,7,12,16,18}; + } + else if( ogn == OS_TWL_PCTL_OGN_PEGI_PRT ) + { + ages = gcnew cli::array{0,4,6,12,16,18}; + } + else if( ogn == OS_TWL_PCTL_OGN_PEGI_BBFC ) + { + ages = gcnew cli::array{0,3,4,7,8,12,15,16,18}; + } + else if( ogn == OS_TWL_PCTL_OGN_OFLC ) + { + ages = gcnew cli::array{0,7,14,15}; + } + return ages; +} + +// 設定可能なインデックスのリストを取得する +System::String^ MasterEditorTWL::getOgnName( int ogn ) +{ + System::String ^name = gcnew System::String(""); + + if( ogn == OS_TWL_PCTL_OGN_CERO ) + { + name = gcnew System::String("CERO"); + } + else if( ogn == OS_TWL_PCTL_OGN_ESRB ) + { + name = gcnew System::String("ESRB"); + } + else if( ogn == OS_TWL_PCTL_OGN_USK ) + { + name = gcnew System::String("USK"); + } + else if( ogn == OS_TWL_PCTL_OGN_PEGI_GEN ) + { + name = gcnew System::String("PEGI(General)"); + } + else if( ogn == OS_TWL_PCTL_OGN_PEGI_PRT ) + { + name = gcnew System::String("PEGI(Portugal)"); + } + else if( ogn == OS_TWL_PCTL_OGN_PEGI_BBFC ) + { + name = gcnew System::String("PEGI and BBFC"); + } + else if( ogn == OS_TWL_PCTL_OGN_OFLC ) + { + name = gcnew System::String("OFLC"); + } + return name; +} + // // バイト列に特定のパターンが含まれるかどうかマッチングする // diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h index 6ac9b0f0..817b7e85 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h @@ -53,6 +53,20 @@ namespace MasterEditorTWL // System::String^ transRatingToString( System::Byte ogn, System::Boolean enable, System::Byte rating, System::Boolean english ); + // + // ペアレンタルコントロールの各団体の設定可能年齢を取得する + // + // @arg [in] 団体 + // + cli::array^ getOgnRatingAges( int ogn ); + + // + // ペアレンタルコントロールの各団体の団体名を取得する + // + // @arg [in] 団体 + // + System::String^ getOgnName( int ogn ); + // // バイト列に特定のパターンが含まれるかどうかマッチングする //