From 5719496e134748098c674640cca6980007d7469d Mon Sep 17 00:00:00 2001 From: nishikawa_takeshi Date: Thu, 4 Sep 2008 11:12:10 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=82=A8=E3=83=87?= =?UTF-8?q?=E3=82=A3=E3=82=BF:=E8=A8=AD=E5=AE=9A=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=A7=E8=BF=BD=E5=8A=A0=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E6=A9=9F=E8=83=BD=E3=82=92=E5=88=87=E3=82=8A?= =?UTF-8?q?=E6=9B=BF=E3=81=88=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F=E3=80=82SDK=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=A7=E3=83=B3=E3=80=81EULA=E3=80=81Shared2File?= =?UTF-8?q?=E3=81=AE=E3=82=B5=E3=82=A4=E3=82=BA=E3=82=92=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=81=99=E3=82=8B=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@2409 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../tools/MasterEditorTWL/MasterEditorTWL.ncb | Bin 11185152 -> 11185152 bytes .../tools/MasterEditorTWL/MasterEditorTWL.suo | Bin 43520 -> 44032 bytes .../MasterEditorTWL/Debug/BuildLog.htm | Bin 15652 -> 15654 bytes .../MasterEditorTWL/MasterEditorTWL/Form1.h | 160 ++++++++++------ .../MasterEditorTWL/FormError.h | 24 +-- .../MasterEditorTWL/MasterEditorTWL/common.h | 1 + .../MasterEditorTWL/deliverable.cpp | 12 +- .../MasterEditorTWL/MasterEditorTWL/srl.cpp | 179 ++++++++++++------ .../MasterEditorTWL/MasterEditorTWL/srl.h | 67 +++++-- .../MasterEditorTWL/utility.cpp | 57 ++++++ .../MasterEditorTWL/MasterEditorTWL/utility.h | 32 ++++ build/tools/MasterEditorTWL/resource/ini.xml | 16 +- 12 files changed, 399 insertions(+), 149 deletions(-) diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL.ncb b/build/tools/MasterEditorTWL/MasterEditorTWL.ncb index 659b75352554eda5d99385fca47801c10f8d6a2d..a93290276ac7eba12407724599650ef5519676cd 100644 GIT binary patch delta 45850 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 Cx-Av} delta 39004 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�Hw%W6CD!DPe5 z(plM-(#KLOsWmL4wo+JoZtr#)WBHI}xYA0sHh|u5j0q)cIxch;+mFbF%hYwILRk1n zXeoRww1N%SMkv}bou{Y%XIb9vTc3t01bepx{G$A!BB86$ZbWqUMf_=tdNne&ld03p zJbpgEfM3Wj;#2ri+5qE9;A?Z5xyW2&ZZY?pC(UYBI2&AMGMbrmD};*vRGup@l$S8L zUMsU963CvOVl)Y4Tkn7CUzEBv8_I>;XJhvZw;#fh)0d|6&RPsl;qGu>e3l9g&*^Wy zQPcq@AOAL=pDzH5w-8??to1c^1U@vUmf8OsznxEG>=~zZJg| zC%{6TC`yO|43AI+z3B4n0(qglNKS!`xkTQr=5X#gYQ*Kt?Wo&)rPRwFXTOpBMW5N8 z0^d#VLsHiPI{YJ&n0m2cb^tqs9nOwq&%zxf^YJ-Xn{Udu<-75H_#yl_UJ)82|Aaij z3C6eBC}hH`8QX*TLN4?(q2j-zo3e|*rp{L8D07v0%6w&kvQSwBV|KB!M0u&s)#vH4 z&UNQo%oy3>p2ZY~$+R3XfHjB${PMZsJ^fQ~Ib`i^Eg6x>D;nWW-f;G~+Uif<$ zayIe?$RjGq1%odm>h^(0SiK>jUM}&MwrHq^X*k9e=*x%DmjUR@srC#zJP+~Am*9KJ zojtTkwhH-c8gn*2M;Bzz zgR|#k@TIaSOY&~WMlz#k=}PQQ`FHuMd`-R%SKy{xaaANVw?J(Z+>KNLaxXpAFM<^j z(I&%qVplxu8v+;TZ`iLeBNMer+GK4C%=>BD5qpZ`LR=D6O4!tUt`-aiGY6{#YX;i{ zKMj5n92?vntQ4vdsvG(i506|uzcIsDj@3n?AGfIcjQat~nU)Akg=KJ=?pby17cLW= ze-!ewKxzLmRkSMoCBSM}^{oOCwVsig#x?{^_m$pD@2z)sO1aB%2V~XWqNlTAy`SD+ z9{^WlkUm`BW{-51!?+`hrnp_g-sda_iAJ`~P5q(H8?uoTF-v0ClF*`eFX8`iGwL#b zj}bEZWrRhTN&U+F%>Tmw%AbRqc!95|B{+&(BJxza((kg@q~8~_7TK3V7qP3@P3#U|v4^<(T#Q$OH4eP#D)6Pp!IM4= z5L&dj7us(M8uV+A{_OvkWB<1EAs**%IJz^RGhZ@qSc(fQ&DmTGm!Er=E6>&AnsHsZ zaoiNdbT@^elumOOxa-_~?m5TtI_~K@*pcTvCuBgVJD*Ti_z)tqrw|s_gWx$X{488X zP(>6?F@u;*Y=xor6_do#5E|u^`%)AdGTEIjdYofc>>1sTtMmhzM3vo2l*8F6!rMA9VoCrZEUG&s68b zNH_*sfztw7td?7QM{5oP@N;ck7z=!rwo%)I41^2XV~x^vJp+v2LHbzzEsyAE@iz`V z1txv8L7x_#z7$28n}K`*5*8a>Mj-KuWYu*O(pt#Q@_E7_WakaTz|qS7<1ZPqU9 zjr;hMblI?yhV6RBe@5_Zh3vxiJ9aUf ztoYJ)IXlrVZ&$D@*_G`oU|MR!KC6q6RU^AG5(%2Y6Z>1-yX}7ne7_;G{_6nv|4aPa z_G_5-+x#b%{*$frIXhqKMS}wA`UO%7;i)r&jY(e4np>V zxrI;DAJ#3gJ)cppnMXo?g!BrEg}__guqxXR^7&F!x5AmNkL}OE))3uNm(I&>kTyy` zNSnY!ZIM#6{%~4}xP4?jvv|8d6eam&VtHn?`=9U``-#*^W-N63c>X(n0-p@Nt%BCw zNDAaKCz^B2<>m%+mwD8zXqELC-}fBoVsN^qOP_^4BnECv?!#)n7(HeD67i+B8}n-V zeOh2%M2|hUb4DDb%2@5AD)^dif;Gb`$-U zht9yxV`HUEQf4WOlofvK6`2(xeLfoHKVpaZj?JSN(~IjR^mp~HPPmNw5iAQr>#V0gWtYGsZKbwW z+kh5qr;gG`>nZwT{UiJkdG2$WI(l7w6#Ng8k$0XQ%QY1Q@v<0_vPs3IN75O2G4i24 zRAaPe@W6X$E44@3YfaM)6xI@z{tmU0ImIS$Ww^3jIqqH~FX|0X_15>*ZcNjf<3TVtuF%n*jmPeHCP7dEjwpNjLOp6Xa+ zDlLGoxkY94fSzuxKjzmI&psELi!H>D#Fn6XTZu9fXzIXcB|~n8kZ3Q&HS6^87i-zT z@rX(COs5UrFpLXGJ|#Zwx70DF4J_eye0#nF-x2I|b?s|ocR0}DA0BfD`M za=RD)N0M)2WQXiDN+AK2JZV#?65JSZI7V7|LK~O*PkjU31rN5P+FAV+x^ulf$SH+6 zCudY3`AZuk#{Nd9RK)EkkKzPUg!UcqZPsNL2m3q@C$ypSvkTaB(s}8EbW!?Ex+Gne zt|a%(8J|7;T%D=U(&L;zoI#P*7GfqMXRw-HU9X{kpnv8hx`U?rzxx*K@Ieui>8W!Z zMImGf=A|=Ycg9P(r94tzkmdQLx20XyLwk!;2L>9kHWQ7sT+25l`Xmh0xmxTe-WJFa zxc#ZW<0jE9*tyDn<$!WfIRp~?h?2#*<#fhwCXxN+bWU~zO6^BUqopxm;1_62U{tP^0O_ z>~Lj-GEy0(j0T54RvD)_+D;?AbH#bw&3Bzip4(1$LKr%zPNKirTXHSALC1a3e?k9E z=Z^Smx48G7f)JOEOV4FMTqTD4)n4SZ=;AMm{&W>~xBOIoCjTivM?m4F+yaTuBmlM> zzT7gMnJ+x<}os?o;=x2h@Y=Aq2UOAYc$arXE+9>dW+<_86zd5dWzb53I9J z4&uED{!f0yZ732V5DHVPnKNunt`=9DtAk)qJ?^YM&si98bH`AJm@<4>z8s&3pw4@I zBkc=gPN0NOYlQ#eH5Nv+S4}z>`<*mFN|q)fo-$clq~(SyK{WDydH}nMU8iQ%;=XO%b*=Ue&|_GvXYxckRb{oSz0>UkWN zJ-LHf)H&ude}(^@zlx~Rb-uJ#%8}ec39%GPB&Y_U>BxE|*}-At+ZIGC7A%RZ+xLR+ z2Ma|s*gUCbun_bB2^L%e|5glHw(n!lw9-51-QXF$$qamx7wDzrg^`o@CL?d<=veP1 z6Hn-Gkx}=P7O#_JnYZ+O`rCSby?|a&FNBEAZk;F;UzNO3AuA)M!(F?D$Bd!qjXm$S z@M&7=8)_Hxn0vxK<(?tR_MB^|RkkKa9!|B<)Ip{wUyLu#mq5_1Bwt(WWvmWVHz%9( z&6Va4<{tC7iLZmjB66mI)x^pO-;MlT+TQ9+h9)Pw=3`i_tCE|QjL#D$IWylg*O)&U z2XExa&sJcYvLCaZ+5YSxb}*a74#hhH{b)Bb>Z%G49i3m1fo!fy!8T^4ktGhT{l zZ$Ih8&mn0QF&Rjn?c@XLy#Xu%vsef*QeqOs)9KmsqA6Kn$(Hcw5T*;ky-6?ag~k5Z z-sVh>*inBXBK24(hQz26;=73c-LznTxA%AZe7Ze*M=7WlQVXl^s6`N6GXvEjhKNl2 zpINAb*wJJ@?&x>*>O;dm3HT}yodG?0tWQ+M7_mlXV;?xqGND#5X2`0Jp_el!*xXzm zE-&{Mmk%-1{9FO9Ah+09VO+46IE#W;gBhWDi8v}ktzu5I6_M^$nXAH8MPzl3aWX>W zj-d828TptnAIoP#5H$<`t~Sv4JrMqf1$y#;KiVy7-B8=6nm2OdI=B5X;2FXs^^$oYWD+xrS;VY}KW7ugjy^JyuFD>kYb$k>x=KAnfEy?xb{YA}Elz!~ zI%Iu?gQ3vL$d(>VZD)Swe&K%Q&LMn$fh!NjdQ2qMF+>N#>}qk1xK><;0QP!um}b`Y zFZR$d+xkoWGrBZ;Q|cmjmAlE^<z$Y$%$EVfeAg=C(5?vy9QNhIBfAVHj%@Vt%v$CrWD$Oh zJjK>r8?G(V0cIPUBkb%9>KEoX|092bKZ&^hY5oK4Gh?!SsC!$EX)cAxBo6_gk$Aq3XbD_=#7m>`o3Bj$a*f?g4Me%+mN?lX*( zJb&Vnzp`sC<~^-hSa=>FdFuC(&r0HQto8SNj~@0wd#&Byd1JN=ndGmH3)YxOPV@vl z{3g4(JS+lo|HJ6o>|wdAQcg)!$|K7EzLL(l?3C~Ao1Y{{k0i&HU*-?U&zdxc`fge* zvN+0w#^7hjtlqacd(3KoRykT`Ukm-k0pdV$5b_q1L=(B-i%Wt?Bv$QSr1WG*WM*;1 zFegDE$x)plN$EU%Eix-fUgfhF8NI+o54*SB7k4+z9&dkVKSNlMsIqbTw|cTZNuQ!m z(`V|l^||_deIfjbCHhi*g}zE(qp#D~>l^eR^v(KKeY?I>->ZkqN5TPF=rzn)wh`Bu zYr-`}5=b-dyuH{df=xuMz&dmuc9pbRS|hDR(!^qIf>q3}jYxixD*kfaW2}iR+`Gma zgyhLgR-i91kNGG3Q~nupKc3@NRc|BJy$H-fBBdM9Z?h+*Q($tq#j zMQXsBb-v&W=#@fae)~IhoGGubc`up&t2E8Dcl}}Yq2FgW$Q$J!MCQ^{+R1^FtF@*L|ml#(F3LzmK zQf@K`8HH9_S7fm6H}aw4pym|+vA#ux+aSZ^V^nF8L{F0BIS$oXd)%542c?vAB=Xk} z4ym#w>pB)*@3e@RJ?l=3tZ<%ISV|lw4i`s=BaxRgT2xT=kO|3?#Q48K-DRrdEnHKD zX~J}5`aH54*cNg}&Q)=^;2GQzfoC>v)aM~A=b%TbPStGDkK$_-jRw(MUg#J9IWfR(iTvP5A4lO+lW{n zO6_J|a}-`QgKU4E<7;Y_thQ%j!k#8rZpB4}cMm#&y(N7qe>`fZbXGo<$;GnXigO z)B0fFK7wQ3k?+CxoA98~APf4g^{cLg$=BnBW{N z|EowkybHPVjHd(!#E^kyo(|PyaYAk(F0W7sHDIN{1U3{JBShIsXphQ>?uhpE7W(34 za7oECn#BhTtP$4XZE#zVX}L!@EF2Y13uj^4{)Q@tn*t+pqK2BOpqLK&KdYEa%#&RE zMu`mJ7T_b=Av?G$LJD7@Okw~;`EV@uZxQ61D$c;GrlV2Mcgg!7mtZ2 z#S7wZ$hf(MtiXrjOYyZRN-|7e7nE35INo`&(uzuDq;gUvsftufs)KZnrijb7mO7xE zth>}h>Miv}^5l>(oaZrcwvB7a$A&vc7bv6CDv$vd5}B| zDGlT03G#G#CgPMS@(Ot^1ZH@Xd_q2j+OrFYgPK9?DVQ&dHV9uFz8Q1dyJ zcqPA5P$`BIn{rU0m6d8Rmg*@@lx9k6rLEEl?PCY;w1h;!MGW{nb;utCh3aq>Ono7m;Dpx1wr${AFShrLK`Cktseqx-{`~sDlH*z!XXCaL4D0D z%ailz=?pX~XxJmjTOtaEp7ue{pu+=G!=6RE)^`G{zi14dzA9MPYU_C)gjOe(C-p@>DW4mFQeTIehIf6=kv_I`#PNPT$QC7Rr zdEbJ$tA}6db&c!Dlrj)5Nssmz?7V{%4I;Y<0q($fCbIh}^@@3jS1rbixy3w4-MnR0 zx1G=Y?}eRqK__D6Z=$=w%I}2-)koc6CpqJht3Y&@$@E60+73J@Qi}4E`m_3r`m1^_ zjGW2kdSYNaG!psALdbN=ADOx-O#90`RUEzXRD0&8{!DN7A1WwF{RF9=ScSsg?Wmj} zbrYm&;$c+D1SyBS=b4s%Tl12?Ue^VTYw9}k;{$T zfRZ3is`Imuy0Du6f!~GfkkdR5{rfiJ5>G@%(%|a84UIBanj`m7hJbLIru?K_QI4xT z*pcztUhSer>xLe;H-;*WE9c?*a}9*+;=r&pLRuy5kWNa|+3FW-f+4$7x zVstgS8=o0HjL(gp#uvty##cr!qqot==xcm!gpGbie`A0#&=_P4Hj<2hV>v%N=MWe% zf+UZyB+^JrgCD67tQbu5hF+BOt(!*7BIYoZN%#@_7#ig%JJ0CjJ8#r)Mjv=0c(nty zhVINRX6vgB)P~rEjj;`zsvjbBI6zydFG9uhO6SElzRglLkcjpoVjz{Xc_$U;ll8Aq z6E5rCU)UXyT;=WT&(LSL@bfS8L6I3yVp*WTib8o+gyL!prPT=vYXFp0G8EN9D5>wE zp!O%X$QYj~To-DlJyc8>>g7AAmibUC>!DKiL!JBrRq_Ya2n7`qg!;%0%~1+kqa`#( zcW8^~7l*Eave*ShaT-eEIuwM4jhGpVA^K&aEub5^LN5$}PWaY)vFMWWPz9Ty297}m z+<^Fh3DIvu?B|BaF9UI33!?sGi23di@#HO}6Cl}BAk{ZQq91}Zzb8FUPKb$57j6sj z{3S&5Fo@;p5Xmbbj!!@mUxgHY1_`V}`o==?=7-cR2Z>t;(zZ1u?H7=;BOzfIK)QYp z$$9`%^#Ua7bA^K_4MB{?Lxh%u_^gJf)(Rr>Aokl`h(!egF$Y9pV~D}7VaULV5Pqo; ze1{5)kJbYr;>|lQZpL?6EyjQHi1;DDtfq5y0Xhvla zm`&iIb_PK)kQ>EKL|OGBZY9zOcOW_J1l;Z4xjW#|XkOtR5G^^8yHgy*W);-9v_L%I zbG{!x9MQAsNHki(f6s46F4qZUA^eVdhNnD@Xj2H~>3L95URr1rMy69oq>S{zU5ymJ zgAF?msTXU7&BAWsh;Rm!*bRXdb;#x{5P1c`SCtbhqrRgNLKy9lfzS(H-w5OaO-DZ3 zQaJmY#eL!l@gkCNABe9+2`pF^@b5*WvQlNKHgY*zp_2SFsSm0pMuS|PDTNoq@%jN7 z-G|{T-IrcSyllV;$tvf8=~zmBU#@}th!%LCLsuA@1CW#WtvmziMXTWBoJ6JgHTfPG zXI9bRX=hS$DFsjfo2XO)fzecHg96(xm4TqYCn4)+m9i0Ox(Ah0%0*P$zfgEQs&s1B zFwF46s1bf2R%l}ct2(QnL2UO!BIPKQoKIKhB5iOZi0Yq_UUmaT2b892=|TAx(3&7U zw3{{>*)PiwhTDnv6a0$Gj{DjRP1Zw5jeQ$&u`+P-_+ zwP?#hbFV^W&KgvuZ9p_)E8^U{L3{5-rOtjtypNe>gY98k5Q}Le-IeW#W!eLYE8(8% z_x51t`hMST*a9P}JHm-1nV*nyY`^b{-8fEx2?G!_=L+fW9~}-PEXU7*XK_*}2h$S_RnGpGj ztH#`MG2T0(zqEVd4K73R4wrFwi%TQ7F}Q*@Zd;Uv_CQMT7kH;j7)g{vk*Pis^Ykqu z=gCN^oayDQ&vO@tk-SdQ*H^jW$d3~myK=lw7Z0cQGDvlRly*^56ynQjNyekVxPMe1 zR&L`j!7u4V_O3Klo(4TQ1MbNzq&Llxe>1W=HugSHynW6n(1x2(gjM3;gLFW3dqyh(t-Q+O_etN#MP2FpPBP0l|T& zavtUtIdAcboJAxVhC=B==|dS%?o6ukZowQT3;3G;2qYF+4;(Y56njVe6AJSMyn|PW z&r>?BGx`@!1@|0+HRR!BxAIw~k+63z5};MwTM_#w`O80YW^O-}8^#UiMsWX3nXVyx zAk-9U3AKefLS3PrP+#~b$^T6FQ+O`C5MBzegx3Nk(qh_VkhF|{6IV_b{wK9^Kt3oR zk`K#AJ&7+vG?uVKyTmkJ?2MGI;n?M<+-xS^HM-qlKK zrL@vof>tIuE?0cf45Zkgv-YXhMf*3w;h69&ZMHT?o2$*!=4%VIh1w!5MO&;b(Y9z? zwQbsV?UZ&}JENV|e$sx{?r3+l;ra-Dq&`Z21Q|-i)*sYErWUNcO;GAvP=a>Xs$)Mz z`O>Wj-!p{T$=n9ZaR)rdJ>>S)(W+RtA_0@{sN;>9u1LA<4pZ}U@EKq5^|ao`x|F;VuG4Ri~RTV`M zY;>{1qsU{PK>f({Mp|`WxD)-rSPkIoYhN1k164@`HXId#t>#tO)^yT)HMFtribzp{ zOl#~^yxUdgyiQNmOFE)EDWVIv(LLBCm};Yuyg63gWDj*F zMFPXc?7hyUh|GEBOp2(3g-GiDxSg+Ey3i%qt5P-4MKwSe)kI3^#}PeV+F23FRas(H zLzsX>AWqUl*;JeDrTt?&CKu=#9~3w1Tl5$9p5&%ITb3=yzQ@*JYq53MdTax>8QYv~!+yfHXFIW9v;EkC>^JNPc2t<1giJf4 z{GMBaJ!x?a5_9~zH9wzpyq8fr5jmw(kxn`fpT*9)N~FifYA^s8>u& zIKBE;%IWRDl1`s_X{TY5cgonT&Dp#y*rF}jvhAn&ky`JBP`yZK-G9%6|Kf&v5mxyN zx*U5)8V@u7JFs-gc%R25qh1$3bm{~`fsBF7foy?XfxJkYtvA%SYhM2?%)KCd&Gho_ zZqrXt1=E}TmYu{VfPN;qc+n@}G>})T%wSB-{evM4!IU400aO#22BI@ym6~0r^zr^pxAjpur(IwgIQnN6K&laFQTOvXF=~Q1;ONM4xC^q;V z#RiX1Y+!oD2D9*Ls}x&+DUboDkJrCLdD3JU4%3l(H3zj33&3wIMq18FeKj&$Qc(l9 z5s6A$^lkbMeV4vZ-xgsyP9k3-C1Qf2fMJ%sIszz;?yNrKThHg{e(W=qFp{dKft56n zUwz1)L&N{b1q8ne zd(8#Gp9utiE)e_$K=79U!Jh~hqbdmg`XKl}0>R%A3b7}|Wq%O-BS7#cgW#XRhZln5 zUx~H>Z3o&xw3BG((5|B0MSF&Z*YkkkH^A_x1H&IDs@E(UQ+~LE%PLI>>Zz} zc?Zz_-O+lZ4MH1{XMylv0>XbS z2>(qW{P%$HKLW!4EC~MxApBoS0x16gT6(lNw7h8Vpp{0efc61eL$r_3+M{(x>m3H? zKL~9k+61(jXenrG(Kex-Lc4%=9qm5ab2JW=KUi)M{viM-T!yhj$}92qOZ(V5jNe|1*I9&jt3s5ZM2wVE@}fzH|rsKL(XM zQ$YPM2lf9wsQ+Df$Kp{C|L3$DXb;d{qLC>{hZcuc2(3BV0JLHH(&kFy8cnEnTwePDVZe~t8#QrM20Hyc} zOAOhM5+fal{&{NeaMq18y!Sjrai{+?b!z`#?)3j>?zAC{C!)7%)4AD2;C~lmn=eIK z&l2q=%(I3aeC~7~V)HW4Z% z%vxEi`d|CWShvDY6(xz-|5G0J2YdX0PkCw!vyIyhK6NMF{?S|Wi)3VY@I;MPq!u!V zz{}re|9~30%g#4sMDEFL454eX2j#cHMHhfbC=^DWQOLREG>lLmlc-b7R8aBLp#)|k zOp>4tHXa7X{=?n3bNfG2l3L6h#o{Fr8X-+?fni5(=7jM)VnIBno-_CGdO-~gtbzB1 znBsGAImEP^sE!SW<;V|Dqkdwxg8SbNWwR4;nY!9n#;QQIf22?DEa`jX2ZN+mx>RUg z1%K|wTk9(O7yZuIYpjb{$8G5X$jtr|0oNChzpqe(wG_+);pARX9Q&uxKx`NW3)~p* zEIDtLxBYUK=h^&}mNj?_TTR6DpFi>im`7=?v|M(wBa$>y*>{>KjaKf@5YGL#vP z7o~TLoHCHE#_p9BL=cGlGEf@UEkeWZa=IP$?ZJ(1hu~+yDxsR8MxhxItNEoR*`Gub zHJ?*7`$Q;%_t%vZ6Y-Lk>sBSZ37AJhe~b?!&bAscwjU8+dj!U@1YV;1AznBZ#%so! zM52^W?N1`STEAer&?k6_1XLa{nkknUn#LET=`Oy=v93<{>f4q3`8!x3}tXHM< zCat60f1lSOdqqD63VzbEJ4kXzVYDK6qajK0Nc=w_$zvDdd*tH~aG>_U47C zq>rcnecDI(U-Lfxmi964e|zFbM=$lGhnM`(R}Pc>k0dVxWVDw9GV%ZE>`dUAIMY8q zGZ{icLI@-r3R18rfh1f8HMR;Uc;8~hF1FZ$wTKE9Z!{-9I*PyQ3Vntr< zYHKT1>wQ&wSc+ZS>S`^vcH3=T{r}!%sK;)1yMNx#`*~*G874FD%)Ij+zvuftpaN-d z>p=c@8ORgA3PFbaDg}A=S20M@gK`kZ@7IIKauENA1R<73Bq2;P#Y7>@%PJ2JIjoL2 z!(Bsky6cBks2#2X1CrGb>!4D1ybgyXrWAPxL!r#^qD_R*3{nR}YB9|SL!kd&)yVG? zjR?L>Hsa@NbUdUSY4a*bgi8<8kF?Q@o`D0mM@6y()yw+;T-Hi&!C=I7H)!P_Zqy2E z*m&sA?a;^69gfVIF4;X#v*fiA;?rG8ik{02A{-@wV2DK?6s z*(m!JS-tyV=Uw>jj{D!K)z=>7R{s~b-Tw!+n$i2(ymlXkWBxYAdckjjtS$davi>c1 zUPHtGjIw43!8WJfhpC;vjkbQ&&$7vQ(H-Cpgm49f1QrVwFrsEBf&QQBz?xuquAE;;j04lx=xv_r3t{`arp!5+bZYJtZGw+ywyF zPBPeyf$Ke0vj|-vylI)%lNVmW!0tu&0L3kgl79~X+z)V~Z$d}XbVDCw;7Ly}(dT@b zBEqdyi`OPN&|FP|1OCZ?)rPz9%wqMO(Y!@*91@a~=pi@_I)J3T3wT2yDpsscmcZ>7 zToB6a6yHQ|PlIUJ^#B(%Ifzj~?}8M@E=0@g6gwbRcpYfHMcPXL#DGb-SPQm1>LdzT z-tY4Y{co&`yDL2s+<0!UP^)Mg@>&LQ$16Y)R)MhafuOKu+Q|az+CMCJ=M(O{-~=Ou)l-(DXKI<(5bbnbjbGPC zC_Wi(X667x03dfpU_}T500Zy}gk9%# z9SnanOu{{8LMf$CrD%mWvo}h7HOhPqx*mKX_ww`YrJG?$H|{r1l555P2Pz1ufgxTEyn}*Vz7yIxZd~3EtZ=dA^ar4U(r^@`2dxiW2ojV(RzrQ z#cr)R)CC`KUkcF>P{p8c&J4tbRr#EDDqzXSbY=kVi{$}^9}Iq|*0Wb;oUl#@Cpka@uZJ_QTR3h&KfOr@}xC7`!JrYoDn1mB#!?}ONc)`1h_Y?;eO{hH|a@U`i z<^9T)XaYEskpd<)dm0dRy3S}KvMX!r$FK7*-W$s0A;ljGZ^pawMz*hXlbx9tSCj62 z-67p!wD6AN=l?S1P!@$au(8^&@Wd>9p zC*#AI+tEAzNBmFtpY^}!e;J>po4{<@0(t~6)Yhz34owV93LN2hz+Gu# z;EQOFFcuf{J?k0dCwB$$sg)MpsHkI~!(D<4w0eZo?R<+h32(dWBE z+~uYM`^j5-a&HMs#2N_dR-tEjHNYlc1iWrIDi26FJe+9{Hu@-<%dD-|Bj~6+w7(6w z)uR~KWLkFoxfst|+y)Fg7wajytbCZFC)9B%=pju5 z?xaF{D`21DoZaI!GMDdzS!vWep>5iQ=JReKI*)2>ZZ^m{c}!vxKS6QBClIy5VDuWc z1IFYWicRJ%b(3EP<;-5qgJZ#$AV_KkYqLdrS^FM(>^}%tX}FBXja}5szDLo*W%+fT zyCn?46ylp9{BlU(lz!(wB0v#%SsomAatDPg;+K$|eGNeBHF2PJp#Mx9fgNOtZ-tyQ zhtYPgfM*mdUY-0<#W8ghBzv9FcWMHSr2+#d>^3oOQU#ix?0ay5UjXUP&ziOo@?fZ{ z+Btv>4Fz=NO^i33L$le69h>0vd=u(SZ_JH808U%mQL;~jzt|jg8TfQ7kyqiE@?apk zj;5fWvB^gVuZk{kD7X$jtX7)vt5sVvuMOZDLPxn3yF_ z!t=de+(Yak(U0+K$(iS&vNS5gmC?!`${Y})=HObJpgOw%pVzDCTrzrh@P5X7s`o7K z1#og%;l0ayA2`2vAoS70eLhjuQ`J{BOqHb?uPRc_QLR+HrrM@@OLZK5LkhK49jFdh zN2?Rmc6D#{Aa$mCoO-RgPW={Ua`_6%ouANUbM!G=Z9Mja}0lqUc7*N#K9$+rgJPNjrQ~@$RsT{wpSKVFK+`bRn~6iD{vy z$j|7@++hK_LC7JYGX|EZpSG|66nqNVe)B}k&$SUfMeL<55N1B$BN(&C^T7TqK`r#6 z2UD8nmn3&*Pv?6nzELfJ0gY9f$sJ3aL7-gOj z=I1(~BRXVEm38fQZijFNH%$lGryh{v0I@k>yCGB_d^Q_mj(8k(6GRVAf*~ZXY-qcL zq6aP^^|YtI?I`By`AUdXB%uq7y_whiPxSMYUN`(tpmWc`5)bJ@@lLUi%|+wK#!pfG zy!;;lU7@mn^mp8k!YDi~7a<4z81Ujxl>vs&4Hx8xb|RmsXi-7)2;HWiS`SXsg@+2m z3v4_dA5!iZ5GCw;dX9TxuIC>92oIwdB+rn*VhqymQhdGLv!x^aa+8mG0IlC~3^vH_ zGSk;NmapE{Eut}W8DmKDf zl;uUXSUA&D{*?Q>_{uo_jk?=zG|c2iLem@XlnF02_A> zbC&*7=%!#SFqX2F+X>G`Ddnm-+PufyQPG%cUMqEi+6Je52l!s;%lhm;6Pv%;N=O_p)E(wywB+`bVy-JOXN*5<0CehNxT}ls12__X0 zl~z5~XWCi~jonS3Xvin=md=e=JB0}(>sqHK+LC06;HBXvQ7W;CHRZ9Dw6eP;idXJN zb_fOJZdXeXJ#Dun2sHh>)Q%eR$G0s$)bfh$yiLk7g-I>8t&PQ|T!H33ZCT4puH-^# zmdPe1bk$2cusOSHgLDMPHg;1r9yeWmj$RG0hVYFEG1coy^)72c>wIHFx0bG?P@NJ;|GfPP4c~a9 z+Z`3X6BZ{bq@TJ?tjRUsru7j|R`Pr&n%42jxx7Pq+Eddt@ix9IW<#IKf5KhjzUJ0! z@eCh5!42ZZa=F|@E}xsmO~<4EJ@+ZLv6p`c_XqA}ZWZ?#*TRLOs9}`HN!(0s2}ig_ zq<)2cuVFZeJxcAlr!Zs0N$yIp#~0HVqa8uq;|{JfW;pAQFqNAH*l;-x=)xgabL;R^ zf8yTY_HYLfnz;8-x}8P&c9HuChh-%;D{3;h6Y`P|cLBu@8$!|HY43@u>HwTf1>V$m zxli5UD)-bT&)|YTN{S9}2~FS}N%;B6oDChQ*~2M`!WJ7hl*{G{xgyXvR^n6}xP#mo?DIK}a|PG_4)$f*rWmw-6R>x8oYV_A zQUU&F7B?F}lFi)Kk=!KYKYtCC#v5D;vY5#W6S!1v45rJ-2gP>{_Zs(S zK+C?w+)D4rx2LE3B=WF*iu?8)=02pS^2~OfE`#sMvzZ{hlOW9LLxPIUePRNXtQqgi z1t>lF6rg0k;fHlruSXH& z8;o?lZ2e`63EiOd&ea>3O~QgvP6&i;hxH)Y2Fo@Cwms6@c`SM5PIM=Fz-Uhr9N9Sg zU=()QID3!99C)~M**JTTRmoNj8;f)w*=l5~g*7AHSGGFY`oUU|u9vO9Yy)7eNN3k( zbzs3LCj`RAVLeE;!Lkj3jYoPr*|wK0Bb+B7JxsP8U=y((F5Aaoldv8k+eq1VgzbX# z$6>SCLX@1)3D$=7&a#b`tqC?6=`pg6m8}`JE7C2pwaPXQwj0vP;1Ii{T!g}5dOB$> zH9xCPRd#ZJR8mRS0&`y~wX+8cIyJsD4BnQ47?(zlh1xTSs@$vkL2tq3t9HsQBBI$KL)FU4Tn|3c7XMPB`2fo?jLV)nRn32 zW#+;l-c0$;=1oC#>qxs+$J^-cBj!z7k~P|tNA`bc4xpz-n-Yb_kIdbzzx~O}iBn)! zP;$;@N%YeoH`oiz&IyexGX8NxJ4Hv%PUDj;F9v(DS*`aI{|rkoX&7wj&ij&Y23vmd zVslr=lQW|%!BiY-vGHC3NN6C5eUXqk%+h}i-;Qor*y9a>H;@q(J-(*4o0iid-Z9u~ zxDQ9}d07ML>DPL!61-xOluB;-S%c|$wN*Qg=!>l)y)wa?kQUL8j-uZ}mrNDi#-sUk*wf>Hd?U%}A?ZNlkY>;qow zLrN=c`0mY5T+H+B>E)+;brJZ->G*|->+@*Cd%e0FY4_ntYsd0E>4=1ssR}YYAw{H3 zT~e+F^C>j({iK%5;N^5aO_$dq83IxOW*D4#~(y^^#`$y@2IqLfiQX)Q_-`E-(Y zJt>&xyp#grni-e&oI8Pt-zHV^768Oje)Q&h(`7#)2L!$|jr31DD3HSP6fe4Ei_Kfd$J1MpX~VopYh;>8(__*il(aNHZB|Di=MF;ILE~@nF zLo5B#bGnh@XD6-oVnt9Ksp^;h3n|I&qN4iolg|I_#U@YJlgmRgf@yi5jI&01wy?mb z5AR3EugM7JNzR%Kk)Kb}YOr0uy8yR0iFSA`<5S+N3;yv%a%L?yRPHG#kEg3nWi0oi z(yfC0AX5m)7Sc{Xyvzk`-juamy32p61@_SqAR{% zb=0C&=Zom7^V9xbO{SQwO7&gQ8}H2_ZWI}RrGGHZzSe*9Mw+E9&QdvD1DvjbPS+r( zYp~Nb#OWI9bPaR5hC5v&oUV~h*C?ke)9D)RbUo#Cjd8lNoUXA>*V9hdADpgir)!+k z^^DW?tkad_bd7hqo|9b9AE))k;wE3b>K&%!el7CJbX;`t8;N{Z>N~dhg=)SVjkM>z zGn(4^OwY+BJFHff?MrOx>b=K{M&Tpjo&5rGkm#qI%OTT5pS@EC*>?<*DPOEnTCu^FU#=iGM&u(q2j^$2r0)4fB5s|4Et%Lt`(K(}2#sM@ zKH?;*$}0HjmAd*Xvqh4yyo*Tsn=ShL_vq=My85fLZN&AqMN3+@&-S7#uV;MgN9)7p zh$2~kxk^Q~!zbUKT2~)2CqZhRTuwrEC2Hxu;d5^LN##?*XnoF{RfqW~$`?*us^BB( zvX`b3Z<25)6;E`RxkeRfSsjO>rEF@G%8N~V{}>&SKKGb~kDwij=B^k;{H`uHdR|6< z1uZrf-ds&zd$#16P|`BZjH2Oap-tn}5&zelEVxt{OpO-`7Z2o(bX`PIFwY0lTW3nv z`|uiCb*bcg1=+W>hl&nQC_>Ak{&LBc!KCtT54@%Gi)z)hd-r*>RGyq&rRkR{$WLCS z`b96gJ9XYY#r@|G&)_t~mk^5)rz6floQXIKaW>){#JPwii1QHVBRUXE5f>mXL@Yxr zN31|}A}+#ny?Elmy885aqO^7iZhQZEi1TTEf5+9{irEp*kTa`FgGlYpg=$i|bDT3c~-XERqb| zSY{-(1IpCoz?L#UI%I3vE`t)9qTkf>2aN4S!ww02tCe?YQOgd6- zlok_}bg8^V(ykK8<)Ibr$mFaFE$K11BAB!et?==z-ZWL{Nz0fDpG5^(6|^ABS*?-6 zUL7puI<->qtD;os94;Ms)hHcshDf(xRY@N?%cauQMk#yI)fH8~$s{McN=ws9*1Tho z(if*o=huj2p^vizi7+owk<`isDpImPtN=<7;;=gi9 zBGE5f;zc6zmiUu%ycG zT>s#8Dyh6OK`LLTayC>-4ON$hpkkEcrC4Tm)J(C5_wyrkM7(&ly>R{POu zt<|}US*3}7zH>vQlKwn@WwWoeXM>S8f4m{zNPBNtS@YQDjo96PfZXR)Xts0|Bh7QYxz|7`e&WDjjnJnJ&`Qg)pW}4 zZTWuARLPlI=SUy-48)TSR*Dvu#g5a%O0V(BM8MCDH>*`qq`Cj)+nnn^1&J53CrEiZ46i2OgWDGa3m diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL.suo b/build/tools/MasterEditorTWL/MasterEditorTWL.suo index 68e853044c795780d222014f5e800693205e040d..785882f43e0d6018b8688bc55e056a4f4db5af63 100644 GIT binary patch delta 6489 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 N?B5!l@EiLp{{yCsMZf?6 delta 5694 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 Mh!wG@oYNQn1s@_!bpQYW diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm b/build/tools/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm index ef9a2a43ddbd5dfa7668462ed1f3ce7616615fc4..7c2f13d51b757785a4c909a07d4ad5a9e8f2e309 100644 GIT binary patch delta 280 zcmZ2dwXABxAtt6*2AdBtl`spsG8i!!G8izJFjxRtW()?K-PvApU=eoYFJ=S^8)K;6 z%(%HiXaXyy++;`o_{|j(uULRmCaBsbyR(^ZUL|{s8&hg?qbArQQw$xZo2|5Mn1DLa wr5yQXH!soEW0ZCUdH}^UK#%D$Brzm1luQm})7&hkzXRk4G)0^58@TcS0ONNxI{*Lx delta 277 zcmZ2hwWMmpA*Rhom`a!hjTy`sj2TQA3>l1ov;~97W>2=49GJqBr6uAw2gryp0;S9` zbZlnaTqQJt6^op-geOSY0#(aoPd4+-Yh;gcV@hpq)+`2DVu_){bhC}N4HFhAX$jfQ r%XIY^rHvUJQFSpGFz7KPF(fjSOui_fxmiMg2gqnNMVlWQxbgr1tKTy5 diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h b/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h index ef2a4e2f..46424df9 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/Form1.h @@ -40,8 +40,8 @@ namespace MasterEditorTWL { System::Boolean ^hIsSpreadSheet; // 入力エラー情報 - System::Collections::Generic::List ^hErrorList; - System::Collections::Generic::List ^hWarnList; + System::Collections::Generic::List ^hErrorList; + System::Collections::Generic::List ^hWarnList; // VC自動追加フィールド @@ -611,9 +611,9 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; // this->hSrl = gcnew (RCSrl); this->hDeliv = gcnew (RCDeliverable); - this->hErrorList = gcnew System::Collections::Generic::List(); + this->hErrorList = gcnew System::Collections::Generic::List(); this->hErrorList->Clear(); - this->hWarnList = gcnew System::Collections::Generic::List(); + this->hWarnList = gcnew System::Collections::Generic::List(); this->hWarnList->Clear(); // バージョン情報を表示 @@ -3580,45 +3580,95 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; System::Xml::XmlElement ^root = doc->DocumentElement; // タグ - System::Boolean bReadOnly = false; - System::Xml::XmlNodeList ^rwlist = root->GetElementsByTagName( "rw" ); - if( rwlist != nullptr ) + System::Boolean bReadOnly = MasterEditorTWL::isXmlEqual( root, "rw", "r" ); + if( bReadOnly ) { - System::Xml::XmlNode ^rw = rwlist->Item(0); - if( rw->FirstChild->Value->Equals( "r" ) ) - { - // リードオンリーモード - this->readOnly(); - bReadOnly = true; - } + this->readOnly(); } // タグ - System::Boolean bXML = false; - System::Xml::XmlNodeList ^outlist = root->GetElementsByTagName( "output" ); - if( outlist != nullptr ) - { - System::Xml::XmlNode ^out = outlist->Item(0); - if( out->FirstChild->Value->Equals( "XML" ) ) - { - // ノーマルXML出力モード - bXML = true; - } - } + System::Boolean bXML = MasterEditorTWL::isXmlEqual( root, "output", "XML" ); - if( bReadOnly || bXML ) + // タグ + 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 += "\n Read Only Mode"; + msgJ += "\nリードオンリーモード"; + msgE += "\nRead Only Mode"; } if( bXML ) { - msgJ += "\n XML出力モード"; - msgE += "\n XML Output Mode"; + msgJ += "\nXML出力モード"; + msgE += "\nXML Output Mode"; + } + if( bCheck ) + { + msgJ += "\n追加チェックモード"; + msgE += "\nExtra Check Mode"; } this->sucMsg( msgJ, msgE ); } @@ -3828,12 +3878,12 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; this->tboxIsGameCardOn->Text = gcnew System::String( "OFF" ); } this->cboxIsShared2->Checked = *(this->hSrl->hIsShared2); - this->tboxShared2Size0->Text = this->hSrl->hShared2Size0->ToString(); - this->tboxShared2Size1->Text = this->hSrl->hShared2Size1->ToString(); - this->tboxShared2Size2->Text = this->hSrl->hShared2Size2->ToString(); - this->tboxShared2Size3->Text = this->hSrl->hShared2Size3->ToString(); - this->tboxShared2Size4->Text = this->hSrl->hShared2Size4->ToString(); - this->tboxShared2Size5->Text = this->hSrl->hShared2Size5->ToString(); + this->tboxShared2Size0->Text = this->hSrl->hShared2SizeArray[0]->ToString(); + this->tboxShared2Size1->Text = this->hSrl->hShared2SizeArray[1]->ToString(); + this->tboxShared2Size2->Text = this->hSrl->hShared2SizeArray[2]->ToString(); + this->tboxShared2Size3->Text = this->hSrl->hShared2SizeArray[3]->ToString(); + this->tboxShared2Size4->Text = this->hSrl->hShared2SizeArray[4]->ToString(); + this->tboxShared2Size5->Text = this->hSrl->hShared2SizeArray[5]->ToString(); // アプリ種別 System::String ^app = gcnew System::String(""); @@ -4348,7 +4398,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; 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 ) ); + this->hErrorList->Add( gcnew RCMrcError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); return false; } return true; @@ -4362,7 +4412,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; if( (val < min) || (max < val) ) { - this->hErrorList->Add( gcnew RCMRCError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); + this->hErrorList->Add( gcnew RCMrcError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); return false; } return true; @@ -4389,7 +4439,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; if( box->SelectedIndex < 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( labelJ, METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, msgJ, labelE, msgE, true, affectRom ) ); } return true; @@ -4467,14 +4517,14 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; // 何も設定されていない if( !always->Checked && (comb->SelectedIndex == (comb->Items->Count - 1)) ) { - this->hWarnList->Add( gcnew RCMRCError( + 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( + 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 ) ); @@ -4484,21 +4534,21 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; { if( !always->Checked && (comb->SelectedIndex == (comb->Items->Count - 1)) ) { - this->hErrorList->Add( gcnew RCMRCError( + 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 ) { - this->hWarnList->Add( gcnew RCMRCError( + 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( comb->SelectedIndex == (comb->Items->Count - 1) ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "ペアレンタルコントロール情報", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, ": Rating Pending指定とレーティング年齢を同時に指定することはできません。", "Parental Control", ": Rating setting is either rating pending or rating age.", true, true ) ); @@ -4745,7 +4795,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; // SRLクラスのエラーリストはすべてSRLに関係するのでチェックしない // -> 入力エラーのみのチェックでよい - for each( RCMRCError ^err in this->hErrorList ) + for each( RCMrcError ^err in this->hErrorList ) { if( !err->AffectRom ) count++; @@ -4760,7 +4810,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; // SRLクラスの修正不可エラーをカウント // (修正可エラーは入力によって修正されてるかもしれないのでチェックしない) - for each( RCMRCError ^err in this->hSrl->hErrorList ) + for each( RCMrcError ^err in this->hSrl->hErrorList ) { if( !err->EnableModify ) // すべてSRLバイナリに影響する count++; @@ -4769,7 +4819,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; // SRLバイナリに影響するエラーの中で // 修正可エラーがフォーム入力によって修正されているかカウント // (エラーリストが更新されていることが前提) - for each( RCMRCError ^err in this->hErrorList ) + for each( RCMrcError ^err in this->hErrorList ) { if( err->AffectRom ) // 修正不可エラーは存在しない count++; @@ -5223,7 +5273,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; this->gridError->Rows->Clear(); if( this->hSrl->hErrorList != nullptr ) { - for each( RCMRCError ^err in this->hSrl->hErrorList ) + for each( RCMrcError ^err in this->hSrl->hErrorList ) { this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); this->colorGridError( err ); @@ -5236,7 +5286,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; this->gridWarn->Rows->Clear(); if( this->hSrl->hWarnList != nullptr ) { - for each( RCMRCError ^err in this->hSrl->hWarnList ) + for each( RCMrcError ^err in this->hSrl->hWarnList ) { this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); this->colorGridWarn( err ); @@ -5251,7 +5301,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; this->gridError->Rows->Clear(); if( this->hSrl->hErrorList != nullptr ) { - for each( RCMRCError ^err in this->hSrl->hErrorList ) + for each( RCMrcError ^err in this->hSrl->hErrorList ) { if( !err->EnableModify ) // 修正可能な情報は表示しない { @@ -5262,7 +5312,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; } if( this->hErrorList != nullptr ) { - for each( RCMRCError ^err in this->hErrorList ) + for each( RCMrcError ^err in this->hErrorList ) { this->gridError->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); this->colorGridError( err ); @@ -5274,7 +5324,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; this->gridWarn->Rows->Clear(); if( this->hSrl->hWarnList != nullptr ) { - for each( RCMRCError ^err in this->hSrl->hWarnList ) + for each( RCMrcError ^err in this->hSrl->hWarnList ) { if( !err->EnableModify ) { @@ -5285,7 +5335,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; } if( this->hWarnList != nullptr ) { - for each( RCMRCError ^err in this->hWarnList ) + for each( RCMrcError ^err in this->hWarnList ) { this->gridWarn->Rows->Add( err->getAll( this->stripItemJapanese->Checked ) ); this->colorGridWarn( err ); @@ -5295,7 +5345,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; // セルの色を変える public: - void colorGridError( RCMRCError ^err ) + void colorGridError( RCMrcError ^err ) { if( err->AffectRom && !err->EnableModify ) // SRLに関係ありで修正不可 { @@ -5308,7 +5358,7 @@ private: System::Windows::Forms::Label^ labAssemblyVersion; this->gridError->Rows[ last ]->DefaultCellStyle->ForeColor = System::Drawing::Color::Blue; } } - void colorGridWarn( RCMRCError ^err ) + void colorGridWarn( RCMrcError ^err ) { if( err->AffectRom && !err->EnableModify ) { diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/FormError.h b/build/tools/MasterEditorTWL/MasterEditorTWL/FormError.h index c79cf0a3..cf1837b0 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/FormError.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/FormError.h @@ -255,24 +255,24 @@ namespace MasterEditorTWL { // エラー情報の登録 // -------------------------------------------------------- public: - void setGridError( System::Collections::Generic::List ^list, System::Boolean isJapanese ) + void setGridError( System::Collections::Generic::List ^list, System::Boolean isJapanese ) { this->gridError->Rows->Clear(); if( list != nullptr ) { - for each( RCMRCError ^err in list ) + for each( RCMrcError ^err in list ) { this->gridError->Rows->Add( err->getAll( isJapanese ) ); } } } - void setGridWarn( System::Collections::Generic::List ^list, System::Boolean isJapanese ) + void setGridWarn( System::Collections::Generic::List ^list, System::Boolean isJapanese ) { this->gridWarn->Rows->Clear(); if( list != nullptr ) { - for each( RCMRCError ^err in list ) + for each( RCMrcError ^err in list ) { this->gridWarn->Rows->Add( err->getAll( isJapanese ) ); } @@ -284,14 +284,14 @@ namespace MasterEditorTWL { // -------------------------------------------------------- public: void overloadGridError( - System::Collections::Generic::List ^listLo, - System::Collections::Generic::List ^listHi, System::Boolean isJapanese ) + System::Collections::Generic::List ^listLo, + System::Collections::Generic::List ^listHi, System::Boolean isJapanese ) { // listLoの修正可能な情報をlistHiで上書きする(listHiは修正可能な情報のみであることが前提) this->gridError->Rows->Clear(); if( listLo != nullptr ) { - for each( RCMRCError ^err in listLo ) + for each( RCMrcError ^err in listLo ) { if( !err->EnableModify ) // 修正可能な情報は表示しない this->gridError->Rows->Add( err->getAll( isJapanese ) ); @@ -299,21 +299,21 @@ namespace MasterEditorTWL { } if( listHi != nullptr ) { - for each( RCMRCError ^err in listHi ) + for each( RCMrcError ^err in listHi ) { this->gridError->Rows->Add( err->getAll( isJapanese ) ); } } } void overloadGridWarn( - System::Collections::Generic::List ^listLo, - System::Collections::Generic::List ^listHi, System::Boolean isJapanese ) + System::Collections::Generic::List ^listLo, + System::Collections::Generic::List ^listHi, System::Boolean isJapanese ) { // listLoの修正可能な情報をlistHiで上書きする(listHiは修正可能な情報のみであることが前提) this->gridWarn->Rows->Clear(); if( listLo != nullptr ) { - for each( RCMRCError ^err in listLo ) + for each( RCMrcError ^err in listLo ) { if( !err->EnableModify ) // 修正可能な情報は表示しない this->gridWarn->Rows->Add( err->getAll( isJapanese ) ); @@ -321,7 +321,7 @@ namespace MasterEditorTWL { } if( listHi != nullptr ) { - for each( RCMRCError ^err in listHi ) + for each( RCMrcError ^err in listHi ) { this->gridWarn->Rows->Add( err->getAll( isJapanese ) ); } diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/common.h b/build/tools/MasterEditorTWL/MasterEditorTWL/common.h index ada6faf7..17c75f1f 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/common.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/common.h @@ -21,3 +21,4 @@ #define METWL_MASK_REGION_CHINA 0x00000010 #define METWL_MASK_REGION_KOREA 0x00000020 #define METWL_MASK_REGION_ALL 0xffffffff +#define METWL_NUMOF_SHARED2FILES 6 \ No newline at end of file diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp index feebdeff..9b9ae31a 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/deliverable.cpp @@ -406,27 +406,27 @@ ECDeliverableResult RCDeliverable::writeSpreadsheet( } if( node->FirstChild->Value->Equals( "TagShared2Size0" ) ) { - node->FirstChild->Value = hSrl->hShared2Size0->ToString() + "KB"; + node->FirstChild->Value = hSrl->hShared2SizeArray[0]->ToString() + "KB"; } if( node->FirstChild->Value->Equals( "TagShared2Size1" ) ) { - node->FirstChild->Value = hSrl->hShared2Size1->ToString() + "KB"; + node->FirstChild->Value = hSrl->hShared2SizeArray[1]->ToString() + "KB"; } if( node->FirstChild->Value->Equals( "TagShared2Size2" ) ) { - node->FirstChild->Value = hSrl->hShared2Size2->ToString() + "KB"; + node->FirstChild->Value = hSrl->hShared2SizeArray[2]->ToString() + "KB"; } if( node->FirstChild->Value->Equals( "TagShared2Size3" ) ) { - node->FirstChild->Value = hSrl->hShared2Size3->ToString() + "KB"; + node->FirstChild->Value = hSrl->hShared2SizeArray[3]->ToString() + "KB"; } if( node->FirstChild->Value->Equals( "TagShared2Size4" ) ) { - node->FirstChild->Value = hSrl->hShared2Size4->ToString() + "KB"; + node->FirstChild->Value = hSrl->hShared2SizeArray[4]->ToString() + "KB"; } if( node->FirstChild->Value->Equals( "TagShared2Size5" ) ) { - node->FirstChild->Value = hSrl->hShared2Size5->ToString() + "KB"; + node->FirstChild->Value = hSrl->hShared2SizeArray[5]->ToString() + "KB"; } // 会社情報 diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp index 6491a27b..5f316b8c 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.cpp @@ -21,6 +21,8 @@ RCSrl::RCSrl() { this->pRomHeader = new (ROM_Header); std::memset( pRomHeader, 0, sizeof(ROM_Header) ); + + this->hMrcSpecialList = gcnew RCMrcSpecialList(); } // destructor @@ -258,36 +260,35 @@ ECSrlResult RCSrl::setRomInfo(void) = gcnew System::Boolean( (this->pRomHeader->s.access_control.common_client_key_for_debugger_sysmenu != 0)?true:false ); // Shared2ファイルサイズ - this->hShared2Size0 = gcnew System::UInt32( 0 ); - this->hShared2Size1 = gcnew System::UInt32( 0 ); - this->hShared2Size2 = gcnew System::UInt32( 0 ); - this->hShared2Size3 = gcnew System::UInt32( 0 ); - this->hShared2Size4 = gcnew System::UInt32( 0 ); - this->hShared2Size5 = gcnew System::UInt32( 0 ); + this->hShared2SizeArray = gcnew cli::array(METWL_NUMOF_SHARED2FILES); + for( i=0; i < METWL_NUMOF_SHARED2FILES; i++ ) + { + this->hShared2SizeArray[i] = gcnew System::UInt32( 0 ); + } u32 unit = 16 * 1024; // 16KBの乗数が格納されている if( this->pRomHeader->s.shared2_file0_size != 0 ) { - *(this->hShared2Size0) = (this->pRomHeader->s.shared2_file0_size * unit) + unit; + *(this->hShared2SizeArray[0]) = (this->pRomHeader->s.shared2_file0_size * unit) + unit; } if( this->pRomHeader->s.shared2_file1_size != 0 ) { - *(this->hShared2Size1) = (this->pRomHeader->s.shared2_file1_size * unit) + unit; + *(this->hShared2SizeArray[1]) = (this->pRomHeader->s.shared2_file1_size * unit) + unit; } if( this->pRomHeader->s.shared2_file2_size != 0 ) { - *(this->hShared2Size2) = (this->pRomHeader->s.shared2_file2_size * unit) + unit; + *(this->hShared2SizeArray[2]) = (this->pRomHeader->s.shared2_file2_size * unit) + unit; } if( this->pRomHeader->s.shared2_file3_size != 0 ) { - *(this->hShared2Size3) = (this->pRomHeader->s.shared2_file3_size * unit) + unit; + *(this->hShared2SizeArray[3]) = (this->pRomHeader->s.shared2_file3_size * unit) + unit; } if( this->pRomHeader->s.shared2_file4_size != 0 ) { - *(this->hShared2Size4) = (this->pRomHeader->s.shared2_file4_size * unit) + unit; + *(this->hShared2SizeArray[4]) = (this->pRomHeader->s.shared2_file4_size * unit) + unit; } if( this->pRomHeader->s.shared2_file5_size != 0 ) { - *(this->hShared2Size5) = (this->pRomHeader->s.shared2_file5_size * unit) + unit; + *(this->hShared2SizeArray[5]) = (this->pRomHeader->s.shared2_file5_size * unit) + unit; } // カードリージョン @@ -531,22 +532,32 @@ ECSrlResult RCSrl::searchSDKVersion( FILE *fp ) // RC1=20100 RC2=20200 ... // RELEASE=30000 System::UInt16 patch = relstep; - while( patch > 10000 ) + while( patch >= 10000 ) { patch -= 10000; } + System::UInt16 rev = patch; + System::String ^revstr = gcnew System::String( "" ); + while( rev >= 100 ) + { + rev -= 100; + } + if( rev > 0 ) + { + revstr = "-" + rev.ToString(); + } patch = patch / 100; switch( relstep / 10000 ) { - case 1: str += ("PR " + patch.ToString()); break; - case 2: str += ("RC " + patch.ToString()); break; - case 3: str += ("RELEASE " + patch.ToString()); break; + case 1: str += ("PR " + patch.ToString() + revstr); break; + case 2: str += ("RC " + patch.ToString() + revstr); break; + case 3: str += ("RELEASE " + patch.ToString() + revstr); break; default: break; } u32 statbegin = this->pRomHeader->s.main_rom_offset; u32 statend = this->pRomHeader->s.main_rom_offset + this->pRomHeader->s.main_size - 1; System::Boolean isstat = ((statbegin <= offset) && (offset <= statend))?true:false; - this->hSDKList->Add( gcnew RCSDKVersion(str, isstat) ); + this->hSDKList->Add( gcnew RCSDKVersion(str, sdkcode, isstat) ); //System::Diagnostics::Debug::WriteLine( "SDK " + str ); } } @@ -609,8 +620,8 @@ 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 = gcnew System::Collections::Generic::List; + this->hWarnList = gcnew System::Collections::Generic::List; this->hErrorList->Clear(); this->hWarnList->Clear(); @@ -651,7 +662,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) } if( !result ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "ソフトタイトル", 0x0, 0xb, "使用不可のASCIIコードが使用されています。", "Game Title", "Unusable ASCII code is used.", false, true ) ); } @@ -667,13 +678,13 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) } if( !result ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "イニシャルコード", 0xc, 0xf, "使用不可のASCIIコードが使用されています。", "Game Code", "Unusable ASCII code is used.", false, true ) ); } if( memcmp( this->pRomHeader->s.game_code, "NTRJ", GAME_CODE_MAX ) == 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "イニシャルコード", 0xc, 0xf, "SDKデフォルトのコード(NTRJ)が使用されています。", "Game Code", "SDK default code(NTRJ) is used.", false, true ) ); } @@ -689,7 +700,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) } if( !result ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "メーカーコード", 0x10, 0x11, "使用不可のASCIIコードが使用されています。", "Maker Code", "Unusable ASCII code is used.", false, true ) ); } @@ -697,7 +708,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) // 値チェック if( this->pRomHeader->s.rom_type != 0x00 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "デバイスタイプ", 0x13, 0x13, "不正な値です。00hを設定してください。", "Device Type", "Invalid data. Please set 00h.", false, true ) ); } @@ -706,38 +717,38 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) u32 romsize = 1 << (this->pRomHeader->s.rom_size); // ROM容量 if( (romsize*1024*1024/8) < filesize ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "デバイス容量", 0x14, 0x14, "実ファイルサイズよりも小さい値が指定されています。", "Device Capacity", "Setting data is less than the actual file size.", false, true ) ); } else if( filesize < (romsize*1024*1024/8) ) { - this->hWarnList->Add( gcnew RCMRCError( // 警告 + this->hWarnList->Add( gcnew RCMrcError( // 警告 "デバイス容量", 0x14, 0x14, "実ファイルサイズに比べて無駄のある値が設定されています。", "Device Capacity", "Setting data is larger than the actual file size.", false, true ) ); } if( (filesize % 2) != 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "実ファイルサイズ", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, "中途半端な値です。通常では2のべき乗の値です。", "Actual File Size", "Invalid size. This size is usually power of 2.", false, true ) ); } u8 romver = this->pRomHeader->s.rom_version; if( ((romver < 0x00) || (0x09 < romver)) && (romver != 0xE0) ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "リマスターバージョン", 0x1e, 0x1e, "不正な値です。正式版では01h-09hのいずれかの値、事前版ではE0hです。", "Release Ver.", "Invalid data. Please set either one of 01h-09h(Regular ver.), or E0h(Preliminary ver.)", false, true ) ); } if( this->pRomHeader->s.banner_offset == 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "バナーオフセット", 0x68, 0x6b, "バナーデータが設定されていません。", "Banner Offset.", "Banner data is not set.", false, true ) ); } if( this->pRomHeader->s.rom_valid_size == 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "ROM実効サイズ", 0x80, 0x83, "値が設定されていません。", "ROM Valid Size.", "Data is not set.", false, true ) ); } @@ -755,7 +766,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) } if (secure_size <= 0) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "セキュア領域CRC", 0x15e, 0x15f, "セキュア領域のアドレス指定が不正です。", "Secure Area CRC.", "Illegal address of secure area.", false, true ) ); } @@ -770,7 +781,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) delete []secures; if( crc != this->pRomHeader->s.secure_area_crc16 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "セキュア領域CRC", 0x07c, 0x07d, "計算結果と一致しません。セキュア領域が改ざんされた可能性があります。", "Secure Area CRC.", "Calclated CRC is different from Registered one.", false, true ) ); } @@ -780,7 +791,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) crc = 0xcf56; if( crc != this->pRomHeader->s.nintendo_logo_crc16 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "キャラクターデータCRC", 0x15c, 0x15d, "計算結果と一致しません。キャラクターデータが改ざんされた可能性があります。", "Charactor Data CRC.", "Calclated CRC is different from Registered one.", false, true ) ); } @@ -789,7 +800,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) crc = calcCRC( CRC16_INIT_VALUE, (u8*)this->pRomHeader, CALC_CRC16_SIZE ); if( crc != this->pRomHeader->s.header_crc16 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "ROMヘッダCRC", 0x15e, 0x15f, "計算結果と一致しません。ROMヘッダが改ざんされた可能性があります。", "ROM Header CRC.", "Calclated CRC is different from Registered one.", false, true ) ); } @@ -799,7 +810,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) { if( this->pRomHeader->s.ctrl_reserved_B[i] != 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "ROM情報予約領域", 0x078, 0x07f, "不正な値が含まれています。この領域をすべて0で埋めてください。", "Reserved Area for ROM Info.", "Invalid data is included. Please set 0 into this area.", false, true ) ); } @@ -808,7 +819,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) { if( this->pRomHeader->s.reserved_C[i] != 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "予約領域C", 0x078, 0x07f, "不正な値が含まれています。この領域をすべて0で埋めてください。", "Reserved Area C", "Invalid data is included. Please set 0 into this area.", false, true ) ); } @@ -831,7 +842,7 @@ ECSrlResult RCSrl::mrcNTR( FILE *fp ) } if( i == 32 ) // 全部0 { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "システムコールライブラリ", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, "SDKデフォルトです。", "System-Call Library", "This Library is SDK default one.", false, true ) ); } @@ -858,19 +869,19 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) u32 romsize = 1 << (this->pRomHeader->s.rom_size); // ROM容量 if( (romsize < METWL_ROMSIZE_MIN) || (METWL_ROMSIZE_MAX < romsize) ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "デバイス容量", 0x14, 0x14, "指定可能な容量ではありません。", "Device Capacity", "Invalid capacity.", false, true ) ); } if( this->pRomHeader->s.warning_no_spec_rom_speed != 0 ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "諸フラグ", 0x1f, 0x1f, "rsfファイルでROMSpeedTypeが設定されていません。", "Setting Flags", "In a RSF file, the item \"ROMSpeedType\" is not set.", false, true ) ); } if( (this->pRomHeader->s.game_cmd_param & CARD_LATENCY_MASK) != CARD_1TROM_GAME_LATENCY ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "ROMコントロール情報", 0x60, 0x67, "TWLではマスクROMは用意されていません。ワンタイムPROM設定にしてください。", "ROM Control Info.", "Mask ROM can be set. Please set One-time PROM.", false, true ) ); } @@ -880,7 +891,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) { if( this->pRomHeader->s.reserved_A[i] != 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "予約領域A", 0x015, 0x01b, "不正な値が含まれています。この領域をすべて0で埋めてください。", "Reserved Area A", "Invalid data is included. Please set 0 into this area.", false, true ) ); } @@ -889,7 +900,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) { if( this->pRomHeader->s.reserved_B[i] != 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "予約領域B", 0x099, 0x0bf, "不正な値が含まれています。この領域をすべて0で埋めてください。", "Reserved Area B", "Invalid data is included. Please set 0 into this area.", false, true ) ); } @@ -933,14 +944,14 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) if( apptype < 0 ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "アプリ種別", 0x230, 0x237, "不正な値です。", "Application Type", "Illigal type.", false, true ) ); } #ifdef METWL_VER_APPTYPE_USER if( apptype != appUser ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "アプリ種別", 0x230, 0x237, "ユーザアプリではありません。", "Application Type", "Not USER application.", false, true ) ); } @@ -948,7 +959,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) #ifdef METWL_VER_APPTYPE_SYSTEM if( apptype != appSystem ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "アプリ種別", 0x230, 0x237, "システムアプリではありません。", "Application Type", "Not SYSTEM application.", false, true ) ); } @@ -956,7 +967,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) #ifdef METWL_VER_APPTYPE_SECURE if( apptype != appSecure ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "アプリ種別", 0x230, 0x237, "セキュアアプリではありません。", "Application Type", "Not SECURE application.", false, true ) ); } @@ -964,7 +975,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) #ifdef METWL_VER_APPTYPE_LAUNCHER if( apptype != appLauncher ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "アプリ種別", 0x230, 0x237, "ランチャーアプリではありません。", "Application Type", "Not LAUNCHER application.", false, true ) ); } @@ -974,14 +985,14 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) if( (this->pRomHeader->s.access_control.game_card_on != 0) && (this->pRomHeader->s.access_control.game_card_nitro_mode != 0) ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "アクセスコントロール情報", 0x1b4, 0x1b7, "ゲームカード電源設定にノーマルモードとNTRモードの両方を設定することはできません。", "Access Control Info.", "Game card power setting is either normal mode or NTR mode.", false, true ) ); } if( ((this->pRomHeader->s.titleID_Hi & TITLE_ID_HI_MEDIA_MASK) == 0) && // カードアプリ ((this->pRomHeader->s.access_control.game_card_on != 0) || (this->pRomHeader->s.access_control.game_card_nitro_mode != 0)) ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "アクセスコントロール情報", 0x1b4, 0x1b7, "ゲームカード用ソフトに対してゲームカード電源設定をすることはできません。", "Access Control Info.", "Game card power setting is not for Game Card Soft.", false, true ) ); } @@ -991,7 +1002,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) (this->pRomHeader->s.shared2_file2_size != 0) || (this->pRomHeader->s.shared2_file3_size != 0) || (this->pRomHeader->s.shared2_file4_size != 0) || (this->pRomHeader->s.shared2_file5_size != 0) ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "アクセスコントロール情報", 0x1b4, 0x1b7, "Shared2ファイルのサイズが設定されているにもかかわらず不使用設定になっています。", "Access Control Info.", "Sizes of shared2 files is setting, but using them is not enabled.", false, true ) ); } @@ -999,7 +1010,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) if( (this->pRomHeader->s.arm7_scfg_ext >> 31) != 0 ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "SCFG設定", 0x1b8, 0x1bb, "SCFGレジスタへアクセス可能になっています。", "SCFG Setting", "In this setting, SCFG register is accessible.", false, true ) ); } @@ -1009,7 +1020,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) (this->pRomHeader->s.titleID_Lo[2] != this->pRomHeader->s.game_code[1]) || (this->pRomHeader->s.titleID_Lo[3] != this->pRomHeader->s.game_code[0]) ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "タイトルID", 0x230, 0x233, "下位4バイトがイニシャルコードと一致しません。", "Title ID", "Lower 4 bytes don't match ones of Game Code.", false, true ) ); } @@ -1018,7 +1029,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) { if( this->pRomHeader->s.reserved_ltd_F[i] != 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "予約領域F", 0x240, 0x2ef, "不正な値が含まれています。この領域をすべて0で埋めてください。", "Reserved Area F", "Invalid data is included. Please set 0 into this area.", false, true ) ); } @@ -1029,7 +1040,7 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) u8 *p = (u8*)this->pRomHeader; if( p[ 0x378 + i ] != 0 ) { - this->hErrorList->Add( gcnew RCMRCError( + this->hErrorList->Add( gcnew RCMrcError( "予約領域D", 0x378, 0xf7f, "不正な値が含まれています。この領域をすべて0で埋めてください。", "Reserved Area D", "Invalid data is included. Please set 0 into this area.", false, true ) ); } @@ -1043,6 +1054,50 @@ ECSrlResult RCSrl::mrcTWL( FILE *fp ) return pctl; } + // 追加チェック + if( *(this->hMrcSpecialList->hIsCheck) == true ) + { + // SDKバージョン + System::Boolean match = true; + for each( RCSDKVersion ^sdk in this->hSDKList ) + { + if( sdk->IsStatic && (sdk->Code != *(this->hMrcSpecialList->hSDKVer) ) ) + { + match = false; + } + } + if( !match ) + { + this->hWarnList->Add( gcnew RCMrcError( + "SDKバージョン", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, "本プログラムに登録されているバージョン情報と一致しません。", + "SDK Version", "The data doesn't match one registered in this program.", false, true ) ); + } + + // EULAバージョン + if( *(this->hEULAVersion) != *(this->hMrcSpecialList->hEULAVer) ) + { + this->hWarnList->Add( gcnew RCMrcError( + "EULA バージョン", METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, "本プログラムに登録されているバージョン情報と一致しません。", + "EULA Version", "The data doesn't match one registered in this program.", false, true ) ); + } + + // Shared2ファイルサイズ + for( i=0; i < METWL_NUMOF_SHARED2FILES; i++ ) + { + if( *(this->hShared2SizeArray[i]) > 0 ) // 0は未使用を表すのでチェックしない + { + if( *(this->hShared2SizeArray[i]) != *(this->hMrcSpecialList->hShared2SizeArray[i]) ) + { + this->hWarnList->Add( gcnew RCMrcError( + "Shared2ファイル" + i.ToString(), METWL_ERRLIST_NORANGE, METWL_ERRLIST_NORANGE, + "本プログラムに登録されているファイルサイズ情報と一致しません。", + "Shared2 file" + i.ToString(), "The size doesn't match one registered in this program.", false, true ) ); + } + } + } + + } //if( *(this->hMrcSpecialList->hIsCheck) ) + return ECSrlResult::NOERROR; } // mrcTWL() @@ -1114,14 +1169,14 @@ System::Boolean RCSrl::mrcRegion( System::UInt32 region ) #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( + 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( + this->hErrorList->Add( gcnew RCMrcError( "カードリージョン", 0x1b0, 0x1b3, "仕向地の組み合わせが不正です。本ツールを用いて修正してください。", "Card Region", "Illigal Region. Please modify this information using this tool.", true, true ) ); bRegionResult = false; @@ -1136,7 +1191,7 @@ System::Boolean RCSrl::mrcRegion( System::UInt32 region ) { this->clearParentalControl( i ); } - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "ペアレンタルコントロール情報", 0x2f0, 0x2ff, "仕向地の設定が不正のため、ROMデータ内のすべてのレーティング団体の情報を無視して読み込みました。本ツールを用いて修正してください。", "Parental Control", @@ -1260,7 +1315,7 @@ void RCSrl::mrcRegionOrganization( System::UInt32 region ) { if( this->pRomHeader->s.parental_control_rating_info[ ogn ] == 0 ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "ペアレンタルコントロール情報", 0x2f0, 0x2ff, ognArray[ogn] + warnEmptyJ, "Parental Control", ognArray[ogn] + warnEmptyE, true, true ) ); this->clearParentalControl( ogn ); @@ -1278,7 +1333,7 @@ void RCSrl::mrcRegionOrganization( System::UInt32 region ) } if( bSet ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "ペアレンタルコントロール情報", 0x2f0, 0x2ff, warnFillJ, "Parental Control", warnFillE, true, true ) ); } @@ -1326,7 +1381,7 @@ void RCSrl::mrcRating( System::Byte ogn ) if( *(this->hArrayParentalEffect[ ogn ]) == false ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "ペアレンタルコントロール情報", 0x2f0, 0x2ff, ognArray[ ogn ] + warnDisableJ, "Parental Control", ognArray[ ogn ] + warnDisableE, true, true ) ); this->clearParentalControl( ogn ); @@ -1342,7 +1397,7 @@ void RCSrl::mrcRating( System::Byte ogn ) // RPが立っていないときレーティング値が設定されていなかったらダメ if( (str != nullptr) && str->Equals( L"未審査" ) ) { - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "ペアレンタルコントロール情報", 0x2f0, 0x2ff, ognArray[ ogn ] + warnIllegalJ, "Parental Control", ognArray[ ogn ] + warnIllegalE, true, true ) ); this->clearParentalControl( ogn ); @@ -1351,7 +1406,7 @@ void RCSrl::mrcRating( System::Byte ogn ) else { // RPが立っていたら問答無用に警告 - this->hWarnList->Add( gcnew RCMRCError( + this->hWarnList->Add( gcnew RCMrcError( "ペアレンタルコントロール情報", 0x2f0, 0x2ff, ognArray[ ogn ] + warnPendingJ, "Parental Control", ognArray[ ogn ] + warnPendingE, true, true ) ); this->clearParentalControl( ogn ); diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h index ebd94cc2..51738c91 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/srl.h @@ -48,16 +48,18 @@ namespace MasterEditorTWL { private: System::String ^hVersion; + System::UInt32 ^hCode; System::Boolean ^hIsStatic; private: RCSDKVersion(){} // 封じる public: - RCSDKVersion( System::String ^ver, System::Boolean isStatic ) // 生成時にのみフィールドを設定可能 + RCSDKVersion( System::String ^ver, System::UInt32 code, System::Boolean isStatic ) // 生成時にのみフィールドを設定可能 { if( ver == nullptr ) this->hVersion = gcnew System::String(""); // NULL参照バグを避ける else this->hVersion = ver; + this->hCode = gcnew System::UInt32( code ); this->hIsStatic = gcnew System::Boolean( isStatic ); } public: @@ -70,6 +72,11 @@ namespace MasterEditorTWL { System::Boolean get(){ return *(this->hIsStatic); } } + public: + property System::UInt32 Code + { + System::UInt32 get(){ return *(this->hCode); } + } }; // ------------------------------------------------------------------- @@ -114,13 +121,13 @@ namespace MasterEditorTWL // ------------------------------------------------------------------- // Type : ref class - // Name : RCMRCError + // Name : RCMrcError // // Description : RCSrlクラスに持たせるMRCエラー情報クラス // // Role : 構造体としてデータをまとめておく // ------------------------------------------------------------------- - public ref class RCMRCError + public ref class RCMrcError { private: System::String ^hName; // 項目名 @@ -132,9 +139,9 @@ namespace MasterEditorTWL System::Boolean ^hEnableModify; // マスタエディタで修正可能かどうか System::Boolean ^hAffectRom; // 変更するとSRL(ROMバイナリ)が変更されるか private: - RCMRCError(){} // 封じる + RCMrcError(){} // 封じる public: - RCMRCError( + RCMrcError( System::String ^name, System::UInt32 beg, System::UInt32 end, System::String ^msg, System::String ^nameE, System::String ^msgE, System::Boolean enableModify, System::Boolean affectRom ) { @@ -192,6 +199,36 @@ namespace MasterEditorTWL } }; + // ------------------------------------------------------------------- + // Type : ref class + // Name : RCMrcSpecialList + // + // Description : MRCの追加エラー項目クラス + // + // Role : 構造体としてデータをまとめておく + // ------------------------------------------------------------------- + ref class RCMrcSpecialList + { + public: + property System::Boolean ^hIsCheck; + property System::UInt32 ^hSDKVer; + property System::Byte ^hEULAVer; + property cli::array ^hShared2SizeArray; + public: + RCMrcSpecialList() + { + this->hIsCheck = gcnew System::Boolean( false ); + this->hSDKVer = gcnew System::UInt32( 0 ); + this->hEULAVer = gcnew System::Byte( 0 ); + this->hShared2SizeArray = gcnew cli::array(METWL_NUMOF_SHARED2FILES); // ファイルサイズの数に合わせる + System::Int32 i; + for( i=0; i < METWL_NUMOF_SHARED2FILES; i++ ) + { + this->hShared2SizeArray[i] = gcnew System::UInt32( 0 ); + } + } + }; + // ------------------------------------------------------------------- // Type : ref class // Name : RCSrl @@ -269,12 +306,13 @@ namespace MasterEditorTWL property System::Boolean ^hIsCommonClientKeyForDebugger; // Shared2ファイルサイズ Read Only - property System::UInt32 ^hShared2Size0; - property System::UInt32 ^hShared2Size1; - property System::UInt32 ^hShared2Size2; - property System::UInt32 ^hShared2Size3; - property System::UInt32 ^hShared2Size4; - property System::UInt32 ^hShared2Size5; + //property System::UInt32 ^hShared2Size0; + //property System::UInt32 ^hShared2Size1; + //property System::UInt32 ^hShared2Size2; + //property System::UInt32 ^hShared2Size3; + //property System::UInt32 ^hShared2Size4; + //property System::UInt32 ^hShared2Size5; + property cli::array ^hShared2SizeArray; // カードリージョン Read Only property System::Boolean ^hIsRegionJapan; @@ -287,8 +325,11 @@ namespace MasterEditorTWL property System::Collections::Generic::List ^hLicenseList; // MRC機能でチェックされたエラー情報のリスト - property System::Collections::Generic::List ^hErrorList; - property System::Collections::Generic::List ^hWarnList; + property System::Collections::Generic::List ^hErrorList; + property System::Collections::Generic::List ^hWarnList; + + // MRC追加項目 + property RCMrcSpecialList ^hMrcSpecialList; // constructor and destructor public: diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp index 4a3a8b02..1e23f929 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.cpp @@ -379,3 +379,60 @@ System::Collections::Generic::List^ MasterEditorTWL::patternMatch( FILE *fp } return list; } + +// +// XMLのルートノードから指定した名前のタグを検索して返す +// +// @arg [in] XMLのルートノード +// @arg [in] タグ名 +// +// @ret 検索でマッチしたときノードを返す。ないときは nullptr。 +// ただし、最初にマッチしたもののみ返す +// +System::Xml::XmlNode^ MasterEditorTWL::searchXmlNode( System::Xml::XmlElement ^root, System::String ^tag ) +{ + System::Xml::XmlNodeList ^list = root->GetElementsByTagName( tag ); + System::Xml::XmlNode ^item = nullptr; + if( list != nullptr ) + { + item = list->Item(0); + } + return item; +} + +// +// タグを検索してそのテキストが指定したテキストと一致するか調べる +// +// @arg [in] XMLのルートノード +// @arg [in] タグ名 +// @arg [in] 値 +// +// @ret 一致するときtrue。一致しないとき、タグが存在しないときはfalse。 +// +System::Boolean MasterEditorTWL::isXmlEqual( System::Xml::XmlElement ^root, System::String ^tag, System::String ^val ) +{ + System::Xml::XmlNode ^item = MasterEditorTWL::searchXmlNode( root, tag ); + if( (item != nullptr) && (item->FirstChild != nullptr) && (item->FirstChild->Value->Equals( val )) ) + { + return true; + } + return false; +} + +// +// タグを検索してそのテキストを返す +// +// @arg [in] XMLのルートノード +// @arg [in] タグのXPath +// +// @ret テキストが存在するときそのテキストを返す。存在しないときnullptr。 +// +System::String^ MasterEditorTWL::getXpathText( System::Xml::XmlElement ^root, System::String ^xpath ) +{ + System::Xml::XmlNode ^tmp = root->SelectSingleNode( xpath ); + if( tmp && tmp->FirstChild && tmp->FirstChild->Value ) + { + return tmp->FirstChild->Value; + } + return nullptr; +} diff --git a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h index 2b687fb6..0fb64a3e 100644 --- a/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h +++ b/build/tools/MasterEditorTWL/MasterEditorTWL/utility.h @@ -70,4 +70,36 @@ namespace MasterEditorTWL // System::Collections::Generic::List^ patternMatch( FILE *fp, const u8 *pattern, const u32 patternLen ); + // + // XMLのルートノードから指定した名前のタグを検索して返す + // + // @arg [in] XMLのルートノード + // @arg [in] タグ名 + // + // @ret 検索でマッチしたときノードを返す。ないときは nullptr。 + // ただし、最初にマッチしたもののみ返す + // + System::Xml::XmlNode^ searchXmlNode( System::Xml::XmlElement ^root, System::String ^tag ); + + // + // タグを検索してそのテキストが指定したテキストと一致するか調べる + // + // @arg [in] XMLのルートノード + // @arg [in] タグ名 + // @arg [in] 値 + // + // @ret 一致するときtrue。一致しないとき、タグが存在しないときはfalse。 + // + System::Boolean isXmlEqual( System::Xml::XmlElement ^root, System::String ^tag, System::String ^val ); + + // + // タグを検索してそのテキストを返す + // + // @arg [in] XMLのルートノード + // @arg [in] タグのXPath + // + // @ret テキストが存在するときそのテキストを返す。存在しないときnullptr。 + // + System::String^ getXpathText( System::Xml::XmlElement ^root, System::String ^xpath ); + } // end of namespace MasterEditorTWL diff --git a/build/tools/MasterEditorTWL/resource/ini.xml b/build/tools/MasterEditorTWL/resource/ini.xml index 616ae387..04e9ae14 100644 --- a/build/tools/MasterEditorTWL/resource/ini.xml +++ b/build/tools/MasterEditorTWL/resource/ini.xml @@ -2,5 +2,19 @@ w Sheet - RC + OFF + + 5 + 0 + 20200 + + 0 + + 0 + 0 + 0 + 0 + 0 + 0 +