OSDN Git Service

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