int nL12345 = (int) p[ 0 ]; \r
ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
{\r
+ #region [ 共通処理 ]\r
if ( n1 == n2 )\r
{\r
return 0;\r
{\r
return order * System.Math.Sign( num );\r
}\r
+ #endregion\r
string strAuthorN1 = "";\r
string strAuthorN2 = "";\r
- if (n1.arスコア[ nL12345 ] != null ) {\r
- strAuthorN1 = n1.arスコア[ nL12345 ].譜面情報.アーティスト名;\r
+ int nL12345補正後1 = nL12345;\r
+ int nL12345補正後2 = nL12345;\r
+ if ( n1.arスコア[ nL12345 ] == null )\r
+ {\r
+ nL12345補正後1 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す( n1, nL12345 );\r
+ }\r
+ if ( n1.arスコア[ nL12345補正後1 ] != null )\r
+ {\r
+ strAuthorN1 = n1.arスコア[ nL12345補正後1 ].譜面情報.アーティスト名;\r
}\r
- if ( n2.arスコア[ nL12345 ] != null )\r
+ if ( n2.arスコア[ nL12345 ] == null )\r
{\r
- strAuthorN2 = n2.arスコア[ nL12345 ].譜面情報.アーティスト名;\r
+ nL12345補正後2 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す( n2, nL12345 );\r
+ }\r
+ if ( n2.arスコア[ nL12345補正後2 ] != null )\r
+ {\r
+ strAuthorN2 = n2.arスコア[ nL12345補正後2 ].譜面情報.アーティスト名;\r
}\r
\r
return order * strAuthorN1.CompareTo( strAuthorN2 );\r
} );\r
+ #region [ デバッグ用 ]\r
foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
{\r
string s = "";\r
{\r
s = c曲リストノード.arスコア[ nL12345 ].譜面情報.アーティスト名;\r
}\r
-Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );\r
+//Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );\r
}\r
+ #endregion\r
+ }\r
+ /// <summary>\r
+ /// CActSelect曲リスト のメソッドのデッドコピー。美しくない実装ですみません。\r
+ /// </summary>\r
+ /// <param name="song"></param>\r
+ /// <param name="n現在のアンカ難易度レベル"></param>\r
+ /// <returns></returns>\r
+ public int n現在のアンカ難易度レベルに最も近い難易度レベルを返す( C曲リストノード song, int n現在のアンカ難易度レベル )\r
+ {\r
+ // 事前チェック。\r
+\r
+ if ( song == null )\r
+ return n現在のアンカ難易度レベル; // 曲がまったくないよ\r
+\r
+ if ( song.arスコア[ n現在のアンカ難易度レベル ] != null )\r
+ return n現在のアンカ難易度レベル; // 難易度ぴったりの曲があったよ\r
+\r
+ if ( ( song.eノード種別 == C曲リストノード.Eノード種別.BOX ) || ( song.eノード種別 == C曲リストノード.Eノード種別.BACKBOX ) )\r
+ return 0; // BOX と BACKBOX は関係無いよ\r
+\r
+\r
+ // 現在のアンカレベルから、難易度上向きに検索開始。\r
+\r
+ int n最も近いレベル = n現在のアンカ難易度レベル;\r
+\r
+ for ( int i = 0; i < 5; i++ )\r
+ {\r
+ if ( song.arスコア[ n最も近いレベル ] != null )\r
+ break; // 曲があった。\r
+\r
+ n最も近いレベル = ( n最も近いレベル + 1 ) % 5; // 曲がなかったので次の難易度レベルへGo。(5以上になったら0に戻る。)\r
+ }\r
+\r
+\r
+ // 見つかった曲がアンカより下のレベルだった場合……\r
+ // アンカから下向きに検索すれば、もっとアンカに近い曲があるんじゃね?\r
+\r
+ if ( n最も近いレベル < n現在のアンカ難易度レベル )\r
+ {\r
+ // 現在のアンカレベルから、難易度下向きに検索開始。\r
+\r
+ n最も近いレベル = n現在のアンカ難易度レベル;\r
+\r
+ for ( int i = 0; i < 5; i++ )\r
+ {\r
+ if ( song.arスコア[ n最も近いレベル ] != null )\r
+ break; // 曲があった。\r
+\r
+ n最も近いレベル = ( ( n最も近いレベル - 1 ) + 5 ) % 5; // 曲がなかったので次の難易度レベルへGo。(0未満になったら4に戻る。)\r
+ }\r
+ }\r
+\r
+ return n最も近いレベル;\r
}\r
#if TEST_SORTBGM\r
public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r