OSDN Git Service

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