OSDN Git Service

起動時にウインドウが最前面に出なかった場合でも例外が出ないよう修正。HIDのAcqure(やPoll)に失敗したときにデバイスが外されたとみなして同deviceをDisp...
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / スコア、曲 / CSong管理.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Globalization;\r
4 using System.Text;\r
5 using System.Diagnostics;\r
6 using System.IO;\r
7 using System.Drawing;\r
8 using System.Threading;\r
9 \r
10 namespace DTXMania\r
11 {\r
12         [Serializable]\r
13         internal class CSongs管理\r
14         {\r
15                 // プロパティ\r
16 \r
17                 public int nSongsDBから取得できたスコア数\r
18                 {\r
19                         get;\r
20                         set;\r
21                 }\r
22                 public int nSongsDBへ出力できたスコア数\r
23                 {\r
24                         get;\r
25                         set;\r
26                 }\r
27                 public int nスコアキャッシュから反映できたスコア数\r
28                 {\r
29                         get;\r
30                         set;\r
31                 }\r
32                 public int nファイルから反映できたスコア数\r
33                 {\r
34                         get;\r
35                         set;\r
36                 }\r
37                 public int n検索されたスコア数\r
38                 {\r
39                         get;\r
40                         set;\r
41                 }\r
42                 public int n検索された曲ノード数\r
43                 {\r
44                         get;\r
45                         set;\r
46                 }\r
47                 [NonSerialized]\r
48                 public List<Cスコア> listSongsDB;          // songs.dbから構築されるlist\r
49                 public List<C曲リストノード> list曲ルート;     // 起動時にフォルダ検索して構築されるlist\r
50                 public bool bIsSuspending             // 外部スレッドから、内部スレッドのsuspendを指示する時にtrueにする\r
51                 {                         // 再開時は、これをfalseにしてから、次のautoReset.Set()を実行する\r
52                         get;\r
53                         set;\r
54                 }\r
55                 public bool bIsSlowdown               // #PREMOVIE再生時に曲検索を遅くする\r
56                 {\r
57                         get;\r
58                         set;\r
59                 }\r
60                 [NonSerialized]\r
61                 private AutoResetEvent autoReset;\r
62                 public AutoResetEvent AutoReset\r
63                 {\r
64                         get\r
65                         {\r
66                                 return autoReset;\r
67                         }\r
68                         private set\r
69                         {\r
70                                 autoReset = value;\r
71                         }\r
72                 }\r
73 \r
74                 private int searchCount;              // #PREMOVIE中は検索n回実行したら少しスリープする\r
75 \r
76                 // コンストラクタ\r
77 \r
78                 public CSongs管理()\r
79                 {\r
80                         this.listSongsDB = new List<Cスコア>();\r
81                         this.list曲ルート = new List<C曲リストノード>();\r
82                         this.n検索された曲ノード数 = 0;\r
83                         this.n検索されたスコア数 = 0;\r
84                         this.bIsSuspending = false;           // #27060\r
85                         this.autoReset = new AutoResetEvent(true);  // #27060\r
86                         this.searchCount = 0;\r
87                 }\r
88 \r
89 \r
90                 // メソッド\r
91 \r
92                 #region [ SongsDB(songs.db) を読み込む ]\r
93                 //-----------------\r
94                 public void tSongsDBを読み込む(string SongsDBファイル名)\r
95                 {\r
96                         this.nSongsDBから取得できたスコア数 = 0;\r
97                         if (File.Exists(SongsDBファイル名))\r
98                         {\r
99                                 BinaryReader br = null;\r
100                                 try\r
101                                 {\r
102                                         br = new BinaryReader(File.OpenRead(SongsDBファイル名));\r
103                                         if (!br.ReadString().Equals(SONGSDB_VERSION))\r
104                                         {\r
105                                                 throw new InvalidDataException("ヘッダが異なります。");\r
106                                         }\r
107                                         this.listSongsDB = new List<Cスコア>();\r
108 \r
109                                         while (true)\r
110                                         {\r
111                                                 try\r
112                                                 {\r
113                                                         Cスコア item = this.tSongsDBからスコアを1つ読み込む(br);\r
114                                                         this.listSongsDB.Add(item);\r
115                                                         this.nSongsDBから取得できたスコア数++;\r
116                                                 }\r
117                                                 catch (EndOfStreamException)\r
118                                                 {\r
119                                                         break;\r
120                                                 }\r
121                                         }\r
122                                 }\r
123                                 finally\r
124                                 {\r
125                                         if (br != null)\r
126                                                 br.Close();\r
127                                 }\r
128                         }\r
129                 }\r
130                 //-----------------\r
131                 #endregion\r
132 \r
133                 #region [ 曲を検索してリストを作成する ]\r
134                 //-----------------\r
135                 public void t曲を検索してリストを作成する(string str基点フォルダ, bool b子BOXへ再帰する)\r
136                 {\r
137                         this.t曲を検索してリストを作成する(str基点フォルダ, b子BOXへ再帰する, this.list曲ルート, null);\r
138                 }\r
139                 private void t曲を検索してリストを作成する(string str基点フォルダ, bool b子BOXへ再帰する, List<C曲リストノード> listノードリスト, C曲リストノード node親)\r
140                 {\r
141                         if (!str基点フォルダ.EndsWith(@"\"))\r
142                                 str基点フォルダ = str基点フォルダ + @"\";\r
143 \r
144                         DirectoryInfo info = new DirectoryInfo(str基点フォルダ);\r
145 \r
146                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
147                                 Trace.TraceInformation("基点フォルダ: " + str基点フォルダ);\r
148 \r
149                         #region [ a.フォルダ内に set.def が存在する場合 → set.def からノード作成]\r
150                         //-----------------------------\r
151                         string path = str基点フォルダ + "set.def";\r
152                         if (File.Exists(path))\r
153                         {\r
154                                 CSetDef def = new CSetDef(path);\r
155                                 new FileInfo(path);\r
156                                 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
157                                 {\r
158                                         Trace.TraceInformation("set.def検出 : {0}", path);\r
159                                         Trace.Indent();\r
160                                 }\r
161                                 try\r
162                                 {\r
163                                         SlowOrSuspendSearchTask();    // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
164                                         for (int i = 0; i < def.blocks.Count; i++)\r
165                                         {\r
166                                                 CSetDef.CBlock block = def.blocks[i];\r
167                                                 C曲リストノード item = new C曲リストノード();\r
168                                                 item.eノード種別 = C曲リストノード.Eノード種別.SCORE;\r
169                                                 item.strタイトル = block.Title;\r
170                                                 item.strジャンル = block.Genre;\r
171                                                 item.nスコア数 = 0;\r
172                                                 item.col文字色 = block.FontColor;\r
173                                                 item.SetDefのブロック番号 = i;\r
174                                                 item.pathSetDefの絶対パス = path;\r
175                                                 item.r親ノード = node親;\r
176 \r
177                                                 item.strBreadcrumbs = (item.r親ノード == null) ?\r
178                                                         path + i : item.r親ノード.strBreadcrumbs + " > " + path + i;\r
179 \r
180                                                 for (int j = 0; j < 5; j++)\r
181                                                 {\r
182                                                         if (!string.IsNullOrEmpty(block.File[j]))\r
183                                                         {\r
184                                                                 string str2 = str基点フォルダ + block.File[j];\r
185                                                                 if (File.Exists(str2))\r
186                                                                 {\r
187                                                                         item.ar難易度ラベル[j] = block.Label[j];\r
188                                                                         item.arスコア[j] = new Cスコア();\r
189                                                                         item.arスコア[j].ファイル情報.ファイルの絶対パス = str2;\r
190                                                                         item.arスコア[j].ファイル情報.フォルダの絶対パス = Path.GetFullPath(Path.GetDirectoryName(str2)) + @"\";\r
191                                                                         FileInfo info2 = new FileInfo(str2);\r
192                                                                         item.arスコア[j].ファイル情報.ファイルサイズ = info2.Length;\r
193                                                                         item.arスコア[j].ファイル情報.最終更新日時 = info2.LastWriteTime;\r
194                                                                         string str3 = str2 + ".score.ini";\r
195                                                                         if (File.Exists(str3))\r
196                                                                         {\r
197                                                                                 FileInfo info3 = new FileInfo(str3);\r
198                                                                                 item.arスコア[j].ScoreIni情報.ファイルサイズ = info3.Length;\r
199                                                                                 item.arスコア[j].ScoreIni情報.最終更新日時 = info3.LastWriteTime;\r
200                                                                         }\r
201                                                                         item.nスコア数++;\r
202                                                                         this.n検索されたスコア数++;\r
203                                                                 }\r
204                                                                 else\r
205                                                                 {\r
206                                                                         item.arスコア[j] = null;\r
207                                                                 }\r
208                                                         }\r
209                                                 }\r
210                                                 if (item.nスコア数 > 0)\r
211                                                 {\r
212                                                         listノードリスト.Add(item);\r
213                                                         this.n検索された曲ノード数++;\r
214                                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
215                                                         {\r
216                                                                 StringBuilder builder = new StringBuilder(0x200);\r
217                                                                 builder.Append(string.Format("nID#{0:D3}", item.nID));\r
218                                                                 if (item.r親ノード != null)\r
219                                                                 {\r
220                                                                         builder.Append(string.Format("(in#{0:D3}):", item.r親ノード.nID));\r
221                                                                 }\r
222                                                                 else\r
223                                                                 {\r
224                                                                         builder.Append("(onRoot):");\r
225                                                                 }\r
226                                                                 if ((item.strタイトル != null) && (item.strタイトル.Length > 0))\r
227                                                                 {\r
228                                                                         builder.Append(" SONG, Title=" + item.strタイトル);\r
229                                                                 }\r
230                                                                 if ((item.strジャンル != null) && (item.strジャンル.Length > 0))\r
231                                                                 {\r
232                                                                         builder.Append(", Genre=" + item.strジャンル);\r
233                                                                 }\r
234                                                                 if (item.col文字色 != Color.White)\r
235                                                                 {\r
236                                                                         builder.Append(", FontColor=" + item.col文字色);\r
237                                                                 }\r
238                                                                 Trace.TraceInformation(builder.ToString());\r
239                                                                 Trace.Indent();\r
240                                                                 try\r
241                                                                 {\r
242                                                                         for (int k = 0; k < 5; k++)\r
243                                                                         {\r
244                                                                                 if (item.arスコア[k] != null)\r
245                                                                                 {\r
246                                                                                         Cスコア cスコア = item.arスコア[k];\r
247                                                                                         builder.Remove(0, builder.Length);\r
248                                                                                         builder.Append(string.Format("ブロック{0}-{1}:", item.SetDefのブロック番号 + 1, k + 1));\r
249                                                                                         builder.Append(" Label=" + item.ar難易度ラベル[k]);\r
250                                                                                         builder.Append(", File=" + cスコア.ファイル情報.ファイルの絶対パス);\r
251                                                                                         builder.Append(", Size=" + cスコア.ファイル情報.ファイルサイズ);\r
252                                                                                         builder.Append(", LastUpdate=" + cスコア.ファイル情報.最終更新日時);\r
253                                                                                         Trace.TraceInformation(builder.ToString());\r
254                                                                                 }\r
255                                                                         }\r
256                                                                 }\r
257                                                                 finally\r
258                                                                 {\r
259                                                                         Trace.Unindent();\r
260                                                                 }\r
261                                                         }\r
262                                                 }\r
263                                         }\r
264                                 }\r
265                                 finally\r
266                                 {\r
267                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
268                                         {\r
269                                                 Trace.Unindent();\r
270                                         }\r
271                                 }\r
272                         }\r
273                         //-----------------------------\r
274                         #endregion\r
275 \r
276                         #region [ b.フォルダ内に set.def が存在しない場合 → 個別ファイルからノード作成 ]\r
277                         //-----------------------------\r
278                         else\r
279                         {\r
280                                 foreach (FileInfo fileinfo in info.GetFiles())\r
281                                 {\r
282                                         SlowOrSuspendSearchTask();    // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
283                                         string strExt = fileinfo.Extension.ToLower();\r
284                                         if ((strExt.Equals(".dtx") || strExt.Equals(".gda")) || ((strExt.Equals(".g2d") || strExt.Equals(".bms")) || strExt.Equals(".bme")))\r
285                                         {\r
286                                                 C曲リストノード c曲リストノード = new C曲リストノード();\r
287                                                 c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.SCORE;\r
288                                                 c曲リストノード.nスコア数 = 1;\r
289                                                 c曲リストノード.r親ノード = node親;\r
290 \r
291                                                 c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ?\r
292                                                         str基点フォルダ + fileinfo.Name : c曲リストノード.r親ノード.strBreadcrumbs + " > " + str基点フォルダ + fileinfo.Name;\r
293 \r
294                                                 c曲リストノード.arスコア[0] = new Cスコア();\r
295                                                 c曲リストノード.arスコア[0].ファイル情報.ファイルの絶対パス = str基点フォルダ + fileinfo.Name;\r
296                                                 c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス = str基点フォルダ;\r
297                                                 c曲リストノード.arスコア[0].ファイル情報.ファイルサイズ = fileinfo.Length;\r
298                                                 c曲リストノード.arスコア[0].ファイル情報.最終更新日時 = fileinfo.LastWriteTime;\r
299                                                 string strFileNameScoreIni = c曲リストノード.arスコア[0].ファイル情報.ファイルの絶対パス + ".score.ini";\r
300                                                 if (File.Exists(strFileNameScoreIni))\r
301                                                 {\r
302                                                         FileInfo infoScoreIni = new FileInfo(strFileNameScoreIni);\r
303                                                         c曲リストノード.arスコア[0].ScoreIni情報.ファイルサイズ = infoScoreIni.Length;\r
304                                                         c曲リストノード.arスコア[0].ScoreIni情報.最終更新日時 = infoScoreIni.LastWriteTime;\r
305                                                 }\r
306                                                 this.n検索されたスコア数++;\r
307                                                 listノードリスト.Add(c曲リストノード);\r
308                                                 this.n検索された曲ノード数++;\r
309                                                 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
310                                                 {\r
311                                                         Trace.Indent();\r
312                                                         try\r
313                                                         {\r
314                                                                 StringBuilder sb = new StringBuilder(0x100);\r
315                                                                 sb.Append(string.Format("nID#{0:D3}", c曲リストノード.nID));\r
316                                                                 if (c曲リストノード.r親ノード != null)\r
317                                                                 {\r
318                                                                         sb.Append(string.Format("(in#{0:D3}):", c曲リストノード.r親ノード.nID));\r
319                                                                 }\r
320                                                                 else\r
321                                                                 {\r
322                                                                         sb.Append("(onRoot):");\r
323                                                                 }\r
324                                                                 sb.Append(" SONG, File=" + c曲リストノード.arスコア[0].ファイル情報.ファイルの絶対パス);\r
325                                                                 sb.Append(", Size=" + c曲リストノード.arスコア[0].ファイル情報.ファイルサイズ);\r
326                                                                 sb.Append(", LastUpdate=" + c曲リストノード.arスコア[0].ファイル情報.最終更新日時);\r
327                                                                 Trace.TraceInformation(sb.ToString());\r
328                                                         }\r
329                                                         finally\r
330                                                         {\r
331                                                                 Trace.Unindent();\r
332                                                         }\r
333                                                 }\r
334                                         }\r
335                                         else if (strExt.Equals(".mid") || strExt.Equals(".smf"))\r
336                                         {\r
337                                                 // 何もしない\r
338                                         }\r
339                                 }\r
340                         }\r
341                         //-----------------------------\r
342                         #endregion\r
343 \r
344                         foreach (DirectoryInfo infoDir in info.GetDirectories())\r
345                         {\r
346                                 SlowOrSuspendSearchTask();    // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
347 \r
348                                 #region [ a. "dtxfiles." で始まるフォルダの場合 ]\r
349                                 //-----------------------------\r
350                                 if (infoDir.Name.ToLower().StartsWith("dtxfiles."))\r
351                                 {\r
352                                         C曲リストノード c曲リストノード = new C曲リストノード();\r
353                                         c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.BOX;\r
354                                         c曲リストノード.bDTXFilesで始まるフォルダ名のBOXである = true;\r
355                                         c曲リストノード.strタイトル = infoDir.Name.Substring(9);\r
356                                         c曲リストノード.nスコア数 = 1;\r
357                                         c曲リストノード.r親ノード = node親;\r
358 \r
359                                         // 一旦、上位BOXのスキン情報をコピー (後でbox.defの記載にて上書きされる場合がある)\r
360                                         c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?\r
361                                                 "" : c曲リストノード.r親ノード.strSkinPath;\r
362 \r
363                                         c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ?\r
364                                                 c曲リストノード.strタイトル : c曲リストノード.r親ノード.strBreadcrumbs + " > " + c曲リストノード.strタイトル;\r
365 \r
366 \r
367                                         c曲リストノード.list子リスト = new List<C曲リストノード>();\r
368                                         c曲リストノード.arスコア[0] = new Cスコア();\r
369                                         c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス = infoDir.FullName + @"\";\r
370                                         c曲リストノード.arスコア[0].譜面情報.タイトル = c曲リストノード.strタイトル;\r
371                                         c曲リストノード.arスコア[0].譜面情報.コメント =\r
372                                                 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
373                                                 "BOX に移動します。" :\r
374                                                 "Enter into the BOX.";\r
375                                         listノードリスト.Add(c曲リストノード);\r
376                                         if (File.Exists(infoDir.FullName + @"\box.def"))\r
377                                         {\r
378                                                 CBoxDef boxdef = new CBoxDef(infoDir.FullName + @"\box.def");\r
379                                                 if ((boxdef.Title != null) && (boxdef.Title.Length > 0))\r
380                                                 {\r
381                                                         c曲リストノード.strタイトル = boxdef.Title;\r
382                                                 }\r
383                                                 if ((boxdef.Genre != null) && (boxdef.Genre.Length > 0))\r
384                                                 {\r
385                                                         c曲リストノード.strジャンル = boxdef.Genre;\r
386                                                 }\r
387                                                 if (boxdef.Color != Color.White)\r
388                                                 {\r
389                                                         c曲リストノード.col文字色 = boxdef.Color;\r
390                                                 }\r
391                                                 if ((boxdef.Artist != null) && (boxdef.Artist.Length > 0))\r
392                                                 {\r
393                                                         c曲リストノード.arスコア[0].譜面情報.アーティスト名 = boxdef.Artist;\r
394                                                 }\r
395                                                 if ((boxdef.Comment != null) && (boxdef.Comment.Length > 0))\r
396                                                 {\r
397                                                         c曲リストノード.arスコア[0].譜面情報.コメント = boxdef.Comment;\r
398                                                 }\r
399                                                 if ((boxdef.Preimage != null) && (boxdef.Preimage.Length > 0))\r
400                                                 {\r
401                                                         c曲リストノード.arスコア[0].譜面情報.Preimage = boxdef.Preimage;\r
402                                                 }\r
403                                                 if ((boxdef.Premovie != null) && (boxdef.Premovie.Length > 0))\r
404                                                 {\r
405                                                         c曲リストノード.arスコア[0].譜面情報.Premovie = boxdef.Premovie;\r
406                                                 }\r
407                                                 if ((boxdef.Presound != null) && (boxdef.Presound.Length > 0))\r
408                                                 {\r
409                                                         c曲リストノード.arスコア[0].譜面情報.Presound = boxdef.Presound;\r
410                                                 }\r
411                                                 if (boxdef.SkinPath != null)\r
412                                                 {\r
413                                                         if (boxdef.SkinPath == "")\r
414                                                         {\r
415                                                                 // box.defにスキン情報が記載されていないなら、上位BOXのスキン情報をコピー\r
416                                                                 c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?\r
417                                                                         "" : c曲リストノード.r親ノード.strSkinPath;\r
418                                                         }\r
419                                                         else\r
420                                                         {\r
421                                                                 // box.defに記載されているスキン情報をコピー。末尾に必ず\をつけておくこと。\r
422                                                                 string s = System.IO.Path.Combine(infoDir.FullName, boxdef.SkinPath);\r
423                                                                 if (s[s.Length - 1] != System.IO.Path.DirectorySeparatorChar) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する\r
424                                                                 {\r
425                                                                         s += System.IO.Path.DirectorySeparatorChar;\r
426                                                                 }\r
427                                                                 if (CDTXMania.Instance.Skin.bIsValid(s))\r
428                                                                 {\r
429                                                                         c曲リストノード.strSkinPath = s;\r
430                                                                 }\r
431                                                                 else\r
432                                                                 {\r
433                                                                         c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?\r
434                                                                                 "" : c曲リストノード.r親ノード.strSkinPath;\r
435                                                                 }\r
436                                                         }\r
437                                                 }\r
438                                                 if (boxdef.PerfectRange >= 0)\r
439                                                 {\r
440                                                         c曲リストノード.nPerfect範囲ms = boxdef.PerfectRange;\r
441                                                 }\r
442                                                 if (boxdef.GreatRange >= 0)\r
443                                                 {\r
444                                                         c曲リストノード.nGreat範囲ms = boxdef.GreatRange;\r
445                                                 }\r
446                                                 if (boxdef.GoodRange >= 0)\r
447                                                 {\r
448                                                         c曲リストノード.nGood範囲ms = boxdef.GoodRange;\r
449                                                 }\r
450                                                 if (boxdef.PoorRange >= 0)\r
451                                                 {\r
452                                                         c曲リストノード.nPoor範囲ms = boxdef.PoorRange;\r
453                                                 }\r
454                                         }\r
455                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
456                                         {\r
457                                                 Trace.Indent();\r
458                                                 try\r
459                                                 {\r
460                                                         StringBuilder sb = new StringBuilder(0x100);\r
461                                                         sb.Append(string.Format("nID#{0:D3}", c曲リストノード.nID));\r
462                                                         if (c曲リストノード.r親ノード != null)\r
463                                                         {\r
464                                                                 sb.Append(string.Format("(in#{0:D3}):", c曲リストノード.r親ノード.nID));\r
465                                                         }\r
466                                                         else\r
467                                                         {\r
468                                                                 sb.Append("(onRoot):");\r
469                                                         }\r
470                                                         sb.Append(" BOX, Title=" + c曲リストノード.strタイトル);\r
471                                                         sb.Append(", Folder=" + c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス);\r
472                                                         sb.Append(", Comment=" + c曲リストノード.arスコア[0].譜面情報.コメント);\r
473                                                         sb.Append(", SkinPath=" + c曲リストノード.strSkinPath);\r
474                                                         Trace.TraceInformation(sb.ToString());\r
475                                                 }\r
476                                                 finally\r
477                                                 {\r
478                                                         Trace.Unindent();\r
479                                                 }\r
480                                         }\r
481                                         if (b子BOXへ再帰する)\r
482                                         {\r
483                                                 this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, c曲リストノード.list子リスト, c曲リストノード);\r
484                                         }\r
485                                 }\r
486                                 //-----------------------------\r
487                                 #endregion\r
488 \r
489                                 #region [ b.box.def を含むフォルダの場合  ]\r
490                                 //-----------------------------\r
491                                 else if (File.Exists(infoDir.FullName + @"\box.def"))\r
492                                 {\r
493                                         CBoxDef boxdef = new CBoxDef(infoDir.FullName + @"\box.def");\r
494                                         C曲リストノード c曲リストノード = new C曲リストノード();\r
495                                         c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.BOX;\r
496                                         c曲リストノード.bDTXFilesで始まるフォルダ名のBOXである = false;\r
497                                         c曲リストノード.strタイトル = boxdef.Title;\r
498                                         c曲リストノード.strジャンル = boxdef.Genre;\r
499                                         c曲リストノード.col文字色 = boxdef.Color;\r
500                                         c曲リストノード.nスコア数 = 1;\r
501                                         c曲リストノード.arスコア[0] = new Cスコア();\r
502                                         c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス = infoDir.FullName + @"\";\r
503                                         c曲リストノード.arスコア[0].譜面情報.タイトル = boxdef.Title;\r
504                                         c曲リストノード.arスコア[0].譜面情報.ジャンル = boxdef.Genre;\r
505                                         c曲リストノード.arスコア[0].譜面情報.アーティスト名 = boxdef.Artist;\r
506                                         c曲リストノード.arスコア[0].譜面情報.コメント = boxdef.Comment;\r
507                                         c曲リストノード.arスコア[0].譜面情報.Preimage = boxdef.Preimage;\r
508                                         c曲リストノード.arスコア[0].譜面情報.Premovie = boxdef.Premovie;\r
509                                         c曲リストノード.arスコア[0].譜面情報.Presound = boxdef.Presound;\r
510                                         c曲リストノード.r親ノード = node親;\r
511 \r
512                                         if (boxdef.SkinPath == "")\r
513                                         {\r
514                                                 // box.defにスキン情報が記載されていないなら、上位BOXのスキン情報をコピー\r
515                                                 c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?\r
516                                                         "" : c曲リストノード.r親ノード.strSkinPath;\r
517                                         }\r
518                                         else\r
519                                         {\r
520                                                 // box.defに記載されているスキン情報をコピー。末尾に必ず\をつけておくこと。\r
521                                                 string s = System.IO.Path.Combine(infoDir.FullName, boxdef.SkinPath);\r
522                                                 if (s[s.Length - 1] != System.IO.Path.DirectorySeparatorChar) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する\r
523                                                 {\r
524                                                         s += System.IO.Path.DirectorySeparatorChar;\r
525                                                 }\r
526                                                 if (CDTXMania.Instance.Skin.bIsValid(s))\r
527                                                 {\r
528                                                         c曲リストノード.strSkinPath = s;\r
529                                                 }\r
530                                                 else\r
531                                                 {\r
532                                                         c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?\r
533                                                                 "" : c曲リストノード.r親ノード.strSkinPath;\r
534                                                 }\r
535                                         }\r
536                                         c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ?\r
537                                                 c曲リストノード.strタイトル : c曲リストノード.r親ノード.strBreadcrumbs + " > " + c曲リストノード.strタイトル;\r
538 \r
539 \r
540                                         c曲リストノード.list子リスト = new List<C曲リストノード>();\r
541                                         c曲リストノード.nPerfect範囲ms = boxdef.PerfectRange;\r
542                                         c曲リストノード.nGreat範囲ms = boxdef.GreatRange;\r
543                                         c曲リストノード.nGood範囲ms = boxdef.GoodRange;\r
544                                         c曲リストノード.nPoor範囲ms = boxdef.PoorRange;\r
545                                         listノードリスト.Add(c曲リストノード);\r
546                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
547                                         {\r
548                                                 Trace.TraceInformation("box.def検出 : {0}", infoDir.FullName + @"\box.def");\r
549                                                 Trace.Indent();\r
550                                                 try\r
551                                                 {\r
552                                                         StringBuilder sb = new StringBuilder(0x400);\r
553                                                         sb.Append(string.Format("nID#{0:D3}", c曲リストノード.nID));\r
554                                                         if (c曲リストノード.r親ノード != null)\r
555                                                         {\r
556                                                                 sb.Append(string.Format("(in#{0:D3}):", c曲リストノード.r親ノード.nID));\r
557                                                         }\r
558                                                         else\r
559                                                         {\r
560                                                                 sb.Append("(onRoot):");\r
561                                                         }\r
562                                                         sb.Append("BOX, Title=" + c曲リストノード.strタイトル);\r
563                                                         if ((c曲リストノード.strジャンル != null) && (c曲リストノード.strジャンル.Length > 0))\r
564                                                         {\r
565                                                                 sb.Append(", Genre=" + c曲リストノード.strジャンル);\r
566                                                         }\r
567                                                         if ((c曲リストノード.arスコア[0].譜面情報.アーティスト名 != null) && (c曲リストノード.arスコア[0].譜面情報.アーティスト名.Length > 0))\r
568                                                         {\r
569                                                                 sb.Append(", Artist=" + c曲リストノード.arスコア[0].譜面情報.アーティスト名);\r
570                                                         }\r
571                                                         if ((c曲リストノード.arスコア[0].譜面情報.コメント != null) && (c曲リストノード.arスコア[0].譜面情報.コメント.Length > 0))\r
572                                                         {\r
573                                                                 sb.Append(", Comment=" + c曲リストノード.arスコア[0].譜面情報.コメント);\r
574                                                         }\r
575                                                         if ((c曲リストノード.arスコア[0].譜面情報.Preimage != null) && (c曲リストノード.arスコア[0].譜面情報.Preimage.Length > 0))\r
576                                                         {\r
577                                                                 sb.Append(", Preimage=" + c曲リストノード.arスコア[0].譜面情報.Preimage);\r
578                                                         }\r
579                                                         if ((c曲リストノード.arスコア[0].譜面情報.Premovie != null) && (c曲リストノード.arスコア[0].譜面情報.Premovie.Length > 0))\r
580                                                         {\r
581                                                                 sb.Append(", Premovie=" + c曲リストノード.arスコア[0].譜面情報.Premovie);\r
582                                                         }\r
583                                                         if ((c曲リストノード.arスコア[0].譜面情報.Presound != null) && (c曲リストノード.arスコア[0].譜面情報.Presound.Length > 0))\r
584                                                         {\r
585                                                                 sb.Append(", Presound=" + c曲リストノード.arスコア[0].譜面情報.Presound);\r
586                                                         }\r
587                                                         if (c曲リストノード.col文字色 != ColorTranslator.FromHtml("White"))\r
588                                                         {\r
589                                                                 sb.Append(", FontColor=" + c曲リストノード.col文字色);\r
590                                                         }\r
591                                                         if (c曲リストノード.nPerfect範囲ms != -1)\r
592                                                         {\r
593                                                                 sb.Append(", Perfect=" + c曲リストノード.nPerfect範囲ms + "ms");\r
594                                                         }\r
595                                                         if (c曲リストノード.nGreat範囲ms != -1)\r
596                                                         {\r
597                                                                 sb.Append(", Great=" + c曲リストノード.nGreat範囲ms + "ms");\r
598                                                         }\r
599                                                         if (c曲リストノード.nGood範囲ms != -1)\r
600                                                         {\r
601                                                                 sb.Append(", Good=" + c曲リストノード.nGood範囲ms + "ms");\r
602                                                         }\r
603                                                         if (c曲リストノード.nPoor範囲ms != -1)\r
604                                                         {\r
605                                                                 sb.Append(", Poor=" + c曲リストノード.nPoor範囲ms + "ms");\r
606                                                         }\r
607                                                         if ((c曲リストノード.strSkinPath != null) && (c曲リストノード.strSkinPath.Length > 0))\r
608                                                         {\r
609                                                                 sb.Append(", SkinPath=" + c曲リストノード.strSkinPath);\r
610                                                         }\r
611                                                         Trace.TraceInformation(sb.ToString());\r
612                                                 }\r
613                                                 finally\r
614                                                 {\r
615                                                         Trace.Unindent();\r
616                                                 }\r
617                                         }\r
618                                         if (b子BOXへ再帰する)\r
619                                         {\r
620                                                 this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, c曲リストノード.list子リスト, c曲リストノード);\r
621                                         }\r
622                                 }\r
623                                 //-----------------------------\r
624                                 #endregion\r
625 \r
626                                 #region [ c.通常フォルダの場合 ]\r
627                                 //-----------------------------\r
628                                 else\r
629                                 {\r
630                                         this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, listノードリスト, node親);\r
631                                 }\r
632                                 //-----------------------------\r
633                                 #endregion\r
634                         }\r
635                 }\r
636                 //-----------------\r
637                 #endregion\r
638                 #region [ スコアキャッシュを曲リストに反映する ]\r
639                 //-----------------\r
640                 public void tスコアキャッシュを曲リストに反映する()\r
641                 {\r
642                         this.nスコアキャッシュから反映できたスコア数 = 0;\r
643                         this.tスコアキャッシュを曲リストに反映する(this.list曲ルート);\r
644                 }\r
645                 private void tスコアキャッシュを曲リストに反映する(List<C曲リストノード> ノードリスト)\r
646                 {\r
647                         using (List<C曲リストノード>.Enumerator enumerator = ノードリスト.GetEnumerator())\r
648                         {\r
649                                 while (enumerator.MoveNext())\r
650                                 {\r
651                                         SlowOrSuspendSearchTask();    // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
652 \r
653                                         C曲リストノード node = enumerator.Current;\r
654                                         if (node.eノード種別 == C曲リストノード.Eノード種別.BOX)\r
655                                         {\r
656                                                 this.tスコアキャッシュを曲リストに反映する(node.list子リスト);\r
657                                         }\r
658                                         else if ((node.eノード種別 == C曲リストノード.Eノード種別.SCORE) || (node.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))\r
659                                         {\r
660                                                 Predicate<Cスコア> match = null;\r
661                                                 for (int lv = 0; lv < 5; lv++)\r
662                                                 {\r
663                                                         if (node.arスコア[lv] != null)\r
664                                                         {\r
665                                                                 if (match == null)\r
666                                                                 {\r
667                                                                         match = delegate (Cスコア sc)\r
668                                                                         {\r
669                                                                                 return\r
670                                                                                         (\r
671                                                                                         (sc.ファイル情報.ファイルの絶対パス.Equals(node.arスコア[lv].ファイル情報.ファイルの絶対パス)\r
672                                                                                         && sc.ファイル情報.ファイルサイズ.Equals(node.arスコア[lv].ファイル情報.ファイルサイズ))\r
673                                                                                         && (sc.ファイル情報.最終更新日時.Equals(node.arスコア[lv].ファイル情報.最終更新日時)\r
674                                                                                         && sc.ScoreIni情報.ファイルサイズ.Equals(node.arスコア[lv].ScoreIni情報.ファイルサイズ)))\r
675                                                                                         && sc.ScoreIni情報.最終更新日時.Equals(node.arスコア[lv].ScoreIni情報.最終更新日時);\r
676                                                                         };\r
677                                                                 }\r
678                                                                 int nMatched = this.listSongsDB.FindIndex(match);\r
679                                                                 if (nMatched == -1)\r
680                                                                 {\r
681                                                                         //Trace.TraceInformation( "songs.db に存在しません。({0})", node.arスコア[ lv ].ファイル情報.ファイルの絶対パス );\r
682                                                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
683                                                                         {\r
684                                                                                 Trace.TraceInformation("songs.db に存在しません。({0})", node.arスコア[lv].ファイル情報.ファイルの絶対パス);\r
685                                                                         }\r
686                                                                 }\r
687                                                                 else\r
688                                                                 {\r
689                                                                         node.arスコア[lv].譜面情報 = this.listSongsDB[nMatched].譜面情報;\r
690                                                                         node.arスコア[lv].bSongDBにキャッシュがあった = true;\r
691                                                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
692                                                                         {\r
693                                                                                 Trace.TraceInformation("songs.db から転記しました。({0})", node.arスコア[lv].ファイル情報.ファイルの絶対パス);\r
694                                                                         }\r
695                                                                         this.nスコアキャッシュから反映できたスコア数++;\r
696                                                                         if (node.arスコア[lv].ScoreIni情報.最終更新日時 != this.listSongsDB[nMatched].ScoreIni情報.最終更新日時)\r
697                                                                         {\r
698                                                                                 string strFileNameScoreIni = node.arスコア[lv].ファイル情報.ファイルの絶対パス + ".score.ini";\r
699                                                                                 try\r
700                                                                                 {\r
701                                                                                         CScoreIni scoreIni = new CScoreIni(strFileNameScoreIni);\r
702                                                                                         for (EPart i = EPart.Drums; i <= EPart.Bass; i++)\r
703                                                                                         {\r
704                                                                                                 if (scoreIni.stセクション.HiSkill[i].b演奏にMIDI入力を使用した\r
705                                                                                                         || scoreIni.stセクション.HiSkill[i].b演奏にキーボードを使用した\r
706                                                                                                         || scoreIni.stセクション.HiSkill[i].b演奏にジョイパッドを使用した\r
707                                                                                                         || scoreIni.stセクション.HiSkill[i].b演奏にマウスを使用した)\r
708                                                                                                 {\r
709                                                                                                         node.arスコア[lv].譜面情報.最大ランク[i] =\r
710                                                                                                                 (scoreIni.stファイル.BestRank[i] != CScoreIni.ERANK.UNKNOWN) ?\r
711                                                                                                                 scoreIni.stファイル.BestRank[i] : CScoreIni.tランク値を計算して返す(scoreIni.stセクション.HiSkill[i]);\r
712                                                                                                 }\r
713                                                                                                 else\r
714                                                                                                 {\r
715                                                                                                         node.arスコア[lv].譜面情報.最大ランク[i] = CScoreIni.ERANK.UNKNOWN;\r
716                                                                                                 }\r
717                                                                                                 node.arスコア[lv].譜面情報.最大スキル[i] = scoreIni.stセクション.HiSkill[i].db演奏型スキル値;\r
718                                                                                                 node.arスコア[lv].譜面情報.フルコンボ[i] = scoreIni.stセクション.HiSkill[i].bフルコンボである;\r
719                                                                                         }\r
720                                                                                         node.arスコア[lv].譜面情報.演奏回数.Drums = scoreIni.stファイル.PlayCountDrums;\r
721                                                                                         node.arスコア[lv].譜面情報.演奏回数.Guitar = scoreIni.stファイル.PlayCountGuitar;\r
722                                                                                         node.arスコア[lv].譜面情報.演奏回数.Bass = scoreIni.stファイル.PlayCountBass;\r
723                                                                                         for (int j = 0; j < 5; j++)\r
724                                                                                         {\r
725                                                                                                 node.arスコア[lv].譜面情報.演奏履歴[j] = scoreIni.stファイル.History[j];\r
726                                                                                         }\r
727                                                                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
728                                                                                         {\r
729                                                                                                 Trace.TraceInformation("演奏記録ファイルから HiSkill 情報と演奏履歴を取得しました。({0})", strFileNameScoreIni);\r
730                                                                                         }\r
731                                                                                 }\r
732                                                                                 catch\r
733                                                                                 {\r
734                                                                                         Trace.TraceError("演奏記録ファイルの読み込みに失敗しました。({0})", strFileNameScoreIni);\r
735                                                                                 }\r
736                                                                         }\r
737                                                                 }\r
738                                                         }\r
739                                                 }\r
740                                         }\r
741                                 }\r
742                         }\r
743                 }\r
744                 private Cスコア tSongsDBからスコアを1つ読み込む(BinaryReader br)\r
745                 {\r
746                         Cスコア cスコア = new Cスコア();\r
747                         cスコア.ファイル情報.ファイルの絶対パス = br.ReadString();\r
748                         cスコア.ファイル情報.フォルダの絶対パス = br.ReadString();\r
749                         cスコア.ファイル情報.最終更新日時 = new DateTime(br.ReadInt64());\r
750                         cスコア.ファイル情報.ファイルサイズ = br.ReadInt64();\r
751                         cスコア.ScoreIni情報.最終更新日時 = new DateTime(br.ReadInt64());\r
752                         cスコア.ScoreIni情報.ファイルサイズ = br.ReadInt64();\r
753                         cスコア.譜面情報.タイトル = br.ReadString();\r
754                         cスコア.譜面情報.アーティスト名 = br.ReadString();\r
755                         cスコア.譜面情報.コメント = br.ReadString();\r
756                         cスコア.譜面情報.ジャンル = br.ReadString();\r
757                         cスコア.譜面情報.Preimage = br.ReadString();\r
758                         cスコア.譜面情報.Premovie = br.ReadString();\r
759                         cスコア.譜面情報.Presound = br.ReadString();\r
760                         cスコア.譜面情報.Backgound = br.ReadString();\r
761                         cスコア.譜面情報.レベル.Drums = br.ReadInt32();\r
762                         cスコア.譜面情報.レベル.Guitar = br.ReadInt32();\r
763                         cスコア.譜面情報.レベル.Bass = br.ReadInt32();\r
764                         cスコア.譜面情報.最大ランク.Drums = (CScoreIni.ERANK)br.ReadInt32();\r
765                         cスコア.譜面情報.最大ランク.Guitar = (CScoreIni.ERANK)br.ReadInt32();\r
766                         cスコア.譜面情報.最大ランク.Bass = (CScoreIni.ERANK)br.ReadInt32();\r
767                         cスコア.譜面情報.最大スキル.Drums = br.ReadDouble();\r
768                         cスコア.譜面情報.最大スキル.Guitar = br.ReadDouble();\r
769                         cスコア.譜面情報.最大スキル.Bass = br.ReadDouble();\r
770                         cスコア.譜面情報.フルコンボ.Drums = br.ReadBoolean();\r
771                         cスコア.譜面情報.フルコンボ.Guitar = br.ReadBoolean();\r
772                         cスコア.譜面情報.フルコンボ.Bass = br.ReadBoolean();\r
773                         cスコア.譜面情報.演奏回数.Drums = br.ReadInt32();\r
774                         cスコア.譜面情報.演奏回数.Guitar = br.ReadInt32();\r
775                         cスコア.譜面情報.演奏回数.Bass = br.ReadInt32();\r
776                         cスコア.譜面情報.演奏履歴.行1 = br.ReadString();\r
777                         cスコア.譜面情報.演奏履歴.行2 = br.ReadString();\r
778                         cスコア.譜面情報.演奏履歴.行3 = br.ReadString();\r
779                         cスコア.譜面情報.演奏履歴.行4 = br.ReadString();\r
780                         cスコア.譜面情報.演奏履歴.行5 = br.ReadString();\r
781                         cスコア.譜面情報.レベルを非表示にする = br.ReadBoolean();\r
782                         cスコア.譜面情報.曲種別 = (EDTX種別)br.ReadInt32();\r
783                         cスコア.譜面情報.Bpm = br.ReadDouble();\r
784                         cスコア.譜面情報.Duration = br.ReadInt32();\r
785                         cスコア.譜面情報.使用レーン数.Drums = (EUseLanes)br.ReadInt32();\r
786                         cスコア.譜面情報.使用レーン数.Guitar = (EUseLanes)br.ReadInt32();\r
787                         cスコア.譜面情報.使用レーン数.Bass = (EUseLanes)br.ReadInt32();\r
788 \r
789                         //Debug.WriteLine( "songs.db: " + cスコア.ファイル情報.ファイルの絶対パス );\r
790                         return cスコア;\r
791                 }\r
792                 //-----------------\r
793                 #endregion\r
794                 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]\r
795                 //-----------------\r
796                 public void tSongsDBになかった曲をファイルから読み込んで反映する()\r
797                 {\r
798                         this.nファイルから反映できたスコア数 = 0;\r
799                         this.tSongsDBになかった曲をファイルから読み込んで反映する(this.list曲ルート);\r
800                 }\r
801                 private void tSongsDBになかった曲をファイルから読み込んで反映する(List<C曲リストノード> ノードリスト)\r
802                 {\r
803                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
804                         {\r
805                                 SlowOrSuspendSearchTask();    // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
806 \r
807                                 if (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX)\r
808                                 {\r
809                                         this.tSongsDBになかった曲をファイルから読み込んで反映する(c曲リストノード.list子リスト);\r
810                                 }\r
811                                 else if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE)\r
812                                                 || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))\r
813                                 {\r
814                                         for (int i = 0; i < 5; i++)\r
815                                         {\r
816                                                 if ((c曲リストノード.arスコア[i] != null) && !c曲リストノード.arスコア[i].bSongDBにキャッシュがあった)\r
817                                                 {\r
818                                                         #region [ Cスコア.譜面情報 を設定する ]\r
819                                                         //-----------------\r
820                                                         string path = c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス;\r
821                                                         if (File.Exists(path))\r
822                                                         {\r
823                                                                 try\r
824                                                                 {\r
825                                                                         //#36177 2016.7.30 ikanick 曲データの取得時、bLoadDTXDetailがtrueであれば bヘッダのみをfalseにし 詳細なデータを取得する\r
826                                                                         CDTX cdtx = new CDTX(c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス, !CDTXMania.Instance.ConfigIni.bLoadDTXDetail );\r
827                                                                         c曲リストノード.arスコア[i].譜面情報.タイトル = cdtx.TITLE;\r
828                                                                         c曲リストノード.arスコア[i].譜面情報.アーティスト名 = cdtx.ARTIST;\r
829                                                                         c曲リストノード.arスコア[i].譜面情報.コメント = cdtx.COMMENT;\r
830                                                                         c曲リストノード.arスコア[i].譜面情報.ジャンル = cdtx.GENRE;\r
831                                                                         c曲リストノード.arスコア[i].譜面情報.Preimage = cdtx.PREIMAGE;\r
832                                                                         c曲リストノード.arスコア[i].譜面情報.Premovie = cdtx.PREMOVIE;\r
833                                                                         c曲リストノード.arスコア[i].譜面情報.Presound = cdtx.PREVIEW;\r
834                                                                         c曲リストノード.arスコア[i].譜面情報.Backgound = ((cdtx.BACKGROUND != null) && (cdtx.BACKGROUND.Length > 0)) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;\r
835                                                                         c曲リストノード.arスコア[i].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;\r
836                                                                         c曲リストノード.arスコア[i].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;\r
837                                                                         c曲リストノード.arスコア[i].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;\r
838                                                                         c曲リストノード.arスコア[i].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;\r
839                                                                         c曲リストノード.arスコア[i].譜面情報.曲種別 = cdtx.e種別;\r
840                                                                         c曲リストノード.arスコア[i].譜面情報.Bpm = cdtx.BPM;\r
841                                                                         c曲リストノード.arスコア[i].譜面情報.Duration = 0;  //  (cdtx.listChip == null)? 0 : cdtx.listChip[ cdtx.listChip.Count - 1 ].n発声時刻ms;\r
842                                                                         \r
843                                                                         // #36177 2016.7.30 ikanick\r
844                                                                         #region [ LoadDTXDetail ]\r
845                                                                         c曲リストノード.arスコア[i].譜面情報.使用レーン数.Drums = cdtx.n使用レーン数.Drums;\r
846                                                                         c曲リストノード.arスコア[i].譜面情報.使用レーン数.Guitar = cdtx.n使用レーン数.Guitar;\r
847                                                                         c曲リストノード.arスコア[i].譜面情報.使用レーン数.Bass = cdtx.n使用レーン数.Bass;\r
848                                                                         #endregion\r
849 \r
850                                                                         this.nファイルから反映できたスコア数++;\r
851                                                                         cdtx.On非活性化();\r
852                                                                         //Debug.WriteLine( "★" + this.nファイルから反映できたスコア数 + " " + c曲リストノード.arスコア[ i ].譜面情報.タイトル );\r
853                                                                         #region [ 曲検索ログ出力 ]\r
854                                                                         //-----------------\r
855                                                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
856                                                                         {\r
857                                                                                 StringBuilder sb = new StringBuilder(0x400);\r
858                                                                                 sb.Append(string.Format("曲データファイルから譜面情報を転記しました。({0})", path));\r
859                                                                                 sb.Append("(title=" + c曲リストノード.arスコア[i].譜面情報.タイトル);\r
860                                                                                 sb.Append(", artist=" + c曲リストノード.arスコア[i].譜面情報.アーティスト名);\r
861                                                                                 sb.Append(", comment=" + c曲リストノード.arスコア[i].譜面情報.コメント);\r
862                                                                                 sb.Append(", genre=" + c曲リストノード.arスコア[i].譜面情報.ジャンル);\r
863                                                                                 sb.Append(", preimage=" + c曲リストノード.arスコア[i].譜面情報.Preimage);\r
864                                                                                 sb.Append(", premovie=" + c曲リストノード.arスコア[i].譜面情報.Premovie);\r
865                                                                                 sb.Append(", presound=" + c曲リストノード.arスコア[i].譜面情報.Presound);\r
866                                                                                 sb.Append(", background=" + c曲リストノード.arスコア[i].譜面情報.Backgound);\r
867                                                                                 sb.Append(", lvDr=" + c曲リストノード.arスコア[i].譜面情報.レベル.Drums);\r
868                                                                                 sb.Append(", lvGt=" + c曲リストノード.arスコア[i].譜面情報.レベル.Guitar);\r
869                                                                                 sb.Append(", lvBs=" + c曲リストノード.arスコア[i].譜面情報.レベル.Bass);\r
870                                                                                 sb.Append(", lvHide=" + c曲リストノード.arスコア[i].譜面情報.レベルを非表示にする);\r
871                                                                                 sb.Append(", type=" + c曲リストノード.arスコア[i].譜面情報.曲種別);\r
872                                                                                 sb.Append(", bpm=" + c曲リストノード.arスコア[i].譜面情報.Bpm);\r
873                                                                                 //      sb.Append( ", duration=" + c曲リストノード.arスコア[ i ].譜面情報.Duration );\r
874                                                                                 sb.Append(", lnDr=" + c曲リストノード.arスコア[i].譜面情報.使用レーン数.Drums);\r
875                                                                                 sb.Append(", lnGt=" + c曲リストノード.arスコア[i].譜面情報.使用レーン数.Guitar);\r
876                                                                                 sb.Append(", lnBs=" + c曲リストノード.arスコア[i].譜面情報.使用レーン数.Bass);\r
877                                                                                 Trace.TraceInformation(sb.ToString());\r
878                                                                         }\r
879                                                                         //-----------------\r
880                                                                         #endregion\r
881                                                                 }\r
882                                                                 catch (Exception exception)\r
883                                                                 {\r
884                                                                         Trace.TraceError(exception.Message);\r
885                                                                         c曲リストノード.arスコア[i] = null;\r
886                                                                         c曲リストノード.nスコア数--;\r
887                                                                         this.n検索されたスコア数--;\r
888                                                                         Trace.TraceError("曲データファイルの読み込みに失敗しました。({0})", path);\r
889                                                                 }\r
890                                                         }\r
891                                                         //-----------------\r
892                                                         #endregion\r
893 \r
894                                                         #region [ 対応する .score.ini が存在していれば読み込み、Cスコア.譜面情報 に追加設定する ]\r
895                                                         //-----------------\r
896                                                         this.tScoreIniを読み込んで譜面情報を設定する(c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス + ".score.ini", ref c曲リストノード.arスコア[i]);\r
897                                                         //-----------------\r
898                                                         #endregion\r
899                                                 }\r
900                                         }\r
901                                 }\r
902                         }\r
903                 }\r
904                 //-----------------\r
905                 #endregion\r
906                 #region [ 曲リストへ後処理を適用する ]\r
907                 //-----------------\r
908                 public void t曲リストへ後処理を適用する()\r
909                 {\r
910                         listStrBoxDefSkinSubfolderFullName = new List<string>();\r
911                         if (CDTXMania.Instance.Skin.strBoxDefSkinSubfolders != null)\r
912                         {\r
913                                 foreach (string b in CDTXMania.Instance.Skin.strBoxDefSkinSubfolders)\r
914                                 {\r
915                                         listStrBoxDefSkinSubfolderFullName.Add(b);\r
916                                 }\r
917                         }\r
918 \r
919                         this.t曲リストへ後処理を適用する(this.list曲ルート);\r
920 \r
921                         #region [ skin名で比較して、systemスキンとboxdefスキンに重複があれば、boxdefスキン側を削除する ]\r
922                         string[] systemSkinNames = CSkin.GetSkinName(CDTXMania.Instance.Skin.strSystemSkinSubfolders);\r
923                         List<string> l = new List<string>(listStrBoxDefSkinSubfolderFullName);\r
924                         foreach (string boxdefSkinSubfolderFullName in l)\r
925                         {\r
926                                 if (Array.BinarySearch(systemSkinNames,\r
927                                         CSkin.GetSkinName(boxdefSkinSubfolderFullName),\r
928                                         StringComparer.InvariantCultureIgnoreCase) >= 0)\r
929                                 {\r
930                                         listStrBoxDefSkinSubfolderFullName.Remove(boxdefSkinSubfolderFullName);\r
931                                 }\r
932                         }\r
933                         #endregion\r
934                         string[] ba = listStrBoxDefSkinSubfolderFullName.ToArray();\r
935                         Array.Sort(ba);\r
936                         CDTXMania.Instance.Skin.strBoxDefSkinSubfolders = ba;\r
937                 }\r
938                 private void t曲リストへ後処理を適用する(List<C曲リストノード> ノードリスト)\r
939                 {\r
940                         #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]\r
941                         //-----------------------------\r
942                         if (ノードリスト.Count > 0)\r
943                         {\r
944                                 C曲リストノード itemRandom = new C曲リストノード();\r
945                                 itemRandom.eノード種別 = C曲リストノード.Eノード種別.RANDOM;\r
946                                 itemRandom.strタイトル = "< RANDOM SELECT >";\r
947                                 itemRandom.nスコア数 = 5;\r
948                                 itemRandom.r親ノード = ノードリスト[0].r親ノード;\r
949 \r
950                                 itemRandom.strBreadcrumbs = (itemRandom.r親ノード == null) ?\r
951                                         itemRandom.strタイトル : itemRandom.r親ノード.strBreadcrumbs + " > " + itemRandom.strタイトル;\r
952 \r
953                                 for (int i = 0; i < 5; i++)\r
954                                 {\r
955                                         itemRandom.arスコア[i] = new Cスコア();\r
956                                         itemRandom.arスコア[i].譜面情報.タイトル = string.Format("< RANDOM SELECT Lv.{0} >", i + 1);\r
957                                         itemRandom.arスコア[i].譜面情報.コメント =\r
958                                                  (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
959                                                  string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :\r
960                                                  string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);\r
961                                         itemRandom.ar難易度ラベル[i] = string.Format("L{0}", i + 1);\r
962                                 }\r
963                                 ノードリスト.Add(itemRandom);\r
964 \r
965                                 #region [ ログ出力 ]\r
966                                 //-----------------------------\r
967                                 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
968                                 {\r
969                                         StringBuilder sb = new StringBuilder(0x100);\r
970                                         sb.Append(string.Format("nID#{0:D3}", itemRandom.nID));\r
971                                         if (itemRandom.r親ノード != null)\r
972                                         {\r
973                                                 sb.Append(string.Format("(in#{0:D3}):", itemRandom.r親ノード.nID));\r
974                                         }\r
975                                         else\r
976                                         {\r
977                                                 sb.Append("(onRoot):");\r
978                                         }\r
979                                         sb.Append(" RANDOM");\r
980                                         Trace.TraceInformation(sb.ToString());\r
981                                 }\r
982                                 //-----------------------------\r
983                                 #endregion\r
984                         }\r
985                         //-----------------------------\r
986                         #endregion\r
987 \r
988                         // すべてのノードについて…\r
989                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
990                         {\r
991                                 SlowOrSuspendSearchTask();    // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
992 \r
993                                 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]\r
994                                 //-----------------------------\r
995                                 if (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX)\r
996                                 {\r
997                                         C曲リストノード itemBack = new C曲リストノード();\r
998                                         itemBack.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;\r
999                                         itemBack.strタイトル = "<< BACK";\r
1000                                         itemBack.nスコア数 = 1;\r
1001                                         itemBack.r親ノード = c曲リストノード;\r
1002 \r
1003                                         itemBack.strSkinPath = (c曲リストノード.r親ノード == null) ?\r
1004                                                 "" : c曲リストノード.r親ノード.strSkinPath;\r
1005 \r
1006                                         if (itemBack.strSkinPath != "" && !listStrBoxDefSkinSubfolderFullName.Contains(itemBack.strSkinPath))\r
1007                                         {\r
1008                                                 listStrBoxDefSkinSubfolderFullName.Add(itemBack.strSkinPath);\r
1009                                         }\r
1010 \r
1011                                         itemBack.strBreadcrumbs = (itemBack.r親ノード == null) ?\r
1012                                                 itemBack.strタイトル : itemBack.r親ノード.strBreadcrumbs + " > " + itemBack.strタイトル;\r
1013 \r
1014                                         itemBack.arスコア[0] = new Cスコア();\r
1015                                         itemBack.arスコア[0].ファイル情報.フォルダの絶対パス = "";\r
1016                                         itemBack.arスコア[0].譜面情報.タイトル = itemBack.strタイトル;\r
1017                                         itemBack.arスコア[0].譜面情報.コメント =\r
1018                                                 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
1019                                                 "BOX を出ます。" :\r
1020                                                 "Exit from the BOX.";\r
1021                                         c曲リストノード.list子リスト.Insert(0, itemBack);\r
1022 \r
1023                                         #region [ ログ出力 ]\r
1024                                         //-----------------------------\r
1025                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
1026                                         {\r
1027                                                 StringBuilder sb = new StringBuilder(0x100);\r
1028                                                 sb.Append(string.Format("nID#{0:D3}", itemBack.nID));\r
1029                                                 if (itemBack.r親ノード != null)\r
1030                                                 {\r
1031                                                         sb.Append(string.Format("(in#{0:D3}):", itemBack.r親ノード.nID));\r
1032                                                 }\r
1033                                                 else\r
1034                                                 {\r
1035                                                         sb.Append("(onRoot):");\r
1036                                                 }\r
1037                                                 sb.Append(" BACKBOX");\r
1038                                                 Trace.TraceInformation(sb.ToString());\r
1039                                         }\r
1040                                         //-----------------------------\r
1041                                         #endregion\r
1042 \r
1043                                         this.t曲リストへ後処理を適用する(c曲リストノード.list子リスト);\r
1044                                         continue;\r
1045                                 }\r
1046                                 //-----------------------------\r
1047                                 #endregion\r
1048 \r
1049                                 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]\r
1050                                 //-----------------------------\r
1051                                 if (string.IsNullOrEmpty(c曲リストノード.strタイトル))\r
1052                                 {\r
1053                                         for (int j = 0; j < 5; j++)\r
1054                                         {\r
1055                                                 if ((c曲リストノード.arスコア[j] != null) && !string.IsNullOrEmpty(c曲リストノード.arスコア[j].譜面情報.タイトル))\r
1056                                                 {\r
1057                                                         c曲リストノード.strタイトル = c曲リストノード.arスコア[j].譜面情報.タイトル;\r
1058 \r
1059                                                         if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)\r
1060                                                                 Trace.TraceInformation("タイトルを設定しました。(nID#{0:D3}, title={1})", c曲リストノード.nID, c曲リストノード.strタイトル);\r
1061 \r
1062                                                         break;\r
1063                                                 }\r
1064                                         }\r
1065                                 }\r
1066                                 //-----------------------------\r
1067                                 #endregion\r
1068                         }\r
1069 \r
1070                         #region [ ノードをソートする ]\r
1071                         //-----------------------------\r
1072                         this.t曲リストのソート1_絶対パス順(ノードリスト);\r
1073                         //-----------------------------\r
1074                         #endregion\r
1075                 }\r
1076                 //-----------------\r
1077                 #endregion\r
1078                 #region [ スコアキャッシュをSongsDBに出力する ]\r
1079                 //-----------------\r
1080                 public void tスコアキャッシュをSongsDBに出力する(string SongsDBファイル名)\r
1081                 {\r
1082                         this.nSongsDBへ出力できたスコア数 = 0;\r
1083                         try\r
1084                         {\r
1085                                 BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );\r
1086                                 //BinaryWriter bw = new BinaryWriter( new FileStreamSSD( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );\r
1087                                 bw.Write( SONGSDB_VERSION );\r
1088                                 this.tSongsDBにリストを1つ出力する(bw, this.list曲ルート);\r
1089                                 bw.Close();\r
1090                         }\r
1091                         catch\r
1092                         {\r
1093                                 Trace.TraceError("songs.dbの出力に失敗しました。");\r
1094                         }\r
1095                 }\r
1096                 private void tSongsDBにノードを1つ出力する(BinaryWriter bw, C曲リストノード node)\r
1097                 {\r
1098                         for (int i = 0; i < 5; i++)\r
1099                         {\r
1100                                 // ここではsuspendに応じないようにしておく(深い意味はない。ファイルの書き込みオープン状態を長時間維持したくないだけ)\r
1101                                 //if ( this.bIsSuspending )             // #27060 中断要求があったら、解除要求が来るまで待機\r
1102                                 //{\r
1103                                 //      autoReset.WaitOne();\r
1104                                 //}\r
1105 \r
1106                                 if (node.arスコア[i] != null)\r
1107                                 {\r
1108                                         bw.Write(node.arスコア[i].ファイル情報.ファイルの絶対パス);\r
1109                                         bw.Write(node.arスコア[i].ファイル情報.フォルダの絶対パス);\r
1110                                         bw.Write(node.arスコア[i].ファイル情報.最終更新日時.Ticks);\r
1111                                         bw.Write(node.arスコア[i].ファイル情報.ファイルサイズ);\r
1112                                         bw.Write(node.arスコア[i].ScoreIni情報.最終更新日時.Ticks);\r
1113                                         bw.Write(node.arスコア[i].ScoreIni情報.ファイルサイズ);\r
1114                                         bw.Write(node.arスコア[i].譜面情報.タイトル);\r
1115                                         bw.Write(node.arスコア[i].譜面情報.アーティスト名);\r
1116                                         bw.Write(node.arスコア[i].譜面情報.コメント);\r
1117                                         bw.Write(node.arスコア[i].譜面情報.ジャンル);\r
1118                                         bw.Write(node.arスコア[i].譜面情報.Preimage);\r
1119                                         bw.Write(node.arスコア[i].譜面情報.Premovie);\r
1120                                         bw.Write(node.arスコア[i].譜面情報.Presound);\r
1121                                         bw.Write(node.arスコア[i].譜面情報.Backgound);\r
1122                                         bw.Write(node.arスコア[i].譜面情報.レベル.Drums);\r
1123                                         bw.Write(node.arスコア[i].譜面情報.レベル.Guitar);\r
1124                                         bw.Write(node.arスコア[i].譜面情報.レベル.Bass);\r
1125                                         bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Drums);\r
1126                                         bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Guitar);\r
1127                                         bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Bass);\r
1128                                         bw.Write(node.arスコア[i].譜面情報.最大スキル.Drums);\r
1129                                         bw.Write(node.arスコア[i].譜面情報.最大スキル.Guitar);\r
1130                                         bw.Write(node.arスコア[i].譜面情報.最大スキル.Bass);\r
1131                                         bw.Write(node.arスコア[i].譜面情報.フルコンボ.Drums);\r
1132                                         bw.Write(node.arスコア[i].譜面情報.フルコンボ.Guitar);\r
1133                                         bw.Write(node.arスコア[i].譜面情報.フルコンボ.Bass);\r
1134                                         bw.Write(node.arスコア[i].譜面情報.演奏回数.Drums);\r
1135                                         bw.Write(node.arスコア[i].譜面情報.演奏回数.Guitar);\r
1136                                         bw.Write(node.arスコア[i].譜面情報.演奏回数.Bass);\r
1137                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行1);\r
1138                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行2);\r
1139                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行3);\r
1140                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行4);\r
1141                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行5);\r
1142                                         bw.Write(node.arスコア[i].譜面情報.レベルを非表示にする);\r
1143                                         bw.Write((int)node.arスコア[i].譜面情報.曲種別);\r
1144                                         bw.Write(node.arスコア[i].譜面情報.Bpm);\r
1145                                         bw.Write(node.arスコア[i].譜面情報.Duration);\r
1146                                         bw.Write((int)node.arスコア[i].譜面情報.使用レーン数.Drums);\r
1147                                         bw.Write((int)node.arスコア[i].譜面情報.使用レーン数.Guitar);\r
1148                                         bw.Write((int)node.arスコア[i].譜面情報.使用レーン数.Bass);\r
1149                                         this.nSongsDBへ出力できたスコア数++;\r
1150                                 }\r
1151                         }\r
1152                 }\r
1153                 private void tSongsDBにリストを1つ出力する(BinaryWriter bw, List<C曲リストノード> list)\r
1154                 {\r
1155                         foreach (C曲リストノード c曲リストノード in list)\r
1156                         {\r
1157                                 if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE)\r
1158                                         || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))\r
1159                                 {\r
1160                                         this.tSongsDBにノードを1つ出力する(bw, c曲リストノード);\r
1161                                 }\r
1162                                 if (c曲リストノード.list子リスト != null)\r
1163                                 {\r
1164                                         this.tSongsDBにリストを1つ出力する(bw, c曲リストノード.list子リスト);\r
1165                                 }\r
1166                         }\r
1167                 }\r
1168                 //-----------------\r
1169                 #endregion\r
1170 \r
1171                 #region [ 曲リストソート ]\r
1172                 //-----------------\r
1173                 public void t曲リストのソート1_絶対パス順(List<C曲リストノード> ノードリスト)\r
1174                 {\r
1175                         ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1176                         {\r
1177                                 #region [ 共通処理 ]\r
1178                                 if (n1 == n2)\r
1179                                 {\r
1180                                         return 0;\r
1181                                 }\r
1182                                 int num = this.t比較0_共通(n1, n2);\r
1183                                 if (num != 0)\r
1184                                 {\r
1185                                         return num;\r
1186                                 }\r
1187                                 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1188                                 {\r
1189                                         return n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1190                                 }\r
1191                                 #endregion\r
1192                                 string str = "";\r
1193                                 if (string.IsNullOrEmpty(n1.pathSetDefの絶対パス))\r
1194                                 {\r
1195                                         for (int i = 0; i < 5; i++)\r
1196                                         {\r
1197                                                 if (n1.arスコア[i] != null)\r
1198                                                 {\r
1199                                                         str = n1.arスコア[i].ファイル情報.ファイルの絶対パス;\r
1200                                                         if (str == null)\r
1201                                                         {\r
1202                                                                 str = "";\r
1203                                                         }\r
1204                                                         break;\r
1205                                                 }\r
1206                                         }\r
1207                                 }\r
1208                                 else\r
1209                                 {\r
1210                                         str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString("00");\r
1211                                 }\r
1212                                 string strB = "";\r
1213                                 if (string.IsNullOrEmpty(n2.pathSetDefの絶対パス))\r
1214                                 {\r
1215                                         for (int j = 0; j < 5; j++)\r
1216                                         {\r
1217                                                 if (n2.arスコア[j] != null)\r
1218                                                 {\r
1219                                                         strB = n2.arスコア[j].ファイル情報.ファイルの絶対パス;\r
1220                                                         if (strB == null)\r
1221                                                         {\r
1222                                                                 strB = "";\r
1223                                                         }\r
1224                                                         break;\r
1225                                                 }\r
1226                                         }\r
1227                                 }\r
1228                                 else\r
1229                                 {\r
1230                                         strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString("00");\r
1231                                 }\r
1232                                 return str.CompareTo(strB);\r
1233                         });\r
1234                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1235                         {\r
1236                                 if ((c曲リストノード.list子リスト != null) && (c曲リストノード.list子リスト.Count > 1))\r
1237                                 {\r
1238                                         this.t曲リストのソート1_絶対パス順(c曲リストノード.list子リスト);\r
1239                                 }\r
1240                         }\r
1241                 }\r
1242                 public void t曲リストのソート2_タイトル順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)\r
1243                 {\r
1244                         ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1245                         {\r
1246                                 if (n1 == n2)\r
1247                                 {\r
1248                                         return 0;\r
1249                                 }\r
1250                                 int num = this.t比較0_共通(n1, n2);\r
1251                                 if (num != 0)\r
1252                                 {\r
1253                                         return order * num;\r
1254                                 }\r
1255                                 return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1256                         });\r
1257                         //                      foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1258                         //                      {\r
1259                         //                              if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1260                         //                              {\r
1261                         //                                      this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト, part, order );\r
1262                         //                              }\r
1263                         //                      }\r
1264                 }\r
1265                 /// <summary>\r
1266                 /// \r
1267                 /// </summary>\r
1268                 /// <param name="ノードリスト"></param>\r
1269                 /// <param name="part"></param>\r
1270                 /// <param name="order">1=Ascend -1=Descend</param>\r
1271                 public void t曲リストのソート3_演奏回数の多い順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)\r
1272                 {\r
1273                         order = -order;\r
1274                         int nL12345 = (int)p[0];\r
1275                         if (part != EPart.Unknown)\r
1276                         {\r
1277                                 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1278                                 {\r
1279                                         #region [ 共通処理 ]\r
1280                                         if (n1 == n2)\r
1281                                         {\r
1282                                                 return 0;\r
1283                                         }\r
1284                                         int num = this.t比較0_共通(n1, n2);\r
1285                                         if (num != 0)\r
1286                                         {\r
1287                                                 return order * num;\r
1288                                         }\r
1289                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1290                                         {\r
1291                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1292                                         }\r
1293                                         #endregion\r
1294                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1295                                         //                                      for( int i = 0; i < 5; i++ )\r
1296                                         //                                      {\r
1297                                         if (n1.arスコア[nL12345] != null)\r
1298                                         {\r
1299                                                 nSumPlayCountN1 += n1.arスコア[nL12345].譜面情報.演奏回数[part];\r
1300                                         }\r
1301                                         if (n2.arスコア[nL12345] != null)\r
1302                                         {\r
1303                                                 nSumPlayCountN2 += n2.arスコア[nL12345].譜面情報.演奏回数[part];\r
1304                                         }\r
1305                                         //                                      }\r
1306                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1307                                         if (num != 0)\r
1308                                         {\r
1309                                                 return order * num;\r
1310                                         }\r
1311                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1312                                 });\r
1313                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1314                                 {\r
1315                                         int nSumPlayCountN1 = 0;\r
1316                                         //                                      for ( int i = 0; i < 5; i++ )\r
1317                                         //                                      {\r
1318                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1319                                         {\r
1320                                                 nSumPlayCountN1 += c曲リストノード.arスコア[nL12345].譜面情報.演奏回数[part];\r
1321                                         }\r
1322                                         //                                      }\r
1323                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1324                                 }\r
1325 \r
1326                                 //                              foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1327                                 //                              {\r
1328                                 //                                      if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1329                                 //                                      {\r
1330                                 //                                              this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );\r
1331                                 //                                      }\r
1332                                 //                              }\r
1333                         }\r
1334                 }\r
1335                 public void t曲リストのソート4_LEVEL順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)\r
1336                 {\r
1337                         order = -order;\r
1338                         int nL12345 = (int)p[0];\r
1339                         if (part != EPart.Unknown)\r
1340                         {\r
1341                                 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1342                                 {\r
1343                                         #region [ 共通処理 ]\r
1344                                         if (n1 == n2)\r
1345                                         {\r
1346                                                 return 0;\r
1347                                         }\r
1348                                         int num = this.t比較0_共通(n1, n2);\r
1349                                         if (num != 0)\r
1350                                         {\r
1351                                                 return order * num;\r
1352                                         }\r
1353                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1354                                         {\r
1355                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1356                                         }\r
1357                                         #endregion\r
1358                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1359                                         if (n1.arスコア[nL12345] != null)\r
1360                                         {\r
1361                                                 nSumPlayCountN1 = n1.arスコア[nL12345].譜面情報.レベル[part];\r
1362                                         }\r
1363                                         if (n2.arスコア[nL12345] != null)\r
1364                                         {\r
1365                                                 nSumPlayCountN2 = n2.arスコア[nL12345].譜面情報.レベル[part];\r
1366                                         }\r
1367                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1368                                         if (num != 0)\r
1369                                         {\r
1370                                                 return order * num;\r
1371                                         }\r
1372                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1373                                 });\r
1374                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1375                                 {\r
1376                                         int nSumPlayCountN1 = 0;\r
1377                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1378                                         {\r
1379                                                 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].譜面情報.レベル[part];\r
1380                                         }\r
1381                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1382                                 }\r
1383                         }\r
1384                 }\r
1385                 public void t曲リストのソート5_BestRank順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)\r
1386                 {\r
1387                         order = -order;\r
1388                         int nL12345 = (int)p[0];\r
1389                         if (part != EPart.Unknown)\r
1390                         {\r
1391                                 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1392                                 {\r
1393                                         #region [ 共通処理 ]\r
1394                                         if (n1 == n2)\r
1395                                         {\r
1396                                                 return 0;\r
1397                                         }\r
1398                                         int num = this.t比較0_共通(n1, n2);\r
1399                                         if (num != 0)\r
1400                                         {\r
1401                                                 return order * num;\r
1402                                         }\r
1403                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1404                                         {\r
1405                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1406                                         }\r
1407                                         #endregion\r
1408                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1409                                         bool isFullCombo1 = false, isFullCombo2 = false;\r
1410                                         if (n1.arスコア[nL12345] != null)\r
1411                                         {\r
1412                                                 isFullCombo1 = n1.arスコア[nL12345].譜面情報.フルコンボ[part];\r
1413                                                 nSumPlayCountN1 = (int)n1.arスコア[nL12345].譜面情報.最大ランク[part];\r
1414                                         }\r
1415                                         if (n2.arスコア[nL12345] != null)\r
1416                                         {\r
1417                                                 isFullCombo2 = n2.arスコア[nL12345].譜面情報.フルコンボ[part];\r
1418                                                 nSumPlayCountN2 = (int)n2.arスコア[nL12345].譜面情報.最大ランク[part];\r
1419                                         }\r
1420                                         if (isFullCombo1 ^ isFullCombo2)\r
1421                                         {\r
1422                                                 if (isFullCombo1) return order; else return -order;\r
1423                                         }\r
1424                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1425                                         if (num != 0)\r
1426                                         {\r
1427                                                 return order * num;\r
1428                                         }\r
1429                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1430                                 });\r
1431                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1432                                 {\r
1433                                         int nSumPlayCountN1 = 0;\r
1434                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1435                                         {\r
1436                                                 nSumPlayCountN1 = (int)c曲リストノード.arスコア[nL12345].譜面情報.最大ランク[part];\r
1437                                         }\r
1438                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1439                                 }\r
1440                         }\r
1441                 }\r
1442                 public void t曲リストのソート6_SkillPoint順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)\r
1443                 {\r
1444                         order = -order;\r
1445                         int nL12345 = (int)p[0];\r
1446                         if (part != EPart.Unknown)\r
1447                         {\r
1448                                 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1449                                 {\r
1450                                         #region [ 共通処理 ]\r
1451                                         if (n1 == n2)\r
1452                                         {\r
1453                                                 return 0;\r
1454                                         }\r
1455                                         int num = this.t比較0_共通(n1, n2);\r
1456                                         if (num != 0)\r
1457                                         {\r
1458                                                 return order * num;\r
1459                                         }\r
1460                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1461                                         {\r
1462                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1463                                         }\r
1464                                         #endregion\r
1465                                         double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1466                                         if (n1.arスコア[nL12345] != null)\r
1467                                         {\r
1468                                                 nSumPlayCountN1 = n1.arスコア[nL12345].譜面情報.最大スキル[part];\r
1469                                         }\r
1470                                         if (n2.arスコア[nL12345] != null)\r
1471                                         {\r
1472                                                 nSumPlayCountN2 = n2.arスコア[nL12345].譜面情報.最大スキル[part];\r
1473                                         }\r
1474                                         double d = nSumPlayCountN2 - nSumPlayCountN1;\r
1475                                         if (d != 0)\r
1476                                         {\r
1477                                                 return order * System.Math.Sign(d);\r
1478                                         }\r
1479                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1480                                 });\r
1481                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1482                                 {\r
1483                                         double nSumPlayCountN1 = 0;\r
1484                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1485                                         {\r
1486                                                 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].譜面情報.最大スキル[part];\r
1487                                         }\r
1488                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1489                                 }\r
1490                         }\r
1491                 }\r
1492                 public void t曲リストのソート7_更新日時順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)\r
1493                 {\r
1494                         int nL12345 = (int)p[0];\r
1495                         if (part != EPart.Unknown)\r
1496                         {\r
1497                                 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1498                                 {\r
1499                                         #region [ 共通処理 ]\r
1500                                         if (n1 == n2)\r
1501                                         {\r
1502                                                 return 0;\r
1503                                         }\r
1504                                         int num = this.t比較0_共通(n1, n2);\r
1505                                         if (num != 0)\r
1506                                         {\r
1507                                                 return order * num;\r
1508                                         }\r
1509                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1510                                         {\r
1511                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1512                                         }\r
1513                                         #endregion\r
1514                                         DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1515                                         DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1516                                         if (n1.arスコア[nL12345] != null)\r
1517                                         {\r
1518                                                 nSumPlayCountN1 = n1.arスコア[nL12345].ファイル情報.最終更新日時;\r
1519                                         }\r
1520                                         if (n2.arスコア[nL12345] != null)\r
1521                                         {\r
1522                                                 nSumPlayCountN2 = n2.arスコア[nL12345].ファイル情報.最終更新日時;\r
1523                                         }\r
1524                                         int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);\r
1525                                         if (d != 0)\r
1526                                         {\r
1527                                                 return order * System.Math.Sign(d);\r
1528                                         }\r
1529                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1530                                 });\r
1531                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1532                                 {\r
1533                                         DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1534                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1535                                         {\r
1536                                                 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].ファイル情報.最終更新日時;\r
1537                                         }\r
1538                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1539                                 }\r
1540                         }\r
1541                 }\r
1542                 public void t曲リストのソート8_アーティスト名順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)\r
1543                 {\r
1544                         int nL12345 = (int)p[0];\r
1545                         ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)\r
1546                         {\r
1547                                 #region [ 共通処理 ]\r
1548                                 if (n1 == n2)\r
1549                                 {\r
1550                                         return 0;\r
1551                                 }\r
1552                                 int num = this.t比較0_共通(n1, n2);\r
1553                                 if (num != 0)\r
1554                                 {\r
1555                                         return order * System.Math.Sign(num);\r
1556                                 }\r
1557                                 #endregion\r
1558                                 string strAuthorN1 = "";\r
1559                                 string strAuthorN2 = "";\r
1560                                 int nL12345補正後1 = nL12345;\r
1561                                 int nL12345補正後2 = nL12345;\r
1562                                 if (n1.arスコア[nL12345] == null)\r
1563                                 {\r
1564                                         nL12345補正後1 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す(n1, nL12345);\r
1565                                 }\r
1566                                 if (n1.arスコア[nL12345補正後1] != null)\r
1567                                 {\r
1568                                         strAuthorN1 = n1.arスコア[nL12345補正後1].譜面情報.アーティスト名;\r
1569                                 }\r
1570                                 if (n2.arスコア[nL12345] == null)\r
1571                                 {\r
1572                                         nL12345補正後2 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す(n2, nL12345);\r
1573                                 }\r
1574                                 if (n2.arスコア[nL12345補正後2] != null)\r
1575                                 {\r
1576                                         strAuthorN2 = n2.arスコア[nL12345補正後2].譜面情報.アーティスト名;\r
1577                                 }\r
1578 \r
1579                                 return order * strAuthorN1.CompareTo(strAuthorN2);\r
1580                         });\r
1581                         #region [ デバッグ用 ]\r
1582                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1583                         {\r
1584                                 string s = "";\r
1585                                 if (c曲リストノード.arスコア[nL12345] != null)\r
1586                                 {\r
1587                                         s = c曲リストノード.arスコア[nL12345].譜面情報.アーティスト名;\r
1588                                 }\r
1589                                 //Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );\r
1590                         }\r
1591                         #endregion\r
1592                 }\r
1593                 /// <summary>\r
1594                 /// CActSelect曲リスト のメソッドのデッドコピー。美しくない実装ですみません。\r
1595                 /// </summary>\r
1596                 /// <param name="song"></param>\r
1597                 /// <param name="n現在のアンカ難易度レベル"></param>\r
1598                 /// <returns></returns>\r
1599                 public int n現在のアンカ難易度レベルに最も近い難易度レベルを返す(C曲リストノード song, int n現在のアンカ難易度レベル)\r
1600                 {\r
1601                         // 事前チェック。\r
1602 \r
1603                         if (song == null)\r
1604                                 return n現在のアンカ難易度レベル; // 曲がまったくないよ\r
1605 \r
1606                         if (song.arスコア[n現在のアンカ難易度レベル] != null)\r
1607                                 return n現在のアンカ難易度レベル; // 難易度ぴったりの曲があったよ\r
1608 \r
1609                         if ((song.eノード種別 == C曲リストノード.Eノード種別.BOX) || (song.eノード種別 == C曲リストノード.Eノード種別.BACKBOX))\r
1610                                 return 0;               // BOX と BACKBOX は関係無いよ\r
1611 \r
1612 \r
1613                         // 現在のアンカレベルから、難易度上向きに検索開始。\r
1614 \r
1615                         int n最も近いレベル = n現在のアンカ難易度レベル;\r
1616 \r
1617                         for (int i = 0; i < 5; i++)\r
1618                         {\r
1619                                 if (song.arスコア[n最も近いレベル] != null)\r
1620                                         break;  // 曲があった。\r
1621 \r
1622                                 n最も近いレベル = (n最も近いレベル + 1) % 5;  // 曲がなかったので次の難易度レベルへGo。(5以上になったら0に戻る。)\r
1623                         }\r
1624 \r
1625 \r
1626                         // 見つかった曲がアンカより下のレベルだった場合……\r
1627                         // アンカから下向きに検索すれば、もっとアンカに近い曲があるんじゃね?\r
1628 \r
1629                         if (n最も近いレベル < n現在のアンカ難易度レベル)\r
1630                         {\r
1631                                 // 現在のアンカレベルから、難易度下向きに検索開始。\r
1632 \r
1633                                 n最も近いレベル = n現在のアンカ難易度レベル;\r
1634 \r
1635                                 for (int i = 0; i < 5; i++)\r
1636                                 {\r
1637                                         if (song.arスコア[n最も近いレベル] != null)\r
1638                                                 break;  // 曲があった。\r
1639 \r
1640                                         n最も近いレベル = ((n最も近いレベル - 1) + 5) % 5;  // 曲がなかったので次の難易度レベルへGo。(0未満になったら4に戻る。)\r
1641                                 }\r
1642                         }\r
1643 \r
1644                         return n最も近いレベル;\r
1645                 }\r
1646 #if TEST_SORTBGM\r
1647                 public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1648                 {\r
1649                         order = -order;\r
1650                         int nL12345 = (int) p[ 0 ];\r
1651                         if ( part != E楽器パート.UNKNOWN )\r
1652                         {\r
1653                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1654                                 {\r
1655                 #region [ 共通処理 ]\r
1656                                         if ( n1 == n2 )\r
1657                                         {\r
1658                                                 return 0;\r
1659                                         }\r
1660                                         int num = this.t比較0_共通( n1, n2 );\r
1661                                         if ( num != 0 )\r
1662                                         {\r
1663                                                 return order * num;\r
1664                                         }\r
1665                                         if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1666                                         {\r
1667                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1668                                         }\r
1669                 #endregion\r
1670                                         double dBPMn1 = 0.0, dBPMn2 = 0.0;\r
1671                                         if ( n1.arスコア[ nL12345 ] != null )\r
1672                                         {\r
1673                                                 dBPMn1 = n1.arスコア[ nL12345 ].譜面情報.bpm;\r
1674                                         }\r
1675                                         if ( n2.arスコア[ nL12345 ] != null )\r
1676                                         {\r
1677                                                 dBPMn2 = n2.arスコア[ nL12345 ].譜面情報.bpm;\r
1678                                         }\r
1679                                         double d = dBPMn1- dBPMn2;\r
1680                                         if ( d != 0 )\r
1681                                         {\r
1682                                                 return order * System.Math.Sign( d );\r
1683                                         }\r
1684                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1685                                 } );\r
1686                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1687                                 {\r
1688                                         double dBPM = 0;\r
1689                                         if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1690                                         {\r
1691                                                 dBPM = c曲リストノード.arスコア[ nL12345 ].譜面情報.bpm;\r
1692                                         }\r
1693 Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );\r
1694                                 }\r
1695                         }\r
1696                 }\r
1697 #endif\r
1698                 //-----------------\r
1699                 #endregion\r
1700                 #region [ .score.ini を読み込んで Cスコア.譜面情報に設定する ]\r
1701                 //-----------------\r
1702                 public void tScoreIniを読み込んで譜面情報を設定する(string strScoreIniファイルパス, ref Cスコア score)\r
1703                 {\r
1704                         if (!File.Exists(strScoreIniファイルパス))\r
1705                                 return;\r
1706 \r
1707                         try\r
1708                         {\r
1709                                 var ini = new CScoreIni(strScoreIniファイルパス);\r
1710 \r
1711                                 for (EPart inst = EPart.Drums; inst <= EPart.Bass; inst++)\r
1712                                 {\r
1713                                         //-----------------\r
1714                                         if (\r
1715                                                 ini.stセクション.HiSkill[inst].b演奏にMIDI入力を使用した ||\r
1716                                                 ini.stセクション.HiSkill[inst].b演奏にキーボードを使用した ||\r
1717                                                 ini.stセクション.HiSkill[inst].b演奏にジョイパッドを使用した ||\r
1718                                                 ini.stセクション.HiSkill[inst].b演奏にマウスを使用した)\r
1719                                         {\r
1720                                                 // (A) 全オートじゃないようなので、演奏結果情報を有効としてランクを算出する。\r
1721 \r
1722                                                 score.譜面情報.最大ランク[inst] =\r
1723                                                         CScoreIni.tランク値を計算して返す(\r
1724                                                                 ini.stセクション.HiSkill[inst].n全チップ数,\r
1725                                                                 ini.stセクション.HiSkill[inst].nPerfect数,\r
1726                                                                 ini.stセクション.HiSkill[inst].nGreat数,\r
1727                                                                 ini.stセクション.HiSkill[inst].nGood数,\r
1728                                                                 ini.stセクション.HiSkill[inst].nPoor数,\r
1729                                                                 ini.stセクション.HiSkill[inst].nMiss数);\r
1730                                         }\r
1731                                         else\r
1732                                         {\r
1733                                                 // (B) 全オートらしいので、ランクは無効とする。\r
1734 \r
1735                                                 score.譜面情報.最大ランク[inst] = CScoreIni.ERANK.UNKNOWN;\r
1736                                         }\r
1737                                         //-----------------\r
1738                                         score.譜面情報.最大スキル[inst] = ini.stセクション.HiSkill[inst].db演奏型スキル値;\r
1739                                         score.譜面情報.フルコンボ[inst] = ini.stセクション.HiSkill[inst].bフルコンボである;\r
1740                                 }\r
1741                                 score.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
1742                                 score.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
1743                                 score.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;\r
1744                                 for (int i = 0; i < 5; i++)\r
1745                                 {\r
1746                                         score.譜面情報.演奏履歴[i] = ini.stファイル.History[i];\r
1747                                 }\r
1748                         }\r
1749                         catch\r
1750                         {\r
1751                                 Trace.TraceError("演奏記録ファイルの読み込みに失敗しました。[{0}]", strScoreIniファイルパス);\r
1752                         }\r
1753                 }\r
1754                 //-----------------\r
1755                 #endregion\r
1756 \r
1757 \r
1758                 // その他\r
1759 \r
1760                 #region [ private ]\r
1761                 //-----------------\r
1762                 private const string SONGSDB_VERSION = "SongsDB4";\r
1763                 private List<string> listStrBoxDefSkinSubfolderFullName;\r
1764 \r
1765                 private int t比較0_共通(C曲リストノード n1, C曲リストノード n2)\r
1766                 {\r
1767                         if (n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX)\r
1768                         {\r
1769                                 return -1;\r
1770                         }\r
1771                         if (n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX)\r
1772                         {\r
1773                                 return 1;\r
1774                         }\r
1775                         if (n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM)\r
1776                         {\r
1777                                 return 1;\r
1778                         }\r
1779                         if (n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM)\r
1780                         {\r
1781                                 return -1;\r
1782                         }\r
1783                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 != C曲リストノード.Eノード種別.BOX))\r
1784                         {\r
1785                                 return -1;\r
1786                         }\r
1787                         if ((n1.eノード種別 != C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1788                         {\r
1789                                 return 1;\r
1790                         }\r
1791                         return 0;\r
1792                 }\r
1793 \r
1794                 /// <summary>\r
1795                 /// 検索を中断・スローダウンする\r
1796                 /// </summary>\r
1797                 private void SlowOrSuspendSearchTask()\r
1798                 {\r
1799                         if (this.bIsSuspending)   // #27060 中断要求があったら、解除要求が来るまで待機\r
1800                         {\r
1801                                 autoReset.WaitOne();\r
1802                         }\r
1803                         if (this.bIsSlowdown && ++this.searchCount > 10)      // #27060 #PREMOVIE再生中は検索負荷を下げる\r
1804                         {\r
1805                                 Thread.Sleep(100);\r
1806                                 this.searchCount = 0;\r
1807                         }\r
1808                 }\r
1809 \r
1810                 //-----------------\r
1811                 #endregion\r
1812         }\r
1813 }\r