OSDN Git Service

#36720 Fixed to work Beat line display (Ch C2) correctly
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / CStage演奏画面共通_描画.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using System.Threading.Tasks;\r
6 using SlimDX;\r
7 using FDK;\r
8 using System.Drawing;\r
9 using System.IO;\r
10 using System.Diagnostics;\r
11 using System.Drawing.Imaging;\r
12 \r
13 namespace DTXMania\r
14 {\r
15         internal partial class CStage演奏画面共通 : CStage\r
16         {\r
17                 void SudHidInvChip( EPart inst, ref CChip pChip )\r
18                 {\r
19                         if (CDTXMania.Instance.ConfigIni.eSudHidInv[inst] == ESudHidInv.SemiInv ||\r
20                                 CDTXMania.Instance.ConfigIni.eSudHidInv[inst] == ESudHidInv.FullInv)\r
21                         {\r
22                                 cInvisibleChip.SetInvisibleStatus(ref pChip);\r
23                         }\r
24                         else\r
25                         {\r
26                                 if (CDTXMania.Instance.ConfigIni.eSudHidInv[inst] == ESudHidInv.Sudden ||\r
27                                         CDTXMania.Instance.ConfigIni.eSudHidInv[inst] == ESudHidInv.SudHid)\r
28                                 {\r
29                                         if (pChip.nバーからの距離dot[inst] < CDTXMania.Instance.ConfigIni.nSuddenFrom[inst])\r
30                                         {\r
31                                                 pChip.b可視 = true;\r
32                                                 pChip.n透明度 = 0xff;\r
33                                         }\r
34                                         else if (pChip.nバーからの距離dot[inst] < CDTXMania.Instance.ConfigIni.nSuddenFrom[inst] + 100)\r
35                                         {\r
36                                                 pChip.b可視 = true;\r
37                                                 pChip.n透明度 = 0xff - (int)((pChip.nバーからの距離dot[inst] -\r
38                                                         CDTXMania.Instance.ConfigIni.nSuddenFrom[inst]) * 255.0 / 50.0);\r
39                                         }\r
40                                         else\r
41                                         {\r
42                                                 pChip.b可視 = false;\r
43                                                 pChip.n透明度 = 0;\r
44                                         }\r
45                                 }\r
46                                 if (CDTXMania.Instance.ConfigIni.eSudHidInv[inst] == ESudHidInv.Hidden ||\r
47                                         CDTXMania.Instance.ConfigIni.eSudHidInv[inst] == ESudHidInv.SudHid)\r
48                                 {\r
49                                         if (pChip.nバーからの距離dot[inst] < CDTXMania.Instance.ConfigIni.nHiddenFrom[inst])\r
50                                         {\r
51                                                 pChip.b可視 = false;\r
52                                         }\r
53                                         else if (pChip.nバーからの距離dot[inst] < CDTXMania.Instance.ConfigIni.nHiddenFrom[inst] + 100)\r
54                                         {\r
55                                                 pChip.b可視 = true;\r
56                                                 pChip.n透明度 = (int)((pChip.nバーからの距離dot[inst] -\r
57                                                         CDTXMania.Instance.ConfigIni.nHiddenFrom[inst]) * 255.0 / 50.0);\r
58                                         }\r
59                                 }\r
60                         }\r
61                 }\r
62 \r
63 \r
64                 /// <summary>\r
65                 /// ギター・ベースのチップ表示\r
66                 /// </summary>\r
67                 /// <param name="configIni"></param>\r
68                 /// <param name="dTX"></param>\r
69                 /// <param name="pChip">描画するチップ</param>\r
70                 /// <param name="inst">楽器種別</param>\r
71                 protected void t進行描画_チップ_ギターベース(ref CChip pChip, EPart inst)\r
72                 {\r
73                         if (CDTXMania.Instance.ConfigIni.bGuitar有効)\r
74                         {\r
75                                 SudHidInvChip(inst, ref pChip);\r
76 \r
77                                 bool bChipHasR = pChip.bGuitarBass_R;\r
78                                 bool bChipHasG = pChip.bGuitarBass_G;\r
79                                 bool bChipHasB = pChip.bGuitarBass_B;\r
80                                 bool bChipHasW = pChip.bGuitarBass_Wailing;\r
81                                 bool bChipIsO = pChip.bGuitarBass_Open;\r
82 \r
83                                 #region [ chip描画 ]\r
84                                 if (!pChip.bHit && pChip.b可視)\r
85                                 {\r
86                                         if (this.txチップGB != null)\r
87                                         {\r
88                                                 this.txチップGB.n透明度 = pChip.n透明度;\r
89                                         }\r
90 \r
91                                         int barY = C演奏判定ライン座標共通.n判定ラインY座標(inst);\r
92                                         int y = CDTXMania.Instance.ConfigIni.bReverse[inst] ?\r
93                                                 barY - pChip.nバーからの距離dot[inst] :\r
94                                                 barY + pChip.nバーからの距離dot[inst];\r
95 \r
96                                         int showRangeY0 = 0;\r
97                                         int showRangeY1 = SampleFramework.GameWindowSize.Height;\r
98 \r
99                                         if ((showRangeY0 < y) && (y < showRangeY1))\r
100                                         {\r
101                                                 if (this.txチップGB != null)\r
102                                                 {\r
103                                                         int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[inst].n現在の値;\r
104                                                         #region [ OPENチップの描画 ]\r
105                                                         if (pChip[(inst == EPart.Guitar) ? EChannel.Guitar_Open : EChannel.Bass_Open])\r
106                                                         {\r
107                                                                 int xo = CDTXMania.Instance.ConfigIni.cdInstX[inst][CDTXMania.Instance.ConfigIni.eActiveInst];\r
108                                                                 this.txチップGB.t2D描画(CDTXMania.Instance.Device, xo,\r
109                                                                         y - CDTXMania.Instance.Coordinates.ImgGtChipOpen.H / 2,\r
110                                                                         CDTXMania.Instance.Coordinates.ImgGtChipOpen.ApplyCounterY(nアニメカウンタ現在の値 % CDTXMania.Instance.Coordinates.ImgGtCountOpenChip, 2));\r
111                                                         }\r
112                                                         Rectangle rect = CDTXMania.Instance.Coordinates.ImgGtRGBButton.ApplyCounterY(nアニメカウンタ現在の値 % CDTXMania.Instance.Coordinates.ImgGtCountRGBChip, 2);\r
113                                                         #endregion\r
114                                                         #region [ RGBチップ描画 ]\r
115                                                         if (bChipHasR)\r
116                                                         {\r
117                                                                 this.txチップGB.t2D描画(CDTXMania.Instance.Device,\r
118                                                                         CDTXMania.Instance.ConfigIni.GetLaneX(inst == EPart.Guitar ? ELane.GtR : ELane.BsR) +\r
119                                                                         (CDTXMania.Instance.ConfigIni.GetLaneW(inst == EPart.Guitar ? ELane.GtR : ELane.BsR) - CDTXMania.Instance.Coordinates.ImgGtRGBButton.W) / 2,\r
120                                                                         y - rect.Height / 2, rect);\r
121                                                         }\r
122                                                         rect.X += rect.Width;\r
123                                                         if (bChipHasG)\r
124                                                         {\r
125                                                                 this.txチップGB.t2D描画(CDTXMania.Instance.Device,\r
126                                                                         CDTXMania.Instance.ConfigIni.GetLaneX(inst == EPart.Guitar ? ELane.GtG : ELane.BsG) +\r
127                                                                         (CDTXMania.Instance.ConfigIni.GetLaneW(inst == EPart.Guitar ? ELane.GtG : ELane.BsG) - CDTXMania.Instance.Coordinates.ImgGtRGBButton.W) / 2,\r
128                                                                         y - rect.Height / 2, rect);\r
129                                                         }\r
130                                                         rect.X += rect.Width;\r
131                                                         if (bChipHasB)\r
132                                                         {\r
133                                                                 this.txチップGB.t2D描画(CDTXMania.Instance.Device,\r
134                                                                         CDTXMania.Instance.ConfigIni.GetLaneX(inst == EPart.Guitar ? ELane.GtB : ELane.BsB) +\r
135                                                                         (CDTXMania.Instance.ConfigIni.GetLaneW(inst == EPart.Guitar ? ELane.GtB : ELane.BsB) - CDTXMania.Instance.Coordinates.ImgGtRGBButton.W) / 2,\r
136                                                                         y - rect.Height / 2, rect);\r
137                                                         }\r
138                                                         #endregion\r
139                                                 }\r
140                                         }\r
141                                 }\r
142                                 #endregion\r
143 \r
144                                 // #35411 2015.08.20 chnmr0 modified\r
145                                 // 従来のAUTO処理に加えてプレーヤーゴーストの再生機能を追加\r
146                                 bool autoPlayCondition = (!pChip.bHit) && (pChip.nバーからの距離dot[inst] < 0);\r
147                                 if (autoPlayCondition)\r
148                                 {\r
149                                         cInvisibleChip.StartSemiInvisible(inst);\r
150                                 }\r
151 \r
152                                 bool autoPick = (inst == EPart.Guitar) ?\r
153                                                                                 CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick :\r
154                                                                                 CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick;\r
155 \r
156                                 autoPlayCondition = !pChip.bHit && autoPick;\r
157                                 long ghostLag = 0;\r
158                                 bool bUsePerfectGhost = true;\r
159 \r
160                                 if ((pChip.e楽器パート == EPart.Guitar || pChip.e楽器パート == EPart.Bass) &&\r
161                                                 CDTXMania.Instance.ConfigIni.eAutoGhost[pChip.e楽器パート] != EAutoGhostData.Perfect &&\r
162                                                 CDTXMania.Instance.DTX.listAutoGhostLag[pChip.e楽器パート] != null &&\r
163                                                 0 <= pChip.n楽器パートでの出現順 &&\r
164                                                 pChip.n楽器パートでの出現順 < CDTXMania.Instance.DTX.listAutoGhostLag[pChip.e楽器パート].Count)\r
165                                 {\r
166                                         // #35411 (mod) Ghost data が有効なので 従来のAUTOではなくゴーストのラグを利用\r
167                                         // 発生時刻と現在時刻からこのタイミングで演奏するかどうかを決定\r
168                                         ghostLag = CDTXMania.Instance.DTX.listAutoGhostLag[pChip.e楽器パート][pChip.n楽器パートでの出現順];\r
169                                         bool resetCombo = ghostLag > 255;\r
170                                         ghostLag = (ghostLag & 255) - 128;\r
171                                         ghostLag -= (pChip.e楽器パート == EPart.Guitar ?\r
172                                                                                                 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Guitar :\r
173                                                                                                 CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Bass);\r
174                                         autoPlayCondition &= (pChip.n発声時刻ms + ghostLag <= CSound管理.rc演奏用タイマ.n現在時刻ms);\r
175                                         if (resetCombo && autoPlayCondition)\r
176                                         {\r
177                                                 this.actCombo.dgbコンボ数[pChip.e楽器パート].ResetCombo();\r
178                                         }\r
179                                         bUsePerfectGhost = false;\r
180                                 }\r
181 \r
182                                 if (bUsePerfectGhost)\r
183                                 {\r
184                                         // 従来のAUTOを使用する場合\r
185                                         autoPlayCondition &= (pChip.nバーからの距離dot[inst] < 0);\r
186                                 }\r
187 \r
188                                 if (autoPlayCondition)\r
189                                 {\r
190                                         // lane offset\r
191                                         int lo = (inst == EPart.Guitar) ? 0 : 3;\r
192                                         bool autoR = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtR : CDTXMania.Instance.ConfigIni.bAutoPlay.BsR;\r
193                                         bool autoG = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtG : CDTXMania.Instance.ConfigIni.bAutoPlay.BsG;\r
194                                         bool autoB = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtB : CDTXMania.Instance.ConfigIni.bAutoPlay.BsB;\r
195                                         bool pushingR = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtR : EPad.BsR);\r
196                                         bool pushingG = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtG : EPad.BsG);\r
197                                         bool pushingB = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtB : EPad.BsB);\r
198 \r
199                                         #region [ Chip Fire effects (auto時用) ]\r
200                                         // autoPickでない時の処理は、 t入力処理・ギターベース(E楽器パート) で行う\r
201                                         bool bSuccessOPEN = bChipIsO && (autoR || !pushingR) && (autoG || !pushingG) && (autoB || !pushingB);\r
202                                         {\r
203                                                 if ((bChipHasR && (autoR || pushingR)) || bSuccessOPEN)\r
204                                                 {\r
205                                                         this.actChipFireGB.Start(0 + lo);\r
206                                                 }\r
207                                                 if ((bChipHasG && (autoG || pushingG)) || bSuccessOPEN)\r
208                                                 {\r
209                                                         this.actChipFireGB.Start(1 + lo);\r
210                                                 }\r
211                                                 if ((bChipHasB && (autoB || pushingB)) || bSuccessOPEN)\r
212                                                 {\r
213                                                         this.actChipFireGB.Start(2 + lo);\r
214                                                 }\r
215                                         }\r
216                                         #endregion\r
217                                         #region [ autopick ]\r
218                                         {\r
219                                                 bool bMiss = true;\r
220                                                 if (bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB)   // autoレーンとチップレーン一致時はOK\r
221                                                 {                                     // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。\r
222                                                         bMiss = false;\r
223                                                 }\r
224                                                 else if ((autoR || (bChipHasR == pushingR)) && (autoG || (bChipHasG == pushingG)) && (autoB || (bChipHasB == pushingB)))\r
225                                                 // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )\r
226                                                 {\r
227                                                         bMiss = false;\r
228                                                 }\r
229                                                 else if (((bChipIsO == true) && (!pushingR | autoR) && (!pushingG | autoG) && (!pushingB | autoB))) // OPEN時\r
230                                                 {\r
231                                                         bMiss = false;\r
232                                                 }\r
233                                                 pChip.bHit = true;\r
234                                                 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms + ghostLag,\r
235                                                         inst, CDTXMania.Instance.DTX.nモニタを考慮した音量(inst), false, bMiss);\r
236                                                 this.r次にくるギターChip = null;\r
237                                                 if (!bMiss)\r
238                                                 {\r
239                                                         this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip);\r
240                                                 }\r
241                                                 else\r
242                                                 {\r
243                                                         pChip.nLag = 0;   // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入\r
244                                                         this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip, false);\r
245                                                 }\r
246                                                 EChannel chWailingChip = (inst == EPart.Guitar) ? EChannel.Guitar_Wailing : EChannel.Bass_Wailing;\r
247                                                 CChip item = this.r指定時刻に一番近い未ヒットChip(pChip.n発声時刻ms + ghostLag, chWailingChip, CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst], 140);\r
248                                                 if (item != null && !bMiss)\r
249                                                 {\r
250                                                         this.queWailing[inst].Enqueue(item);\r
251                                                 }\r
252                                         }\r
253                                         #endregion\r
254                                         // #35411 modify end\r
255                                 }\r
256                                 SetGhostTargetOnGraph(inst);\r
257                                 return;\r
258                         } // end of "if configIni.bGuitar有効"\r
259                         else\r
260                         {\r
261                                 // Guitar/Bass無効の場合は、自動演奏する\r
262                                 if ((!pChip.bHit && (pChip.nバーからの距離dot[inst] < 0)))\r
263                                 {\r
264                                         pChip.bHit = true;\r
265                                         this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, CDTXMania.Instance.DTX.nモニタを考慮した音量(inst));\r
266                                 }\r
267                         }\r
268                 }\r
269 \r
270                 private void SetGhostTargetOnGraph(EPart inst)\r
271                 {\r
272                         if (inst != EPart.Unknown)\r
273                         {\r
274                                 // #35411 2015.08.21 chnmr0 add\r
275                                 // 目標値グラフにゴーストの達成率を渡す\r
276                                 if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] != ETargetGhostData.None &&\r
277                                                 CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null)\r
278                                 {\r
279                                         double val = 0;\r
280                                         if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] == ETargetGhostData.Online)\r
281                                         {\r
282                                                 if (CDTXMania.Instance.DTX.n可視チップ数[inst] > 0)\r
283                                                 {\r
284                                                         // Online Stats の計算式\r
285                                                         val = 100 *\r
286                                                                         (this.nヒット数_TargetGhost[inst].Perfect * 17 +\r
287                                                                          this.nヒット数_TargetGhost[inst].Great * 7 +\r
288                                                                          this.n最大コンボ数_TargetGhost[inst] * 3) / (20.0 * CDTXMania.Instance.DTX.n可視チップ数[inst]);\r
289                                                 }\r
290                                         }\r
291                                         else\r
292                                         {\r
293                                                 val = CScoreIni.t演奏型スキルを計算して返す(\r
294                                                                                 CDTXMania.Instance.DTX.n可視チップ数[inst],\r
295                                                                                 this.nヒット数_TargetGhost[inst].Perfect,\r
296                                                                                 this.nヒット数_TargetGhost[inst].Great,\r
297                                                                                 this.nヒット数_TargetGhost[inst].Good,\r
298                                                                                 this.nヒット数_TargetGhost[inst].Poor,\r
299                                                                                 this.nヒット数_TargetGhost[inst].Miss,\r
300                                                                                 EPart.Drums, false);\r
301                                         }\r
302                                         if (val < 0)\r
303                                         {\r
304                                                 val = 0;\r
305                                         }\r
306                                         if (val > 100)\r
307                                         {\r
308                                                 val = 100;\r
309                                         }\r
310                                         this.actGraph.dbTarget[inst] = val;\r
311                                 }\r
312                         }\r
313                 }\r
314 \r
315 \r
316                 protected void t進行描画_チップ_小節線_拍線(ref CChip pChip)\r
317                 {\r
318                         int n小節番号plus1 = pChip.n発声位置 / 384;\r
319                         if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))\r
320                         {\r
321                                 pChip.bHit = true;\r
322                                 this.actPlayInfo.n小節番号 = n小節番号plus1 - 1;\r
323                                 if (CDTXMania.Instance.ConfigIni.bWaveAdjust && (bIsDirectSound || CDTXMania.Instance.ConfigIni.bUseOSTimer))\r
324                                 {\r
325                                         CDTXMania.Instance.DTX.tWave再生位置自動補正();\r
326                                 }\r
327                                 // dTX.tWaveBGM再生位置表示();            //デバッグ用\r
328                         }\r
329 \r
330                         EPart ePhraseNumberDisplayInst = EPart.Drums;\r
331                         if (!CDTXMania.Instance.DTX.bチップがある.Drums)\r
332                         {\r
333                                 ePhraseNumberDisplayInst = EPart.Guitar;\r
334                                 if (!CDTXMania.Instance.DTX.bチップがある.Guitar)\r
335                                 {\r
336                                         ePhraseNumberDisplayInst = EPart.Bass;\r
337                                 }\r
338                         }\r
339 \r
340                         for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)\r
341                         {\r
342                                 if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) && CDTXMania.Instance.DTX.bチップがある[inst])\r
343                                 {\r
344                                         if ((inst == EPart.Guitar || inst == EPart.Bass) && pChip[EChannel.BeatLine])\r
345                                         {\r
346                                                 continue;\r
347                                         }\r
348                                         this.txチップ.n透明度 = 255;\r
349 \r
350                                         int y = C演奏判定ライン座標共通.n判定ラインY座標(inst);\r
351                                         int ymin = 0;\r
352                                         int ymax = SampleFramework.GameWindowSize.Height;\r
353 \r
354                                         int dy = 0;\r
355                                         Rectangle rc = pChip[EChannel.BeatLine] ?\r
356                                                 CDTXMania.Instance.Coordinates.ImgBeatLine :\r
357                                                 CDTXMania.Instance.Coordinates.ImgBarLine;\r
358 \r
359                                         if (\r
360                                                 (inst == EPart.Drums && !CDTXMania.Instance.ConfigIni.bReverse.Drums) ||\r
361                                                 (inst != EPart.Drums && CDTXMania.Instance.ConfigIni.bReverse[inst])\r
362                                                 )\r
363                                         {\r
364                                                 // 上から下へくるパターン\r
365                                                 y = y - (int)(pChip.nバーからの距離dot[inst]) - rc.Height / 2;\r
366                                                 dy = -dy;\r
367                                         }\r
368                                         else if (\r
369                                                 (inst == EPart.Drums && CDTXMania.Instance.ConfigIni.bReverse.Drums) ||\r
370                                                 (inst != EPart.Drums && !CDTXMania.Instance.ConfigIni.bReverse[inst])\r
371                                                 )\r
372                                         {\r
373                                                 // 下から上へくるパターン\r
374                                                 y = y + (int)(pChip.nバーからの距離dot[inst]) - rc.Height / 2;\r
375                                         }\r
376 \r
377                                         // Reverse時の小節線消失位置を、RGBボタンの真ん中程度に。\r
378                                         // 非Reverse時の消失処理は、従来通りt進行描画・チップ()にお任せ。\r
379                                         // int n小節線消失距離dot = C演奏判定ライン座標共通.n判定ラインY座標(inst, false, true) - dy;\r
380 \r
381                                         if ((CDTXMania.Instance.DTX.bチップがある[(int)inst]) && (ymin < y) && (y < ymax) &&\r
382                                                 (CDTXMania.Instance.ConfigIni.eDark == EDark.Off ||\r
383                                                 (CDTXMania.Instance.ConfigIni.eDark == EDark.Half && ( pChip[EChannel.BarLine] || pChip[EChannel.BeatLine] ))))\r
384                                                 /*&& (pChip.nバーからの距離dot[(int)inst] >= n小節線消失距離dot)*/\r
385                                         {\r
386                                                 int jx = CDTXMania.Instance.ConfigIni.cdInstX[inst][CDTXMania.Instance.ConfigIni.eActiveInst].Value;\r
387                                                 int jy = CDTXMania.Instance.ConfigIni.cdJudgeLineY[inst];\r
388                                                 int jw = CDTXMania.Instance.Coordinates.Instrument[inst].W;\r
389                                                 //小節線・拍線\r
390                                                 if (pChip.b可視)\r
391                                                 {\r
392                                                         for ( int offsetX = 0; offsetX < jw; offsetX += rc.Width )\r
393                                                         {\r
394                                                                 int x = jx + offsetX;\r
395                                                                 if ( offsetX + rc.Width > jw )\r
396                                                                 {\r
397                                                                         rc.Width = jw - offsetX;\r
398                                                                 }\r
399                                                                 this.txチップ.t2D描画( CDTXMania.Instance.Device, x, y, rc );\r
400                                                         }\r
401                                                 }\r
402                                                 if (\r
403                                                         pChip[EChannel.BarLine] &&\r
404                                                         CDTXMania.Instance.ConfigIni.bDebugInfo &&\r
405                                                         (CDTXMania.Instance.ConfigIni.eDark == EDark.Off) &&\r
406                                                         inst == ePhraseNumberDisplayInst)\r
407                                                 {\r
408                                                         // 小節番号の表示\r
409                                                         int n小節番号 = n小節番号plus1 - 1;\r
410                                                         int x = jx + jw + CDTXMania.Instance.Coordinates.ImgConsoleFont.W;\r
411                                                         CDTXMania.Instance.act文字コンソール.tPrint(x, y - CDTXMania.Instance.Coordinates.ImgConsoleFont.H / 2,\r
412                                                                 C文字コンソール.Eフォント種別.白, n小節番号.ToString()\r
413                                                         );\r
414                                                 }\r
415                                         }\r
416                                 }\r
417                         }\r
418                 }\r
419 \r
420                 private void t進行描画_判定ライン()\r
421                 {\r
422                         if (CDTXMania.Instance.ConfigIni.eDark != EDark.Full)\r
423                         {\r
424                                 for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)\r
425                                 {\r
426                                         if (CDTXMania.Instance.ConfigIni.b楽器有効(inst) && CDTXMania.Instance.DTX.bチップがある[inst])\r
427                                         {\r
428                                                 // #31602 2016.2.11 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする\r
429                                                 int y = C演奏判定ライン座標共通.n判定ラインY座標(inst, false, true);\r
430                                                 if (this.txヒットバー != null)\r
431                                                 {\r
432                                                         int lineLength = CDTXMania.Instance.Coordinates.Instrument[inst].W;\r
433                                                         Rectangle rc = CDTXMania.Instance.Coordinates.ImgJudgeLine;\r
434                                                         int barHeight = rc.Height;\r
435                                                         for (int tmpW = 0; tmpW < lineLength; tmpW += rc.Width)\r
436                                                         {\r
437                                                                 if (tmpW + rc.Width > lineLength)\r
438                                                                 {\r
439                                                                         rc.Width = lineLength - tmpW;\r
440                                                                 }\r
441                                                                 this.txヒットバー.t2D描画(CDTXMania.Instance.Device,\r
442                                                                         CDTXMania.Instance.ConfigIni.cdInstX[ inst ][ CDTXMania.Instance.ConfigIni.eActiveInst ] + tmpW, y - barHeight / 2, rc );\r
443                                                         }\r
444                                                 }\r
445                                         }\r
446                                 }\r
447                         }\r
448                 }\r
449 \r
450                 private void t背景テクスチャの生成()\r
451                 {\r
452                         string bgfilename = null;\r
453 \r
454                         if ((CDTXMania.Instance.ConfigIni.b楽器有効(EPart.Drums) == false) &&  (CDTXMania.Instance.DTX.BACKGROUND_GR != null) && (CDTXMania.Instance.DTX.BACKGROUND_GR.Length > 0))\r
455                         {\r
456                                 bgfilename = CDTXMania.Instance.DTX.BACKGROUND_GR;\r
457                         }\r
458                         else if ((CDTXMania.Instance.DTX.BACKGROUND != null) && (CDTXMania.Instance.DTX.BACKGROUND.Length > 0))\r
459                         {\r
460                                 bgfilename = CDTXMania.Instance.DTX.BACKGROUND;\r
461                         }\r
462 \r
463                         if (bgfilename != null && bgfilename.Length > 0)\r
464                         {\r
465                                 bgfilename = CDTXMania.Instance.DTX.strフォルダ名 + bgfilename;\r
466                         }\r
467 \r
468                         using (Bitmap bgbitmap = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height))\r
469                         {\r
470                                 if (bgfilename != null && File.Exists(bgfilename))\r
471                                 {\r
472                                         using (Bitmap originalBackground = new Bitmap(bgfilename))\r
473                                         {\r
474                                                 float W = originalBackground.Width;\r
475                                                 float H = originalBackground.Height;\r
476 \r
477                                                 float mag = 1;\r
478                                                 // VGA補正\r
479                                                 if (W > 0 && H > 0)\r
480                                                 {\r
481                                                         float mx = SampleFramework.GameWindowSize.Width / W;\r
482                                                         float my = SampleFramework.GameWindowSize.Height / H;\r
483 \r
484                                                         mag = Math.Min(mx, my);\r
485                                                 }\r
486 \r
487                                                 using (Graphics graphic2 = Graphics.FromImage(bgbitmap))\r
488                                                 {\r
489                                                         float x = (SampleFramework.GameWindowSize.Width - W * mag) / 2;\r
490                                                         float y = (SampleFramework.GameWindowSize.Height - H * mag) / 2;\r
491                                                         graphic2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;\r
492                                                         graphic2.DrawImage(originalBackground, x, y, W * mag, H * mag);\r
493                                                 }\r
494                                         }\r
495                                 }\r
496 \r
497                                 using (Bitmap image = new Bitmap(CSkin.Path(@"Graphics\ScreenPlayDrums-background-center.png")))\r
498                                 {\r
499                                         // フレーム画像合成\r
500                                         using (Graphics graphics3 = Graphics.FromImage(image))\r
501                                         {\r
502                                                 graphics3.DrawImage(bgbitmap, new Rectangle(0, 0, image.Width, image.Height));\r
503 \r
504                                                 #region [ BGA領域黒抜き・テクスチャ変換・Full再生透明度 ]\r
505                                                 if ((CDTXMania.Instance.DTX.listBMP.Count > 0) || (CDTXMania.Instance.DTX.listBMPTEX.Count > 0) || CDTXMania.Instance.DTX.listAVI.Count > 0)\r
506                                                 {\r
507                                                         graphics3.FillRectangle(Brushes.Black,\r
508                                                                 new Rectangle(\r
509                                                                         CDTXMania.Instance.ConfigIni.cdMovieX[CDTXMania.Instance.ConfigIni.eActiveInst],\r
510                                                                         CDTXMania.Instance.ConfigIni.cdMovieY[CDTXMania.Instance.ConfigIni.eActiveInst],\r
511                                                                         CDTXMania.Instance.Coordinates.Movie.W, CDTXMania.Instance.Coordinates.Movie.H));\r
512                                                 }\r
513                                                 #endregion\r
514                                         }\r
515                                         TextureFactory.tテクスチャの解放(ref this.tx背景);\r
516                                         this.tx背景 = TextureFactory.tテクスチャの生成(image, true);\r
517                                 }\r
518                         }\r
519                 }\r
520 \r
521                 private void t進行描画_チップ_ドラムス(ref CChip pChip)\r
522                 {\r
523                         if (CDTXMania.Instance.ConfigIni.bDrums有効)\r
524                         {\r
525                                 SudHidInvChip(EPart.Drums, ref pChip);\r
526 \r
527                                 if (!pChip.bHit && pChip.b可視)\r
528                                 {\r
529                                         if (this.txチップ != null)\r
530                                         {\r
531                                                 this.txチップ.n透明度 = pChip.n透明度;\r
532                                         }\r
533                                         int jy = C演奏判定ライン座標共通.n判定ラインY座標(EPart.Drums);\r
534                                         int y = CDTXMania.Instance.ConfigIni.bReverse.Drums ? (int)(jy + pChip.nバーからの距離dot.Drums) : (int)(jy - pChip.nバーからの距離dot.Drums);\r
535 \r
536                                         if (this.txチップ != null)\r
537                                         {\r
538                                                 this.txチップ.vc拡大縮小倍率 = new Vector3((float)(pChip.dbチップサイズ倍率), (float)pChip.dbチップサイズ倍率, 1f);\r
539                                         }\r
540 \r
541                                         int num9 = this.ctチップ模様アニメ.Drums.n現在の値 % CDTXMania.Instance.Coordinates.ImgDrCountChip;\r
542                                         int x = CDTXMania.Instance.ConfigIni.GetLaneX(EnumConverter.LaneFromChannel(pChip.eチャンネル番号)) +\r
543                                                 (int)((CDTXMania.Instance.ConfigIni.GetLaneW(EnumConverter.LaneFromChannel(pChip.eチャンネル番号))\r
544                                                 - (CDTXMania.Instance.Coordinates.ImgDrChip[EnumConverter.PadFromChannel(pChip.eチャンネル番号)].W * (pChip.dbチップサイズ倍率))) / 2.0);\r
545                                         if (this.txチップ != null)\r
546                                         {\r
547                                                 this.txチップ.t2D描画(CDTXMania.Instance.Device, x,\r
548                                                         y - CDTXMania.Instance.Coordinates.ImgDrChip[EnumConverter.PadFromChannel(pChip.eチャンネル番号)].H / 2,\r
549                                                         CDTXMania.Instance.Coordinates.ImgDrChip[EnumConverter.PadFromChannel(pChip.eチャンネル番号)].ApplyCounterY(num9, 2));\r
550                                         }\r
551 \r
552                                         // Chip Decoration\r
553                                         switch (pChip.eチャンネル番号)\r
554                                         {\r
555                                                 case EChannel.Cymbal:\r
556                                                         if (this.txチップ != null)\r
557                                                         {\r
558                                                                 this.txチップ.t2D描画(CDTXMania.Instance.Device, x,\r
559                                                                         y - CDTXMania.Instance.Coordinates.ImgDrChipCYDeco.H / 2, CDTXMania.Instance.Coordinates.ImgDrChipCYDeco);\r
560                                                         }\r
561                                                         break;\r
562 \r
563                                                 case EChannel.HiHatOpen:\r
564                                                         if (this.txチップ != null)\r
565                                                         {\r
566                                                                 this.txチップ.t2D描画(CDTXMania.Instance.Device, x, y - CDTXMania.Instance.Coordinates.ImgDrChipHHODeco.H / 2, CDTXMania.Instance.Coordinates.ImgDrChipHHODeco);\r
567                                                         }\r
568                                                         break;\r
569 \r
570                                                 case EChannel.RideCymbal:\r
571                                                         if (this.txチップ != null)\r
572                                                         {\r
573                                                                 this.txチップ.t2D描画(CDTXMania.Instance.Device, x, y - CDTXMania.Instance.Coordinates.ImgDrChipHHODeco.H / 2, CDTXMania.Instance.Coordinates.ImgDrChipHHODeco);\r
574                                                         }\r
575                                                         break;\r
576 \r
577                                                 case EChannel.LeftCymbal:\r
578                                                         if (this.txチップ != null)\r
579                                                         {\r
580                                                                 this.txチップ.t2D描画(CDTXMania.Instance.Device, x, y - CDTXMania.Instance.Coordinates.ImgDrChipCYDeco.H / 2, CDTXMania.Instance.Coordinates.ImgDrChipCYDeco);\r
581                                                         }\r
582                                                         break;\r
583                                         }\r
584                                         if (this.txチップ != null)\r
585                                         {\r
586                                                 this.txチップ.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);\r
587                                                 this.txチップ.n透明度 = 0xff;\r
588                                         }\r
589                                 }\r
590 \r
591                                 // #35411 chnmr0 modified\r
592                                 bool autoPlayCondition = (CDTXMania.Instance.ConfigIni.bAutoPlay[EnumConverter.PadFromChannel(pChip.eチャンネル番号)] && !pChip.bHit);\r
593                                 bool UsePerfectGhost = true;\r
594                                 long ghostLag = 0;\r
595 \r
596                                 if (CDTXMania.Instance.ConfigIni.eAutoGhost.Drums != EAutoGhostData.Perfect &&\r
597                                                 CDTXMania.Instance.DTX.listAutoGhostLag.Drums != null &&\r
598                                                 0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.Instance.DTX.listAutoGhostLag.Drums.Count)\r
599                                 {\r
600                                         // ゴーストデータが有効 : ラグに合わせて判定\r
601                                         ghostLag = CDTXMania.Instance.DTX.listAutoGhostLag.Drums[pChip.n楽器パートでの出現順];\r
602                                         ghostLag = (ghostLag & 255) - 128;\r
603                                         ghostLag -= CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums;\r
604                                         autoPlayCondition &= !pChip.bHit && (ghostLag + pChip.n発声時刻ms <= CSound管理.rc演奏用タイマ.n現在時刻ms);\r
605                                         UsePerfectGhost = false;\r
606                                 }\r
607                                 if (UsePerfectGhost)\r
608                                 {\r
609                                         // 従来の AUTO : バー下で判定\r
610                                         autoPlayCondition &= (pChip.nバーからの距離dot.Drums < 0);\r
611                                 }\r
612 \r
613                                 if (autoPlayCondition)\r
614                                 {\r
615                                         pChip.bHit = true;\r
616                                         this.actLaneFlushD.Start(EnumConverter.LaneFromChannel(pChip.eチャンネル番号), ((float)CInput管理.n通常音量) / 127f);\r
617                                         bool flag = this.bフィルイン中;\r
618                                         bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである(pChip);\r
619                                         //bool flag3 = flag2;\r
620                                         // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加\r
621                                         this.actChipFireD.Start(EnumConverter.LaneFromChannel(pChip.eチャンネル番号), flag, flag2, flag2);\r
622                                         this.actPad.Hit(EnumConverter.PadFromChannel(pChip.eチャンネル番号));\r
623                                         this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms + ghostLag, EPart.Drums, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Drums));\r
624                                         this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip);\r
625                                         cInvisibleChip.StartSemiInvisible(EPart.Drums);\r
626                                 }\r
627                                 // #35411 modify end\r
628 \r
629                                 SetGhostTargetOnGraph(EPart.Drums);\r
630                                 return;\r
631                         }\r
632                         else\r
633                         {\r
634                                 if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))\r
635                                 {\r
636                                         this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, EPart.Drums, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Drums));\r
637                                         pChip.bHit = true;\r
638                                 }\r
639                         }\r
640                 }\r
641         }\r
642 }\r