OSDN Git Service

#xxxxx リリース番号を107に変更。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / スコア、曲 / CScoreIni.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Runtime.InteropServices;\r
5 using System.Drawing;\r
6 using System.Drawing.Imaging;\r
7 using System.Diagnostics;\r
8 using System.IO;\r
9 using System.Security.Cryptography;\r
10 using FDK;\r
11 \r
12 namespace DTXMania\r
13 {\r
14         public class CScoreIni\r
15         {\r
16                 // プロパティ\r
17 \r
18                 // [File] セクション\r
19                 public STファイル stファイル;\r
20                 [StructLayout(LayoutKind.Sequential)]\r
21                 public struct STファイル\r
22                 {\r
23                         public string Title;\r
24                         public string Name;\r
25                         public string Hash;\r
26                         public int PlayCountDrums;\r
27                         public int PlayCountGuitar;\r
28                         public int PlayCountBass;\r
29                         // #23596 10.11.16 add ikanick-----/\r
30                         public int ClearCountDrums;\r
31                         public int ClearCountGuitar;\r
32                         public int ClearCountBass;\r
33                         // #24459 2011.2.24 yyagi----------/\r
34                         public STDGBSValue<ERANK> BestRank;\r
35                         // --------------------------------/\r
36                         public int HistoryCount;\r
37                         public string[] History;\r
38                         public int BGMAdjust;\r
39                 }\r
40 \r
41                 // 演奏記録セクション(9種類)\r
42                 public STセクション stセクション;\r
43                 [StructLayout(LayoutKind.Sequential)]\r
44                 public struct STセクション\r
45                 {\r
46                         public STDGBSValue<CScoreIni.C演奏記録> HiScore;\r
47                         public STDGBSValue<CScoreIni.C演奏記録> HiSkill;\r
48                         public STDGBSValue<CScoreIni.C演奏記録> LastPlay;\r
49                 }\r
50 \r
51                 public enum Eセクション種別 : int\r
52                 {\r
53                         Unknown = -2,\r
54                         File = -1,\r
55                         HiScoreDrums = 0,\r
56                         HiSkillDrums = 1,\r
57                         HiScoreGuitar = 2,\r
58                         HiSkillGuitar = 3,\r
59                         HiScoreBass = 4,\r
60                         HiSkillBass = 5,\r
61                         LastPlayDrums = 6,  // #23595 2011.1.9 ikanick\r
62                         LastPlayGuitar = 7, //\r
63                         LastPlayBass = 8,   //\r
64                 }\r
65 \r
66                 public enum ERANK : int   // #24459 yyagi\r
67                 {\r
68                         SS = 0,\r
69                         S = 1,\r
70                         A = 2,\r
71                         B = 3,\r
72                         C = 4,\r
73                         D = 5,\r
74                         E = 6,\r
75                         UNKNOWN = 99\r
76                 }\r
77 \r
78                 public class C演奏記録\r
79                 {\r
80                         public STPadValue<bool> bAutoPlay;\r
81                         public bool bDrums有効;\r
82                         public bool bGuitar有効;\r
83                         public STDGBSValue<bool> bLight;\r
84                         public STDGBSValue<bool> bReverse;\r
85                         public STDGBSValue<ESudHidInv> eSudHidInv;\r
86                         public bool bSTAGEFAILED有効;\r
87                         public bool bTight;\r
88                         public bool b演奏にMIDI入力を使用した;\r
89                         public bool b演奏にキーボードを使用した;\r
90                         public bool b演奏にジョイパッドを使用した;\r
91                         public bool b演奏にマウスを使用した;\r
92                         public double dbゲーム型スキル値;\r
93                         public double db演奏型スキル値;\r
94                         public ECYGroup eCYGroup;\r
95                         public EDark eDark;\r
96                         public EFTGroup eFTGroup;\r
97                         public EHHGroup eHHGroup;\r
98                         public EHitSoundPriority eHitSoundPriorityCY;\r
99                         public EHitSoundPriority eHitSoundPriorityFT;\r
100                         public EHitSoundPriority eHitSoundPriorityHH;\r
101                         public STDGBSValue<ERandom> eRandom;\r
102                         public EDamage eダメージレベル;\r
103                         public STDGBSValue<float> f譜面スクロール速度;\r
104                         public string Hash;\r
105                         public int nGoodになる範囲ms;\r
106                         public int nGood数;\r
107                         public int nGreatになる範囲ms;\r
108                         public int nGreat数;\r
109                         public int nMiss数;\r
110                         public int nPerfectになる範囲ms;\r
111                         public int nPerfect数;\r
112                         public int nPoorになる範囲ms;\r
113                         public int nPoor数;\r
114                         public int nPerfect数_Auto含まない;\r
115                         public int nGreat数_Auto含まない;\r
116                         public int nGood数_Auto含まない;\r
117                         public int nPoor数_Auto含まない;\r
118                         public int nMiss数_Auto含まない;\r
119                         public long nスコア;\r
120                         public int n演奏速度分子;\r
121                         public int n演奏速度分母;\r
122                         public int n最大コンボ数;\r
123                         public int n全チップ数;\r
124                         public string strDTXManiaのバージョン;\r
125                         //public bool レーン9モード;\r
126                         public STDGBSValue<EUseLanes> e譜面レーンタイプ;\r
127                         public int nRisky;    // #23559 2011.6.20 yyagi 0=OFF, 1-10=Risky\r
128                         public string 最終更新日時;\r
129                         public bool bギターとベースを入れ替えた; // #35417 2015.08.30 chnmr0 add\r
130                         public EClickType eMetronome;           // #24159 2016.8.2 yyagi\r
131 \r
132                         public C演奏記録()\r
133                         {\r
134                                 this.bAutoPlay = new STPadValue<bool>();\r
135                                 this.eSudHidInv = new STDGBSValue<ESudHidInv>();\r
136                                 this.bReverse = new STDGBSValue<bool>();\r
137                                 this.eRandom = new STDGBSValue<ERandom>();\r
138                                 this.bLight = new STDGBSValue<bool>();\r
139                                 this.f譜面スクロール速度 = new STDGBSValue<float>();\r
140                                 for (EPart i = EPart.Drums; i <= EPart.Bass; ++i)\r
141                                 {\r
142                                         f譜面スクロール速度[i] = 1f;\r
143                                 }\r
144                                 this.n演奏速度分子 = 20;\r
145                                 this.n演奏速度分母 = 20;\r
146                                 this.bGuitar有効 = true;\r
147                                 this.bDrums有効 = true;\r
148                                 this.bSTAGEFAILED有効 = true;\r
149                                 this.eダメージレベル = EDamage.Normal;\r
150                                 this.nPerfectになる範囲ms = 34;\r
151                                 this.nGreatになる範囲ms = 67;\r
152                                 this.nGoodになる範囲ms = 84;\r
153                                 this.nPoorになる範囲ms = 117;\r
154                                 this.strDTXManiaのバージョン = "Unknown";\r
155                                 this.最終更新日時 = "";\r
156                                 this.Hash = "00000000000000000000000000000000";\r
157                                 //this.レーン9モード = true;\r
158                                 this.e譜面レーンタイプ.Drums  = EUseLanes.Dr_6;\r
159                                 this.e譜面レーンタイプ.Guitar = EUseLanes.GB_3;\r
160                                 this.e譜面レーンタイプ.Bass   = EUseLanes.GB_3;\r
161                                 this.nRisky = 0;                  // #23559 2011.6.20 yyagi\r
162                                 this.bギターとベースを入れ替えた = false; // #35417 2015.08.30 chnmr0 add\r
163                                 this.eMetronome = EClickType.Off;\r
164                         }\r
165 \r
166                         public bool bフルコンボじゃない\r
167                         {\r
168                                 get\r
169                                 {\r
170                                         return !this.bフルコンボである;\r
171                                 }\r
172                         }\r
173                         public bool bフルコンボである\r
174                         {\r
175                                 get\r
176                                 {\r
177                                         return ((this.n最大コンボ数 > 0) && (this.n最大コンボ数 == (this.nPerfect数 + this.nGreat数 + this.nGood数 + this.nPoor数 + this.nMiss数)));\r
178                                 }\r
179                         }\r
180 \r
181                         public bool b全AUTOじゃない\r
182                         {\r
183                                 get\r
184                                 {\r
185                                         return !b全AUTOである;\r
186                                 }\r
187                         }\r
188                         public bool b全AUTOである\r
189                         {\r
190                                 get\r
191                                 {\r
192                                         return (this.n全チップ数 - this.nPerfect数_Auto含まない - this.nGreat数_Auto含まない - this.nGood数_Auto含まない - this.nPoor数_Auto含まない - this.nMiss数_Auto含まない) == this.n全チップ数;\r
193                                 }\r
194                         }\r
195                 }\r
196 \r
197                 /// <summary>\r
198                 /// <para>.score.ini の存在するフォルダ(絶対パス;末尾に '\' はついていない)。</para>\r
199                 /// <para>未保存などでファイル名がない場合は null。</para>\r
200                 /// </summary>\r
201                 public string iniファイルのあるフォルダ名\r
202                 {\r
203                         get;\r
204                         private set;\r
205                 }\r
206 \r
207                 /// <summary>\r
208                 /// <para>.score.ini のファイル名(絶対パス)。</para>\r
209                 /// <para>未保存などでファイル名がない場合は null。</para>\r
210                 /// </summary>\r
211                 public string iniファイル名\r
212                 {\r
213                         get;\r
214                         private set;\r
215                 }\r
216 \r
217 \r
218                 // コンストラクタ\r
219 \r
220                 public CScoreIni()\r
221                 {\r
222                         this.iniファイルのあるフォルダ名 = null;\r
223                         this.iniファイル名 = null;\r
224                         this.stファイル = new STファイル();\r
225                         stファイル.Title = "";\r
226                         stファイル.Name = "";\r
227                         stファイル.Hash = "";\r
228                         stファイル.History = new string[] { "", "", "", "", "" };\r
229                         stファイル.BestRank.Drums = ERANK.UNKNOWN;    // #24459 2011.2.24 yyagi\r
230                         stファイル.BestRank.Guitar = ERANK.UNKNOWN;   //\r
231                         stファイル.BestRank.Bass = ERANK.UNKNOWN;   //\r
232 \r
233                         this.stセクション = new STセクション();\r
234 \r
235 \r
236                         stセクション.HiScore = new STDGBSValue<C演奏記録>();\r
237                         stセクション.HiSkill = new STDGBSValue<C演奏記録>();\r
238                         stセクション.LastPlay = new STDGBSValue<C演奏記録>();\r
239 \r
240                         for (EPart i = EPart.Drums; i <= EPart.Bass; ++i)\r
241                         {\r
242                                 stセクション.HiScore[i] = new C演奏記録();\r
243                                 stセクション.HiSkill[i] = new C演奏記録();\r
244                                 stセクション.LastPlay[i] = new C演奏記録();\r
245                         }\r
246                 }\r
247 \r
248                 /// <summary>\r
249                 /// <para>初期化後にiniファイルを読み込むコンストラクタ。</para>\r
250                 /// <para>読み込んだiniに不正値があれば、それが含まれるセクションをリセットする。</para>\r
251                 /// </summary>\r
252                 public CScoreIni(string str読み込むiniファイル)\r
253                         : this()\r
254                 {\r
255                         this.t読み込み(str読み込むiniファイル);\r
256                 }\r
257 \r
258 \r
259                 // メソッド\r
260 \r
261                 /// <summary>\r
262                 /// <para>現在の this.Record[] オブジェクトの、指定されたセクションの情報が正当であるか否かを判定する。\r
263                 /// 真偽どちらでも、その内容は書き換えない。</para>\r
264                 /// </summary>\r
265                 /// <param name="eセクション">判定するセクション。</param>\r
266                 /// <returns>正当である(整合性がある)場合は true。</returns>\r
267                 public bool b整合性がある(Eセクション種別 eセクション)\r
268                 {\r
269                         return true;  // オープンソース化に伴い、整合性チェックを無効化。(2010.10.21)\r
270                 }\r
271 \r
272                 /// <summary>\r
273                 /// 指定されたファイルの内容から MD5 値を求め、それを16進数に変換した文字列を返す。\r
274                 /// </summary>\r
275                 /// <param name="ファイル名">MD5 を求めるファイル名。</param>\r
276                 /// <returns>算出結果の MD5 を16進数で並べた文字列。</returns>\r
277                 public static string tファイルのMD5を求めて返す(string ファイル名)\r
278                 {\r
279                         byte[] buffer = null;\r
280                         FileStream stream = new FileStream(ファイル名, FileMode.Open, FileAccess.Read);\r
281                         buffer = new byte[stream.Length];\r
282                         stream.Read(buffer, 0, (int)stream.Length);\r
283                         stream.Close();\r
284                         StringBuilder builder = new StringBuilder(0x21);\r
285                         {\r
286                                 MD5CryptoServiceProvider m = new MD5CryptoServiceProvider();\r
287                                 byte[] buffer2 = m.ComputeHash(buffer);\r
288                                 foreach (byte num in buffer2)\r
289                                         builder.Append(num.ToString("x2"));\r
290                         }\r
291                         return builder.ToString();\r
292                 }\r
293 \r
294                 /// <summary>\r
295                 /// 指定された .score.ini を読み込む。内容の真偽は判定しない。\r
296                 /// </summary>\r
297                 /// <param name="iniファイル名">読み込む .score.ini ファイルを指定します(絶対パスが安全)。</param>\r
298                 public void t読み込み(string iniファイル名)\r
299                 {\r
300                         this.iniファイルのあるフォルダ名 = Path.GetDirectoryName(iniファイル名);\r
301                         this.iniファイル名 = Path.GetFileName(iniファイル名);\r
302 \r
303                         Eセクション種別 section = Eセクション種別.Unknown;\r
304                         if (File.Exists(iniファイル名))\r
305                         {\r
306                                 string str;\r
307                                 StreamReader reader = new StreamReader(iniファイル名, Encoding.GetEncoding("Shift_JIS"));\r
308                                 while ((str = reader.ReadLine()) != null)\r
309                                 {\r
310                                         str = str.Replace('\t', ' ').TrimStart(new char[] { '\t', ' ' });\r
311                                         if ((str.Length != 0) && (str[0] != ';'))\r
312                                         {\r
313                                                 try\r
314                                                 {\r
315                                                         string item;\r
316                                                         string para;\r
317                                                         C演奏記録 c演奏記録;\r
318                                                         #region [ section ]\r
319                                                         if (str[0] == '[')\r
320                                                         {\r
321                                                                 StringBuilder builder = new StringBuilder(0x20);\r
322                                                                 int num = 1;\r
323                                                                 while ((num < str.Length) && (str[num] != ']'))\r
324                                                                 {\r
325                                                                         builder.Append(str[num++]);\r
326                                                                 }\r
327                                                                 string str2 = builder.ToString();\r
328                                                                 if (str2.Equals("File"))\r
329                                                                 {\r
330                                                                         section = Eセクション種別.File;\r
331                                                                 }\r
332                                                                 else if (str2.Equals("HiScore.Drums"))\r
333                                                                 {\r
334                                                                         section = Eセクション種別.HiScoreDrums;\r
335                                                                 }\r
336                                                                 else if (str2.Equals("HiSkill.Drums"))\r
337                                                                 {\r
338                                                                         section = Eセクション種別.HiSkillDrums;\r
339                                                                 }\r
340                                                                 else if (str2.Equals("HiScore.Guitar"))\r
341                                                                 {\r
342                                                                         section = Eセクション種別.HiScoreGuitar;\r
343                                                                 }\r
344                                                                 else if (str2.Equals("HiSkill.Guitar"))\r
345                                                                 {\r
346                                                                         section = Eセクション種別.HiSkillGuitar;\r
347                                                                 }\r
348                                                                 else if (str2.Equals("HiScore.Bass"))\r
349                                                                 {\r
350                                                                         section = Eセクション種別.HiScoreBass;\r
351                                                                 }\r
352                                                                 else if (str2.Equals("HiSkill.Bass"))\r
353                                                                 {\r
354                                                                         section = Eセクション種別.HiSkillBass;\r
355                                                                 }\r
356                                                                 // #23595 2011.1.9 ikanick\r
357                                                                 else if (str2.Equals("LastPlay.Drums"))\r
358                                                                 {\r
359                                                                         section = Eセクション種別.LastPlayDrums;\r
360                                                                 }\r
361                                                                 else if (str2.Equals("LastPlay.Guitar"))\r
362                                                                 {\r
363                                                                         section = Eセクション種別.LastPlayGuitar;\r
364                                                                 }\r
365                                                                 else if (str2.Equals("LastPlay.Bass"))\r
366                                                                 {\r
367                                                                         section = Eセクション種別.LastPlayBass;\r
368                                                                 }\r
369                                                                 //----------------------------------------------------\r
370                                                                 else\r
371                                                                 {\r
372                                                                         section = Eセクション種別.Unknown;\r
373                                                                 }\r
374                                                         }\r
375                                                         #endregion\r
376                                                         else\r
377                                                         {\r
378                                                                 string[] strArray = str.Split(new char[] { '=' });\r
379                                                                 if (strArray.Length == 2)\r
380                                                                 {\r
381                                                                         item = strArray[0].Trim();\r
382                                                                         para = strArray[1].Trim();\r
383                                                                         switch (section)\r
384                                                                         {\r
385                                                                                 case Eセクション種別.File:\r
386                                                                                         {\r
387                                                                                                 if (!item.Equals("Title"))\r
388                                                                                                 {\r
389                                                                                                         goto Label_01C7;\r
390                                                                                                 }\r
391                                                                                                 this.stファイル.Title = para;\r
392                                                                                                 continue;\r
393                                                                                         }\r
394                                                                                 case Eセクション種別.HiScoreDrums:\r
395                                                                                         c演奏記録 = this.stセクション.HiScore.Drums;\r
396                                                                                         if (!item.Equals("Score"))\r
397                                                                                         {\r
398                                                                                                 goto Label_03B9;\r
399                                                                                         }\r
400                                                                                         c演奏記録.nスコア = long.Parse(para);\r
401                                                                                         continue;\r
402                                                                                 case Eセクション種別.HiSkillDrums:\r
403                                                                                         c演奏記録 = this.stセクション.HiSkill.Drums;\r
404                                                                                         if (!item.Equals("Score"))\r
405                                                                                         {\r
406                                                                                                 goto Label_03B9;\r
407                                                                                         }\r
408                                                                                         c演奏記録.nスコア = long.Parse(para);\r
409                                                                                         continue;\r
410                                                                                 case Eセクション種別.HiScoreGuitar:\r
411                                                                                         c演奏記録 = this.stセクション.HiScore.Guitar;\r
412                                                                                         if (!item.Equals("Score"))\r
413                                                                                         {\r
414                                                                                                 goto Label_03B9;\r
415                                                                                         }\r
416                                                                                         c演奏記録.nスコア = long.Parse(para);\r
417                                                                                         continue;\r
418                                                                                 case Eセクション種別.HiSkillGuitar:\r
419                                                                                         c演奏記録 = this.stセクション.HiSkill.Guitar;\r
420                                                                                         if (!item.Equals("Score"))\r
421                                                                                         {\r
422                                                                                                 goto Label_03B9;\r
423                                                                                         }\r
424                                                                                         c演奏記録.nスコア = long.Parse(para);\r
425                                                                                         continue;\r
426                                                                                 case Eセクション種別.HiScoreBass:\r
427                                                                                         c演奏記録 = this.stセクション.HiScore.Bass;\r
428                                                                                         if (!item.Equals("Score"))\r
429                                                                                         {\r
430                                                                                                 goto Label_03B9;\r
431                                                                                         }\r
432                                                                                         c演奏記録.nスコア = long.Parse(para);\r
433                                                                                         continue;\r
434                                                                                 case Eセクション種別.HiSkillBass:\r
435                                                                                         c演奏記録 = this.stセクション.HiSkill.Bass;\r
436                                                                                         if (!item.Equals("Score"))\r
437                                                                                         {\r
438                                                                                                 goto Label_03B9;\r
439                                                                                         }\r
440                                                                                         c演奏記録.nスコア = long.Parse(para);\r
441                                                                                         continue;\r
442                                                                                 case Eセクション種別.LastPlayDrums:\r
443                                                                                         // #23595 2011.1.9 ikanick\r
444                                                                                         c演奏記録 = this.stセクション.LastPlay.Drums;\r
445                                                                                         if (!item.Equals("Score"))\r
446                                                                                         {\r
447                                                                                                 goto Label_03B9;\r
448                                                                                         }\r
449                                                                                         c演奏記録.nスコア = long.Parse(para);\r
450                                                                                         continue;\r
451                                                                                 case Eセクション種別.LastPlayGuitar:\r
452                                                                                         c演奏記録 = this.stセクション.LastPlay.Guitar;\r
453                                                                                         if (!item.Equals("Score"))\r
454                                                                                         {\r
455                                                                                                 goto Label_03B9;\r
456                                                                                         }\r
457                                                                                         c演奏記録.nスコア = long.Parse(para);\r
458                                                                                         continue;\r
459                                                                                 case Eセクション種別.LastPlayBass:\r
460                                                                                         c演奏記録 = this.stセクション.LastPlay.Bass;\r
461                                                                                         if (!item.Equals("Score"))\r
462                                                                                         {\r
463                                                                                                 goto Label_03B9;\r
464                                                                                         }\r
465                                                                                         c演奏記録.nスコア = long.Parse(para);\r
466                                                                                         continue;\r
467                                                                         }\r
468                                                                 }\r
469                                                         }\r
470                                                         continue;\r
471                                                         #region [ File section ]\r
472                                                         Label_01C7:\r
473                                                         if (item.Equals("Name"))\r
474                                                         {\r
475                                                                 this.stファイル.Name = para;\r
476                                                         }\r
477                                                         else if (item.Equals("Hash"))\r
478                                                         {\r
479                                                                 this.stファイル.Hash = para;\r
480                                                         }\r
481                                                         else if (item.Equals("PlayCountDrums"))\r
482                                                         {\r
483                                                                 this.stファイル.PlayCountDrums = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);\r
484                                                         }\r
485                                                         else if (item.Equals("PlayCountGuitars"))// #23596 11.2.5 changed ikanick\r
486                                                         {\r
487                                                                 this.stファイル.PlayCountGuitar = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);\r
488                                                         }\r
489                                                         else if (item.Equals("PlayCountBass"))\r
490                                                         {\r
491                                                                 this.stファイル.PlayCountBass = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);\r
492                                                         }\r
493                                                         // #23596 10.11.16 add ikanick------------------------------------/\r
494                                                         else if (item.Equals("ClearCountDrums"))\r
495                                                         {\r
496                                                                 this.stファイル.ClearCountDrums = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);\r
497                                                         }\r
498                                                         else if (item.Equals("ClearCountGuitars"))// #23596 11.2.5 changed ikanick\r
499                                                         {\r
500                                                                 this.stファイル.ClearCountGuitar = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);\r
501                                                         }\r
502                                                         else if (item.Equals("ClearCountBass"))\r
503                                                         {\r
504                                                                 this.stファイル.ClearCountBass = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);\r
505                                                         }\r
506                                                         // #24459 2011.2.24 yyagi-----------------------------------------/\r
507                                                         else if (item.Equals("BestRankDrums"))\r
508                                                         {\r
509                                                                 this.stファイル.BestRank.Drums = (ERANK)C変換.n値を文字列から取得して範囲内に丸めて返す(para, (int)ERANK.SS, (int)ERANK.E, (int)ERANK.UNKNOWN);\r
510                                                         }\r
511                                                         else if (item.Equals("BestRankGuitar"))\r
512                                                         {\r
513                                                                 this.stファイル.BestRank.Guitar = (ERANK)C変換.n値を文字列から取得して範囲内に丸めて返す(para, (int)ERANK.SS, (int)ERANK.E, (int)ERANK.UNKNOWN);\r
514                                                         }\r
515                                                         else if (item.Equals("BestRankBass"))\r
516                                                         {\r
517                                                                 this.stファイル.BestRank.Bass = (ERANK)C変換.n値を文字列から取得して範囲内に丸めて返す(para, (int)ERANK.SS, (int)ERANK.E, (int)ERANK.UNKNOWN);\r
518                                                         }\r
519                                                         //----------------------------------------------------------------/\r
520                                                         else if (item.Equals("History0"))\r
521                                                         {\r
522                                                                 this.stファイル.History[0] = para;\r
523                                                         }\r
524                                                         else if (item.Equals("History1"))\r
525                                                         {\r
526                                                                 this.stファイル.History[1] = para;\r
527                                                         }\r
528                                                         else if (item.Equals("History2"))\r
529                                                         {\r
530                                                                 this.stファイル.History[2] = para;\r
531                                                         }\r
532                                                         else if (item.Equals("History3"))\r
533                                                         {\r
534                                                                 this.stファイル.History[3] = para;\r
535                                                         }\r
536                                                         else if (item.Equals("History4"))\r
537                                                         {\r
538                                                                 this.stファイル.History[4] = para;\r
539                                                         }\r
540                                                         else if (item.Equals("HistoryCount"))\r
541                                                         {\r
542                                                                 this.stファイル.HistoryCount = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);\r
543                                                         }\r
544                                                         else if (item.Equals("BGMAdjust"))\r
545                                                         {\r
546                                                                 this.stファイル.BGMAdjust = C変換.n値を文字列から取得して返す(para, 0);\r
547                                                         }\r
548                                                         continue;\r
549                                                         #endregion\r
550                                                         #region [ Score section ]\r
551                                                         Label_03B9:\r
552                                                         if (item.Equals("PlaySkill"))\r
553                                                         {\r
554                                                                 c演奏記録.db演奏型スキル値 = (double)decimal.Parse(para);\r
555                                                         }\r
556                                                         else if (item.Equals("Skill"))\r
557                                                         {\r
558                                                                 c演奏記録.dbゲーム型スキル値 = (double)decimal.Parse(para);\r
559                                                         }\r
560                                                         else if (item.Equals("Perfect"))\r
561                                                         {\r
562                                                                 c演奏記録.nPerfect数 = int.Parse(para);\r
563                                                         }\r
564                                                         else if (item.Equals("Great"))\r
565                                                         {\r
566                                                                 c演奏記録.nGreat数 = int.Parse(para);\r
567                                                         }\r
568                                                         else if (item.Equals("Good"))\r
569                                                         {\r
570                                                                 c演奏記録.nGood数 = int.Parse(para);\r
571                                                         }\r
572                                                         else if (item.Equals("Poor"))\r
573                                                         {\r
574                                                                 c演奏記録.nPoor数 = int.Parse(para);\r
575                                                         }\r
576                                                         else if (item.Equals("Miss"))\r
577                                                         {\r
578                                                                 c演奏記録.nMiss数 = int.Parse(para);\r
579                                                         }\r
580                                                         else if (item.Equals("MaxCombo"))\r
581                                                         {\r
582                                                                 c演奏記録.n最大コンボ数 = int.Parse(para);\r
583                                                         }\r
584                                                         else if (item.Equals("TotalChips"))\r
585                                                         {\r
586                                                                 c演奏記録.n全チップ数 = int.Parse(para);\r
587                                                         }\r
588                                                         else if (item.Equals("AutoPlay"))\r
589                                                         {\r
590                                                                 if ( para.Length > (int) EPad.Max )\r
591                                                                 {\r
592                                                                         throw new IndexOutOfRangeException( "レーン数が想定より多いscore.iniを読み込みました。XG譜面のscore.iniファイルである可能性があります。" );\r
593                                                                         // Trace.TraceWarning( "レーン数が想定より多いscore.iniを読み込みました。XG譜面のscore.iniファイルである可能性があります。読み込みをスキップします。({0})", iniファイル名 );\r
594                                                                 }\r
595                                                                 else\r
596                                                                 {\r
597                                                                         for ( int i = 0; i < para.Length; i++ )\r
598                                                                         {\r
599                                                                                 c演奏記録.bAutoPlay[ (EPad) i ] = C変換.bONorOFF( para[ i ] );\r
600                                                                         }\r
601                                                                 }\r
602                                                         }\r
603                                                         else if (item.Equals("GBFlip"))\r
604                                                         {\r
605                                                                 c演奏記録.bギターとベースを入れ替えた = C変換.bONorOFF(para[0]);\r
606                                                         }\r
607                                                         else if (item.Equals("Risky"))\r
608                                                         {\r
609                                                                 c演奏記録.nRisky = int.Parse(para);\r
610                                                         }\r
611                                                         else if (item.Equals("TightDrums"))\r
612                                                         {\r
613                                                                 c演奏記録.bTight = C変換.bONorOFF(para[0]);\r
614                                                         }\r
615                                                         else if (item.Equals("SudHidInvDrums"))\r
616                                                         {\r
617                                                                 c演奏記録.eSudHidInv.Drums = (ESudHidInv)int.Parse(para);\r
618                                                         }\r
619                                                         else if (item.Equals("SudHidInvGuitar"))\r
620                                                         {\r
621                                                                 c演奏記録.eSudHidInv.Guitar = (ESudHidInv)int.Parse(para);\r
622                                                         }\r
623                                                         else if (item.Equals("SudHidInvBass"))\r
624                                                         {\r
625                                                                 c演奏記録.eSudHidInv.Bass = (ESudHidInv)int.Parse(para);\r
626                                                         }\r
627                                                         else if (item.Equals("ReverseDrums"))\r
628                                                         {\r
629                                                                 c演奏記録.bReverse.Drums = C変換.bONorOFF(para[0]);\r
630                                                         }\r
631                                                         else if (item.Equals("ReverseGuitar"))\r
632                                                         {\r
633                                                                 c演奏記録.bReverse.Guitar = C変換.bONorOFF(para[0]);\r
634                                                         }\r
635                                                         else if (item.Equals("ReverseBass"))\r
636                                                         {\r
637                                                                 c演奏記録.bReverse.Bass = C変換.bONorOFF(para[0]);\r
638                                                         }\r
639                                                         #endregion\r
640                                                         else\r
641                                                         {\r
642                                                                 #region [ RandomGuitar ]\r
643                                                                 if (item.Equals("RandomGuitar"))\r
644                                                                 {\r
645                                                                         switch (int.Parse(para))\r
646                                                                         {\r
647                                                                                 case (int)ERandom.Off:\r
648                                                                                         {\r
649                                                                                                 c演奏記録.eRandom.Guitar = ERandom.Off;\r
650                                                                                                 continue;\r
651                                                                                         }\r
652                                                                                 case (int)ERandom.Random:\r
653                                                                                         {\r
654                                                                                                 c演奏記録.eRandom.Guitar = ERandom.Random;\r
655                                                                                                 continue;\r
656                                                                                         }\r
657                                                                                 case (int)ERandom.Super:\r
658                                                                                         {\r
659                                                                                                 c演奏記録.eRandom.Guitar = ERandom.Super;\r
660                                                                                                 continue;\r
661                                                                                         }\r
662                                                                                 case (int)ERandom.Hyper:    // #25452 2011.6.20 yyagi\r
663                                                                                         {\r
664                                                                                                 c演奏記録.eRandom.Guitar = ERandom.Super;\r
665                                                                                                 continue;\r
666                                                                                         }\r
667                                                                         }\r
668                                                                         throw new Exception("RandomGuitar の値が無効です。");\r
669                                                                 }\r
670                                                                 #endregion\r
671                                                                 #region [ RandomBass ]\r
672                                                                 if (item.Equals("RandomBass"))\r
673                                                                 {\r
674                                                                         switch (int.Parse(para))\r
675                                                                         {\r
676                                                                                 case (int)ERandom.Off:\r
677                                                                                         {\r
678                                                                                                 c演奏記録.eRandom.Bass = ERandom.Off;\r
679                                                                                                 continue;\r
680                                                                                         }\r
681                                                                                 case (int)ERandom.Random:\r
682                                                                                         {\r
683                                                                                                 c演奏記録.eRandom.Bass = ERandom.Random;\r
684                                                                                                 continue;\r
685                                                                                         }\r
686                                                                                 case (int)ERandom.Super:\r
687                                                                                         {\r
688                                                                                                 c演奏記録.eRandom.Bass = ERandom.Super;\r
689                                                                                                 continue;\r
690                                                                                         }\r
691                                                                                 case (int)ERandom.Hyper:    // #25452 2011.6.20 yyagi\r
692                                                                                         {\r
693                                                                                                 c演奏記録.eRandom.Bass = ERandom.Super;\r
694                                                                                                 continue;\r
695                                                                                         }\r
696                                                                         }\r
697                                                                         throw new Exception("RandomBass の値が無効です。");\r
698                                                                 }\r
699                                                                 #endregion\r
700                                                                 #region [ LightGuitar ]\r
701                                                                 if (item.Equals("LightGuitar"))\r
702                                                                 {\r
703                                                                         c演奏記録.bLight.Guitar = C変換.bONorOFF(para[0]);\r
704                                                                 }\r
705                                                                 #endregion\r
706                                                                 #region [ LightBass ]\r
707                                                                 else if (item.Equals("LightBass"))\r
708                                                                 {\r
709                                                                         c演奏記録.bLight.Bass = C変換.bONorOFF(para[0]);\r
710                                                                 }\r
711                                                                 #endregion\r
712                                                                 else\r
713                                                                 {\r
714                                                                         #region [ Dark ]\r
715                                                                         if (item.Equals("Dark"))\r
716                                                                         {\r
717                                                                                 switch (int.Parse(para))\r
718                                                                                 {\r
719                                                                                         case 0:\r
720                                                                                                 {\r
721                                                                                                         c演奏記録.eDark = EDark.Off;\r
722                                                                                                         continue;\r
723                                                                                                 }\r
724                                                                                         case 1:\r
725                                                                                                 {\r
726                                                                                                         c演奏記録.eDark = EDark.Half;\r
727                                                                                                         continue;\r
728                                                                                                 }\r
729                                                                                         case 2:\r
730                                                                                                 {\r
731                                                                                                         c演奏記録.eDark = EDark.Full;\r
732                                                                                                         continue;\r
733                                                                                                 }\r
734                                                                                 }\r
735                                                                                 throw new Exception("Dark の値が無効です。");\r
736                                                                         }\r
737                                                                         #endregion\r
738                                                                         #region [ ScrollSpeedDrums ]\r
739                                                                         if (item.Equals("ScrollSpeedDrums"))\r
740                                                                         {\r
741                                                                                 c演奏記録.f譜面スクロール速度.Drums = (float)decimal.Parse(para);\r
742                                                                         }\r
743                                                                         #endregion\r
744                                                                         #region [ ScrollSpeedGuitar ]\r
745                                                                         else if (item.Equals("ScrollSpeedGuitar"))\r
746                                                                         {\r
747                                                                                 c演奏記録.f譜面スクロール速度.Guitar = (float)decimal.Parse(para);\r
748                                                                         }\r
749                                                                         #endregion\r
750                                                                         #region [ ScrollSpeedBass ]\r
751                                                                         else if (item.Equals("ScrollSpeedBass"))\r
752                                                                         {\r
753                                                                                 c演奏記録.f譜面スクロール速度.Bass = (float)decimal.Parse(para);\r
754                                                                         }\r
755                                                                         #endregion\r
756                                                                         #region [ PlaySpeed ]\r
757                                                                         else if (item.Equals("PlaySpeed"))\r
758                                                                         {\r
759                                                                                 string[] strArray2 = para.Split(new char[] { '/' });\r
760                                                                                 if (strArray2.Length == 2)\r
761                                                                                 {\r
762                                                                                         c演奏記録.n演奏速度分子 = int.Parse(strArray2[0]);\r
763                                                                                         c演奏記録.n演奏速度分母 = int.Parse(strArray2[1]);\r
764                                                                                 }\r
765                                                                         }\r
766                                                                         #endregion\r
767                                                                         else\r
768                                                                         {\r
769                                                                                 #region [ HHGroup ]\r
770                                                                                 if (item.Equals("HHGroup"))\r
771                                                                                 {\r
772                                                                                         switch (int.Parse(para))\r
773                                                                                         {\r
774                                                                                                 case 0:\r
775                                                                                                         {\r
776                                                                                                                 c演奏記録.eHHGroup = EHHGroup.None;\r
777                                                                                                                 continue;\r
778                                                                                                         }\r
779                                                                                                 case 1:\r
780                                                                                                         {\r
781                                                                                                                 c演奏記録.eHHGroup = EHHGroup.HO_HC;\r
782                                                                                                                 continue;\r
783                                                                                                         }\r
784                                                                                                 case 2:\r
785                                                                                                         {\r
786                                                                                                                 c演奏記録.eHHGroup = EHHGroup.LC_HH;\r
787                                                                                                                 continue;\r
788                                                                                                         }\r
789                                                                                                 case 3:\r
790                                                                                                         {\r
791                                                                                                                 c演奏記録.eHHGroup = EHHGroup.Group;\r
792                                                                                                                 continue;\r
793                                                                                                         }\r
794                                                                                         }\r
795                                                                                         throw new Exception("HHGroup の値が無効です。");\r
796                                                                                 }\r
797                                                                                 #endregion\r
798                                                                                 #region [ FTGroup ]\r
799                                                                                 if (item.Equals("FTGroup"))\r
800                                                                                 {\r
801                                                                                         switch (int.Parse(para))\r
802                                                                                         {\r
803                                                                                                 case 0:\r
804                                                                                                         {\r
805                                                                                                                 c演奏記録.eFTGroup = EFTGroup.None;\r
806                                                                                                                 continue;\r
807                                                                                                         }\r
808                                                                                                 case 1:\r
809                                                                                                         {\r
810                                                                                                                 c演奏記録.eFTGroup = EFTGroup.Group;\r
811                                                                                                                 continue;\r
812                                                                                                         }\r
813                                                                                         }\r
814                                                                                         throw new Exception("FTGroup の値が無効です。");\r
815                                                                                 }\r
816                                                                                 #endregion\r
817                                                                                 #region [ CYGroup ]\r
818                                                                                 if (item.Equals("CYGroup"))\r
819                                                                                 {\r
820                                                                                         switch (int.Parse(para))\r
821                                                                                         {\r
822                                                                                                 case 0:\r
823                                                                                                         {\r
824                                                                                                                 c演奏記録.eCYGroup = ECYGroup.None;\r
825                                                                                                                 continue;\r
826                                                                                                         }\r
827                                                                                                 case 1:\r
828                                                                                                         {\r
829                                                                                                                 c演奏記録.eCYGroup = ECYGroup.Group;\r
830                                                                                                                 continue;\r
831                                                                                                         }\r
832                                                                                         }\r
833                                                                                         throw new Exception("CYGroup の値が無効です。");\r
834                                                                                 }\r
835                                                                                 #endregion\r
836                                                                                 #region [ HitSoundPriorityHH ]\r
837                                                                                 if (item.Equals("HitSoundPriorityHH"))\r
838                                                                                 {\r
839                                                                                         switch (int.Parse(para))\r
840                                                                                         {\r
841                                                                                                 case 0:\r
842                                                                                                         {\r
843                                                                                                                 c演奏記録.eHitSoundPriorityHH = EHitSoundPriority.Chip;\r
844                                                                                                                 continue;\r
845                                                                                                         }\r
846                                                                                                 case 1:\r
847                                                                                                         {\r
848                                                                                                                 c演奏記録.eHitSoundPriorityHH = EHitSoundPriority.Pad;\r
849                                                                                                                 continue;\r
850                                                                                                         }\r
851                                                                                         }\r
852                                                                                         throw new Exception("HitSoundPriorityHH の値が無効です。");\r
853                                                                                 }\r
854                                                                                 #endregion\r
855                                                                                 #region [ HitSoundPriorityFT ]\r
856                                                                                 if (item.Equals("HitSoundPriorityFT"))\r
857                                                                                 {\r
858                                                                                         switch (int.Parse(para))\r
859                                                                                         {\r
860                                                                                                 case 0:\r
861                                                                                                         {\r
862                                                                                                                 c演奏記録.eHitSoundPriorityFT = EHitSoundPriority.Chip;\r
863                                                                                                                 continue;\r
864                                                                                                         }\r
865                                                                                                 case 1:\r
866                                                                                                         {\r
867                                                                                                                 c演奏記録.eHitSoundPriorityFT = EHitSoundPriority.Pad;\r
868                                                                                                                 continue;\r
869                                                                                                         }\r
870                                                                                         }\r
871                                                                                         throw new Exception("HitSoundPriorityFT の値が無効です。");\r
872                                                                                 }\r
873                                                                                 #endregion\r
874                                                                                 #region [ HitSoundPriorityCY ]\r
875                                                                                 if (item.Equals("HitSoundPriorityCY"))\r
876                                                                                 {\r
877                                                                                         switch (int.Parse(para))\r
878                                                                                         {\r
879                                                                                                 case 0:\r
880                                                                                                         {\r
881                                                                                                                 c演奏記録.eHitSoundPriorityCY = EHitSoundPriority.Chip;\r
882                                                                                                                 continue;\r
883                                                                                                         }\r
884                                                                                                 case 1:\r
885                                                                                                         {\r
886                                                                                                                 c演奏記録.eHitSoundPriorityCY = EHitSoundPriority.Pad;\r
887                                                                                                                 continue;\r
888                                                                                                         }\r
889                                                                                         }\r
890                                                                                         throw new Exception("HitSoundPriorityCY の値が無効です。");\r
891                                                                                 }\r
892                                                                                 #endregion\r
893                                                                                 #region [ Guitar ]\r
894                                                                                 if (item.Equals("Guitar"))\r
895                                                                                 {\r
896                                                                                         c演奏記録.bGuitar有効 = C変換.bONorOFF(para[0]);\r
897                                                                                 }\r
898                                                                                 #endregion\r
899                                                                                 #region [ Drums ]\r
900                                                                                 else if (item.Equals("Drums"))\r
901                                                                                 {\r
902                                                                                         c演奏記録.bDrums有効 = C変換.bONorOFF(para[0]);\r
903                                                                                 }\r
904                                                                                 #endregion\r
905                                                                                 #region [ StageFailed ]\r
906                                                                                 else if (item.Equals("StageFailed"))\r
907                                                                                 {\r
908                                                                                         c演奏記録.bSTAGEFAILED有効 = C変換.bONorOFF(para[0]);\r
909                                                                                 }\r
910                                                                                 #endregion\r
911                                                                                 #region [ Metronome ]\r
912                                                                                 else if (item.Equals("Metronome"))\r
913                                                                                 {\r
914                                                                                         switch ( int.Parse( para ) )\r
915                                                                                         {\r
916                                                                                                 case 0:\r
917                                                                                                         {\r
918                                                                                                                 c演奏記録.eMetronome = EClickType.Off;\r
919                                                                                                                 continue;\r
920                                                                                                         }\r
921                                                                                                 case 1:\r
922                                                                                                         {\r
923                                                                                                                 c演奏記録.eMetronome = EClickType.OnBeat;\r
924                                                                                                                 continue;\r
925                                                                                                         }\r
926                                                                                                 case 2:\r
927                                                                                                         {\r
928                                                                                                                 c演奏記録.eMetronome = EClickType.OffBeat;\r
929                                                                                                                 continue;\r
930                                                                                                         }\r
931                                                                                         }\r
932                                                                                         throw new Exception( "Metronome の値が無効です。" );\r
933                                                                                 }\r
934                                                                                 #endregion\r
935                                                                                 else\r
936                                                                                 {\r
937                                                                                         #region [ DamageLevel ]\r
938                                                                                         if (item.Equals("DamageLevel"))\r
939                                                                                         {\r
940                                                                                                 switch (int.Parse(para))\r
941                                                                                                 {\r
942                                                                                                         case 0:\r
943                                                                                                                 {\r
944                                                                                                                         c演奏記録.eダメージレベル = EDamage.Easy;\r
945                                                                                                                         continue;\r
946                                                                                                                 }\r
947                                                                                                         case 1:\r
948                                                                                                                 {\r
949                                                                                                                         c演奏記録.eダメージレベル = EDamage.Normal;\r
950                                                                                                                         continue;\r
951                                                                                                                 }\r
952                                                                                                         case 2:\r
953                                                                                                                 {\r
954                                                                                                                         c演奏記録.eダメージレベル = EDamage.Hard;\r
955                                                                                                                         continue;\r
956                                                                                                                 }\r
957                                                                                                 }\r
958                                                                                                 throw new Exception("DamageLevel の値が無効です。");\r
959                                                                                         }\r
960                                                                                         #endregion\r
961                                                                                         if (item.Equals("UseKeyboard"))\r
962                                                                                         {\r
963                                                                                                 c演奏記録.b演奏にキーボードを使用した = C変換.bONorOFF(para[0]);\r
964                                                                                         }\r
965                                                                                         else if (item.Equals("UseMIDIIN"))\r
966                                                                                         {\r
967                                                                                                 c演奏記録.b演奏にMIDI入力を使用した = C変換.bONorOFF(para[0]);\r
968                                                                                         }\r
969                                                                                         else if (item.Equals("UseJoypad"))\r
970                                                                                         {\r
971                                                                                                 c演奏記録.b演奏にジョイパッドを使用した = C変換.bONorOFF(para[0]);\r
972                                                                                         }\r
973                                                                                         else if (item.Equals("UseMouse"))\r
974                                                                                         {\r
975                                                                                                 c演奏記録.b演奏にマウスを使用した = C変換.bONorOFF(para[0]);\r
976                                                                                         }\r
977                                                                                         else if (item.Equals("PerfectRange"))\r
978                                                                                         {\r
979                                                                                                 c演奏記録.nPerfectになる範囲ms = int.Parse(para);\r
980                                                                                         }\r
981                                                                                         else if (item.Equals("GreatRange"))\r
982                                                                                         {\r
983                                                                                                 c演奏記録.nGreatになる範囲ms = int.Parse(para);\r
984                                                                                         }\r
985                                                                                         else if (item.Equals("GoodRange"))\r
986                                                                                         {\r
987                                                                                                 c演奏記録.nGoodになる範囲ms = int.Parse(para);\r
988                                                                                         }\r
989                                                                                         else if (item.Equals("PoorRange"))\r
990                                                                                         {\r
991                                                                                                 c演奏記録.nPoorになる範囲ms = int.Parse(para);\r
992                                                                                         }\r
993                                                                                         else if (item.Equals("DTXManiaVersion"))\r
994                                                                                         {\r
995                                                                                                 c演奏記録.strDTXManiaのバージョン = para;\r
996                                                                                         }\r
997                                                                                         else if (item.Equals("DateTime"))\r
998                                                                                         {\r
999                                                                                                 c演奏記録.最終更新日時 = para;\r
1000                                                                                         }\r
1001                                                                                         else if (item.Equals("Hash"))\r
1002                                                                                         {\r
1003                                                                                                 c演奏記録.Hash = para;\r
1004                                                                                         }\r
1005                                                                                         //else if ( item.Equals( "9LaneMode" ) )\r
1006                                                                                         //{\r
1007                                                                                         //      c演奏記録.レーン9モード = C変換.bONorOFF( para[ 0 ] );\r
1008                                                                                         //}\r
1009                                                                                         else if (item.Equals("ScoreLaneTypeDrums"))\r
1010                                                                                         {\r
1011                                                                                                 c演奏記録.e譜面レーンタイプ.Drums = (EUseLanes) ( int.Parse( para ) );\r
1012                                                                                         }\r
1013                                                                                         else if ( item.Equals( "ScoreLaneTypeGuitar" ) )\r
1014                                                                                         {\r
1015                                                                                                 c演奏記録.e譜面レーンタイプ.Guitar = (EUseLanes) ( int.Parse( para ) );\r
1016                                                                                         }\r
1017                                                                                         else if ( item.Equals( "ScoreLaneTypeBass" ) )\r
1018                                                                                         {\r
1019                                                                                                 c演奏記録.e譜面レーンタイプ.Bass = (EUseLanes) ( int.Parse( para ) );\r
1020                                                                                         }\r
1021                                                                                 }\r
1022                                                                         }\r
1023                                                                 }\r
1024                                                         }\r
1025                                                         continue;\r
1026                                                 }\r
1027                                                 catch (Exception exception)\r
1028                                                 {\r
1029                                                         Trace.TraceError("{0}読み込みを中断します。({1})", exception.Message, iniファイル名);\r
1030                                                         break;\r
1031                                                 }\r
1032                                         }\r
1033                                 }\r
1034                                 reader.Close();\r
1035                         }\r
1036                 }\r
1037 \r
1038                 internal void tヒストリを追加する(string str追加文字列)\r
1039                 {\r
1040                         this.stファイル.HistoryCount++;\r
1041                         for (int i = 3; i >= 0; i--)\r
1042                                 this.stファイル.History[i + 1] = this.stファイル.History[i];\r
1043                         DateTime now = DateTime.Now;\r
1044                         this.stファイル.History[0] = string.Format("{0:0}.{1:D2}/{2}/{3} {4}", this.stファイル.HistoryCount, now.Year % 100, now.Month, now.Day, str追加文字列);\r
1045                 }\r
1046 \r
1047                 internal void tセクション書き出し(TextWriter writer, Eセクション種別 esect)\r
1048                 {\r
1049                         C演奏記録 sect = null;\r
1050                         string strSect = "";\r
1051 \r
1052                         if (esect == Eセクション種別.HiScoreDrums)\r
1053                         {\r
1054                                 sect = this.stセクション.HiScore.Drums;\r
1055                                 strSect = "HiScore.Drums";\r
1056                         }\r
1057                         else if (esect == Eセクション種別.HiSkillDrums)\r
1058                         {\r
1059                                 sect = this.stセクション.HiSkill.Drums;\r
1060                                 strSect = "HiSkill.Drums";\r
1061                         }\r
1062                         else if (esect == Eセクション種別.HiScoreGuitar)\r
1063                         {\r
1064                                 sect = this.stセクション.HiScore.Guitar;\r
1065                                 strSect = "HiScore.Guitar";\r
1066                         }\r
1067                         else if (esect == Eセクション種別.HiSkillGuitar)\r
1068                         {\r
1069                                 sect = this.stセクション.HiSkill.Guitar;\r
1070                                 strSect = "HiSkill.Guitar";\r
1071                         }\r
1072                         else if (esect == Eセクション種別.HiScoreBass)\r
1073                         {\r
1074                                 sect = this.stセクション.HiScore.Bass;\r
1075                                 strSect = "HiScore.Bass";\r
1076                         }\r
1077                         else if (esect == Eセクション種別.HiSkillBass)\r
1078                         {\r
1079                                 sect = this.stセクション.HiSkill.Bass;\r
1080                                 strSect = "HiSkill.Bass";\r
1081                         }\r
1082                         else if (esect == Eセクション種別.LastPlayDrums)\r
1083                         {\r
1084                                 sect = this.stセクション.LastPlay.Drums;\r
1085                                 strSect = "LastPlay.Drums";\r
1086                         }\r
1087                         else if (esect == Eセクション種別.LastPlayGuitar)\r
1088                         {\r
1089                                 sect = this.stセクション.LastPlay.Guitar;\r
1090                                 strSect = "LastPlay.Guitar";\r
1091                         }\r
1092                         else if (esect == Eセクション種別.LastPlayBass)\r
1093                         {\r
1094                                 sect = this.stセクション.LastPlay.Bass;\r
1095                                 strSect = "LastPlay.Bass";\r
1096                         }\r
1097 \r
1098                         if (sect != null)\r
1099                         {\r
1100                                 writer.WriteLine("[{0}]", strSect);\r
1101                                 writer.WriteLine("Score={0}", sect.nスコア);\r
1102                                 writer.WriteLine("PlaySkill={0}", sect.db演奏型スキル値);\r
1103                                 writer.WriteLine("Skill={0}", sect.dbゲーム型スキル値);\r
1104                                 writer.WriteLine("Perfect={0}", sect.nPerfect数);\r
1105                                 writer.WriteLine("Great={0}", sect.nGreat数);\r
1106                                 writer.WriteLine("Good={0}", sect.nGood数);\r
1107                                 writer.WriteLine("Poor={0}", sect.nPoor数);\r
1108                                 writer.WriteLine("Miss={0}", sect.nMiss数);\r
1109                                 writer.WriteLine("MaxCombo={0}", sect.n最大コンボ数);\r
1110                                 writer.WriteLine("TotalChips={0}", sect.n全チップ数);\r
1111                                 writer.Write("AutoPlay=");\r
1112                                 for (EPad j = EPad.Min; j < EPad.Max; j++)\r
1113                                 {\r
1114                                         writer.Write(sect.bAutoPlay[j] ? 1 : 0);\r
1115                                 }\r
1116                                 writer.WriteLine();\r
1117                                 writer.WriteLine("GBFlip={0}", sect.bギターとベースを入れ替えた ? 1 : 0);\r
1118                                 writer.WriteLine("Risky={0}", sect.nRisky);\r
1119                                 writer.WriteLine("SudHidInvDrums={0}", (int)sect.eSudHidInv.Drums);\r
1120                                 writer.WriteLine("SudHidInvGuitar={0}", (int)sect.eSudHidInv.Guitar);\r
1121                                 writer.WriteLine("SudHidInvBass={0}", (int)sect.eSudHidInv.Bass);\r
1122                                 writer.WriteLine("ReverseDrums={0}", sect.bReverse.Drums ? 1 : 0);\r
1123                                 writer.WriteLine("ReverseGuitar={0}", sect.bReverse.Guitar ? 1 : 0);\r
1124                                 writer.WriteLine("ReverseBass={0}", sect.bReverse.Bass ? 1 : 0);\r
1125                                 writer.WriteLine("TightDrums={0}", sect.bTight ? 1 : 0);\r
1126                                 writer.WriteLine("RandomGuitar={0}", (int)sect.eRandom.Guitar);\r
1127                                 writer.WriteLine("RandomBass={0}", (int)sect.eRandom.Bass);\r
1128                                 writer.WriteLine("LightGuitar={0}", sect.bLight.Guitar ? 1 : 0);\r
1129                                 writer.WriteLine("LightBass={0}", sect.bLight.Bass ? 1 : 0);\r
1130                                 writer.WriteLine("Dark={0}", (int)sect.eDark);\r
1131                                 writer.WriteLine("ScrollSpeedDrums={0}", sect.f譜面スクロール速度.Drums);\r
1132                                 writer.WriteLine("ScrollSpeedGuitar={0}", sect.f譜面スクロール速度.Guitar);\r
1133                                 writer.WriteLine("ScrollSpeedBass={0}", sect.f譜面スクロール速度.Bass);\r
1134                                 writer.WriteLine("PlaySpeed={0}/{1}", sect.n演奏速度分子, sect.n演奏速度分母);\r
1135                                 writer.WriteLine("ScoreLaneTypeDrums={0}", (int) sect.e譜面レーンタイプ.Drums);\r
1136                                 writer.WriteLine("ScoreLaneTypeGuitar={0}", (int) sect.e譜面レーンタイプ.Guitar);\r
1137                                 writer.WriteLine("ScoreLaneTypeBass={0}", (int) sect.e譜面レーンタイプ.Bass);\r
1138                                 writer.WriteLine("HHGroup={0}", (int)sect.eHHGroup);\r
1139                                 writer.WriteLine("FTGroup={0}", (int)sect.eFTGroup);\r
1140                                 writer.WriteLine("CYGroup={0}", (int)sect.eCYGroup);\r
1141                                 writer.WriteLine("HitSoundPriorityHH={0}", (int)sect.eHitSoundPriorityHH);\r
1142                                 writer.WriteLine("HitSoundPriorityFT={0}", (int)sect.eHitSoundPriorityFT);\r
1143                                 writer.WriteLine("HitSoundPriorityCY={0}", (int)sect.eHitSoundPriorityCY);\r
1144                                 writer.WriteLine("Guitar={0}", sect.bGuitar有効 ? 1 : 0);\r
1145                                 writer.WriteLine("Drums={0}", sect.bDrums有効 ? 1 : 0);\r
1146                                 writer.WriteLine("StageFailed={0}", sect.bSTAGEFAILED有効 ? 1 : 0);\r
1147                                 writer.WriteLine("DamageLevel={0}", (int)sect.eダメージレベル);\r
1148                                 writer.WriteLine("Metronome={0}", (int)sect.eMetronome);\r
1149                                 writer.WriteLine("UseKeyboard={0}", sect.b演奏にキーボードを使用した ? 1 : 0);\r
1150                                 writer.WriteLine("UseMIDIIN={0}", sect.b演奏にMIDI入力を使用した ? 1 : 0);\r
1151                                 writer.WriteLine("UseJoypad={0}", sect.b演奏にジョイパッドを使用した ? 1 : 0);\r
1152                                 writer.WriteLine("UseMouse={0}", sect.b演奏にマウスを使用した ? 1 : 0);\r
1153                                 writer.WriteLine("PerfectRange={0}", sect.nPerfectになる範囲ms);\r
1154                                 writer.WriteLine("GreatRange={0}", sect.nGreatになる範囲ms);\r
1155                                 writer.WriteLine("GoodRange={0}", sect.nGoodになる範囲ms);\r
1156                                 writer.WriteLine("PoorRange={0}", sect.nPoorになる範囲ms);\r
1157                                 writer.WriteLine("DTXManiaVersion={0}", sect.strDTXManiaのバージョン);\r
1158                                 writer.WriteLine("DateTime={0}", sect.最終更新日時);\r
1159                                 writer.WriteLine("Hash={0}", sect.Hash);\r
1160                         }\r
1161 \r
1162                 }\r
1163 \r
1164                 internal void t書き出し(string iniファイル名)\r
1165                 {\r
1166                         this.iniファイルのあるフォルダ名 = Path.GetDirectoryName(iniファイル名);\r
1167                         this.iniファイル名 = Path.GetFileName(iniファイル名);\r
1168 \r
1169                         using (StreamWriter writer = new StreamWriter(iniファイル名, false, Encoding.GetEncoding("utf-16")))\r
1170                         {\r
1171                                 writer.WriteLine("[File]");\r
1172                                 writer.WriteLine("Title={0}", this.stファイル.Title);\r
1173                                 writer.WriteLine("Name={0}", this.stファイル.Name);\r
1174                                 writer.WriteLine("Hash={0}", this.stファイル.Hash);\r
1175                                 writer.WriteLine("PlayCountDrums={0}", this.stファイル.PlayCountDrums);\r
1176                                 writer.WriteLine("PlayCountGuitars={0}", this.stファイル.PlayCountGuitar);\r
1177                                 writer.WriteLine("PlayCountBass={0}", this.stファイル.PlayCountBass);\r
1178                                 writer.WriteLine("ClearCountDrums={0}", this.stファイル.ClearCountDrums);       // #23596 10.11.16 add ikanick\r
1179                                 writer.WriteLine("ClearCountGuitars={0}", this.stファイル.ClearCountGuitar);    //\r
1180                                 writer.WriteLine("ClearCountBass={0}", this.stファイル.ClearCountBass);         //\r
1181                                 writer.WriteLine("BestRankDrums={0}", this.stファイル.BestRank.Drums);    // #24459 2011.2.24 yyagi\r
1182                                 writer.WriteLine("BestRankGuitar={0}", this.stファイル.BestRank.Guitar);    //\r
1183                                 writer.WriteLine("BestRankBass={0}", this.stファイル.BestRank.Bass);      //\r
1184                                 writer.WriteLine("HistoryCount={0}", this.stファイル.HistoryCount);\r
1185                                 writer.WriteLine("History0={0}", this.stファイル.History[0]);\r
1186                                 writer.WriteLine("History1={0}", this.stファイル.History[1]);\r
1187                                 writer.WriteLine("History2={0}", this.stファイル.History[2]);\r
1188                                 writer.WriteLine("History3={0}", this.stファイル.History[3]);\r
1189                                 writer.WriteLine("History4={0}", this.stファイル.History[4]);\r
1190                                 writer.WriteLine("BGMAdjust={0}", this.stファイル.BGMAdjust);\r
1191                                 writer.WriteLine();\r
1192 \r
1193                                 tセクション書き出し(writer, Eセクション種別.HiScoreDrums);\r
1194                                 tセクション書き出し(writer, Eセクション種別.HiSkillDrums);\r
1195                                 tセクション書き出し(writer, Eセクション種別.HiScoreGuitar);\r
1196                                 tセクション書き出し(writer, Eセクション種別.HiSkillGuitar);\r
1197                                 tセクション書き出し(writer, Eセクション種別.HiScoreBass);\r
1198                                 tセクション書き出し(writer, Eセクション種別.HiSkillBass);\r
1199                                 tセクション書き出し(writer, Eセクション種別.LastPlayDrums);\r
1200                                 tセクション書き出し(writer, Eセクション種別.LastPlayGuitar);\r
1201                                 tセクション書き出し(writer, Eセクション種別.LastPlayBass);\r
1202                         }\r
1203                 }\r
1204 \r
1205                 internal static ERANK tランク値を計算して返す(C演奏記録 part)\r
1206                 {\r
1207                         if (part.b演奏にMIDI入力を使用した || part.b演奏にキーボードを使用した || part.b演奏にジョイパッドを使用した || part.b演奏にマウスを使用した) // 2010.9.11\r
1208                         {\r
1209                                 int nTotal = part.nPerfect数 + part.nGreat数 + part.nGood数 + part.nPoor数 + part.nMiss数;\r
1210                                 return tランク値を計算して返す(nTotal, part.nPerfect数, part.nGreat数, part.nGood数, part.nPoor数, part.nMiss数);\r
1211                         }\r
1212                         return ERANK.UNKNOWN;\r
1213                 }\r
1214 \r
1215                 internal static ERANK tランク値を計算して返す(int nTotal, int nPerfect, int nGreat, int nGood, int nPoor, int nMiss)\r
1216                 {\r
1217                         if (nTotal <= 0)\r
1218                                 return ERANK.UNKNOWN;\r
1219 \r
1220                         //int nRank = (int)ERANK.E;\r
1221                         int nAuto = nTotal - (nPerfect + nGreat + nGood + nPoor + nMiss);\r
1222                         if (nTotal == nAuto)\r
1223                         {\r
1224                                 return ERANK.SS;\r
1225                         }\r
1226                         double dRate = ((double)(nPerfect + nGreat)) / ((double)(nTotal - nAuto));\r
1227                         if (dRate == 1.0)\r
1228                         {\r
1229                                 return ERANK.SS;\r
1230                         }\r
1231                         if (dRate >= 0.95)\r
1232                         {\r
1233                                 return ERANK.S;\r
1234                         }\r
1235                         if (dRate >= 0.9)\r
1236                         {\r
1237                                 return ERANK.A;\r
1238                         }\r
1239                         if (dRate >= 0.85)\r
1240                         {\r
1241                                 return ERANK.B;\r
1242                         }\r
1243                         if (dRate >= 0.8)\r
1244                         {\r
1245                                 return ERANK.C;\r
1246                         }\r
1247                         if (dRate >= 0.7)\r
1248                         {\r
1249                                 return ERANK.D;\r
1250                         }\r
1251                         return ERANK.E;\r
1252                 }\r
1253 \r
1254                 internal static double tゲーム型スキルを計算して返す(int nLevel, int nTotal, int nPerfect, int nCombo, EPart inst)\r
1255                 {\r
1256                         double ret;\r
1257                         if ((nTotal == 0) || ((nPerfect == 0) && (nCombo == 0)))\r
1258                                 ret = 0.0;\r
1259 \r
1260                         ret = ((nLevel * ((nPerfect * 0.8 + nCombo * 0.2) / ((double)nTotal))) / 2.0);\r
1261                         ret *= dbCalcReviseValForDrGtBsAutoLanes(inst);\r
1262 \r
1263                         return ret;\r
1264                 }\r
1265 \r
1266                 internal static double t演奏型スキルを計算して返す(int nTotal, int nPerfect, int nGreat, int nGood, int nPoor, int nMiss, EPart inst, bool auto考慮)\r
1267                 {\r
1268                         if (nTotal == 0)\r
1269                                 return 0.0;\r
1270 \r
1271                         int nAuto = nTotal - (nPerfect + nGreat + nGood + nPoor + nMiss);\r
1272                         double y = ((nPerfect * 1.0 + nGreat * 0.8 + nGood * 0.5 + nPoor * 0.2 + nMiss * 0.0 + nAuto * 0.0) * 100.0) / ((double)nTotal);\r
1273                         double ret = (100.0 * ((Math.Pow(1.03, y) - 1.0) / (Math.Pow(1.03, 100.0) - 1.0)));\r
1274 \r
1275                         if (auto考慮)\r
1276                         {\r
1277                                 ret *= dbCalcReviseValForDrGtBsAutoLanes(inst);\r
1278                         }\r
1279                         return ret;\r
1280                 }\r
1281 \r
1282                 internal static double dbCalcReviseValForDrGtBsAutoLanes(EPart inst)  // #28607 2012.6.7 yyagi\r
1283                 {\r
1284                         double ret = 1.0;\r
1285                         bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(inst);\r
1286                         switch (inst)\r
1287                         {\r
1288                                 #region [ Unknown ]\r
1289                                 case EPart.Unknown:\r
1290                                         throw new ArgumentException();\r
1291                                 #endregion\r
1292                                 #region [ Drums ]\r
1293                                 case EPart.Drums:\r
1294                                         if (!allauto)\r
1295                                         {\r
1296                                                 #region [ Auto BD ]\r
1297                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.BD)\r
1298                                                 {\r
1299                                                         ret /= 2;\r
1300                                                 }\r
1301                                                 #endregion\r
1302                                         }\r
1303                                         break;\r
1304                                 #endregion\r
1305                                 #region [ Guitar ]\r
1306                                 case EPart.Guitar:\r
1307                                         if (!allauto)\r
1308                                         {\r
1309                                                 #region [ Auto Pick ]\r
1310                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick)\r
1311                                                 {\r
1312                                                         ret /= 2;      // AutoPick時、達成率を1/2にする\r
1313                                                 }\r
1314                                                 #endregion\r
1315                                                 #region [ Auto Neck ]\r
1316                                                 int nAutoLanes = 0;\r
1317                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.GtR)\r
1318                                                 {\r
1319                                                         nAutoLanes++;\r
1320                                                 }\r
1321                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.GtG)\r
1322                                                 {\r
1323                                                         nAutoLanes++;\r
1324                                                 }\r
1325                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.GtB)\r
1326                                                 {\r
1327                                                         nAutoLanes++;\r
1328                                                 }\r
1329                                                 ret /= Math.Sqrt(nAutoLanes + 1);\r
1330                                                 #endregion\r
1331                                         }\r
1332                                         break;\r
1333                                 #endregion\r
1334                                 #region [ Bass ]\r
1335                                 case EPart.Bass:\r
1336                                         if (!allauto)\r
1337                                         {\r
1338                                                 #region [ Auto Pick ]\r
1339                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick)\r
1340                                                 {\r
1341                                                         ret /= 2;      // AutoPick時、達成率を1/2にする\r
1342                                                 }\r
1343                                                 #endregion\r
1344                                                 #region [ Auto lanes ]\r
1345                                                 int nAutoLanes = 0;\r
1346                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.BsR)\r
1347                                                 {\r
1348                                                         nAutoLanes++;\r
1349                                                 }\r
1350                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.BsG)\r
1351                                                 {\r
1352                                                         nAutoLanes++;\r
1353                                                 }\r
1354                                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay.BsB)\r
1355                                                 {\r
1356                                                         nAutoLanes++;\r
1357                                                 }\r
1358                                                 ret /= Math.Sqrt(nAutoLanes + 1);\r
1359                                                 #endregion\r
1360                                         }\r
1361                                         break;\r
1362                                         #endregion\r
1363                         }\r
1364                         return ret;\r
1365                 }\r
1366 \r
1367                 internal static STDGBSValue<bool> t更新条件を取得する()\r
1368                 {\r
1369                         STDGBSValue<bool> ret = new STDGBSValue<bool>();\r
1370                         for (EPart i = EPart.Drums; i <= EPart.Bass; ++i)\r
1371                         {\r
1372                                 ret[i] = CDTXMania.Instance.ConfigIni.b楽器有効(i) && CDTXMania.Instance.DTX.bチップがある[i] && !CDTXMania.Instance.ConfigIni.bIsAutoPlay(i);\r
1373                         }\r
1374                         return ret;\r
1375                 }\r
1376 \r
1377                 internal static ERANK t総合ランク値を計算して返す(STDGBSValue<C演奏記録> record)\r
1378                 {\r
1379                         int nTotal = record.Drums.n全チップ数 + record.Guitar.n全チップ数 + record.Bass.n全チップ数;\r
1380                         int nPerfect = record.Drums.nPerfect数_Auto含まない + record.Guitar.nPerfect数_Auto含まない + record.Bass.nPerfect数_Auto含まない; // #24569 2011.3.1 yyagi: to calculate result rank without AUTO chips\r
1381                         int nGreat = record.Drums.nGreat数_Auto含まない + record.Guitar.nGreat数_Auto含まない + record.Bass.nGreat数_Auto含まない;   //\r
1382                         int nGood = record.Drums.nGood数_Auto含まない + record.Guitar.nGood数_Auto含まない + record.Bass.nGood数_Auto含まない;   //\r
1383                         int nPoor = record.Drums.nPoor数_Auto含まない + record.Guitar.nPoor数_Auto含まない + record.Bass.nPoor数_Auto含まない;   //\r
1384                         int nMiss = record.Drums.nMiss数_Auto含まない + record.Guitar.nMiss数_Auto含まない + record.Bass.nMiss数_Auto含まない;   //\r
1385                         return tランク値を計算して返す(nTotal, nPerfect, nGreat, nGood, nPoor, nMiss);\r
1386                 }\r
1387 \r
1388                 // その他\r
1389 \r
1390                 #region [ private ]\r
1391                 //-----------------\r
1392                 /*\r
1393                 private bool ONorOFF(char c)\r
1394                 {\r
1395                         return (c != '0');\r
1396                 }\r
1397                 private static char boolToChar(bool b)\r
1398                 {\r
1399                         if (!b)\r
1400                         {\r
1401                                 return '0';\r
1402                         }\r
1403                         return '1';\r
1404                 }\r
1405                 */\r
1406                 //-----------------\r
1407                 #endregion\r
1408         }\r
1409 }\r