OSDN Git Service

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