OSDN Git Service

#36043 rev.920 で手違いが起きたため、一度 rev.919 に戻し、ファイルを再修正。Ech定義の使用を CChip のプロパティを使うよう一部変更。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / ドラム画面 / CAct演奏Drums判定文字列.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Diagnostics;\r
4 using System.Text;\r
5 using System.Runtime.InteropServices;\r
6 using SlimDX;\r
7 \r
8 namespace DTXMania\r
9 {\r
10         internal class CAct演奏Drums判定文字列 : CAct演奏判定文字列共通\r
11         {\r
12                 // コンストラクタ\r
13 \r
14                 public CAct演奏Drums判定文字列()\r
15                 {\r
16                         this.stレーンサイズ = new STレーンサイズ[ 12 ]\r
17                         {\r
18                                 new STレーンサイズ(  36 - 36, 36 ),\r
19                                 new STレーンサイズ(  77 - 36, 30 ),\r
20                                 new STレーンサイズ( 111 - 36, 30 ),\r
21                                 new STレーンサイズ( 146 - 36, 42 ),\r
22                                 new STレーンサイズ( 192 - 36, 30 ),\r
23                                 new STレーンサイズ( 227 - 36, 30 ),\r
24                                 new STレーンサイズ( 261 - 36, 30 ),\r
25                                 new STレーンサイズ( 295 - 36, 36 ),\r
26                                 new STレーンサイズ(   0 - 36, 0 ),\r
27                                 new STレーンサイズ(   0 - 36, 0 ),\r
28                                 new STレーンサイズ( 507 - 36, 80 ),\r
29                                 new STレーンサイズ( 398 - 36, 80 )\r
30                         };\r
31                         //for ( int i = 0; i < 12; i++ )\r
32                         //{\r
33                         //      this.stレーンサイズ[i] = new STレーンサイズ();\r
34                         //      this.stレーンサイズ[i].x = sizeXW[i, 0];\r
35                         //      this.stレーンサイズ[i].w = sizeXW[i, 1];\r
36                         //}\r
37                         base.b活性化してない = true;\r
38                 }\r
39                 \r
40                 \r
41                 // CActivity 実装(共通クラスからの差分のみ)\r
42                 public override int On進行描画()\r
43                 {\r
44                         throw new InvalidOperationException( "t進行描画(C演奏判定ライン座標共通 演奏判定ライン共通 ) のほうを使用してください。" );\r
45                 }\r
46                 public override int t進行描画( C演奏判定ライン座標共通 演奏判定ライン座標 )\r
47                 {\r
48                         if( !base.b活性化してない )\r
49                         {\r
50                                 #region [ 表示拡大率の設定 ]\r
51                                 for ( int i = 0; i < 12; i++ )\r
52                                 {\r
53                                         if( !base.st状態[ i ].ct進行.b停止中 )\r
54                                         {\r
55                                                 base.st状態[ i ].ct進行.t進行();\r
56                                                 if( base.st状態[ i ].ct進行.b終了値に達した )\r
57                                                 {\r
58                                                         base.st状態[ i ].ct進行.t停止();\r
59                                                 }\r
60                                                 int num2 = base.st状態[ i ].ct進行.n現在の値;\r
61                                                 if( ( base.st状態[ i ].judge != E判定.Miss ) && ( base.st状態[ i ].judge != E判定.Bad ) )\r
62                                                 {\r
63                                                         if( num2 < 50 )\r
64                                                         {\r
65                                                                 base.st状態[ i ].fX方向拡大率 = 1f + ( 1f * ( 1f - ( ( (float) num2 ) / 50f ) ) );\r
66                                                                 base.st状態[ i ].fY方向拡大率 = ( (float) num2 ) / 50f;\r
67                                                                 base.st状態[ i ].n相対X座標 = 0;\r
68                                                                 base.st状態[ i ].n相対Y座標 = 0;\r
69                                                                 base.st状態[ i ].n透明度 = 0xff;\r
70                                                         }\r
71                                                         else if( num2 < 130 )\r
72                                                         {\r
73                                                                 base.st状態[ i ].fX方向拡大率 = 1f;\r
74                                                                 base.st状態[ i ].fY方向拡大率 = 1f;\r
75                                                                 base.st状態[ i ].n相対X座標 = 0;\r
76                                                                 base.st状態[ i ].n相対Y座標 = ( ( num2 % 6 ) == 0 ) ? ( CDTXMania.Instance.Random.Next( 6 ) - 3 ) : base.st状態[ i ].n相対Y座標;\r
77                                                                 base.st状態[ i ].n透明度 = 0xff;\r
78                                                         }\r
79                                                         else if( num2 >= 240 )\r
80                                                         {\r
81                                                                 base.st状態[ i ].fX方向拡大率 = 1f;\r
82                                                                 base.st状態[ i ].fY方向拡大率 = 1f - ( ( 1f * ( num2 - 240 ) ) / 60f );\r
83                                                                 base.st状態[ i ].n相対X座標 = 0;\r
84                                                                 base.st状態[ i ].n相対Y座標 = 0;\r
85                                                                 base.st状態[ i ].n透明度 = 0xff;\r
86                                                         }\r
87                                                         else\r
88                                                         {\r
89                                                                 base.st状態[ i ].fX方向拡大率 = 1f;\r
90                                                                 base.st状態[ i ].fY方向拡大率 = 1f;\r
91                                                                 base.st状態[ i ].n相対X座標 = 0;\r
92                                                                 base.st状態[ i ].n相対Y座標 = 0;\r
93                                                                 base.st状態[ i ].n透明度 = 0xff;\r
94                                                         }\r
95                                                 }\r
96                                                 else if( num2 < 50 )\r
97                                                 {\r
98                                                         base.st状態[ i ].fX方向拡大率 = 1f;\r
99                                                         base.st状態[ i ].fY方向拡大率 = ( (float) num2 ) / 50f;\r
100                                                         base.st状態[ i ].n相対X座標 = 0;\r
101                                                         base.st状態[ i ].n相対Y座標 = 0;\r
102                                                         base.st状態[ i ].n透明度 = 0xff;\r
103                                                 }\r
104                                                 else if( num2 >= 200 )\r
105                                                 {\r
106                                                         base.st状態[ i ].fX方向拡大率 = 1f - ( ( (float) ( num2 - 200 ) ) / 100f );\r
107                                                         base.st状態[ i ].fY方向拡大率 = 1f - ( ( (float) ( num2 - 200 ) ) / 100f );\r
108                                                         base.st状態[ i ].n相対X座標 = 0;\r
109                                                         base.st状態[ i ].n相対Y座標 = 0;\r
110                                                         base.st状態[ i ].n透明度 = 0xff;\r
111                                                 }\r
112                                                 else\r
113                                                 {\r
114                                                         base.st状態[ i ].fX方向拡大率 = 1f;\r
115                                                         base.st状態[ i ].fY方向拡大率 = 1f;\r
116                                                         base.st状態[ i ].n相対X座標 = 0;\r
117                                                         base.st状態[ i ].n相対Y座標 = 0;\r
118                                                         base.st状態[ i ].n透明度 = 0xff;\r
119                                                 }\r
120                                         }\r
121                                 }\r
122                                 #endregion\r
123                                 for( int j = 0; j < 12; j++ )\r
124                                 {\r
125                                         if( !base.st状態[ j ].ct進行.b停止中 )\r
126                                         {\r
127                                                 int index = base.st判定文字列[ (int) base.st状態[ j ].judge ].n画像番号;\r
128                                                 int baseX = 0;\r
129                                                 int baseY = 0;\r
130                                                 #region [ Drums 判定文字列 baseX/Y生成 ]\r
131                                                 if ( j < 8 )                    // Drums\r
132                                                 {\r
133                                                         if ( CDTXMania.Instance.ConfigIni.判定文字表示位置.Drums == E判定文字表示位置.表示OFF )\r
134                                                         {\r
135                                                                 continue;\r
136                                                         }\r
137                                                         baseX = this.stレーンサイズ[ j ].x;\r
138                                                         baseX = (int) ( baseX * ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left ? 1.0 : 0.75 ) );\r
139                                                         baseX += ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Left? 36 : 205 );\r
140                                                         baseY = CDTXMania.Instance.ConfigIni.bReverse.Drums ?\r
141                                                                 ( ( ( (E判定文字表示位置) CDTXMania.Instance.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.レーン上 ) ? ( 240 + ( this.n文字の縦表示位置[ j ] * 0x20 ) ) : 50 ) :\r
142                                                                 ( ( ( (E判定文字表示位置) CDTXMania.Instance.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.レーン上 ) ? ( 180 + ( this.n文字の縦表示位置[ j ] * 0x20 ) ) : 450 );\r
143                                                         baseY = (int) ( baseY * Scale.Y );\r
144                                                 }\r
145                                                 #endregion\r
146                                                 #region [ Bass 判定文字列描画 baseX/Y生成 ]\r
147                                                 else if( j == 11 )      // Bass\r
148                                                 {\r
149                                                         if( ( (E判定文字表示位置) CDTXMania.Instance.ConfigIni.判定文字表示位置.Bass ) == E判定文字表示位置.表示OFF )\r
150                                                         {\r
151                                                                 continue;\r
152                                                         }\r
153                                                         int yB;\r
154                                                         switch ( CDTXMania.Instance.ConfigIni.判定文字表示位置.Bass )\r
155                                                         {\r
156                                                                 case E判定文字表示位置.コンボ下:\r
157                                                                         baseX = this.stレーンサイズ[ j ].x + 36;\r
158                                                                         if ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Center)\r
159                                                                         {\r
160                                                                                 baseX -= 331+1;\r
161                                                                         }\r
162                                                                         yB = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, CDTXMania.Instance.ConfigIni.bReverse.Bass );\r
163                                                                         baseY = (\r
164                                                                                                 CDTXMania.Instance.ConfigIni.bReverse.Bass ?\r
165                                                                                                         yB + (int) ( ( -124 + 0 ) * Scale.Y ) :\r
166                                                                                                         yB + (int) ( ( +184 + 0 ) * Scale.Y )\r
167                                                                                         )\r
168                                                                                         + (int) (  this.n文字の縦表示位置[ j ] * 0x20 * Scale.Y );\r
169                                                                         break;\r
170                                                                 case E判定文字表示位置.レーン上:\r
171                                                                         baseX = this.stレーンサイズ[ j ].x + 36;\r
172                                                                         if ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Center)\r
173                                                                         {\r
174                                                                                 baseX -= 331+1;\r
175                                                                         }\r
176                                                                         //baseY = ( CDTXMania.Instance.ConfigIni.bReverse.Bass ? 240 : 180 ) + ( this.n文字の縦表示位置[ j ] * 0x20 );\r
177                                                                         yB = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, CDTXMania.Instance.ConfigIni.bReverse.Bass );\r
178                                                                         baseY = (\r
179                                                                                                 CDTXMania.Instance.ConfigIni.bReverse.Bass ?\r
180                                                                                                         yB - (int) ( 134 * Scale.Y ) :\r
181                                                                                                         yB + (int) (  75 * Scale.Y )\r
182                                                                                         )\r
183                                                                                         + (int) ( this.n文字の縦表示位置[ j ] * 0x20 * Scale.Y );\r
184                                                                         break;\r
185                                                                 case E判定文字表示位置.判定ライン上:\r
186                                                                         baseX = this.stレーンサイズ[ j ].x + 36;\r
187                                                                         if ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Center)\r
188                                                                         {\r
189                                                                                 baseX -= 331+1;\r
190                                                                         }\r
191                                                                         yB = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, CDTXMania.Instance.ConfigIni.bReverse.Bass );\r
192                                                                         baseY = CDTXMania.Instance.ConfigIni.bReverse.Bass ?\r
193                                                                                 yB + (int) ( 20 * Scale.Y ) :\r
194                                                                                 yB - (int) ( 24 * Scale.Y );\r
195                                                                         break;\r
196                                                         }\r
197                                                 }\r
198                                                 #endregion\r
199                                                 #region [ Guitar 判定文字列描画 baseX/Y生成 ]\r
200                                                 else if( j == 10 )      // Guitar\r
201                                                 {\r
202                                                         if( ( (E判定文字表示位置) CDTXMania.Instance.ConfigIni.判定文字表示位置.Guitar ) == E判定文字表示位置.表示OFF )\r
203                                                         {\r
204                                                                 continue;\r
205                                                         }\r
206                                                         int yG;\r
207                                                         switch ( CDTXMania.Instance.ConfigIni.判定文字表示位置.Guitar )\r
208                                                         {\r
209                                                             case E判定文字表示位置.コンボ下:\r
210                                                                         baseX = ( CDTXMania.Instance.DTX.bチップがある.Bass ) ? this.stレーンサイズ[ j ].x + 36 : 0x198;\r
211                                                                         if ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Center)\r
212                                                                         {\r
213                                                                                 baseX = this.stレーンサイズ[ j ].x + 36;  // 判定表示がドラムレーンにかぶらないよう、ベース有りの時と同じ表示方法にする\r
214                                                                                 baseX -= 24 + 1;\r
215                                                                         }\r
216                                                                         yG = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, CDTXMania.Instance.ConfigIni.bReverse.Guitar );\r
217                                                                         baseY = (\r
218                                                                                                 CDTXMania.Instance.ConfigIni.bReverse.Guitar ?\r
219                                                                                                         yG + (int) ( ( -124 + 0 ) * Scale.Y ) :\r
220                                                                                                         yG + (int) ( ( +184 + 0 ) * Scale.Y )\r
221                                                                                         )\r
222                                                                                         + (int) (  this.n文字の縦表示位置[ j ] * 0x20 * Scale.Y );\r
223                                                                         break;\r
224                                                             case E判定文字表示位置.レーン上:\r
225                                                                         baseX = ( CDTXMania.Instance.DTX.bチップがある.Bass ) ? this.stレーンサイズ[ j ].x + 36 : 0x198;\r
226                                                                         if ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Center)\r
227                                                                         {\r
228                                                                                 baseX = this.stレーンサイズ[ j ].x + 36;  // 判定表示がドラムレーンにかぶらないよう、ベース有りの時と同じ表示方法にする\r
229                                                                                 baseX -= 24+1;\r
230                                                                         }\r
231                                                                         //baseY = ( CDTXMania.Instance.ConfigIni.bReverse.Guitar ? 240 : 180 ) + ( this.n文字の縦表示位置[ j ] * 0x20 );\r
232                                                                         yG = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, CDTXMania.Instance.ConfigIni.bReverse.Guitar );\r
233                                                                         baseY = (\r
234                                                                                                 CDTXMania.Instance.ConfigIni.bReverse.Guitar ?\r
235                                                                                                         yG - (int) ( 134 * Scale.Y ):\r
236                                                                                                         yG + (int) (  75 * Scale.Y )\r
237                                                                                         )\r
238                                                                                         + (int) ( this.n文字の縦表示位置[ j ] * 0x20 * Scale.Y );\r
239                                                                         break;\r
240                                                             case E判定文字表示位置.判定ライン上:\r
241                                                                         baseX = ( CDTXMania.Instance.DTX.bチップがある.Bass ) ? this.stレーンサイズ[ j ].x + 36 : 0x198;\r
242                                                                         if ( CDTXMania.Instance.ConfigIni.eドラムレーン表示位置 == Eドラムレーン表示位置.Center)\r
243                                                                         {\r
244                                                                                 baseX = this.stレーンサイズ[ j ].x + 36;  // 判定表示がドラムレーンにかぶらないよう、ベース有りの時と同じ表示方法にする\r
245                                                                                 baseX -= 24 + 1;\r
246                                                                         }\r
247                                                                         yG = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, CDTXMania.Instance.ConfigIni.bReverse.Guitar );\r
248                                                                 baseY = CDTXMania.Instance.ConfigIni.bReverse.Guitar ?\r
249                                                                                 yG + (int) ( 20 * Scale.Y ) :\r
250                                                                                 yG - (int) ( 24 * Scale.Y );\r
251                                                                         break;\r
252                                                         }\r
253                                                 }\r
254                                                 #endregion\r
255                                                 int xc = (int) ( ( ( ( baseX + base.st状態[ j ].n相対X座標 ) + ( this.stレーンサイズ[ j ].w / 2 ) ) ) * Scale.X );  // Xcenter座標\r
256                                                 int x = xc - ( (int) ( ( ( 256f / 2 ) * base.st状態[ j ].fX方向拡大率 ) * ( ( j < 10 ) ? 1.0 : 0.7 ) ) );\r
257                                                 int y = (int) (  baseY + ( base.st状態[ j ].n相対Y座標 ) * Scale.Y ) - ( (int) ( ( ( ( 256f / 3 ) * base.st状態[ j ].fY方向拡大率 ) * ( ( j < 10 ) ? 1.0 : 0.7 ) ) / 2.0 ) );\r
258 \r
259                                                 //int xc = ( ( baseX + base.st状態[ j ].n相対X座標 ) + ( this.stレーンサイズ[ j ].w / 2 ) );        // Xcenter座標\r
260                                                 //int x = xc - ( (int) ( ( 64f * base.st状態[ j ].fX方向拡大率 ) * ( ( j < 10 ) ? 1.0 : 0.7 ) ) );\r
261                                                 //int y = ( baseY + base.st状態[ j ].n相対Y座標 ) - ( (int) ( ( ( 43f * base.st状態[ j ].fY方向拡大率 ) * ( ( j < 10 ) ? 1.0 : 0.7 ) ) / 2.0 ) );\r
262                                                 if( base.tx判定文字列[ index ] != null )\r
263                                                 {\r
264                                                         base.tx判定文字列[ index ].n透明度 = base.st状態[ j ].n透明度;\r
265                                                         base.tx判定文字列[ index ].vc拡大縮小倍率 = new Vector3( (float) ( base.st状態[ j ].fX方向拡大率 * ( ( j < 10 ) ? 1.0 : 0.7 ) ), (float) ( base.st状態[ j ].fY方向拡大率 * ( ( j < 10 ) ? 1.0 : 0.7 ) ), 1f );\r
266                                                         base.tx判定文字列[ index ].t2D描画(\r
267                                                                 CDTXMania.Instance.Device,\r
268                                                                 x,\r
269                                                                 y,\r
270                                                                 base.st判定文字列[ (int) base.st状態[ j ].judge ].rc\r
271                                                         );\r
272 \r
273                                                         #region [ #25370 2011.6.3 yyagi ShowLag support ]\r
274                                                         if ( base.nShowLagType == (int) EShowLagType.ON ||\r
275                                                                  ( ( base.nShowLagType == (int) EShowLagType.GREAT_POOR ) && ( base.st状態[ j ].judge != E判定.Perfect ) ) )\r
276                                                         {\r
277                                                                 if ( base.st状態[ j ].judge != E判定.Auto && base.txlag数値 != null )             // #25370 2011.2.1 yyagi\r
278                                                                 {\r
279                                                                         bool minus = false;\r
280                                                                         int offsetX = 0;\r
281                                                                         string strDispLag = base.st状態[ j ].nLag.ToString();\r
282                                                                         if ( st状態[ j ].nLag < 0 )\r
283                                                                         {\r
284                                                                                 minus = true;\r
285                                                                         }\r
286                                                                         //x = xc - strDispLag.Length * 15 / 2;\r
287                                                                         x = xc - (int) ( ( strDispLag.Length * 15 / 2 ) * Scale.X );\r
288                                                                         for ( int i = 0; i < strDispLag.Length; i++ )\r
289                                                                         {\r
290                                                                                 int p = ( strDispLag[ i ] == '-' ) ? 11 : (int) ( strDispLag[ i ] - '0' );      //int.Parse(strDispLag[i]);\r
291                                                                                 p += minus ? 0 : 12;            // change color if it is minus value\r
292                                                                                 //base.txlag数値.t2D描画( CDTXMania.Instance.app.Device, x + offsetX, y + 34, base.stLag数値[ p ].rc );\r
293                                                                                 base.txlag数値.t2D描画(\r
294                                                                                         CDTXMania.Instance.Device,\r
295                                                                                         x + offsetX * Scale.X,\r
296                                                                                         y + 38 * Scale.Y,\r
297                                                                                         base.stLag数値[ p ].rc\r
298                                                                                 );\r
299                                                                                 offsetX += 12;  // 15 -> 12\r
300                                                                         }\r
301                                                                 }\r
302                                                         }\r
303                                                         #endregion\r
304                                                 }\r
305                                         // Label_07FC: ;\r
306                                         }\r
307                                 }\r
308                         }\r
309                         return 0;\r
310                 }\r
311                 \r
312 \r
313                 // その他\r
314 \r
315                 #region [ private ]\r
316                 //-----------------\r
317                 [StructLayout( LayoutKind.Sequential )]\r
318                 private struct STレーンサイズ\r
319                 {\r
320                         public int x;\r
321                         public int w;\r
322                         public STレーンサイズ( int x_, int w_ )\r
323                         {\r
324                                 x = x_;\r
325                                 w = w_;\r
326                         }\r
327 \r
328                 }\r
329 \r
330                 private readonly int[] n文字の縦表示位置 = new int[] { 1, 2, 0, 1, 3, 2, 1, 0, 0, 0, 1, 1 };\r
331                 private STレーンサイズ[] stレーンサイズ;\r
332                 //-----------------\r
333                 #endregion\r
334         }\r
335 }\r