OSDN Git Service

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