OSDN Git Service

6d6bf66a40ce8a2a9959c03dd53f14d0b9db4133
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 08.結果 / CStage結果.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.IO;\r
4 using System.Text;\r
5 using System.Diagnostics;\r
6 using FDK;\r
7 using SlimDX.Direct3D9;\r
8 \r
9 namespace DTXMania\r
10 {\r
11         internal class CStage結果 : CStage\r
12         {\r
13                 public STDGBVALUE<bool> b新記録スキル;\r
14                 public STDGBVALUE<bool> b新記録スコア;\r
15                 public STDGBVALUE<bool> b新記録ランク;\r
16                 public STDGBVALUE<float> fPerfect率;\r
17                 public STDGBVALUE<float> fGreat率;\r
18                 public STDGBVALUE<float> fGood率;\r
19                 public STDGBVALUE<float> fPoor率;\r
20                 public STDGBVALUE<float> fMiss率;\r
21                 public STDGBVALUE<bool> bオート;        // #23596 10.11.16 add ikanick\r
22                 //        10.11.17 change (int to bool) ikanick\r
23                 public STDGBVALUE<CScoreIni.ERANK> nランク値;\r
24                 public STDGBVALUE<int> n演奏回数;\r
25                 public CScoreIni.ERANK n総合ランク値;\r
26                 public CChip[] r空うちドラムチップ;\r
27                 public STDGBVALUE<CScoreIni.C演奏記録> st演奏記録;\r
28 \r
29                 public CStage結果()\r
30                 {\r
31                         this.st演奏記録.Drums = new CScoreIni.C演奏記録();\r
32                         this.st演奏記録.Guitar = new CScoreIni.C演奏記録();\r
33                         this.st演奏記録.Bass = new CScoreIni.C演奏記録();\r
34                         this.r空うちドラムチップ = new CChip[10];\r
35                         this.n総合ランク値 = CScoreIni.ERANK.UNKNOWN;\r
36                         this.nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };\r
37                         base.eステージID = CStage.Eステージ.結果;\r
38                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
39                         base.b活性化してない = true;\r
40                         base.list子Activities.Add(this.actResultImage = new CActResultImage());\r
41                         base.list子Activities.Add(this.actParameterPanel = new CActResultParameterPanel());\r
42                         base.list子Activities.Add(this.actRank = new CActResultRank());\r
43                         base.list子Activities.Add(this.actSongBar = new CActResultSongBar());\r
44                         base.list子Activities.Add(this.actOption = new CActオプションパネル());\r
45                         base.list子Activities.Add(this.actFI = new CActFIFOWhite());\r
46                         base.list子Activities.Add(this.actFO = new CActFIFOBlack());\r
47                         base.list子Activities.Add(this.actAVI = new CAct演奏AVI());\r
48 \r
49                         this.actResultImage.actAVI = this.actAVI;\r
50                 }\r
51 \r
52                 public override void On活性化()\r
53                 {\r
54                         Trace.TraceInformation("結果ステージを活性化します。");\r
55                         Trace.Indent();\r
56                         try\r
57                         {\r
58                                 #region [ 初期化 ]\r
59                                 //---------------------\r
60                                 this.eフェードアウト完了時の戻り値 = E戻り値.継続;\r
61                                 this.bアニメが完了 = false;\r
62                                 this.bIsCheckedWhetherResultScreenShouldSaveOrNot = false;                              // #24609 2011.3.14 yyagi\r
63                                 this.n最後に再生したHHのWAV番号 = -1;\r
64                                 this.e最後に再生したHHのチャンネル番号 = Ech定義.Invalid;\r
65                                 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)\r
66                                 {\r
67                                         this.b新記録スキル[i] = false;\r
68                                         this.b新記録スコア[i] = false;\r
69                                         this.b新記録ランク[i] = false;\r
70                                 }\r
71                                 //---------------------\r
72                                 #endregion\r
73 \r
74                                 #region [ 結果の計算 ]\r
75                                 //---------------------\r
76                                 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)\r
77                                 {\r
78                                         this.nランク値[i] = CScoreIni.ERANK.UNKNOWN;\r
79                                         this.fPerfect率[i] = this.fGreat率[i] = this.fGood率[i] = this.fPoor率[i] = this.fMiss率[i] = 0.0f;        // #28500 2011.5.24 yyagi\r
80                                         if ((\r
81                                                 ((i != E楽器パート.DRUMS) || (CDTXMania.Instance.DTX.bチップがある.Drums )) &&\r
82                                                 ((i != E楽器パート.GUITAR) || CDTXMania.Instance.DTX.bチップがある.Guitar)) &&\r
83                                                 ((i != E楽器パート.BASS) || CDTXMania.Instance.DTX.bチップがある.Bass))\r
84                                         {\r
85                                                 CScoreIni.C演奏記録 part = this.st演奏記録[i];\r
86                                                 bool bIsAutoPlay = true;\r
87                                                 switch (i)\r
88                                                 {\r
89                                                         case E楽器パート.DRUMS:\r
90                                                                 bIsAutoPlay = CDTXMania.Instance.ConfigIni.bドラムが全部オートプレイである || !CDTXMania.Instance.ConfigIni.bDrums有効; // #35411 chnmr0 add Drums が有効でない場合 AUTO 扱いとして LastPlay 更新しない\r
91                                                                 break;\r
92 \r
93                                                         case E楽器パート.GUITAR:\r
94                                                                 bIsAutoPlay = CDTXMania.Instance.ConfigIni.bギターが全部オートプレイである || !CDTXMania.Instance.ConfigIni.bGuitar有効; // #35411 chnmr0 add\r
95                                                                 break;\r
96 \r
97                                                         case E楽器パート.BASS:\r
98                                                                 bIsAutoPlay = CDTXMania.Instance.ConfigIni.bベースが全部オートプレイである || !CDTXMania.Instance.ConfigIni.bGuitar有効;\r
99                                                                 break;\r
100                                                 }\r
101                                                 this.fPerfect率[i] = bIsAutoPlay ? 0f : ((100f * part.nPerfect数) / ((float)part.n全チップ数));\r
102                                                 this.fGreat率[i] = bIsAutoPlay ? 0f : ((100f * part.nGreat数) / ((float)part.n全チップ数));\r
103                                                 this.fGood率[i] = bIsAutoPlay ? 0f : ((100f * part.nGood数) / ((float)part.n全チップ数));\r
104                                                 this.fPoor率[i] = bIsAutoPlay ? 0f : ((100f * part.nPoor数) / ((float)part.n全チップ数));\r
105                                                 this.fMiss率[i] = bIsAutoPlay ? 0f : ((100f * part.nMiss数) / ((float)part.n全チップ数));\r
106                                                 this.bオート[i] = bIsAutoPlay;       // #23596 10.11.16 add ikanick そのパートがオートなら1\r
107                                                 //        10.11.17 change (int to bool) ikanick\r
108                                                 this.nランク値[i] = CScoreIni.tランク値を計算して返す(part);\r
109                                         }\r
110                                 }\r
111                                 this.n総合ランク値 = CScoreIni.t総合ランク値を計算して返す(this.st演奏記録);\r
112                                 //---------------------\r
113                                 #endregion\r
114 \r
115                                 #region [ .score.ini の作成と出力 ]\r
116                                 //---------------------\r
117                                 string str = CDTXMania.Instance.DTX.strファイル名の絶対パス + ".score.ini";\r
118                                 CScoreIni ini = new CScoreIni(str);\r
119 \r
120                                 STDGBVALUE<bool> b今までにフルコンボしたことがある =\r
121                                         new STDGBVALUE<bool>();\r
122 \r
123                                 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)\r
124                                 {\r
125                                         // フルコンボチェックならびに新記録ランクチェックは、ini.Record[] が、スコアチェックや演奏型スキルチェックの IF 内で書き直されてしまうよりも前に行う。(2010.9.10)\r
126 \r
127                                         b今までにフルコンボしたことがある[i] =\r
128                                                 ini.stセクション.HiScore[i].bフルコンボである ||\r
129                                                 ini.stセクション.HiSkill[i].bフルコンボである;\r
130 \r
131                                         if (this.nランク値[i] >= 0 && ini.stファイル.BestRank[i] > this.nランク値[i])\r
132                                         {\r
133                                                 // #24459 2011.3.1 yyagi update BestRank\r
134                                                 this.b新記録ランク[i] = true;\r
135                                                 ini.stファイル.BestRank[i] = this.nランク値[i];\r
136                                         }\r
137 \r
138                                         // 新記録スコアチェック\r
139                                         if (this.st演奏記録[i].nスコア > ini.stセクション.HiScore[i].nスコア)\r
140                                         {\r
141                                                 this.b新記録スコア[i] = true;\r
142                                                 ini.stセクション.HiScore[i] = this.st演奏記録[i];\r
143                                                 CScoreIni.Eセクション種別 esect = CScoreIni.Eセクション種別.HiScoreDrums;\r
144                                                 if (i == E楽器パート.GUITAR)\r
145                                                 {\r
146                                                         esect = CScoreIni.Eセクション種別.HiScoreGuitar;\r
147                                                 }\r
148                                                 else if (i == E楽器パート.BASS)\r
149                                                 {\r
150                                                         esect = CScoreIni.Eセクション種別.HiScoreBass;\r
151                                                 }\r
152                                                 this.SaveGhost(esect); // #35411 chnmr0 add\r
153                                         }\r
154 \r
155                                         // 新記録スキルチェック\r
156                                         if (this.st演奏記録[i].db演奏型スキル値 > ini.stセクション.HiSkill[i].db演奏型スキル値)\r
157                                         {\r
158                                                 this.b新記録スキル[i] = true;\r
159                                                 ini.stセクション.HiSkill[i] = this.st演奏記録[i];\r
160                                                 CScoreIni.Eセクション種別 esect = CScoreIni.Eセクション種別.HiSkillDrums;\r
161                                                 if (i == E楽器パート.GUITAR)\r
162                                                 {\r
163                                                         esect = CScoreIni.Eセクション種別.HiSkillGuitar;\r
164                                                 }\r
165                                                 else if (i == E楽器パート.BASS)\r
166                                                 {\r
167                                                         esect = CScoreIni.Eセクション種別.HiSkillBass;\r
168                                                 }\r
169                                                 this.SaveGhost(esect); // #35411 chnmr0 add\r
170                                         }\r
171 \r
172                                         // ラストプレイ #23595 2011.1.9 ikanick\r
173                                         // オートじゃなければプレイ結果を書き込む\r
174                                         if (this.bオート[i] == false)\r
175                                         {\r
176                                                 ini.stセクション.LastPlay[i] = this.st演奏記録[i];\r
177                                                 CScoreIni.Eセクション種別 esect = CScoreIni.Eセクション種別.LastPlayDrums;\r
178                                                 if (i == E楽器パート.GUITAR)\r
179                                                 {\r
180                                                         esect = CScoreIni.Eセクション種別.LastPlayGuitar;\r
181                                                 }\r
182                                                 else if (i == E楽器パート.BASS)\r
183                                                 {\r
184                                                         esect = CScoreIni.Eセクション種別.LastPlayBass;\r
185                                                 }\r
186                                                 this.SaveGhost(esect); // #35411 chnmr0 add\r
187                                         }\r
188 \r
189                                         // #23596 10.11.16 add ikanick オートじゃないならクリア回数を1増やす\r
190                                         //        11.02.05 bオート to t更新条件を取得する use      ikanick\r
191                                         STDGBVALUE<bool> b更新が必要か否か;\r
192                                         b更新が必要か否か = CScoreIni.t更新条件を取得する();\r
193                                         if (b更新が必要か否か[i])\r
194                                         {\r
195                                                 switch (i)\r
196                                                 {\r
197                                                         case E楽器パート.DRUMS:\r
198                                                                 ini.stファイル.ClearCountDrums++;\r
199                                                                 break;\r
200                                                         case E楽器パート.GUITAR:\r
201                                                                 ini.stファイル.ClearCountGuitar++;\r
202                                                                 break;\r
203                                                         case E楽器パート.BASS:\r
204                                                                 ini.stファイル.ClearCountBass++;\r
205                                                                 break;\r
206                                                         default:\r
207                                                                 throw new Exception("クリア回数増加のk(0-2)が範囲外です。");\r
208                                                 }\r
209                                         }\r
210                                         //---------------------------------------------------------------------/\r
211                                 }\r
212                                 if (CDTXMania.Instance.ConfigIni.bScoreIniを出力する)\r
213                                         ini.t書き出し(str);\r
214                                 //---------------------\r
215                                 #endregion\r
216 \r
217                                 #region [ リザルト画面への演奏回数の更新 #24281 2011.1.30 yyagi]\r
218                                 if (CDTXMania.Instance.ConfigIni.bScoreIniを出力する)\r
219                                 {\r
220                                         this.n演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
221                                         this.n演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
222                                         this.n演奏回数.Bass = ini.stファイル.PlayCountBass;\r
223                                 }\r
224                                 #endregion\r
225                                 #region [ 選曲画面の譜面情報の更新 ]\r
226                                 //---------------------\r
227                                 if (!CDTXMania.Instance.bコンパクトモード)\r
228                                 {\r
229                                         Cスコア cスコア = CDTXMania.Instance.stage選曲.r確定されたスコア;\r
230                                         STDGBVALUE<bool> b更新が必要か否か;\r
231                                         b更新が必要か否か = CScoreIni.t更新条件を取得する();\r
232                                         for (E楽器パート m = E楽器パート.DRUMS; m <= E楽器パート.BASS; m++)\r
233                                         {\r
234                                                 if (b更新が必要か否か[m])\r
235                                                 {\r
236                                                         // FullCombo した記録を FullCombo なしで超えた場合、FullCombo マークが消えてしまう。\r
237                                                         // → FullCombo は、最新記録と関係なく、一度達成したらずっとつくようにする。(2010.9.11)\r
238                                                         cスコア.譜面情報.フルコンボ[m] = this.st演奏記録[m].bフルコンボである | b今までにフルコンボしたことがある[m];\r
239 \r
240                                                         if (this.b新記録スキル[m])\r
241                                                         {\r
242                                                                 cスコア.譜面情報.最大スキル[m] = this.st演奏記録[m].db演奏型スキル値;\r
243                                                         }\r
244 \r
245                                                         if (this.b新記録ランク[m])\r
246                                                         {\r
247                                                                 cスコア.譜面情報.最大ランク[m] = this.nランク値[m];\r
248                                                         }\r
249                                                 }\r
250                                         }\r
251                                 }\r
252                                 //---------------------\r
253                                 #endregion\r
254 \r
255                                 #region [ #RESULTSOUND_xx の再生(あれば)]\r
256                                 //---------------------\r
257                                 CScoreIni.ERANK rank = CScoreIni.t総合ランク値を計算して返す(this.st演奏記録);\r
258 \r
259                                 if (rank == CScoreIni.ERANK.UNKNOWN)    // #23534 2010.10.28 yyagi: 演奏チップが0個のときは、rankEと見なす\r
260                                 {\r
261                                         rank = CScoreIni.ERANK.E;\r
262                                 }\r
263 \r
264                                 if (string.IsNullOrEmpty(CDTXMania.Instance.DTX.RESULTSOUND[(int)rank]))\r
265                                 {\r
266                                         CDTXMania.Instance.Skin.soundステージクリア音.t再生する();\r
267                                         this.rResultSound = null;\r
268                                 }\r
269                                 else\r
270                                 {\r
271                                         string str2 = CDTXMania.Instance.DTX.strフォルダ名 + CDTXMania.Instance.DTX.RESULTSOUND[(int)rank];\r
272                                         try\r
273                                         {\r
274                                                 this.rResultSound = CDTXMania.Instance.Sound管理.tサウンドを生成する(str2);\r
275                                         }\r
276                                         catch\r
277                                         {\r
278                                                 Trace.TraceError("サウンドの生成に失敗しました。({0})", new object[] { str2 });\r
279                                                 this.rResultSound = null;\r
280                                         }\r
281                                 }\r
282                                 //---------------------\r
283                                 #endregion\r
284 \r
285                                 base.On活性化();\r
286                         }\r
287                         finally\r
288                         {\r
289                                 Trace.TraceInformation("結果ステージの活性化を完了しました。");\r
290                                 Trace.Unindent();\r
291                         }\r
292                 }\r
293 \r
294                 // #35411 chnmr0 add\r
295                 private void SaveGhost(CScoreIni.Eセクション種別 sect)\r
296                 {\r
297                         STDGBVALUE<bool> saveCond = new STDGBVALUE<bool>();\r
298                         saveCond.Drums = true;\r
299                         saveCond.Guitar = true;\r
300                         saveCond.Bass = true;\r
301 \r
302                         foreach (CChip chip in CDTXMania.Instance.DTX.listChip)\r
303                         {\r
304                                 if (chip.bIsAutoPlayed)\r
305                                 {\r
306                                         if (chip.eチャンネル番号 != Ech定義.Guitar_Wailing && chip.eチャンネル番号 != Ech定義.Bass_Wailing) // Guitar/Bass Wailing は OK\r
307                                         {\r
308                                                 saveCond[chip.e楽器パート] = false;\r
309                                         }\r
310                                 }\r
311                         }\r
312                         for (E楽器パート instIndex = E楽器パート.DRUMS; instIndex <= E楽器パート.BASS; ++instIndex)\r
313                         {\r
314                                 saveCond[instIndex] &= CDTXMania.Instance.DTX.listAutoGhostLag.Drums == null;\r
315                         }\r
316 \r
317                         string directory = CDTXMania.Instance.DTX.strフォルダ名;\r
318                         string filename = CDTXMania.Instance.DTX.strファイル名 + ".";\r
319                         E楽器パート inst = E楽器パート.UNKNOWN;\r
320 \r
321                         if (sect == CScoreIni.Eセクション種別.HiScoreDrums)\r
322                         {\r
323                                 filename += "hiscore.dr.ghost";\r
324                                 inst = E楽器パート.DRUMS;\r
325                         }\r
326                         else if (sect == CScoreIni.Eセクション種別.HiSkillDrums)\r
327                         {\r
328                                 filename += "hiskill.dr.ghost";\r
329                                 inst = E楽器パート.DRUMS;\r
330                         }\r
331                         if (sect == CScoreIni.Eセクション種別.HiScoreGuitar)\r
332                         {\r
333                                 filename += "hiscore.gt.ghost";\r
334                                 inst = E楽器パート.GUITAR;\r
335                         }\r
336                         else if (sect == CScoreIni.Eセクション種別.HiSkillGuitar)\r
337                         {\r
338                                 filename += "hiskill.gt.ghost";\r
339                                 inst = E楽器パート.GUITAR;\r
340                         }\r
341                         if (sect == CScoreIni.Eセクション種別.HiScoreBass)\r
342                         {\r
343                                 filename += "hiscore.bs.ghost";\r
344                                 inst = E楽器パート.BASS;\r
345                         }\r
346                         else if (sect == CScoreIni.Eセクション種別.HiSkillBass)\r
347                         {\r
348                                 filename += "hiskill.bs.ghost";\r
349                                 inst = E楽器パート.BASS;\r
350                         }\r
351                         else if (sect == CScoreIni.Eセクション種別.LastPlayDrums)\r
352                         {\r
353                                 filename += "lastplay.dr.ghost";\r
354                                 inst = E楽器パート.DRUMS;\r
355                         }\r
356                         else if (sect == CScoreIni.Eセクション種別.LastPlayGuitar)\r
357                         {\r
358                                 filename += "lastplay.gt.ghost";\r
359                                 inst = E楽器パート.GUITAR;\r
360                         }\r
361                         else if (sect == CScoreIni.Eセクション種別.LastPlayBass)\r
362                         {\r
363                                 filename += "lastplay.bs.ghost";\r
364                                 inst = E楽器パート.BASS;\r
365                         }\r
366 \r
367                         if (inst == E楽器パート.UNKNOWN)\r
368                         {\r
369                                 return;\r
370                         }\r
371 \r
372                         int cnt = 0;\r
373                         foreach (DTXMania.CChip chip in CDTXMania.Instance.DTX.listChip)\r
374                         {\r
375                                 if (chip.e楽器パート == inst)\r
376                                 {\r
377                                         ++cnt;\r
378                                 }\r
379                         }\r
380 \r
381                         if (saveCond[inst])\r
382                         {\r
383                                 using (FileStream fs = new FileStream(directory + "\\" + filename, FileMode.Create, FileAccess.Write))\r
384                                 {\r
385                                         using (BinaryWriter bw = new BinaryWriter(fs))\r
386                                         {\r
387                                                 bw.Write((Int32)cnt);\r
388                                                 foreach (DTXMania.CChip chip in CDTXMania.Instance.DTX.listChip)\r
389                                                 {\r
390                                                         if (chip.e楽器パート == inst)\r
391                                                         {\r
392                                                                 // -128 ms から 127 ms までのラグしか保存しない\r
393                                                                 // その範囲を超えているラグはクランプ\r
394                                                                 // ラグデータの 上位8ビットでそのチップの前でギター空打ちBADがあったことを示す\r
395                                                                 int lag = chip.nLag;\r
396                                                                 if (lag < -128)\r
397                                                                 {\r
398                                                                         lag = -128;\r
399                                                                 }\r
400                                                                 if (lag > 127)\r
401                                                                 {\r
402                                                                         lag = 127;\r
403                                                                 }\r
404                                                                 byte lower = (byte)(lag + 128);\r
405                                                                 int upper = chip.extendInfoForGhost == false ? 1 : 0;\r
406                                                                 bw.Write((short)((upper << 8) | lower));\r
407                                                         }\r
408                                                 }\r
409                                         }\r
410                                 }\r
411                         }\r
412                 }\r
413 \r
414                 public override void On非活性化()\r
415                 {\r
416                         if (this.rResultSound != null)\r
417                         {\r
418                                 CDTXMania.Instance.Sound管理.tサウンドを破棄する(this.rResultSound);\r
419                                 this.rResultSound = null;\r
420                         }\r
421                         base.On非活性化();\r
422                 }\r
423                 public override void OnManagedリソースの作成()\r
424                 {\r
425                         if (!base.b活性化してない)\r
426                         {\r
427                                 this.tx背景 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenResult background.jpg"));\r
428                                 this.tx上部パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenResult header panel.png"), true);\r
429                                 this.tx下部パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenResult footer panel.png"), true);\r
430                                 //this.txオプションパネル = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\Screen option panels.png"));\r
431                                 base.OnManagedリソースの作成();\r
432                         }\r
433                 }\r
434                 public override void OnManagedリソースの解放()\r
435                 {\r
436                         if (!base.b活性化してない)\r
437                         {\r
438                                 if (this.ct登場用 != null)\r
439                                 {\r
440                                         this.ct登場用 = null;\r
441                                 }\r
442                                 TextureFactory.tテクスチャの解放(ref this.tx背景);\r
443                                 TextureFactory.tテクスチャの解放(ref this.tx上部パネル);\r
444                                 TextureFactory.tテクスチャの解放(ref this.tx下部パネル);\r
445                                 //TextureFactory.tテクスチャの解放(ref this.txオプションパネル);\r
446                                 base.OnManagedリソースの解放();\r
447                         }\r
448                 }\r
449                 public override int On進行描画()\r
450                 {\r
451                         if (!base.b活性化してない)\r
452                         {\r
453                                 int num;\r
454                                 if (base.b初めての進行描画)\r
455                                 {\r
456                                         this.ct登場用 = new CCounter(0, 100, 5, CDTXMania.Instance.Timer);\r
457                                         this.actFI.tフェードイン開始();\r
458                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
459                                         if (this.rResultSound != null)\r
460                                         {\r
461                                                 this.rResultSound.t再生を開始する();\r
462                                         }\r
463                                         base.b初めての進行描画 = false;\r
464                                 }\r
465                                 this.bアニメが完了 = true;\r
466                                 if (this.ct登場用.b進行中)\r
467                                 {\r
468                                         this.ct登場用.t進行();\r
469                                         if (this.ct登場用.b終了値に達した)\r
470                                         {\r
471                                                 this.ct登場用.t停止();\r
472                                         }\r
473                                         else\r
474                                         {\r
475                                                 this.bアニメが完了 = false;\r
476                                         }\r
477                                 }\r
478 \r
479                                 // 描画\r
480 \r
481                                 if (this.tx背景 != null)\r
482                                 {\r
483                                         this.tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);\r
484                                 }\r
485                                 if (this.ct登場用.b進行中 && (this.tx上部パネル != null))\r
486                                 {\r
487                                         double num2 = ((double)this.ct登場用.n現在の値) / 100.0;\r
488                                         double num3 = Math.Sin(Math.PI / 2 * num2);\r
489                                         num = ((int)(this.tx上部パネル.sz画像サイズ.Height * num3)) - this.tx上部パネル.sz画像サイズ.Height;\r
490                                 }\r
491                                 else\r
492                                 {\r
493                                         num = 0;\r
494                                 }\r
495                                 if (this.tx上部パネル != null)\r
496                                 {\r
497                                         this.tx上部パネル.t2D描画(CDTXMania.Instance.Device, 0, num * Scale.Y);\r
498                                 }\r
499                                 if (this.tx下部パネル != null)\r
500                                 {\r
501                                         this.tx下部パネル.t2D描画(CDTXMania.Instance.Device, 0, (SampleFramework.GameWindowSize.Height - this.tx下部パネル.sz画像サイズ.Height));\r
502                                 }\r
503                                 this.actOption.On進行描画();\r
504                                 if (this.actResultImage.On進行描画() == 0)\r
505                                 {\r
506                                         this.bアニメが完了 = false;\r
507                                 }\r
508                                 if (this.actParameterPanel.On進行描画() == 0)\r
509                                 {\r
510                                         this.bアニメが完了 = false;\r
511                                 }\r
512                                 if (this.actRank.On進行描画() == 0)\r
513                                 {\r
514                                         this.bアニメが完了 = false;\r
515                                 }\r
516                                 if (this.actSongBar.On進行描画() == 0)\r
517                                 {\r
518                                         this.bアニメが完了 = false;\r
519                                 }\r
520                                 if (base.eフェーズID == CStage.Eフェーズ.共通_フェードイン)\r
521                                 {\r
522                                         if (this.actFI.On進行描画() != 0)\r
523                                         {\r
524                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
525                                         }\r
526                                 }\r
527                                 else if ((base.eフェーズID == CStage.Eフェーズ.共通_フェードアウト))                   //&& ( this.actFO.On進行描画() != 0 ) )\r
528                                 {\r
529                                         return (int)this.eフェードアウト完了時の戻り値;\r
530                                 }\r
531                                 #region [ #24609 2011.3.14 yyagi ランク更新or演奏型スキル更新時、リザルト画像をpngで保存する ]\r
532                                 if (this.bアニメが完了 == true && this.bIsCheckedWhetherResultScreenShouldSaveOrNot == false      // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.\r
533                                         && CDTXMania.Instance.ConfigIni.bScoreIniを出力する\r
534                                         && CDTXMania.Instance.ConfigIni.bIsAutoResultCapture)                                                                                           // #25399 2011.6.9 yyagi\r
535                                 {\r
536                                         CheckAndSaveResultScreen(true);\r
537                                         this.bIsCheckedWhetherResultScreenShouldSaveOrNot = true;\r
538                                 }\r
539                                 #endregion\r
540 \r
541                                 // キー入力\r
542 \r
543                                 if (CDTXMania.Instance.act現在入力を占有中のプラグイン == null)\r
544                                 {\r
545                                         if (CDTXMania.Instance.ConfigIni.bドラム打音を発声する && CDTXMania.Instance.ConfigIni.bDrums有効)\r
546                                         {\r
547                                                 for (int i = 0; i < 10; i++)\r
548                                                 {\r
549                                                         List<STInputEvent> events = CDTXMania.Instance.Pad.GetEvents(E楽器パート.DRUMS, (Eパッド)i);\r
550                                                         if ((events != null) && (events.Count > 0))\r
551                                                         {\r
552                                                                 foreach (STInputEvent event2 in events)\r
553                                                                 {\r
554                                                                         if (!event2.b押された)\r
555                                                                         {\r
556                                                                                 continue;\r
557                                                                         }\r
558                                                                         CChip rChip = this.r空うちドラムチップ[i];\r
559                                                                         if (rChip == null)\r
560                                                                         {\r
561                                                                                 switch (((Eパッド)i))\r
562                                                                                 {\r
563                                                                                         case Eパッド.HH:\r
564                                                                                                 rChip = this.r空うちドラムチップ[7];\r
565                                                                                                 if (rChip == null)\r
566                                                                                                 {\r
567                                                                                                         rChip = this.r空うちドラムチップ[9];\r
568                                                                                                 }\r
569                                                                                                 break;\r
570 \r
571                                                                                         case Eパッド.FT:\r
572                                                                                                 rChip = this.r空うちドラムチップ[4];\r
573                                                                                                 break;\r
574 \r
575                                                                                         case Eパッド.CY:\r
576                                                                                                 rChip = this.r空うちドラムチップ[8];\r
577                                                                                                 break;\r
578 \r
579                                                                                         case Eパッド.HHO:\r
580                                                                                                 rChip = this.r空うちドラムチップ[0];\r
581                                                                                                 if (rChip == null)\r
582                                                                                                 {\r
583                                                                                                         rChip = this.r空うちドラムチップ[9];\r
584                                                                                                 }\r
585                                                                                                 break;\r
586 \r
587                                                                                         case Eパッド.RD:\r
588                                                                                                 rChip = this.r空うちドラムチップ[6];\r
589                                                                                                 break;\r
590 \r
591                                                                                         case Eパッド.LC:\r
592                                                                                                 rChip = this.r空うちドラムチップ[0];\r
593                                                                                                 if (rChip == null)\r
594                                                                                                 {\r
595                                                                                                         rChip = this.r空うちドラムチップ[7];\r
596                                                                                                 }\r
597                                                                                                 break;\r
598                                                                                 }\r
599                                                                         }\r
600                                                                         if ((\r
601                                                                                 (rChip != null) &&\r
602                                                                                 (rChip.eチャンネル番号 >= Ech定義.HiHatClose)) && (rChip.eチャンネル番号 <= Ech定義.LeftCymbal))\r
603                                                                         {\r
604                                                                                 int nLane = this.nチャンネル0Atoレーン07[rChip.eチャンネル番号 - Ech定義.HiHatClose];\r
605                                                                                 if ((nLane == 1) && (\r
606                                                                                         (rChip.eチャンネル番号 == Ech定義.HiHatClose) ||\r
607                                                                                         ((rChip.eチャンネル番号 == Ech定義.HiHatOpen) && (this.e最後に再生したHHのチャンネル番号 != Ech定義.HiHatOpen))))\r
608                                                                                 {\r
609                                                                                         CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生したHHのWAV番号);\r
610                                                                                         this.n最後に再生したHHのWAV番号 = rChip.n整数値_内部番号;\r
611                                                                                         this.e最後に再生したHHのチャンネル番号 = rChip.eチャンネル番号;\r
612                                                                                 }\r
613                                                                                 CDTXMania.Instance.DTX.tチップの再生(rChip, CDTXMania.Instance.Timer.nシステム時刻, nLane, CDTXMania.Instance.ConfigIni.n手動再生音量, CDTXMania.Instance.ConfigIni.b演奏音を強調する.Drums);\r
614                                                                         }\r
615                                                                 }\r
616                                                         }\r
617                                                 }\r
618                                         }\r
619                                         if (((CDTXMania.Instance.Pad.b押されたDGB(Eパッド.CY) || CDTXMania.Instance.Pad.b押された(E楽器パート.DRUMS, Eパッド.RD)) || (CDTXMania.Instance.Pad.b押された(E楽器パート.DRUMS, Eパッド.LC) || CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Return))) && !this.bアニメが完了)\r
620                                         {\r
621                                                 this.actFI.tフェードイン完了();                                 // #25406 2011.6.9 yyagi\r
622                                                 this.actResultImage.tアニメを完了させる();\r
623                                                 this.actParameterPanel.tアニメを完了させる();\r
624                                                 this.actRank.tアニメを完了させる();\r
625                                                 this.actSongBar.tアニメを完了させる();\r
626                                                 this.ct登場用.t停止();\r
627                                         }\r
628                                         #region [ #24609 2011.4.7 yyagi リザルト画面で[F12]を押下すると、リザルト画像をpngで保存する機能は、CDTXManiaに移管。 ]\r
629                                         //                                      if ( CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F12 ) &&\r
630                                         //                                              CDTXMania.Instance.ConfigIni.bScoreIniを出力する )\r
631                                         //                                      {\r
632                                         //                                              CheckAndSaveResultScreen(false);\r
633                                         //                                              this.bIsCheckedWhetherResultScreenShouldSaveOrNot = true;\r
634                                         //                                      }\r
635                                         #endregion\r
636                                         if (base.eフェーズID == CStage.Eフェーズ.共通_通常状態)\r
637                                         {\r
638                                                 if (CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Escape))\r
639                                                 {\r
640                                                         CDTXMania.Instance.Skin.sound取消音.t再生する();\r
641                                                         this.actFO.tフェードアウト開始();\r
642                                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
643                                                         this.eフェードアウト完了時の戻り値 = E戻り値.完了;\r
644                                                 }\r
645                                                 if (((CDTXMania.Instance.Pad.b押されたDGB(Eパッド.CY) || CDTXMania.Instance.Pad.b押された(E楽器パート.DRUMS, Eパッド.RD)) || (CDTXMania.Instance.Pad.b押された(E楽器パート.DRUMS, Eパッド.LC) || CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Return))) && this.bアニメが完了)\r
646                                                 {\r
647                                                         CDTXMania.Instance.Skin.sound取消音.t再生する();\r
648                                                         //                                                      this.actFO.tフェードアウト開始();\r
649                                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
650                                                         this.eフェードアウト完了時の戻り値 = E戻り値.完了;\r
651                                                 }\r
652                                         }\r
653                                 }\r
654                         }\r
655                         return 0;\r
656                 }\r
657 \r
658                 public enum E戻り値 : int\r
659                 {\r
660                         継続,\r
661                         完了\r
662                 }\r
663 \r
664 \r
665                 // その他\r
666 \r
667                 #region [ private ]\r
668                 //-----------------\r
669                 private CCounter ct登場用;\r
670                 private E戻り値 eフェードアウト完了時の戻り値;\r
671                 private CActFIFOWhite actFI;\r
672                 private CActFIFOBlack actFO;\r
673                 private CActオプションパネル actOption;\r
674                 private CAct演奏AVI actAVI;\r
675                 private CActResultParameterPanel actParameterPanel;\r
676                 private CActResultRank actRank;\r
677                 private CActResultImage actResultImage;\r
678                 private CActResultSongBar actSongBar;\r
679                 private bool bアニメが完了;\r
680                 private bool bIsCheckedWhetherResultScreenShouldSaveOrNot;                              // #24509 2011.3.14 yyagi\r
681                 private readonly int[] nチャンネル0Atoレーン07;\r
682                 private int n最後に再生したHHのWAV番号;\r
683                 private Ech定義 e最後に再生したHHのチャンネル番号;\r
684                 private CSound rResultSound;\r
685                 //private CTexture txオプションパネル;\r
686                 private CTextureAf tx下部パネル;\r
687                 private CTextureAf tx上部パネル;\r
688                 private CTexture tx背景;\r
689 \r
690                 #region [ #24609 リザルト画像をpngで保存する ]              // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.\r
691                 /// <summary>\r
692                 /// リザルト画像のキャプチャと保存。\r
693                 /// 自動保存モード時は、ランク更新or演奏型スキル更新時に自動保存。\r
694                 /// 手動保存モード時は、ランクに依らず保存。\r
695                 /// </summary>\r
696                 /// <param name="bIsAutoSave">true=自動保存モード, false=手動保存モード</param>\r
697                 private void CheckAndSaveResultScreen(bool bIsAutoSave)\r
698                 {\r
699                         string path = Path.GetDirectoryName(CDTXMania.Instance.DTX.strファイル名の絶対パス);\r
700                         string datetime = DateTime.Now.ToString("yyyyMMddHHmmss");\r
701                         if (bIsAutoSave)\r
702                         {\r
703                                 // リザルト画像を自動保存するときは、dtxファイル名.yyMMddHHmmss_DRUMS_SS.png という形式で保存。\r
704                                 for (E楽器パート i = E楽器パート.DRUMS; i <= E楽器パート.BASS; i++)\r
705                                 {\r
706                                         if (this.b新記録ランク[i] == true || this.b新記録スキル[i] == true)\r
707                                         {\r
708                                                 string strPart = ((E楽器パート)(i)).ToString();\r
709                                                 string strRank = ((CScoreIni.ERANK)(this.nランク値[i])).ToString();\r
710                                                 string strFullPath = CDTXMania.Instance.DTX.strファイル名の絶対パス + "." + datetime + "_" + strPart + "_" + strRank + ".png";\r
711                                                 //Surface.ToFile( pSurface, strFullPath, ImageFileFormat.Png );\r
712                                                 CDTXMania.Instance.SaveResultScreen(strFullPath);\r
713                                         }\r
714                                 }\r
715                         }\r
716                 }\r
717                 #endregion\r
718                 //-----------------\r
719                 #endregion\r
720         }\r
721 }\r