OSDN Git Service

#36410 DGB グラフ
[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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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.bLog曲検索ログ出力)\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 (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.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.bLog曲検索ログ出力)\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 \r
786                         //Debug.WriteLine( "songs.db: " + cスコア.ファイル情報.ファイルの絶対パス );\r
787                         return cスコア;\r
788                 }\r
789                 //-----------------\r
790                 #endregion\r
791                 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]\r
792                 //-----------------\r
793                 public void tSongsDBになかった曲をファイルから読み込んで反映する()\r
794                 {\r
795                         this.nファイルから反映できたスコア数 = 0;\r
796                         this.tSongsDBになかった曲をファイルから読み込んで反映する(this.list曲ルート);\r
797                 }\r
798                 private void tSongsDBになかった曲をファイルから読み込んで反映する(List<C曲リストノード> ノードリスト)\r
799                 {\r
800                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
801                         {\r
802                                 SlowOrSuspendSearchTask();              // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
803 \r
804                                 if (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX)\r
805                                 {\r
806                                         this.tSongsDBになかった曲をファイルから読み込んで反映する(c曲リストノード.list子リスト);\r
807                                 }\r
808                                 else if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE)\r
809                                                 || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))\r
810                                 {\r
811                                         for (int i = 0; i < 5; i++)\r
812                                         {\r
813                                                 if ((c曲リストノード.arスコア[i] != null) && !c曲リストノード.arスコア[i].bSongDBにキャッシュがあった)\r
814                                                 {\r
815                                                         #region [ DTX ファイルのヘッダだけ読み込み、Cスコア.譜面情報 を設定する ]\r
816                                                         //-----------------\r
817                                                         string path = c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス;\r
818                                                         if (File.Exists(path))\r
819                                                         {\r
820                                                                 try\r
821                                                                 {\r
822                                                                         CDTX cdtx = new CDTX(c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス, true);\r
823                                                                         c曲リストノード.arスコア[i].譜面情報.タイトル = cdtx.TITLE;\r
824                                                                         c曲リストノード.arスコア[i].譜面情報.アーティスト名 = cdtx.ARTIST;\r
825                                                                         c曲リストノード.arスコア[i].譜面情報.コメント = cdtx.COMMENT;\r
826                                                                         c曲リストノード.arスコア[i].譜面情報.ジャンル = cdtx.GENRE;\r
827                                                                         c曲リストノード.arスコア[i].譜面情報.Preimage = cdtx.PREIMAGE;\r
828                                                                         c曲リストノード.arスコア[i].譜面情報.Premovie = cdtx.PREMOVIE;\r
829                                                                         c曲リストノード.arスコア[i].譜面情報.Presound = cdtx.PREVIEW;\r
830                                                                         c曲リストノード.arスコア[i].譜面情報.Backgound = ((cdtx.BACKGROUND != null) && (cdtx.BACKGROUND.Length > 0)) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;\r
831                                                                         c曲リストノード.arスコア[i].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;\r
832                                                                         c曲リストノード.arスコア[i].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;\r
833                                                                         c曲リストノード.arスコア[i].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;\r
834                                                                         c曲リストノード.arスコア[i].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;\r
835                                                                         c曲リストノード.arスコア[i].譜面情報.曲種別 = cdtx.e種別;\r
836                                                                         c曲リストノード.arスコア[i].譜面情報.Bpm = cdtx.BPM;\r
837                                                                         c曲リストノード.arスコア[i].譜面情報.Duration = 0;        //  (cdtx.listChip == null)? 0 : cdtx.listChip[ cdtx.listChip.Count - 1 ].n発声時刻ms;\r
838                                                                         this.nファイルから反映できたスコア数++;\r
839                                                                         cdtx.On非活性化();\r
840                                                                         //Debug.WriteLine( "★" + this.nファイルから反映できたスコア数 + " " + c曲リストノード.arスコア[ i ].譜面情報.タイトル );\r
841                                                                         #region [ 曲検索ログ出力 ]\r
842                                                                         //-----------------\r
843                                                                         if (CDTXMania.Instance.ConfigIni.bLog曲検索ログ出力)\r
844                                                                         {\r
845                                                                                 StringBuilder sb = new StringBuilder(0x400);\r
846                                                                                 sb.Append(string.Format("曲データファイルから譜面情報を転記しました。({0})", path));\r
847                                                                                 sb.Append("(title=" + c曲リストノード.arスコア[i].譜面情報.タイトル);\r
848                                                                                 sb.Append(", artist=" + c曲リストノード.arスコア[i].譜面情報.アーティスト名);\r
849                                                                                 sb.Append(", comment=" + c曲リストノード.arスコア[i].譜面情報.コメント);\r
850                                                                                 sb.Append(", genre=" + c曲リストノード.arスコア[i].譜面情報.ジャンル);\r
851                                                                                 sb.Append(", preimage=" + c曲リストノード.arスコア[i].譜面情報.Preimage);\r
852                                                                                 sb.Append(", premovie=" + c曲リストノード.arスコア[i].譜面情報.Premovie);\r
853                                                                                 sb.Append(", presound=" + c曲リストノード.arスコア[i].譜面情報.Presound);\r
854                                                                                 sb.Append(", background=" + c曲リストノード.arスコア[i].譜面情報.Backgound);\r
855                                                                                 sb.Append(", lvDr=" + c曲リストノード.arスコア[i].譜面情報.レベル.Drums);\r
856                                                                                 sb.Append(", lvGt=" + c曲リストノード.arスコア[i].譜面情報.レベル.Guitar);\r
857                                                                                 sb.Append(", lvBs=" + c曲リストノード.arスコア[i].譜面情報.レベル.Bass);\r
858                                                                                 sb.Append(", lvHide=" + c曲リストノード.arスコア[i].譜面情報.レベルを非表示にする);\r
859                                                                                 sb.Append(", type=" + c曲リストノード.arスコア[i].譜面情報.曲種別);\r
860                                                                                 sb.Append(", bpm=" + c曲リストノード.arスコア[i].譜面情報.Bpm);\r
861                                                                                 //      sb.Append( ", duration=" + c曲リストノード.arスコア[ i ].譜面情報.Duration );\r
862                                                                                 Trace.TraceInformation(sb.ToString());\r
863                                                                         }\r
864                                                                         //-----------------\r
865                                                                         #endregion\r
866                                                                 }\r
867                                                                 catch (Exception exception)\r
868                                                                 {\r
869                                                                         Trace.TraceError(exception.Message);\r
870                                                                         c曲リストノード.arスコア[i] = null;\r
871                                                                         c曲リストノード.nスコア数--;\r
872                                                                         this.n検索されたスコア数--;\r
873                                                                         Trace.TraceError("曲データファイルの読み込みに失敗しました。({0})", path);\r
874                                                                 }\r
875                                                         }\r
876                                                         //-----------------\r
877                                                         #endregion\r
878 \r
879                                                         #region [ 対応する .score.ini が存在していれば読み込み、Cスコア.譜面情報 に追加設定する ]\r
880                                                         //-----------------\r
881                                                         this.tScoreIniを読み込んで譜面情報を設定する(c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス + ".score.ini", ref c曲リストノード.arスコア[i]);\r
882                                                         //-----------------\r
883                                                         #endregion\r
884                                                 }\r
885                                         }\r
886                                 }\r
887                         }\r
888                 }\r
889                 //-----------------\r
890                 #endregion\r
891                 #region [ 曲リストへ後処理を適用する ]\r
892                 //-----------------\r
893                 public void t曲リストへ後処理を適用する()\r
894                 {\r
895                         listStrBoxDefSkinSubfolderFullName = new List<string>();\r
896                         if (CDTXMania.Instance.Skin.strBoxDefSkinSubfolders != null)\r
897                         {\r
898                                 foreach (string b in CDTXMania.Instance.Skin.strBoxDefSkinSubfolders)\r
899                                 {\r
900                                         listStrBoxDefSkinSubfolderFullName.Add(b);\r
901                                 }\r
902                         }\r
903 \r
904                         this.t曲リストへ後処理を適用する(this.list曲ルート);\r
905 \r
906                         #region [ skin名で比較して、systemスキンとboxdefスキンに重複があれば、boxdefスキン側を削除する ]\r
907                         string[] systemSkinNames = CSkin.GetSkinName(CDTXMania.Instance.Skin.strSystemSkinSubfolders);\r
908                         List<string> l = new List<string>(listStrBoxDefSkinSubfolderFullName);\r
909                         foreach (string boxdefSkinSubfolderFullName in l)\r
910                         {\r
911                                 if (Array.BinarySearch(systemSkinNames,\r
912                                         CSkin.GetSkinName(boxdefSkinSubfolderFullName),\r
913                                         StringComparer.InvariantCultureIgnoreCase) >= 0)\r
914                                 {\r
915                                         listStrBoxDefSkinSubfolderFullName.Remove(boxdefSkinSubfolderFullName);\r
916                                 }\r
917                         }\r
918                         #endregion\r
919                         string[] ba = listStrBoxDefSkinSubfolderFullName.ToArray();\r
920                         Array.Sort(ba);\r
921                         CDTXMania.Instance.Skin.strBoxDefSkinSubfolders = ba;\r
922                 }\r
923                 private void t曲リストへ後処理を適用する(List<C曲リストノード> ノードリスト)\r
924                 {\r
925                         #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]\r
926                         //-----------------------------\r
927                         if (ノードリスト.Count > 0)\r
928                         {\r
929                                 C曲リストノード itemRandom = new C曲リストノード();\r
930                                 itemRandom.eノード種別 = C曲リストノード.Eノード種別.RANDOM;\r
931                                 itemRandom.strタイトル = "< RANDOM SELECT >";\r
932                                 itemRandom.nスコア数 = 5;\r
933                                 itemRandom.r親ノード = ノードリスト[0].r親ノード;\r
934 \r
935                                 itemRandom.strBreadcrumbs = (itemRandom.r親ノード == null) ?\r
936                                         itemRandom.strタイトル : itemRandom.r親ノード.strBreadcrumbs + " > " + itemRandom.strタイトル;\r
937 \r
938                                 for (int i = 0; i < 5; i++)\r
939                                 {\r
940                                         itemRandom.arスコア[i] = new Cスコア();\r
941                                         itemRandom.arスコア[i].譜面情報.タイトル = string.Format("< RANDOM SELECT Lv.{0} >", i + 1);\r
942                                         itemRandom.arスコア[i].譜面情報.コメント =\r
943                                                  (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
944                                                  string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :\r
945                                                  string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);\r
946                                         itemRandom.ar難易度ラベル[i] = string.Format("L{0}", i + 1);\r
947                                 }\r
948                                 ノードリスト.Add(itemRandom);\r
949 \r
950                                 #region [ ログ出力 ]\r
951                                 //-----------------------------\r
952                                 if (CDTXMania.Instance.ConfigIni.bLog曲検索ログ出力)\r
953                                 {\r
954                                         StringBuilder sb = new StringBuilder(0x100);\r
955                                         sb.Append(string.Format("nID#{0:D3}", itemRandom.nID));\r
956                                         if (itemRandom.r親ノード != null)\r
957                                         {\r
958                                                 sb.Append(string.Format("(in#{0:D3}):", itemRandom.r親ノード.nID));\r
959                                         }\r
960                                         else\r
961                                         {\r
962                                                 sb.Append("(onRoot):");\r
963                                         }\r
964                                         sb.Append(" RANDOM");\r
965                                         Trace.TraceInformation(sb.ToString());\r
966                                 }\r
967                                 //-----------------------------\r
968                                 #endregion\r
969                         }\r
970                         //-----------------------------\r
971                         #endregion\r
972 \r
973                         // すべてのノードについて…\r
974                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
975                         {\r
976                                 SlowOrSuspendSearchTask();              // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす\r
977 \r
978                                 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]\r
979                                 //-----------------------------\r
980                                 if (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX)\r
981                                 {\r
982                                         C曲リストノード itemBack = new C曲リストノード();\r
983                                         itemBack.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;\r
984                                         itemBack.strタイトル = "<< BACK";\r
985                                         itemBack.nスコア数 = 1;\r
986                                         itemBack.r親ノード = c曲リストノード;\r
987 \r
988                                         itemBack.strSkinPath = (c曲リストノード.r親ノード == null) ?\r
989                                                 "" : c曲リストノード.r親ノード.strSkinPath;\r
990 \r
991                                         if (itemBack.strSkinPath != "" && !listStrBoxDefSkinSubfolderFullName.Contains(itemBack.strSkinPath))\r
992                                         {\r
993                                                 listStrBoxDefSkinSubfolderFullName.Add(itemBack.strSkinPath);\r
994                                         }\r
995 \r
996                                         itemBack.strBreadcrumbs = (itemBack.r親ノード == null) ?\r
997                                                 itemBack.strタイトル : itemBack.r親ノード.strBreadcrumbs + " > " + itemBack.strタイトル;\r
998 \r
999                                         itemBack.arスコア[0] = new Cスコア();\r
1000                                         itemBack.arスコア[0].ファイル情報.フォルダの絶対パス = "";\r
1001                                         itemBack.arスコア[0].譜面情報.タイトル = itemBack.strタイトル;\r
1002                                         itemBack.arスコア[0].譜面情報.コメント =\r
1003                                                 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
1004                                                 "BOX を出ます。" :\r
1005                                                 "Exit from the BOX.";\r
1006                                         c曲リストノード.list子リスト.Insert(0, itemBack);\r
1007 \r
1008                                         #region [ ログ出力 ]\r
1009                                         //-----------------------------\r
1010                                         if (CDTXMania.Instance.ConfigIni.bLog曲検索ログ出力)\r
1011                                         {\r
1012                                                 StringBuilder sb = new StringBuilder(0x100);\r
1013                                                 sb.Append(string.Format("nID#{0:D3}", itemBack.nID));\r
1014                                                 if (itemBack.r親ノード != null)\r
1015                                                 {\r
1016                                                         sb.Append(string.Format("(in#{0:D3}):", itemBack.r親ノード.nID));\r
1017                                                 }\r
1018                                                 else\r
1019                                                 {\r
1020                                                         sb.Append("(onRoot):");\r
1021                                                 }\r
1022                                                 sb.Append(" BACKBOX");\r
1023                                                 Trace.TraceInformation(sb.ToString());\r
1024                                         }\r
1025                                         //-----------------------------\r
1026                                         #endregion\r
1027 \r
1028                                         this.t曲リストへ後処理を適用する(c曲リストノード.list子リスト);\r
1029                                         continue;\r
1030                                 }\r
1031                                 //-----------------------------\r
1032                                 #endregion\r
1033 \r
1034                                 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]\r
1035                                 //-----------------------------\r
1036                                 if (string.IsNullOrEmpty(c曲リストノード.strタイトル))\r
1037                                 {\r
1038                                         for (int j = 0; j < 5; j++)\r
1039                                         {\r
1040                                                 if ((c曲リストノード.arスコア[j] != null) && !string.IsNullOrEmpty(c曲リストノード.arスコア[j].譜面情報.タイトル))\r
1041                                                 {\r
1042                                                         c曲リストノード.strタイトル = c曲リストノード.arスコア[j].譜面情報.タイトル;\r
1043 \r
1044                                                         if (CDTXMania.Instance.ConfigIni.bLog曲検索ログ出力)\r
1045                                                                 Trace.TraceInformation("タイトルを設定しました。(nID#{0:D3}, title={1})", c曲リストノード.nID, c曲リストノード.strタイトル);\r
1046 \r
1047                                                         break;\r
1048                                                 }\r
1049                                         }\r
1050                                 }\r
1051                                 //-----------------------------\r
1052                                 #endregion\r
1053                         }\r
1054 \r
1055                         #region [ ノードをソートする ]\r
1056                         //-----------------------------\r
1057                         this.t曲リストのソート1_絶対パス順(ノードリスト);\r
1058                         //-----------------------------\r
1059                         #endregion\r
1060                 }\r
1061                 //-----------------\r
1062                 #endregion\r
1063                 #region [ スコアキャッシュをSongsDBに出力する ]\r
1064                 //-----------------\r
1065                 public void tスコアキャッシュをSongsDBに出力する(string SongsDBファイル名)\r
1066                 {\r
1067                         this.nSongsDBへ出力できたスコア数 = 0;\r
1068                         try\r
1069                         {\r
1070                                 BinaryWriter bw = new BinaryWriter(new FileStream(SongsDBファイル名, FileMode.Create, FileAccess.Write));\r
1071                                 bw.Write(SONGSDB_VERSION);\r
1072                                 this.tSongsDBにリストを1つ出力する(bw, this.list曲ルート);\r
1073                                 bw.Close();\r
1074                         }\r
1075                         catch\r
1076                         {\r
1077                                 Trace.TraceError("songs.dbの出力に失敗しました。");\r
1078                         }\r
1079                 }\r
1080                 private void tSongsDBにノードを1つ出力する(BinaryWriter bw, C曲リストノード node)\r
1081                 {\r
1082                         for (int i = 0; i < 5; i++)\r
1083                         {\r
1084                                 // ここではsuspendに応じないようにしておく(深い意味はない。ファイルの書き込みオープン状態を長時間維持したくないだけ)\r
1085                                 //if ( this.bIsSuspending )             // #27060 中断要求があったら、解除要求が来るまで待機\r
1086                                 //{\r
1087                                 //      autoReset.WaitOne();\r
1088                                 //}\r
1089 \r
1090                                 if (node.arスコア[i] != null)\r
1091                                 {\r
1092                                         bw.Write(node.arスコア[i].ファイル情報.ファイルの絶対パス);\r
1093                                         bw.Write(node.arスコア[i].ファイル情報.フォルダの絶対パス);\r
1094                                         bw.Write(node.arスコア[i].ファイル情報.最終更新日時.Ticks);\r
1095                                         bw.Write(node.arスコア[i].ファイル情報.ファイルサイズ);\r
1096                                         bw.Write(node.arスコア[i].ScoreIni情報.最終更新日時.Ticks);\r
1097                                         bw.Write(node.arスコア[i].ScoreIni情報.ファイルサイズ);\r
1098                                         bw.Write(node.arスコア[i].譜面情報.タイトル);\r
1099                                         bw.Write(node.arスコア[i].譜面情報.アーティスト名);\r
1100                                         bw.Write(node.arスコア[i].譜面情報.コメント);\r
1101                                         bw.Write(node.arスコア[i].譜面情報.ジャンル);\r
1102                                         bw.Write(node.arスコア[i].譜面情報.Preimage);\r
1103                                         bw.Write(node.arスコア[i].譜面情報.Premovie);\r
1104                                         bw.Write(node.arスコア[i].譜面情報.Presound);\r
1105                                         bw.Write(node.arスコア[i].譜面情報.Backgound);\r
1106                                         bw.Write(node.arスコア[i].譜面情報.レベル.Drums);\r
1107                                         bw.Write(node.arスコア[i].譜面情報.レベル.Guitar);\r
1108                                         bw.Write(node.arスコア[i].譜面情報.レベル.Bass);\r
1109                                         bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Drums);\r
1110                                         bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Guitar);\r
1111                                         bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Bass);\r
1112                                         bw.Write(node.arスコア[i].譜面情報.最大スキル.Drums);\r
1113                                         bw.Write(node.arスコア[i].譜面情報.最大スキル.Guitar);\r
1114                                         bw.Write(node.arスコア[i].譜面情報.最大スキル.Bass);\r
1115                                         bw.Write(node.arスコア[i].譜面情報.フルコンボ.Drums);\r
1116                                         bw.Write(node.arスコア[i].譜面情報.フルコンボ.Guitar);\r
1117                                         bw.Write(node.arスコア[i].譜面情報.フルコンボ.Bass);\r
1118                                         bw.Write(node.arスコア[i].譜面情報.演奏回数.Drums);\r
1119                                         bw.Write(node.arスコア[i].譜面情報.演奏回数.Guitar);\r
1120                                         bw.Write(node.arスコア[i].譜面情報.演奏回数.Bass);\r
1121                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行1);\r
1122                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行2);\r
1123                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行3);\r
1124                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行4);\r
1125                                         bw.Write(node.arスコア[i].譜面情報.演奏履歴.行5);\r
1126                                         bw.Write(node.arスコア[i].譜面情報.レベルを非表示にする);\r
1127                                         bw.Write((int)node.arスコア[i].譜面情報.曲種別);\r
1128                                         bw.Write(node.arスコア[i].譜面情報.Bpm);\r
1129                                         bw.Write(node.arスコア[i].譜面情報.Duration);\r
1130                                         this.nSongsDBへ出力できたスコア数++;\r
1131                                 }\r
1132                         }\r
1133                 }\r
1134                 private void tSongsDBにリストを1つ出力する(BinaryWriter bw, List<C曲リストノード> list)\r
1135                 {\r
1136                         foreach (C曲リストノード c曲リストノード in list)\r
1137                         {\r
1138                                 if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE)\r
1139                                         || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))\r
1140                                 {\r
1141                                         this.tSongsDBにノードを1つ出力する(bw, c曲リストノード);\r
1142                                 }\r
1143                                 if (c曲リストノード.list子リスト != null)\r
1144                                 {\r
1145                                         this.tSongsDBにリストを1つ出力する(bw, c曲リストノード.list子リスト);\r
1146                                 }\r
1147                         }\r
1148                 }\r
1149                 //-----------------\r
1150                 #endregion\r
1151 \r
1152                 #region [ 曲リストソート ]\r
1153                 //-----------------\r
1154                 public void t曲リストのソート1_絶対パス順(List<C曲リストノード> ノードリスト)\r
1155                 {\r
1156                         ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1157                         {\r
1158                                 #region [ 共通処理 ]\r
1159                                 if (n1 == n2)\r
1160                                 {\r
1161                                         return 0;\r
1162                                 }\r
1163                                 int num = this.t比較0_共通(n1, n2);\r
1164                                 if (num != 0)\r
1165                                 {\r
1166                                         return num;\r
1167                                 }\r
1168                                 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1169                                 {\r
1170                                         return n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1171                                 }\r
1172                                 #endregion\r
1173                                 string str = "";\r
1174                                 if (string.IsNullOrEmpty(n1.pathSetDefの絶対パス))\r
1175                                 {\r
1176                                         for (int i = 0; i < 5; i++)\r
1177                                         {\r
1178                                                 if (n1.arスコア[i] != null)\r
1179                                                 {\r
1180                                                         str = n1.arスコア[i].ファイル情報.ファイルの絶対パス;\r
1181                                                         if (str == null)\r
1182                                                         {\r
1183                                                                 str = "";\r
1184                                                         }\r
1185                                                         break;\r
1186                                                 }\r
1187                                         }\r
1188                                 }\r
1189                                 else\r
1190                                 {\r
1191                                         str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString("00");\r
1192                                 }\r
1193                                 string strB = "";\r
1194                                 if (string.IsNullOrEmpty(n2.pathSetDefの絶対パス))\r
1195                                 {\r
1196                                         for (int j = 0; j < 5; j++)\r
1197                                         {\r
1198                                                 if (n2.arスコア[j] != null)\r
1199                                                 {\r
1200                                                         strB = n2.arスコア[j].ファイル情報.ファイルの絶対パス;\r
1201                                                         if (strB == null)\r
1202                                                         {\r
1203                                                                 strB = "";\r
1204                                                         }\r
1205                                                         break;\r
1206                                                 }\r
1207                                         }\r
1208                                 }\r
1209                                 else\r
1210                                 {\r
1211                                         strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString("00");\r
1212                                 }\r
1213                                 return str.CompareTo(strB);\r
1214                         });\r
1215                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1216                         {\r
1217                                 if ((c曲リストノード.list子リスト != null) && (c曲リストノード.list子リスト.Count > 1))\r
1218                                 {\r
1219                                         this.t曲リストのソート1_絶対パス順(c曲リストノード.list子リスト);\r
1220                                 }\r
1221                         }\r
1222                 }\r
1223                 public void t曲リストのソート2_タイトル順(List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p)\r
1224                 {\r
1225                         ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1226                         {\r
1227                                 if (n1 == n2)\r
1228                                 {\r
1229                                         return 0;\r
1230                                 }\r
1231                                 int num = this.t比較0_共通(n1, n2);\r
1232                                 if (num != 0)\r
1233                                 {\r
1234                                         return order * num;\r
1235                                 }\r
1236                                 return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1237                         });\r
1238                         //                      foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1239                         //                      {\r
1240                         //                              if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1241                         //                              {\r
1242                         //                                      this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト, part, order );\r
1243                         //                              }\r
1244                         //                      }\r
1245                 }\r
1246                 /// <summary>\r
1247                 /// \r
1248                 /// </summary>\r
1249                 /// <param name="ノードリスト"></param>\r
1250                 /// <param name="part"></param>\r
1251                 /// <param name="order">1=Ascend -1=Descend</param>\r
1252                 public void t曲リストのソート3_演奏回数の多い順(List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p)\r
1253                 {\r
1254                         order = -order;\r
1255                         int nL12345 = (int)p[0];\r
1256                         if (part != E楽器パート.UNKNOWN)\r
1257                         {\r
1258                                 ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1259                                 {\r
1260                                         #region [ 共通処理 ]\r
1261                                         if (n1 == n2)\r
1262                                         {\r
1263                                                 return 0;\r
1264                                         }\r
1265                                         int num = this.t比較0_共通(n1, n2);\r
1266                                         if (num != 0)\r
1267                                         {\r
1268                                                 return order * num;\r
1269                                         }\r
1270                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1271                                         {\r
1272                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1273                                         }\r
1274                                         #endregion\r
1275                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1276                                         //                                      for( int i = 0; i < 5; i++ )\r
1277                                         //                                      {\r
1278                                         if (n1.arスコア[nL12345] != null)\r
1279                                         {\r
1280                                                 nSumPlayCountN1 += n1.arスコア[nL12345].譜面情報.演奏回数[part];\r
1281                                         }\r
1282                                         if (n2.arスコア[nL12345] != null)\r
1283                                         {\r
1284                                                 nSumPlayCountN2 += n2.arスコア[nL12345].譜面情報.演奏回数[part];\r
1285                                         }\r
1286                                         //                                      }\r
1287                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1288                                         if (num != 0)\r
1289                                         {\r
1290                                                 return order * num;\r
1291                                         }\r
1292                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1293                                 });\r
1294                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1295                                 {\r
1296                                         int nSumPlayCountN1 = 0;\r
1297                                         //                                      for ( int i = 0; i < 5; i++ )\r
1298                                         //                                      {\r
1299                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1300                                         {\r
1301                                                 nSumPlayCountN1 += c曲リストノード.arスコア[nL12345].譜面情報.演奏回数[part];\r
1302                                         }\r
1303                                         //                                      }\r
1304                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1305                                 }\r
1306 \r
1307                                 //                              foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1308                                 //                              {\r
1309                                 //                                      if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1310                                 //                                      {\r
1311                                 //                                              this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );\r
1312                                 //                                      }\r
1313                                 //                              }\r
1314                         }\r
1315                 }\r
1316                 public void t曲リストのソート4_LEVEL順(List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p)\r
1317                 {\r
1318                         order = -order;\r
1319                         int nL12345 = (int)p[0];\r
1320                         if (part != E楽器パート.UNKNOWN)\r
1321                         {\r
1322                                 ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1323                                 {\r
1324                                         #region [ 共通処理 ]\r
1325                                         if (n1 == n2)\r
1326                                         {\r
1327                                                 return 0;\r
1328                                         }\r
1329                                         int num = this.t比較0_共通(n1, n2);\r
1330                                         if (num != 0)\r
1331                                         {\r
1332                                                 return order * num;\r
1333                                         }\r
1334                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1335                                         {\r
1336                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1337                                         }\r
1338                                         #endregion\r
1339                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1340                                         if (n1.arスコア[nL12345] != null)\r
1341                                         {\r
1342                                                 nSumPlayCountN1 = n1.arスコア[nL12345].譜面情報.レベル[part];\r
1343                                         }\r
1344                                         if (n2.arスコア[nL12345] != null)\r
1345                                         {\r
1346                                                 nSumPlayCountN2 = n2.arスコア[nL12345].譜面情報.レベル[part];\r
1347                                         }\r
1348                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1349                                         if (num != 0)\r
1350                                         {\r
1351                                                 return order * num;\r
1352                                         }\r
1353                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1354                                 });\r
1355                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1356                                 {\r
1357                                         int nSumPlayCountN1 = 0;\r
1358                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1359                                         {\r
1360                                                 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].譜面情報.レベル[part];\r
1361                                         }\r
1362                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1363                                 }\r
1364                         }\r
1365                 }\r
1366                 public void t曲リストのソート5_BestRank順(List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p)\r
1367                 {\r
1368                         order = -order;\r
1369                         int nL12345 = (int)p[0];\r
1370                         if (part != E楽器パート.UNKNOWN)\r
1371                         {\r
1372                                 ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1373                                 {\r
1374                                         #region [ 共通処理 ]\r
1375                                         if (n1 == n2)\r
1376                                         {\r
1377                                                 return 0;\r
1378                                         }\r
1379                                         int num = this.t比較0_共通(n1, n2);\r
1380                                         if (num != 0)\r
1381                                         {\r
1382                                                 return order * num;\r
1383                                         }\r
1384                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1385                                         {\r
1386                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1387                                         }\r
1388                                         #endregion\r
1389                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1390                                         bool isFullCombo1 = false, isFullCombo2 = false;\r
1391                                         if (n1.arスコア[nL12345] != null)\r
1392                                         {\r
1393                                                 isFullCombo1 = n1.arスコア[nL12345].譜面情報.フルコンボ[part];\r
1394                                                 nSumPlayCountN1 = (int)n1.arスコア[nL12345].譜面情報.最大ランク[part];\r
1395                                         }\r
1396                                         if (n2.arスコア[nL12345] != null)\r
1397                                         {\r
1398                                                 isFullCombo2 = n2.arスコア[nL12345].譜面情報.フルコンボ[part];\r
1399                                                 nSumPlayCountN2 = (int)n2.arスコア[nL12345].譜面情報.最大ランク[part];\r
1400                                         }\r
1401                                         if (isFullCombo1 ^ isFullCombo2)\r
1402                                         {\r
1403                                                 if (isFullCombo1) return order; else return -order;\r
1404                                         }\r
1405                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1406                                         if (num != 0)\r
1407                                         {\r
1408                                                 return order * num;\r
1409                                         }\r
1410                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1411                                 });\r
1412                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1413                                 {\r
1414                                         int nSumPlayCountN1 = 0;\r
1415                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1416                                         {\r
1417                                                 nSumPlayCountN1 = (int)c曲リストノード.arスコア[nL12345].譜面情報.最大ランク[part];\r
1418                                         }\r
1419                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1420                                 }\r
1421                         }\r
1422                 }\r
1423                 public void t曲リストのソート6_SkillPoint順(List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p)\r
1424                 {\r
1425                         order = -order;\r
1426                         int nL12345 = (int)p[0];\r
1427                         if (part != E楽器パート.UNKNOWN)\r
1428                         {\r
1429                                 ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1430                                 {\r
1431                                         #region [ 共通処理 ]\r
1432                                         if (n1 == n2)\r
1433                                         {\r
1434                                                 return 0;\r
1435                                         }\r
1436                                         int num = this.t比較0_共通(n1, n2);\r
1437                                         if (num != 0)\r
1438                                         {\r
1439                                                 return order * num;\r
1440                                         }\r
1441                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1442                                         {\r
1443                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1444                                         }\r
1445                                         #endregion\r
1446                                         double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1447                                         if (n1.arスコア[nL12345] != null)\r
1448                                         {\r
1449                                                 nSumPlayCountN1 = n1.arスコア[nL12345].譜面情報.最大スキル[part];\r
1450                                         }\r
1451                                         if (n2.arスコア[nL12345] != null)\r
1452                                         {\r
1453                                                 nSumPlayCountN2 = n2.arスコア[nL12345].譜面情報.最大スキル[part];\r
1454                                         }\r
1455                                         double d = nSumPlayCountN2 - nSumPlayCountN1;\r
1456                                         if (d != 0)\r
1457                                         {\r
1458                                                 return order * System.Math.Sign(d);\r
1459                                         }\r
1460                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1461                                 });\r
1462                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1463                                 {\r
1464                                         double nSumPlayCountN1 = 0;\r
1465                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1466                                         {\r
1467                                                 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].譜面情報.最大スキル[part];\r
1468                                         }\r
1469                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1470                                 }\r
1471                         }\r
1472                 }\r
1473                 public void t曲リストのソート7_更新日時順(List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p)\r
1474                 {\r
1475                         int nL12345 = (int)p[0];\r
1476                         if (part != E楽器パート.UNKNOWN)\r
1477                         {\r
1478                                 ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1479                                 {\r
1480                                         #region [ 共通処理 ]\r
1481                                         if (n1 == n2)\r
1482                                         {\r
1483                                                 return 0;\r
1484                                         }\r
1485                                         int num = this.t比較0_共通(n1, n2);\r
1486                                         if (num != 0)\r
1487                                         {\r
1488                                                 return order * num;\r
1489                                         }\r
1490                                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1491                                         {\r
1492                                                 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);\r
1493                                         }\r
1494                                         #endregion\r
1495                                         DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1496                                         DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1497                                         if (n1.arスコア[nL12345] != null)\r
1498                                         {\r
1499                                                 nSumPlayCountN1 = n1.arスコア[nL12345].ファイル情報.最終更新日時;\r
1500                                         }\r
1501                                         if (n2.arスコア[nL12345] != null)\r
1502                                         {\r
1503                                                 nSumPlayCountN2 = n2.arスコア[nL12345].ファイル情報.最終更新日時;\r
1504                                         }\r
1505                                         int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);\r
1506                                         if (d != 0)\r
1507                                         {\r
1508                                                 return order * System.Math.Sign(d);\r
1509                                         }\r
1510                                         return order * n1.strタイトル.CompareTo(n2.strタイトル);\r
1511                                 });\r
1512                                 foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1513                                 {\r
1514                                         DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1515                                         if (c曲リストノード.arスコア[nL12345] != null)\r
1516                                         {\r
1517                                                 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].ファイル情報.最終更新日時;\r
1518                                         }\r
1519                                         // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1520                                 }\r
1521                         }\r
1522                 }\r
1523                 public void t曲リストのソート8_アーティスト名順(List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p)\r
1524                 {\r
1525                         int nL12345 = (int)p[0];\r
1526                         ノードリスト.Sort(delegate(C曲リストノード n1, C曲リストノード n2)\r
1527                         {\r
1528                                 #region [ 共通処理 ]\r
1529                                 if (n1 == n2)\r
1530                                 {\r
1531                                         return 0;\r
1532                                 }\r
1533                                 int num = this.t比較0_共通(n1, n2);\r
1534                                 if (num != 0)\r
1535                                 {\r
1536                                         return order * System.Math.Sign(num);\r
1537                                 }\r
1538                                 #endregion\r
1539                                 string strAuthorN1 = "";\r
1540                                 string strAuthorN2 = "";\r
1541                                 int nL12345補正後1 = nL12345;\r
1542                                 int nL12345補正後2 = nL12345;\r
1543                                 if (n1.arスコア[nL12345] == null)\r
1544                                 {\r
1545                                         nL12345補正後1 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す(n1, nL12345);\r
1546                                 }\r
1547                                 if (n1.arスコア[nL12345補正後1] != null)\r
1548                                 {\r
1549                                         strAuthorN1 = n1.arスコア[nL12345補正後1].譜面情報.アーティスト名;\r
1550                                 }\r
1551                                 if (n2.arスコア[nL12345] == null)\r
1552                                 {\r
1553                                         nL12345補正後2 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す(n2, nL12345);\r
1554                                 }\r
1555                                 if (n2.arスコア[nL12345補正後2] != null)\r
1556                                 {\r
1557                                         strAuthorN2 = n2.arスコア[nL12345補正後2].譜面情報.アーティスト名;\r
1558                                 }\r
1559 \r
1560                                 return order * strAuthorN1.CompareTo(strAuthorN2);\r
1561                         });\r
1562                         #region [ デバッグ用 ]\r
1563                         foreach (C曲リストノード c曲リストノード in ノードリスト)\r
1564                         {\r
1565                                 string s = "";\r
1566                                 if (c曲リストノード.arスコア[nL12345] != null)\r
1567                                 {\r
1568                                         s = c曲リストノード.arスコア[nL12345].譜面情報.アーティスト名;\r
1569                                 }\r
1570                                 //Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );\r
1571                         }\r
1572                         #endregion\r
1573                 }\r
1574                 /// <summary>\r
1575                 /// CActSelect曲リスト のメソッドのデッドコピー。美しくない実装ですみません。\r
1576                 /// </summary>\r
1577                 /// <param name="song"></param>\r
1578                 /// <param name="n現在のアンカ難易度レベル"></param>\r
1579                 /// <returns></returns>\r
1580                 public int n現在のアンカ難易度レベルに最も近い難易度レベルを返す(C曲リストノード song, int n現在のアンカ難易度レベル)\r
1581                 {\r
1582                         // 事前チェック。\r
1583 \r
1584                         if (song == null)\r
1585                                 return n現在のアンカ難易度レベル;   // 曲がまったくないよ\r
1586 \r
1587                         if (song.arスコア[n現在のアンカ難易度レベル] != null)\r
1588                                 return n現在のアンカ難易度レベル;   // 難易度ぴったりの曲があったよ\r
1589 \r
1590                         if ((song.eノード種別 == C曲リストノード.Eノード種別.BOX) || (song.eノード種別 == C曲リストノード.Eノード種別.BACKBOX))\r
1591                                 return 0;                                                               // BOX と BACKBOX は関係無いよ\r
1592 \r
1593 \r
1594                         // 現在のアンカレベルから、難易度上向きに検索開始。\r
1595 \r
1596                         int n最も近いレベル = n現在のアンカ難易度レベル;\r
1597 \r
1598                         for (int i = 0; i < 5; i++)\r
1599                         {\r
1600                                 if (song.arスコア[n最も近いレベル] != null)\r
1601                                         break;  // 曲があった。\r
1602 \r
1603                                 n最も近いレベル = (n最も近いレベル + 1) % 5;      // 曲がなかったので次の難易度レベルへGo。(5以上になったら0に戻る。)\r
1604                         }\r
1605 \r
1606 \r
1607                         // 見つかった曲がアンカより下のレベルだった場合……\r
1608                         // アンカから下向きに検索すれば、もっとアンカに近い曲があるんじゃね?\r
1609 \r
1610                         if (n最も近いレベル < n現在のアンカ難易度レベル)\r
1611                         {\r
1612                                 // 現在のアンカレベルから、難易度下向きに検索開始。\r
1613 \r
1614                                 n最も近いレベル = n現在のアンカ難易度レベル;\r
1615 \r
1616                                 for (int i = 0; i < 5; i++)\r
1617                                 {\r
1618                                         if (song.arスコア[n最も近いレベル] != null)\r
1619                                                 break;  // 曲があった。\r
1620 \r
1621                                         n最も近いレベル = ((n最も近いレベル - 1) + 5) % 5;        // 曲がなかったので次の難易度レベルへGo。(0未満になったら4に戻る。)\r
1622                                 }\r
1623                         }\r
1624 \r
1625                         return n最も近いレベル;\r
1626                 }\r
1627 #if TEST_SORTBGM\r
1628                 public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1629                 {\r
1630                         order = -order;\r
1631                         int nL12345 = (int) p[ 0 ];\r
1632                         if ( part != E楽器パート.UNKNOWN )\r
1633                         {\r
1634                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1635                                 {\r
1636                 #region [ 共通処理 ]\r
1637                                         if ( n1 == n2 )\r
1638                                         {\r
1639                                                 return 0;\r
1640                                         }\r
1641                                         int num = this.t比較0_共通( n1, n2 );\r
1642                                         if ( num != 0 )\r
1643                                         {\r
1644                                                 return order * num;\r
1645                                         }\r
1646                                         if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1647                                         {\r
1648                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1649                                         }\r
1650                                         #endregion\r
1651                                         double dBPMn1 = 0.0, dBPMn2 = 0.0;\r
1652                                         if ( n1.arスコア[ nL12345 ] != null )\r
1653                                         {\r
1654                                                 dBPMn1 = n1.arスコア[ nL12345 ].譜面情報.bpm;\r
1655                                         }\r
1656                                         if ( n2.arスコア[ nL12345 ] != null )\r
1657                                         {\r
1658                                                 dBPMn2 = n2.arスコア[ nL12345 ].譜面情報.bpm;\r
1659                                         }\r
1660                                         double d = dBPMn1- dBPMn2;\r
1661                                         if ( d != 0 )\r
1662                                         {\r
1663                                                 return order * System.Math.Sign( d );\r
1664                                         }\r
1665                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1666                                 } );\r
1667                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1668                                 {\r
1669                                         double dBPM = 0;\r
1670                                         if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1671                                         {\r
1672                                                 dBPM = c曲リストノード.arスコア[ nL12345 ].譜面情報.bpm;\r
1673                                         }\r
1674 Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );\r
1675                                 }\r
1676                         }\r
1677                 }\r
1678 #endif\r
1679                 //-----------------\r
1680                 #endregion\r
1681                 #region [ .score.ini を読み込んで Cスコア.譜面情報に設定する ]\r
1682                 //-----------------\r
1683                 public void tScoreIniを読み込んで譜面情報を設定する(string strScoreIniファイルパス, ref Cスコア score)\r
1684                 {\r
1685                         if (!File.Exists(strScoreIniファイルパス))\r
1686                                 return;\r
1687 \r
1688                         try\r
1689                         {\r
1690                                 var ini = new CScoreIni(strScoreIniファイルパス);\r
1691                                 \r
1692                                 for (E楽器パート inst = E楽器パート.DRUMS; inst <= E楽器パート.BASS; inst++)\r
1693                                 {\r
1694                                         //-----------------\r
1695                                         if (\r
1696                                                 ini.stセクション.HiSkill[inst].b演奏にMIDI入力を使用した ||\r
1697                                                 ini.stセクション.HiSkill[inst].b演奏にキーボードを使用した ||\r
1698                                                 ini.stセクション.HiSkill[inst].b演奏にジョイパッドを使用した ||\r
1699                                                 ini.stセクション.HiSkill[inst].b演奏にマウスを使用した)\r
1700                                         {\r
1701                                                 // (A) 全オートじゃないようなので、演奏結果情報を有効としてランクを算出する。\r
1702 \r
1703                                                 score.譜面情報.最大ランク[inst] =\r
1704                                                         CScoreIni.tランク値を計算して返す(\r
1705                                                                 ini.stセクション.HiSkill[inst].n全チップ数,\r
1706                                                                 ini.stセクション.HiSkill[inst].nPerfect数,\r
1707                                                                 ini.stセクション.HiSkill[inst].nGreat数,\r
1708                                                                 ini.stセクション.HiSkill[inst].nGood数,\r
1709                                                                 ini.stセクション.HiSkill[inst].nPoor数,\r
1710                                                                 ini.stセクション.HiSkill[inst].nMiss数);\r
1711                                         }\r
1712                                         else\r
1713                                         {\r
1714                                                 // (B) 全オートらしいので、ランクは無効とする。\r
1715 \r
1716                                                 score.譜面情報.最大ランク[inst] = CScoreIni.ERANK.UNKNOWN;\r
1717                                         }\r
1718                                         //-----------------\r
1719                                         score.譜面情報.最大スキル[inst] = ini.stセクション.HiSkill[inst].db演奏型スキル値;\r
1720                                         score.譜面情報.フルコンボ[inst] = ini.stセクション.HiSkill[inst].bフルコンボである;\r
1721                                 }\r
1722                                 score.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
1723                                 score.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
1724                                 score.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;\r
1725                                 for (int i = 0; i < 5; i++)\r
1726                                 {\r
1727                                         score.譜面情報.演奏履歴[i] = ini.stファイル.History[i];\r
1728                                 }\r
1729                         }\r
1730                         catch\r
1731                         {\r
1732                                 Trace.TraceError("演奏記録ファイルの読み込みに失敗しました。[{0}]", strScoreIniファイルパス);\r
1733                         }\r
1734                 }\r
1735                 //-----------------\r
1736                 #endregion\r
1737 \r
1738 \r
1739                 // その他\r
1740 \r
1741                 #region [ private ]\r
1742                 //-----------------\r
1743                 private const string SONGSDB_VERSION = "SongsDB3";\r
1744                 private List<string> listStrBoxDefSkinSubfolderFullName;\r
1745 \r
1746                 private int t比較0_共通(C曲リストノード n1, C曲リストノード n2)\r
1747                 {\r
1748                         if (n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX)\r
1749                         {\r
1750                                 return -1;\r
1751                         }\r
1752                         if (n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX)\r
1753                         {\r
1754                                 return 1;\r
1755                         }\r
1756                         if (n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM)\r
1757                         {\r
1758                                 return 1;\r
1759                         }\r
1760                         if (n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM)\r
1761                         {\r
1762                                 return -1;\r
1763                         }\r
1764                         if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 != C曲リストノード.Eノード種別.BOX))\r
1765                         {\r
1766                                 return -1;\r
1767                         }\r
1768                         if ((n1.eノード種別 != C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))\r
1769                         {\r
1770                                 return 1;\r
1771                         }\r
1772                         return 0;\r
1773                 }\r
1774 \r
1775                 /// <summary>\r
1776                 /// 検索を中断・スローダウンする\r
1777                 /// </summary>\r
1778                 private void SlowOrSuspendSearchTask()\r
1779                 {\r
1780                         if (this.bIsSuspending)         // #27060 中断要求があったら、解除要求が来るまで待機\r
1781                         {\r
1782                                 autoReset.WaitOne();\r
1783                         }\r
1784                         if (this.bIsSlowdown && ++this.searchCount > 10)                        // #27060 #PREMOVIE再生中は検索負荷を下げる\r
1785                         {\r
1786                                 Thread.Sleep(100);\r
1787                                 this.searchCount = 0;\r
1788                         }\r
1789                 }\r
1790 \r
1791                 //-----------------\r
1792                 #endregion\r
1793         }\r
1794 }\r