2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Drawing;
\r
6 using System.Drawing.Imaging;
\r
7 using System.Diagnostics;
\r
9 using System.Security.Cryptography;
\r
14 public class CScoreIni
\r
19 public STファイル stファイル;
\r
20 [StructLayout( LayoutKind.Sequential )]
\r
21 public struct STファイル
\r
23 public string Title;
\r
26 public int PlayCountDrums;
\r
27 public int PlayCountGuitar;
\r
28 public int PlayCountBass;
\r
29 // #23596 10.11.16 add ikanick-----/
\r
30 public int ClearCountDrums;
\r
31 public int ClearCountGuitar;
\r
32 public int ClearCountBass;
\r
33 // #24459 2011.2.24 yyagi----------/
\r
34 public STDGBVALUE<int> BestRank;
\r
35 // --------------------------------/
\r
36 public int HistoryCount;
\r
37 public string[] History;
\r
38 public int BGMAdjust;
\r
42 public STセクション stセクション;
\r
43 [StructLayout( LayoutKind.Sequential )]
\r
44 public struct STセクション
\r
46 public CScoreIni.C演奏記録 HiScoreDrums;
\r
47 public CScoreIni.C演奏記録 HiSkillDrums;
\r
48 public CScoreIni.C演奏記録 HiScoreGuitar;
\r
49 public CScoreIni.C演奏記録 HiSkillGuitar;
\r
50 public CScoreIni.C演奏記録 HiScoreBass;
\r
51 public CScoreIni.C演奏記録 HiSkillBass;
\r
52 public CScoreIni.C演奏記録 LastPlayDrums; // #23595 2011.1.9 ikanick
\r
53 public CScoreIni.C演奏記録 LastPlayGuitar; //
\r
54 public CScoreIni.C演奏記録 LastPlayBass; //
\r
55 public CScoreIni.C演奏記録 this[ int index ]
\r
62 return this.HiScoreDrums;
\r
65 return this.HiSkillDrums;
\r
68 return this.HiScoreGuitar;
\r
71 return this.HiSkillGuitar;
\r
74 return this.HiScoreBass;
\r
77 return this.HiSkillBass;
\r
79 // #23595 2011.1.9 ikanick
\r
81 return this.LastPlayDrums;
\r
84 return this.LastPlayGuitar;
\r
87 return this.LastPlayBass;
\r
90 throw new IndexOutOfRangeException();
\r
97 this.HiScoreDrums = value;
\r
101 this.HiSkillDrums = value;
\r
105 this.HiScoreGuitar = value;
\r
109 this.HiSkillGuitar = value;
\r
113 this.HiScoreBass = value;
\r
117 this.HiSkillBass = value;
\r
119 // #23595 2011.1.9 ikanick
\r
121 this.LastPlayDrums = value;
\r
125 this.LastPlayGuitar = value;
\r
129 this.LastPlayBass = value;
\r
131 //------------------
\r
133 throw new IndexOutOfRangeException();
\r
137 public enum Eセクション種別 : int
\r
147 LastPlayDrums = 6, // #23595 2011.1.9 ikanick
\r
148 LastPlayGuitar = 7, //
\r
149 LastPlayBass = 8, //
\r
151 public enum ERANK : int // #24459 yyagi
\r
164 public STAUTOPLAY bAutoPlay;
\r
165 public bool bDrums有効;
\r
166 public bool bGuitar有効;
\r
167 public STDGBVALUE<bool> bHidden;
\r
168 public STDGBVALUE<bool> bLeft;
\r
169 public STDGBVALUE<bool> bLight;
\r
170 public STDGBVALUE<bool> bReverse;
\r
171 public bool bSTAGEFAILED有効;
\r
172 public STDGBVALUE<bool> bSudden;
\r
173 public STDGBVALUE<EInvisible> eInvisible;
\r
174 public bool bTight;
\r
175 public bool b演奏にMIDI入力を使用した;
\r
176 public bool b演奏にキーボードを使用した;
\r
177 public bool b演奏にジョイパッドを使用した;
\r
178 public bool b演奏にマウスを使用した;
\r
179 public double dbゲーム型スキル値;
\r
180 public double db演奏型スキル値;
\r
181 public ECYGroup eCYGroup;
\r
182 public Eダークモード eDark;
\r
183 public EFTGroup eFTGroup;
\r
184 public EHHGroup eHHGroup;
\r
185 public E打ち分け時の再生の優先順位 eHitSoundPriorityCY;
\r
186 public E打ち分け時の再生の優先順位 eHitSoundPriorityFT;
\r
187 public E打ち分け時の再生の優先順位 eHitSoundPriorityHH;
\r
188 public STDGBVALUE<Eランダムモード> eRandom;
\r
189 public Eダメージレベル eダメージレベル;
\r
190 public STDGBVALUE<float> f譜面スクロール速度;
\r
191 public string Hash;
\r
192 public int nGoodになる範囲ms;
\r
194 public int nGreatになる範囲ms;
\r
195 public int nGreat数;
\r
197 public int nPerfectになる範囲ms;
\r
198 public int nPerfect数;
\r
199 public int nPoorになる範囲ms;
\r
201 public int nPerfect数_Auto含まない;
\r
202 public int nGreat数_Auto含まない;
\r
203 public int nGood数_Auto含まない;
\r
204 public int nPoor数_Auto含まない;
\r
205 public int nMiss数_Auto含まない;
\r
207 public int n演奏速度分子;
\r
208 public int n演奏速度分母;
\r
209 public int n最大コンボ数;
\r
211 public string strDTXManiaのバージョン;
\r
212 public bool レーン9モード;
\r
213 public int nRisky; // #23559 2011.6.20 yyagi 0=OFF, 1-10=Risky
\r
214 public string 最終更新日時;
\r
218 this.bAutoPlay = new STAUTOPLAY();
\r
219 this.bAutoPlay.LC = false;
\r
220 this.bAutoPlay.HH = false;
\r
221 this.bAutoPlay.SD = false;
\r
222 this.bAutoPlay.BD = false;
\r
223 this.bAutoPlay.HT = false;
\r
224 this.bAutoPlay.LT = false;
\r
225 this.bAutoPlay.FT = false;
\r
226 this.bAutoPlay.CY = false;
\r
227 this.bAutoPlay.Guitar = false;
\r
228 this.bAutoPlay.Bass = false;
\r
229 this.bAutoPlay.GtR = false;
\r
230 this.bAutoPlay.GtG = false;
\r
231 this.bAutoPlay.GtB = false;
\r
232 this.bAutoPlay.GtPick = false;
\r
233 this.bAutoPlay.GtW = false;
\r
234 this.bAutoPlay.BsR = false;
\r
235 this.bAutoPlay.BsG = false;
\r
236 this.bAutoPlay.BsB = false;
\r
237 this.bAutoPlay.BsPick = false;
\r
238 this.bAutoPlay.BsW = false;
\r
240 this.bSudden = new STDGBVALUE<bool>();
\r
241 this.bSudden.Drums = false;
\r
242 this.bSudden.Guitar = false;
\r
243 this.bSudden.Bass = false;
\r
244 this.bHidden = new STDGBVALUE<bool>();
\r
245 this.bHidden.Drums = false;
\r
246 this.bHidden.Guitar = false;
\r
247 this.bHidden.Bass = false;
\r
248 this.eInvisible = new STDGBVALUE<EInvisible>();
\r
249 this.eInvisible.Drums = EInvisible.OFF;
\r
250 this.eInvisible.Guitar = EInvisible.OFF;
\r
251 this.eInvisible.Bass = EInvisible.OFF;
\r
252 this.bReverse = new STDGBVALUE<bool>();
\r
253 this.bReverse.Drums = false;
\r
254 this.bReverse.Guitar = false;
\r
255 this.bReverse.Bass = false;
\r
256 this.eRandom = new STDGBVALUE<Eランダムモード>();
\r
257 this.eRandom.Drums = Eランダムモード.OFF;
\r
258 this.eRandom.Guitar = Eランダムモード.OFF;
\r
259 this.eRandom.Bass = Eランダムモード.OFF;
\r
260 this.bLight = new STDGBVALUE<bool>();
\r
261 this.bLight.Drums = false;
\r
262 this.bLight.Guitar = false;
\r
263 this.bLight.Bass = false;
\r
264 this.bLeft = new STDGBVALUE<bool>();
\r
265 this.bLeft.Drums = false;
\r
266 this.bLeft.Guitar = false;
\r
267 this.bLeft.Bass = false;
\r
268 this.f譜面スクロール速度 = new STDGBVALUE<float>();
\r
269 this.f譜面スクロール速度.Drums = 1f;
\r
270 this.f譜面スクロール速度.Guitar = 1f;
\r
271 this.f譜面スクロール速度.Bass = 1f;
\r
274 this.bGuitar有効 = true;
\r
275 this.bDrums有効 = true;
\r
276 this.bSTAGEFAILED有効 = true;
\r
277 this.eダメージレベル = Eダメージレベル.普通;
\r
278 this.nPerfectになる範囲ms = 34;
\r
279 this.nGreatになる範囲ms = 67;
\r
280 this.nGoodになる範囲ms = 84;
\r
281 this.nPoorになる範囲ms = 117;
\r
282 this.strDTXManiaのバージョン = "Unknown";
\r
284 this.Hash = "00000000000000000000000000000000";
\r
285 this.レーン9モード = true;
\r
286 this.nRisky = 0; // #23559 2011.6.20 yyagi
\r
289 public bool bフルコンボじゃない
\r
293 return !this.bフルコンボである;
\r
296 public bool bフルコンボである
\r
300 return ( ( this.n最大コンボ数 > 0 ) && ( this.n最大コンボ数 == ( this.nPerfect数 + this.nGreat数 + this.nGood数 + this.nPoor数 + this.nMiss数 ) ) );
\r
304 public bool b全AUTOじゃない
\r
311 public bool b全AUTOである
\r
315 return (this.n全チップ数 - this.nPerfect数_Auto含まない - this.nGreat数_Auto含まない - this.nGood数_Auto含まない - this.nPoor数_Auto含まない - this.nMiss数_Auto含まない) == this.n全チップ数;
\r
319 [StructLayout( LayoutKind.Sequential )]
\r
320 public struct STAUTOPLAY
\r
331 public bool Guitar;
\r
336 public bool GtPick;
\r
341 public bool BsPick;
\r
343 public bool this[ int index ]
\r
349 case (int) Eレーン.LC:
\r
351 case (int) Eレーン.HH:
\r
353 case (int) Eレーン.SD:
\r
355 case (int) Eレーン.BD:
\r
357 case (int) Eレーン.HT:
\r
359 case (int) Eレーン.LT:
\r
361 case (int) Eレーン.FT:
\r
363 case (int) Eレーン.CY:
\r
365 case (int) Eレーン.RD:
\r
367 case (int) Eレーン.Guitar:
\r
368 return this.Guitar;
\r
369 case (int) Eレーン.Bass:
\r
371 case (int) Eレーン.GtR:
\r
373 case (int) Eレーン.GtG:
\r
375 case (int) Eレーン.GtB:
\r
377 case (int) Eレーン.GtPick:
\r
378 return this.GtPick;
\r
379 case (int) Eレーン.GtW:
\r
381 case (int) Eレーン.BsR:
\r
383 case (int) Eレーン.BsG:
\r
385 case (int) Eレーン.BsB:
\r
387 case (int) Eレーン.BsPick:
\r
388 return this.BsPick;
\r
389 case (int) Eレーン.BsW:
\r
392 throw new IndexOutOfRangeException();
\r
398 case (int) Eレーン.LC:
\r
401 case (int) Eレーン.HH:
\r
404 case (int) Eレーン.SD:
\r
407 case (int) Eレーン.BD:
\r
410 case (int) Eレーン.HT:
\r
413 case (int) Eレーン.LT:
\r
416 case (int) Eレーン.FT:
\r
419 case (int) Eレーン.CY:
\r
422 case (int) Eレーン.RD:
\r
425 case (int) Eレーン.Guitar:
\r
426 this.Guitar = value;
\r
428 case (int) Eレーン.Bass:
\r
431 case (int) Eレーン.GtR:
\r
434 case (int) Eレーン.GtG:
\r
437 case (int) Eレーン.GtB:
\r
440 case (int) Eレーン.GtPick:
\r
441 this.GtPick = value;
\r
443 case (int) Eレーン.GtW:
\r
446 case (int) Eレーン.BsR:
\r
449 case (int) Eレーン.BsG:
\r
452 case (int) Eレーン.BsB:
\r
455 case (int) Eレーン.BsPick:
\r
456 this.BsPick = value;
\r
458 case (int) Eレーン.BsW:
\r
462 throw new IndexOutOfRangeException();
\r
470 /// <para>.score.ini の存在するフォルダ(絶対パス;末尾に '\' はついていない)。</para>
\r
471 /// <para>未保存などでファイル名がない場合は null。</para>
\r
473 public string iniファイルのあるフォルダ名
\r
480 /// <para>.score.ini のファイル名(絶対パス)。</para>
\r
481 /// <para>未保存などでファイル名がない場合は null。</para>
\r
483 public string iniファイル名
\r
494 this.iniファイルのあるフォルダ名 = null;
\r
495 this.iniファイル名 = null;
\r
496 this.stファイル = new STファイル();
\r
500 stファイル.History = new string[] { "", "", "", "", "" };
\r
501 stファイル.BestRank.Drums = (int)ERANK.UNKNOWN; // #24459 2011.2.24 yyagi
\r
502 stファイル.BestRank.Guitar = (int)ERANK.UNKNOWN; //
\r
503 stファイル.BestRank.Bass = (int)ERANK.UNKNOWN; //
\r
505 this.stセクション = new STセクション();
\r
506 stセクション.HiScoreDrums = new C演奏記録();
\r
507 stセクション.HiSkillDrums = new C演奏記録();
\r
508 stセクション.HiScoreGuitar = new C演奏記録();
\r
509 stセクション.HiSkillGuitar = new C演奏記録();
\r
510 stセクション.HiScoreBass = new C演奏記録();
\r
511 stセクション.HiSkillBass = new C演奏記録();
\r
512 stセクション.LastPlayDrums = new C演奏記録();
\r
513 stセクション.LastPlayGuitar = new C演奏記録();
\r
514 stセクション.LastPlayBass = new C演奏記録();
\r
518 /// <para>初期化後にiniファイルを読み込むコンストラクタ。</para>
\r
519 /// <para>読み込んだiniに不正値があれば、それが含まれるセクションをリセットする。</para>
\r
521 public CScoreIni( string str読み込むiniファイル )
\r
524 this.t読み込み( str読み込むiniファイル );
\r
525 this.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
532 /// <para>現在の this.Record[] オブジェクトの、指定されたセクションの情報が正当であるか否かを判定する。
\r
533 /// 真偽どちらでも、その内容は書き換えない。</para>
\r
535 /// <param name="eセクション">判定するセクション。</param>
\r
536 /// <returns>正当である(整合性がある)場合は true。</returns>
\r
537 public bool b整合性がある( Eセクション種別 eセクション )
\r
539 return true; // オープンソース化に伴い、整合性チェックを無効化。(2010.10.21)
\r
543 /// 指定されたファイルの内容から MD5 値を求め、それを16進数に変換した文字列を返す。
\r
545 /// <param name="ファイル名">MD5 を求めるファイル名。</param>
\r
546 /// <returns>算出結果の MD5 を16進数で並べた文字列。</returns>
\r
547 public static string tファイルのMD5を求めて返す( string ファイル名 )
\r
549 byte[] buffer = null;
\r
550 FileStream stream = new FileStream( ファイル名, FileMode.Open, FileAccess.Read );
\r
551 buffer = new byte[ stream.Length ];
\r
552 stream.Read( buffer, 0, (int) stream.Length );
\r
554 StringBuilder builder = new StringBuilder(0x21);
\r
556 MD5CryptoServiceProvider m = new MD5CryptoServiceProvider();
\r
557 byte[] buffer2 = m.ComputeHash(buffer);
\r
558 foreach (byte num in buffer2)
\r
559 builder.Append(num.ToString("x2"));
\r
561 return builder.ToString();
\r
565 /// 指定された .score.ini を読み込む。内容の真偽は判定しない。
\r
567 /// <param name="iniファイル名">読み込む .score.ini ファイルを指定します(絶対パスが安全)。</param>
\r
568 public void t読み込み( string iniファイル名 )
\r
570 this.iniファイルのあるフォルダ名 = Path.GetDirectoryName( iniファイル名 );
\r
571 this.iniファイル名 = Path.GetFileName( iniファイル名 );
\r
573 Eセクション種別 section = Eセクション種別.Unknown;
\r
574 if( File.Exists( iniファイル名 ) )
\r
577 StreamReader reader = new StreamReader( iniファイル名, Encoding.GetEncoding( "Shift_JIS" ) );
\r
578 while( ( str = reader.ReadLine() ) != null )
\r
580 str = str.Replace( '\t', ' ' ).TrimStart( new char[] { '\t', ' ' } );
\r
581 if( ( str.Length != 0 ) && ( str[ 0 ] != ';' ) )
\r
588 #region [ section ]
\r
589 if ( str[ 0 ] == '[' )
\r
591 StringBuilder builder = new StringBuilder( 0x20 );
\r
593 while( ( num < str.Length ) && ( str[ num ] != ']' ) )
\r
595 builder.Append( str[ num++ ] );
\r
597 string str2 = builder.ToString();
\r
598 if( str2.Equals( "File" ) )
\r
600 section = Eセクション種別.File;
\r
602 else if( str2.Equals( "HiScore.Drums" ) )
\r
604 section = Eセクション種別.HiScoreDrums;
\r
606 else if( str2.Equals( "HiSkill.Drums" ) )
\r
608 section = Eセクション種別.HiSkillDrums;
\r
610 else if( str2.Equals( "HiScore.Guitar" ) )
\r
612 section = Eセクション種別.HiScoreGuitar;
\r
614 else if( str2.Equals( "HiSkill.Guitar" ) )
\r
616 section = Eセクション種別.HiSkillGuitar;
\r
618 else if( str2.Equals( "HiScore.Bass" ) )
\r
620 section = Eセクション種別.HiScoreBass;
\r
622 else if (str2.Equals("HiSkill.Bass"))
\r
624 section = Eセクション種別.HiSkillBass;
\r
626 // #23595 2011.1.9 ikanick
\r
627 else if (str2.Equals("LastPlay.Drums"))
\r
629 section = Eセクション種別.LastPlayDrums;
\r
631 else if (str2.Equals("LastPlay.Guitar"))
\r
633 section = Eセクション種別.LastPlayGuitar;
\r
635 else if (str2.Equals("LastPlay.Bass"))
\r
637 section = Eセクション種別.LastPlayBass;
\r
639 //----------------------------------------------------
\r
642 section = Eセクション種別.Unknown;
\r
648 string[] strArray = str.Split( new char[] { '=' } );
\r
649 if( strArray.Length == 2 )
\r
651 item = strArray[ 0 ].Trim();
\r
652 para = strArray[ 1 ].Trim();
\r
655 case Eセクション種別.File:
\r
657 if( !item.Equals( "Title" ) )
\r
661 this.stファイル.Title = para;
\r
664 case Eセクション種別.HiScoreDrums:
\r
665 case Eセクション種別.HiSkillDrums:
\r
666 case Eセクション種別.HiScoreGuitar:
\r
667 case Eセクション種別.HiSkillGuitar:
\r
668 case Eセクション種別.HiScoreBass:
\r
669 case Eセクション種別.HiSkillBass:
\r
670 case Eセクション種別.LastPlayDrums:// #23595 2011.1.9 ikanick
\r
671 case Eセクション種別.LastPlayGuitar:
\r
672 case Eセクション種別.LastPlayBass:
\r
674 c演奏記録 = this.stセクション[ (int) section ];
\r
675 if( !item.Equals( "Score" ) )
\r
679 c演奏記録.nスコア = long.Parse( para );
\r
686 #region [ File section ]
\r
688 if( item.Equals( "Name" ) )
\r
690 this.stファイル.Name = para;
\r
692 else if( item.Equals( "Hash" ) )
\r
694 this.stファイル.Hash = para;
\r
696 else if( item.Equals( "PlayCountDrums" ) )
\r
698 this.stファイル.PlayCountDrums = C変換.n値を文字列から取得して範囲内に丸めて返す( para, 0, 99999999, 0 );
\r
700 else if( item.Equals( "PlayCountGuitars" ) )// #23596 11.2.5 changed ikanick
\r
702 this.stファイル.PlayCountGuitar = C変換.n値を文字列から取得して範囲内に丸めて返す( para, 0, 99999999, 0 );
\r
704 else if( item.Equals( "PlayCountBass" ) )
\r
706 this.stファイル.PlayCountBass = C変換.n値を文字列から取得して範囲内に丸めて返す( para, 0, 99999999, 0 );
\r
708 // #23596 10.11.16 add ikanick------------------------------------/
\r
709 else if (item.Equals("ClearCountDrums"))
\r
711 this.stファイル.ClearCountDrums = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);
\r
713 else if (item.Equals("ClearCountGuitars"))// #23596 11.2.5 changed ikanick
\r
715 this.stファイル.ClearCountGuitar = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);
\r
717 else if (item.Equals("ClearCountBass"))
\r
719 this.stファイル.ClearCountBass = C変換.n値を文字列から取得して範囲内に丸めて返す(para, 0, 99999999, 0);
\r
721 // #24459 2011.2.24 yyagi-----------------------------------------/
\r
722 else if ( item.Equals( "BestRankDrums" ) )
\r
724 this.stファイル.BestRank.Drums = C変換.n値を文字列から取得して範囲内に丸めて返す( para, (int) ERANK.SS, (int) ERANK.E, (int) ERANK.UNKNOWN );
\r
726 else if ( item.Equals( "BestRankGuitar" ) )
\r
728 this.stファイル.BestRank.Guitar = C変換.n値を文字列から取得して範囲内に丸めて返す( para, (int) ERANK.SS, (int) ERANK.E, (int) ERANK.UNKNOWN );
\r
730 else if ( item.Equals( "BestRankBass" ) )
\r
732 this.stファイル.BestRank.Bass = C変換.n値を文字列から取得して範囲内に丸めて返す( para, (int) ERANK.SS, (int) ERANK.E, (int) ERANK.UNKNOWN );
\r
734 //----------------------------------------------------------------/
\r
735 else if ( item.Equals( "History0" ) )
\r
737 this.stファイル.History[ 0 ] = para;
\r
739 else if( item.Equals( "History1" ) )
\r
741 this.stファイル.History[ 1 ] = para;
\r
743 else if( item.Equals( "History2" ) )
\r
745 this.stファイル.History[ 2 ] = para;
\r
747 else if( item.Equals( "History3" ) )
\r
749 this.stファイル.History[ 3 ] = para;
\r
751 else if( item.Equals( "History4" ) )
\r
753 this.stファイル.History[ 4 ] = para;
\r
755 else if( item.Equals( "HistoryCount" ) )
\r
757 this.stファイル.HistoryCount = C変換.n値を文字列から取得して範囲内に丸めて返す( para, 0, 99999999, 0 );
\r
759 else if( item.Equals( "BGMAdjust" ) )
\r
761 this.stファイル.BGMAdjust = C変換.n値を文字列から取得して返す( para, 0 );
\r
765 #region [ Score section ]
\r
767 if( item.Equals( "PlaySkill" ) )
\r
769 c演奏記録.db演奏型スキル値 = (double) decimal.Parse( para );
\r
771 else if( item.Equals( "Skill" ) )
\r
773 c演奏記録.dbゲーム型スキル値 = (double) decimal.Parse( para );
\r
775 else if( item.Equals( "Perfect" ) )
\r
777 c演奏記録.nPerfect数 = int.Parse( para );
\r
779 else if( item.Equals( "Great" ) )
\r
781 c演奏記録.nGreat数 = int.Parse( para );
\r
783 else if( item.Equals( "Good" ) )
\r
785 c演奏記録.nGood数 = int.Parse( para );
\r
787 else if( item.Equals( "Poor" ) )
\r
789 c演奏記録.nPoor数 = int.Parse( para );
\r
791 else if( item.Equals( "Miss" ) )
\r
793 c演奏記録.nMiss数 = int.Parse( para );
\r
795 else if( item.Equals( "MaxCombo" ) )
\r
797 c演奏記録.n最大コンボ数 = int.Parse( para );
\r
799 else if( item.Equals( "TotalChips" ) )
\r
801 c演奏記録.n全チップ数 = int.Parse( para );
\r
803 else if( item.Equals( "AutoPlay" ) )
\r
805 // LCなし LCあり CYとRDが別 Gt/Bs autolane/pick
\r
806 if( para.Length == 9 || para.Length == 10 || para.Length == 11 || para.Length == 21 )
\r
808 for( int i = 0; i < para.Length; i++ )
\r
810 c演奏記録.bAutoPlay[ i ] = this.ONorOFF( para[ i ] );
\r
814 else if ( item.Equals( "Risky" ) )
\r
816 c演奏記録.nRisky = int.Parse( para );
\r
818 else if ( item.Equals( "TightDrums" ) )
\r
820 c演奏記録.bTight = C変換.bONorOFF( para[ 0 ] );
\r
822 else if ( item.Equals( "SuddenDrums" ) )
\r
824 c演奏記録.bSudden.Drums = C変換.bONorOFF( para[ 0 ] );
\r
826 else if ( item.Equals( "SuddenGuitar" ) )
\r
828 c演奏記録.bSudden.Guitar = C変換.bONorOFF( para[ 0 ] );
\r
830 else if ( item.Equals( "SuddenBass" ) )
\r
832 c演奏記録.bSudden.Bass = C変換.bONorOFF( para[ 0 ] );
\r
834 else if ( item.Equals( "HiddenDrums" ) )
\r
836 c演奏記録.bHidden.Drums = C変換.bONorOFF( para[ 0 ] );
\r
838 else if ( item.Equals( "HiddenGuitar" ) )
\r
840 c演奏記録.bHidden.Guitar = C変換.bONorOFF( para[ 0 ] );
\r
842 else if ( item.Equals( "HiddenBass" ) )
\r
844 c演奏記録.bHidden.Bass = C変換.bONorOFF( para[ 0 ] );
\r
846 else if ( item.Equals( "InvisibleDrums" ) )
\r
848 c演奏記録.eInvisible.Drums = (EInvisible) int.Parse( para );
\r
850 else if ( item.Equals( "InvisibleGuitar" ) )
\r
852 c演奏記録.eInvisible.Guitar = (EInvisible) int.Parse( para );
\r
854 else if ( item.Equals( "InvisibleBass" ) )
\r
856 c演奏記録.eInvisible.Bass = (EInvisible) int.Parse( para );
\r
858 else if ( item.Equals( "ReverseDrums" ) )
\r
860 c演奏記録.bReverse.Drums = C変換.bONorOFF( para[ 0 ] );
\r
862 else if ( item.Equals( "ReverseGuitar" ) )
\r
864 c演奏記録.bReverse.Guitar = C変換.bONorOFF( para[ 0 ] );
\r
866 else if ( item.Equals( "ReverseBass" ) )
\r
868 c演奏記録.bReverse.Bass = C変換.bONorOFF( para[ 0 ] );
\r
873 #region [ RandomGuitar ]
\r
874 if ( item.Equals( "RandomGuitar" ) )
\r
876 switch ( int.Parse( para ) )
\r
878 case (int) Eランダムモード.OFF:
\r
880 c演奏記録.eRandom.Guitar = Eランダムモード.OFF;
\r
883 case (int) Eランダムモード.RANDOM:
\r
885 c演奏記録.eRandom.Guitar = Eランダムモード.RANDOM;
\r
888 case (int) Eランダムモード.SUPERRANDOM:
\r
890 c演奏記録.eRandom.Guitar = Eランダムモード.SUPERRANDOM;
\r
893 case (int) Eランダムモード.HYPERRANDOM: // #25452 2011.6.20 yyagi
\r
895 c演奏記録.eRandom.Guitar = Eランダムモード.SUPERRANDOM;
\r
899 throw new Exception( "RandomGuitar の値が無効です。" );
\r
902 #region [ RandomBass ]
\r
903 if ( item.Equals( "RandomBass" ) )
\r
905 switch ( int.Parse( para ) )
\r
907 case (int) Eランダムモード.OFF:
\r
909 c演奏記録.eRandom.Bass = Eランダムモード.OFF;
\r
912 case (int) Eランダムモード.RANDOM:
\r
914 c演奏記録.eRandom.Bass = Eランダムモード.RANDOM;
\r
917 case (int) Eランダムモード.SUPERRANDOM:
\r
919 c演奏記録.eRandom.Bass = Eランダムモード.SUPERRANDOM;
\r
922 case (int) Eランダムモード.HYPERRANDOM: // #25452 2011.6.20 yyagi
\r
924 c演奏記録.eRandom.Bass = Eランダムモード.SUPERRANDOM;
\r
928 throw new Exception( "RandomBass の値が無効です。" );
\r
931 #region [ LightGuitar ]
\r
932 if ( item.Equals( "LightGuitar" ) )
\r
934 c演奏記録.bLight.Guitar = C変換.bONorOFF( para[ 0 ] );
\r
937 #region [ LightBass ]
\r
938 else if ( item.Equals( "LightBass" ) )
\r
940 c演奏記録.bLight.Bass = C変換.bONorOFF( para[ 0 ] );
\r
943 #region [ LeftGuitar ]
\r
944 else if ( item.Equals( "LeftGuitar" ) )
\r
946 c演奏記録.bLeft.Guitar = C変換.bONorOFF( para[ 0 ] );
\r
949 #region [ LeftBass ]
\r
950 else if ( item.Equals( "LeftBass" ) )
\r
952 c演奏記録.bLeft.Bass = C変換.bONorOFF( para[ 0 ] );
\r
958 if ( item.Equals( "Dark" ) )
\r
960 switch ( int.Parse( para ) )
\r
964 c演奏記録.eDark = Eダークモード.OFF;
\r
969 c演奏記録.eDark = Eダークモード.HALF;
\r
974 c演奏記録.eDark = Eダークモード.FULL;
\r
978 throw new Exception( "Dark の値が無効です。" );
\r
981 #region [ ScrollSpeedDrums ]
\r
982 if ( item.Equals( "ScrollSpeedDrums" ) )
\r
984 c演奏記録.f譜面スクロール速度.Drums = (float) decimal.Parse( para );
\r
987 #region [ ScrollSpeedGuitar ]
\r
988 else if ( item.Equals( "ScrollSpeedGuitar" ) )
\r
990 c演奏記録.f譜面スクロール速度.Guitar = (float) decimal.Parse( para );
\r
993 #region [ ScrollSpeedBass ]
\r
994 else if ( item.Equals( "ScrollSpeedBass" ) )
\r
996 c演奏記録.f譜面スクロール速度.Bass = (float) decimal.Parse( para );
\r
999 #region [ PlaySpeed ]
\r
1000 else if ( item.Equals( "PlaySpeed" ) )
\r
1002 string[] strArray2 = para.Split( new char[] { '/' } );
\r
1003 if ( strArray2.Length == 2 )
\r
1005 c演奏記録.n演奏速度分子 = int.Parse( strArray2[ 0 ] );
\r
1006 c演奏記録.n演奏速度分母 = int.Parse( strArray2[ 1 ] );
\r
1012 #region [ HHGroup ]
\r
1013 if ( item.Equals( "HHGroup" ) )
\r
1015 switch ( int.Parse( para ) )
\r
1019 c演奏記録.eHHGroup = EHHGroup.全部打ち分ける;
\r
1024 c演奏記録.eHHGroup = EHHGroup.ハイハットのみ打ち分ける;
\r
1029 c演奏記録.eHHGroup = EHHGroup.左シンバルのみ打ち分ける;
\r
1034 c演奏記録.eHHGroup = EHHGroup.全部共通;
\r
1038 throw new Exception( "HHGroup の値が無効です。" );
\r
1041 #region [ FTGroup ]
\r
1042 if ( item.Equals( "FTGroup" ) )
\r
1044 switch ( int.Parse( para ) )
\r
1048 c演奏記録.eFTGroup = EFTGroup.打ち分ける;
\r
1053 c演奏記録.eFTGroup = EFTGroup.共通;
\r
1057 throw new Exception( "FTGroup の値が無効です。" );
\r
1060 #region [ CYGroup ]
\r
1061 if ( item.Equals( "CYGroup" ) )
\r
1063 switch ( int.Parse( para ) )
\r
1067 c演奏記録.eCYGroup = ECYGroup.打ち分ける;
\r
1072 c演奏記録.eCYGroup = ECYGroup.共通;
\r
1076 throw new Exception( "CYGroup の値が無効です。" );
\r
1079 #region [ HitSoundPriorityHH ]
\r
1080 if ( item.Equals( "HitSoundPriorityHH" ) )
\r
1082 switch ( int.Parse( para ) )
\r
1086 c演奏記録.eHitSoundPriorityHH = E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
1091 c演奏記録.eHitSoundPriorityHH = E打ち分け時の再生の優先順位.PadがChipより優先;
\r
1095 throw new Exception( "HitSoundPriorityHH の値が無効です。" );
\r
1098 #region [ HitSoundPriorityFT ]
\r
1099 if ( item.Equals( "HitSoundPriorityFT" ) )
\r
1101 switch ( int.Parse( para ) )
\r
1105 c演奏記録.eHitSoundPriorityFT = E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
1110 c演奏記録.eHitSoundPriorityFT = E打ち分け時の再生の優先順位.PadがChipより優先;
\r
1114 throw new Exception( "HitSoundPriorityFT の値が無効です。" );
\r
1117 #region [ HitSoundPriorityCY ]
\r
1118 if ( item.Equals( "HitSoundPriorityCY" ) )
\r
1120 switch ( int.Parse( para ) )
\r
1124 c演奏記録.eHitSoundPriorityCY = E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
1129 c演奏記録.eHitSoundPriorityCY = E打ち分け時の再生の優先順位.PadがChipより優先;
\r
1133 throw new Exception( "HitSoundPriorityCY の値が無効です。" );
\r
1136 #region [ Guitar ]
\r
1137 if ( item.Equals( "Guitar" ) )
\r
1139 c演奏記録.bGuitar有効 = C変換.bONorOFF( para[ 0 ] );
\r
1143 else if ( item.Equals( "Drums" ) )
\r
1145 c演奏記録.bDrums有効 = C変換.bONorOFF( para[ 0 ] );
\r
1148 #region [ StageFailed ]
\r
1149 else if ( item.Equals( "StageFailed" ) )
\r
1151 c演奏記録.bSTAGEFAILED有効 = C変換.bONorOFF( para[ 0 ] );
\r
1156 #region [ DamageLevel ]
\r
1157 if ( item.Equals( "DamageLevel" ) )
\r
1159 switch ( int.Parse( para ) )
\r
1163 c演奏記録.eダメージレベル = Eダメージレベル.少ない;
\r
1168 c演奏記録.eダメージレベル = Eダメージレベル.普通;
\r
1173 c演奏記録.eダメージレベル = Eダメージレベル.大きい;
\r
1177 throw new Exception( "DamageLevel の値が無効です。" );
\r
1180 if ( item.Equals( "UseKeyboard" ) )
\r
1182 c演奏記録.b演奏にキーボードを使用した = C変換.bONorOFF( para[ 0 ] );
\r
1184 else if ( item.Equals( "UseMIDIIN" ) )
\r
1186 c演奏記録.b演奏にMIDI入力を使用した = C変換.bONorOFF( para[ 0 ] );
\r
1188 else if ( item.Equals( "UseJoypad" ) )
\r
1190 c演奏記録.b演奏にジョイパッドを使用した = C変換.bONorOFF( para[ 0 ] );
\r
1192 else if ( item.Equals( "UseMouse" ) )
\r
1194 c演奏記録.b演奏にマウスを使用した = C変換.bONorOFF( para[ 0 ] );
\r
1196 else if ( item.Equals( "PerfectRange" ) )
\r
1198 c演奏記録.nPerfectになる範囲ms = int.Parse( para );
\r
1200 else if ( item.Equals( "GreatRange" ) )
\r
1202 c演奏記録.nGreatになる範囲ms = int.Parse( para );
\r
1204 else if ( item.Equals( "GoodRange" ) )
\r
1206 c演奏記録.nGoodになる範囲ms = int.Parse( para );
\r
1208 else if ( item.Equals( "PoorRange" ) )
\r
1210 c演奏記録.nPoorになる範囲ms = int.Parse( para );
\r
1212 else if ( item.Equals( "DTXManiaVersion" ) )
\r
1214 c演奏記録.strDTXManiaのバージョン = para;
\r
1216 else if ( item.Equals( "DateTime" ) )
\r
1218 c演奏記録.最終更新日時 = para;
\r
1220 else if ( item.Equals( "Hash" ) )
\r
1222 c演奏記録.Hash = para;
\r
1224 else if ( item.Equals( "9LaneMode" ) )
\r
1226 c演奏記録.レーン9モード = C変換.bONorOFF( para[ 0 ] );
\r
1234 catch( Exception exception )
\r
1236 Trace.TraceError( "{0}読み込みを中断します。({1})", exception.Message, iniファイル名 );
\r
1245 internal void tヒストリを追加する( string str追加文字列 )
\r
1247 this.stファイル.HistoryCount++;
\r
1248 for( int i = 3; i >= 0; i-- )
\r
1249 this.stファイル.History[ i + 1 ] = this.stファイル.History[ i ];
\r
1250 DateTime now = DateTime.Now;
\r
1251 this.stファイル.History[ 0 ] = string.Format( "{0:0}.{1:D2}/{2}/{3} {4}", this.stファイル.HistoryCount, now.Year % 100, now.Month, now.Day, str追加文字列 );
\r
1253 internal void t書き出し( string iniファイル名 )
\r
1255 this.iniファイルのあるフォルダ名 = Path.GetDirectoryName( iniファイル名 );
\r
1256 this.iniファイル名 = Path.GetFileName( iniファイル名 );
\r
1258 StreamWriter writer = new StreamWriter( iniファイル名, false, Encoding.GetEncoding( "utf-16" ) );
\r
1259 writer.WriteLine( "[File]" );
\r
1260 writer.WriteLine( "Title={0}", this.stファイル.Title );
\r
1261 writer.WriteLine( "Name={0}", this.stファイル.Name );
\r
1262 writer.WriteLine( "Hash={0}", this.stファイル.Hash );
\r
1263 writer.WriteLine( "PlayCountDrums={0}", this.stファイル.PlayCountDrums );
\r
1264 writer.WriteLine( "PlayCountGuitars={0}", this.stファイル.PlayCountGuitar );
\r
1265 writer.WriteLine( "PlayCountBass={0}", this.stファイル.PlayCountBass );
\r
1266 writer.WriteLine( "ClearCountDrums={0}", this.stファイル.ClearCountDrums ); // #23596 10.11.16 add ikanick
\r
1267 writer.WriteLine( "ClearCountGuitars={0}", this.stファイル.ClearCountGuitar ); //
\r
1268 writer.WriteLine( "ClearCountBass={0}", this.stファイル.ClearCountBass ); //
\r
1269 writer.WriteLine( "BestRankDrums={0}", this.stファイル.BestRank.Drums ); // #24459 2011.2.24 yyagi
\r
1270 writer.WriteLine( "BestRankGuitar={0}", this.stファイル.BestRank.Guitar ); //
\r
1271 writer.WriteLine( "BestRankBass={0}", this.stファイル.BestRank.Bass ); //
\r
1272 writer.WriteLine( "HistoryCount={0}", this.stファイル.HistoryCount );
\r
1273 writer.WriteLine( "History0={0}", this.stファイル.History[ 0 ] );
\r
1274 writer.WriteLine( "History1={0}", this.stファイル.History[ 1 ] );
\r
1275 writer.WriteLine( "History2={0}", this.stファイル.History[ 2 ] );
\r
1276 writer.WriteLine( "History3={0}", this.stファイル.History[ 3 ] );
\r
1277 writer.WriteLine( "History4={0}", this.stファイル.History[ 4 ] );
\r
1278 writer.WriteLine( "BGMAdjust={0}", this.stファイル.BGMAdjust );
\r
1279 writer.WriteLine();
\r
1280 for( int i = 0; i < 9; i++ )
\r
1282 string[] strArray = { "HiScore.Drums", "HiSkill.Drums", "HiScore.Guitar", "HiSkill.Guitar", "HiScore.Bass", "HiSkill.Bass", "LastPlay.Drums", "LastPlay.Guitar", "LastPlay.Bass" };
\r
1283 writer.WriteLine( "[{0}]", strArray[ i ] );
\r
1284 writer.WriteLine( "Score={0}", this.stセクション[ i ].nスコア );
\r
1285 writer.WriteLine( "PlaySkill={0}", this.stセクション[ i ].db演奏型スキル値 );
\r
1286 writer.WriteLine( "Skill={0}", this.stセクション[ i ].dbゲーム型スキル値 );
\r
1287 writer.WriteLine( "Perfect={0}", this.stセクション[ i ].nPerfect数 );
\r
1288 writer.WriteLine( "Great={0}", this.stセクション[ i ].nGreat数 );
\r
1289 writer.WriteLine( "Good={0}", this.stセクション[ i ].nGood数 );
\r
1290 writer.WriteLine( "Poor={0}", this.stセクション[ i ].nPoor数 );
\r
1291 writer.WriteLine( "Miss={0}", this.stセクション[ i ].nMiss数 );
\r
1292 writer.WriteLine( "MaxCombo={0}", this.stセクション[ i ].n最大コンボ数 );
\r
1293 writer.WriteLine( "TotalChips={0}", this.stセクション[ i ].n全チップ数 );
\r
1294 writer.Write( "AutoPlay=" );
\r
1295 for ( int j = 0; j < (int) Eレーン.MAX; j++ )
\r
1297 writer.Write( this.stセクション[ i ].bAutoPlay[ j ] ? 1 : 0 );
\r
1299 writer.WriteLine();
\r
1300 writer.WriteLine( "Risky={0}", this.stセクション[ i ].nRisky );
\r
1301 writer.WriteLine( "SuddenDrums={0}", this.stセクション[ i ].bSudden.Drums ? 1 : 0 );
\r
1302 writer.WriteLine( "SuddenGuitar={0}", this.stセクション[ i ].bSudden.Guitar ? 1 : 0 );
\r
1303 writer.WriteLine( "SuddenBass={0}", this.stセクション[ i ].bSudden.Bass ? 1 : 0 );
\r
1304 writer.WriteLine( "HiddenDrums={0}", this.stセクション[ i ].bHidden.Drums ? 1 : 0 );
\r
1305 writer.WriteLine( "HiddenGuitar={0}", this.stセクション[ i ].bHidden.Guitar ? 1 : 0 );
\r
1306 writer.WriteLine( "HiddenBass={0}", this.stセクション[ i ].bHidden.Bass ? 1 : 0 );
\r
1307 writer.WriteLine( "InvisibleDrums={0}", (int) this.stセクション[ i ].eInvisible.Drums );
\r
1308 writer.WriteLine( "InvisibleGuitar={0}", (int) this.stセクション[ i ].eInvisible.Guitar );
\r
1309 writer.WriteLine( "InvisibleBass={0}", (int) this.stセクション[ i ].eInvisible.Bass );
\r
1310 writer.WriteLine( "ReverseDrums={0}", this.stセクション[ i ].bReverse.Drums ? 1 : 0 );
\r
1311 writer.WriteLine( "ReverseGuitar={0}", this.stセクション[ i ].bReverse.Guitar ? 1 : 0 );
\r
1312 writer.WriteLine( "ReverseBass={0}", this.stセクション[ i ].bReverse.Bass ? 1 : 0 );
\r
1313 writer.WriteLine( "TightDrums={0}", this.stセクション[ i ].bTight ? 1 : 0 );
\r
1314 writer.WriteLine( "RandomGuitar={0}", (int) this.stセクション[ i ].eRandom.Guitar );
\r
1315 writer.WriteLine( "RandomBass={0}", (int) this.stセクション[ i ].eRandom.Bass );
\r
1316 writer.WriteLine( "LightGuitar={0}", this.stセクション[ i ].bLight.Guitar ? 1 : 0 );
\r
1317 writer.WriteLine( "LightBass={0}", this.stセクション[ i ].bLight.Bass ? 1 : 0 );
\r
1318 writer.WriteLine( "LeftGuitar={0}", this.stセクション[ i ].bLeft.Guitar ? 1 : 0 );
\r
1319 writer.WriteLine( "LeftBass={0}", this.stセクション[ i ].bLeft.Bass ? 1 : 0 );
\r
1320 writer.WriteLine( "Dark={0}", (int) this.stセクション[ i ].eDark );
\r
1321 writer.WriteLine( "ScrollSpeedDrums={0}", this.stセクション[ i ].f譜面スクロール速度.Drums );
\r
1322 writer.WriteLine( "ScrollSpeedGuitar={0}", this.stセクション[ i ].f譜面スクロール速度.Guitar );
\r
1323 writer.WriteLine( "ScrollSpeedBass={0}", this.stセクション[ i ].f譜面スクロール速度.Bass );
\r
1324 writer.WriteLine( "PlaySpeed={0}/{1}", this.stセクション[ i ].n演奏速度分子, this.stセクション[ i ].n演奏速度分母 );
\r
1325 writer.WriteLine( "HHGroup={0}", (int) this.stセクション[ i ].eHHGroup );
\r
1326 writer.WriteLine( "FTGroup={0}", (int) this.stセクション[ i ].eFTGroup );
\r
1327 writer.WriteLine( "CYGroup={0}", (int) this.stセクション[ i ].eCYGroup );
\r
1328 writer.WriteLine( "HitSoundPriorityHH={0}", (int) this.stセクション[ i ].eHitSoundPriorityHH );
\r
1329 writer.WriteLine( "HitSoundPriorityFT={0}", (int) this.stセクション[ i ].eHitSoundPriorityFT );
\r
1330 writer.WriteLine( "HitSoundPriorityCY={0}", (int) this.stセクション[ i ].eHitSoundPriorityCY );
\r
1331 writer.WriteLine( "Guitar={0}", this.stセクション[ i ].bGuitar有効 ? 1 : 0 );
\r
1332 writer.WriteLine( "Drums={0}", this.stセクション[ i ].bDrums有効 ? 1 : 0 );
\r
1333 writer.WriteLine( "StageFailed={0}", this.stセクション[ i ].bSTAGEFAILED有効 ? 1 : 0 );
\r
1334 writer.WriteLine( "DamageLevel={0}", (int) this.stセクション[ i ].eダメージレベル );
\r
1335 writer.WriteLine( "UseKeyboard={0}", this.stセクション[ i ].b演奏にキーボードを使用した ? 1 : 0 );
\r
1336 writer.WriteLine( "UseMIDIIN={0}", this.stセクション[ i ].b演奏にMIDI入力を使用した ? 1 : 0 );
\r
1337 writer.WriteLine( "UseJoypad={0}", this.stセクション[ i ].b演奏にジョイパッドを使用した ? 1 : 0 );
\r
1338 writer.WriteLine( "UseMouse={0}", this.stセクション[ i ].b演奏にマウスを使用した ? 1 : 0 );
\r
1339 writer.WriteLine( "PerfectRange={0}", this.stセクション[ i ].nPerfectになる範囲ms );
\r
1340 writer.WriteLine( "GreatRange={0}", this.stセクション[ i ].nGreatになる範囲ms );
\r
1341 writer.WriteLine( "GoodRange={0}", this.stセクション[ i ].nGoodになる範囲ms );
\r
1342 writer.WriteLine( "PoorRange={0}", this.stセクション[ i ].nPoorになる範囲ms );
\r
1343 writer.WriteLine( "DTXManiaVersion={0}", this.stセクション[ i ].strDTXManiaのバージョン );
\r
1344 writer.WriteLine( "DateTime={0}", this.stセクション[ i ].最終更新日時 );
\r
1345 writer.WriteLine( "Hash={0}", this.stセクション[ i ].Hash );
\r
1349 internal void t全演奏記録セクションの整合性をチェックし不整合があればリセットする()
\r
1351 for( int i = 0; i < 9; i++ )
\r
1353 if( !this.b整合性がある( (Eセクション種別) i ) )
\r
1354 this.stセクション[ i ] = new C演奏記録();
\r
1357 internal static int tランク値を計算して返す( C演奏記録 part )
\r
1359 if( part.b演奏にMIDI入力を使用した || part.b演奏にキーボードを使用した || part.b演奏にジョイパッドを使用した || part.b演奏にマウスを使用した ) // 2010.9.11
\r
1361 int nTotal = part.nPerfect数 + part.nGreat数 + part.nGood数 + part.nPoor数 + part.nMiss数;
\r
1362 return tランク値を計算して返す( nTotal, part.nPerfect数, part.nGreat数, part.nGood数, part.nPoor数, part.nMiss数 );
\r
1364 return (int)ERANK.UNKNOWN;
\r
1366 internal static int tランク値を計算して返す( int nTotal, int nPerfect, int nGreat, int nGood, int nPoor, int nMiss )
\r
1369 return (int)ERANK.UNKNOWN;
\r
1371 //int nRank = (int)ERANK.E;
\r
1372 int nAuto = nTotal - ( nPerfect + nGreat + nGood + nPoor + nMiss );
\r
1373 if( nTotal == nAuto )
\r
1375 return (int)ERANK.SS;
\r
1377 double dRate = ( (double) ( nPerfect + nGreat ) ) / ( (double) ( nTotal - nAuto ) );
\r
1378 if( dRate == 1.0 )
\r
1380 return (int)ERANK.SS;
\r
1382 if( dRate >= 0.95 )
\r
1384 return (int)ERANK.S;
\r
1386 if( dRate >= 0.9 )
\r
1388 return (int)ERANK.A;
\r
1390 if( dRate >= 0.85 )
\r
1392 return (int)ERANK.B;
\r
1394 if( dRate >= 0.8 )
\r
1396 return (int)ERANK.C;
\r
1398 if( dRate >= 0.7 )
\r
1400 return (int)ERANK.D;
\r
1402 return (int)ERANK.E;
\r
1404 internal static double tゲーム型スキルを計算して返す( int nLevel, int nTotal, int nPerfect, int nCombo, E楽器パート inst, STAUTOPLAY bAutoPlay )
\r
1407 if( ( nTotal == 0 ) || ( ( nPerfect == 0 ) && ( nCombo == 0 ) ) )
\r
1410 ret = ( ( nLevel * ( ( nPerfect * 0.8 + nCombo * 0.2 ) / ( (double) nTotal ) ) ) / 2.0 );
\r
1411 ret *= dbCalcReviseValForDrGtBsAutoLanes( inst, bAutoPlay );
\r
1415 internal static double t演奏型スキルを計算して返す( int nTotal, int nPerfect, int nGreat, int nGood, int nPoor, int nMiss, E楽器パート inst, STAUTOPLAY bAutoPlay)
\r
1420 int nAuto = nTotal - ( nPerfect + nGreat + nGood + nPoor + nMiss );
\r
1421 double y = ( ( nPerfect * 1.0 + nGreat * 0.8 + nGood * 0.5 + nPoor * 0.2 + nMiss * 0.0 + nAuto * 0.0 ) * 100.0 ) / ( (double) nTotal );
\r
1422 double ret = ( 100.0 * ( ( Math.Pow( 1.03, y ) - 1.0 ) / ( Math.Pow( 1.03, 100.0 ) - 1.0 ) ) );
\r
1424 ret *= dbCalcReviseValForDrGtBsAutoLanes( inst, bAutoPlay );
\r
1427 internal static double dbCalcReviseValForDrGtBsAutoLanes( E楽器パート inst, STAUTOPLAY bAutoPlay ) // #28607 2012.6.7 yyagi
\r
1433 #region [ Unknown ]
\r
1434 case E楽器パート.UNKNOWN:
\r
1435 throw new ArgumentException();
\r
1438 case E楽器パート.DRUMS:
\r
1439 if ( !CDTXMania.ConfigIni.bドラムが全部オートプレイである )
\r
1441 #region [ Auto BD ]
\r
1442 if ( bAutoPlay.BD )
\r
1450 #region [ Guitar ]
\r
1451 case E楽器パート.GUITAR:
\r
1452 if ( !CDTXMania.ConfigIni.bギターが全部オートプレイである )
\r
1454 #region [ Auto Pick ]
\r
1455 if ( bAutoPlay.GtPick )
\r
1457 ret /= 2; // AutoPick時、達成率を1/2にする
\r
1460 #region [ Auto Neck ]
\r
1461 int nAutoLanes = 0;
\r
1462 if ( bAutoPlay.GtR )
\r
1466 if ( bAutoPlay.GtG )
\r
1470 if ( bAutoPlay.GtB )
\r
1474 ret /= Math.Sqrt( nAutoLanes + 1 );
\r
1481 if ( !CDTXMania.ConfigIni.bベースが全部オートプレイである )
\r
1483 #region [ Auto Pick ]
\r
1484 if ( bAutoPlay.BsPick )
\r
1486 ret /= 2; // AutoPick時、達成率を1/2にする
\r
1489 #region [ Auto lanes ]
\r
1490 int nAutoLanes = 0;
\r
1491 if ( bAutoPlay.BsR )
\r
1495 if ( bAutoPlay.BsG )
\r
1499 if ( bAutoPlay.BsB )
\r
1503 ret /= Math.Sqrt( nAutoLanes + 1 );
\r
1511 internal static string t演奏セクションのMD5を求めて返す( C演奏記録 cc )
\r
1513 StringBuilder builder = new StringBuilder();
\r
1514 builder.Append( cc.nスコア.ToString() );
\r
1515 builder.Append( cc.dbゲーム型スキル値.ToString( ".000000" ) );
\r
1516 builder.Append( cc.db演奏型スキル値.ToString( ".000000" ) );
\r
1517 builder.Append( cc.nPerfect数 );
\r
1518 builder.Append( cc.nGreat数 );
\r
1519 builder.Append( cc.nGood数 );
\r
1520 builder.Append( cc.nPoor数 );
\r
1521 builder.Append( cc.nMiss数 );
\r
1522 builder.Append( cc.n最大コンボ数 );
\r
1523 builder.Append( cc.n全チップ数 );
\r
1524 for( int i = 0; i < 10; i++ )
\r
1525 builder.Append( boolToChar( cc.bAutoPlay[ i ] ) );
\r
1526 builder.Append( boolToChar( cc.bTight ) );
\r
1527 builder.Append( boolToChar( cc.bSudden.Drums ) );
\r
1528 builder.Append( boolToChar( cc.bSudden.Guitar ) );
\r
1529 builder.Append( boolToChar( cc.bSudden.Bass ) );
\r
1530 builder.Append( boolToChar( cc.bHidden.Drums ) );
\r
1531 builder.Append( boolToChar( cc.bHidden.Guitar ) );
\r
1532 builder.Append( boolToChar( cc.bHidden.Bass ) );
\r
1533 builder.Append( (int) cc.eInvisible.Drums );
\r
1534 builder.Append( (int) cc.eInvisible.Guitar );
\r
1535 builder.Append( (int) cc.eInvisible.Bass );
\r
1536 builder.Append( boolToChar( cc.bReverse.Drums ) );
\r
1537 builder.Append( boolToChar( cc.bReverse.Guitar ) );
\r
1538 builder.Append( boolToChar( cc.bReverse.Bass ) );
\r
1539 builder.Append( (int) cc.eRandom.Guitar );
\r
1540 builder.Append( (int) cc.eRandom.Bass );
\r
1541 builder.Append( boolToChar( cc.bLight.Guitar ) );
\r
1542 builder.Append( boolToChar( cc.bLight.Bass ) );
\r
1543 builder.Append( boolToChar( cc.bLeft.Guitar ) );
\r
1544 builder.Append( boolToChar( cc.bLeft.Bass ) );
\r
1545 builder.Append( (int) cc.eDark );
\r
1546 builder.Append( cc.f譜面スクロール速度.Drums.ToString( ".000000" ) );
\r
1547 builder.Append( cc.f譜面スクロール速度.Guitar.ToString( ".000000" ) );
\r
1548 builder.Append( cc.f譜面スクロール速度.Bass.ToString( ".000000" ) );
\r
1549 builder.Append( cc.n演奏速度分子 );
\r
1550 builder.Append( cc.n演奏速度分母 );
\r
1551 builder.Append( (int) cc.eHHGroup );
\r
1552 builder.Append( (int) cc.eFTGroup );
\r
1553 builder.Append( (int) cc.eCYGroup );
\r
1554 builder.Append( (int) cc.eHitSoundPriorityHH );
\r
1555 builder.Append( (int) cc.eHitSoundPriorityFT );
\r
1556 builder.Append( (int) cc.eHitSoundPriorityCY );
\r
1557 builder.Append( boolToChar( cc.bGuitar有効 ) );
\r
1558 builder.Append( boolToChar( cc.bDrums有効 ) );
\r
1559 builder.Append( boolToChar( cc.bSTAGEFAILED有効 ) );
\r
1560 builder.Append( (int) cc.eダメージレベル );
\r
1561 builder.Append( boolToChar( cc.b演奏にキーボードを使用した ) );
\r
1562 builder.Append( boolToChar( cc.b演奏にMIDI入力を使用した ) );
\r
1563 builder.Append( boolToChar( cc.b演奏にジョイパッドを使用した ) );
\r
1564 builder.Append( boolToChar( cc.b演奏にマウスを使用した ) );
\r
1565 builder.Append( cc.nPerfectになる範囲ms );
\r
1566 builder.Append( cc.nGreatになる範囲ms );
\r
1567 builder.Append( cc.nGoodになる範囲ms );
\r
1568 builder.Append( cc.nPoorになる範囲ms );
\r
1569 builder.Append( cc.strDTXManiaのバージョン );
\r
1570 builder.Append( cc.最終更新日時 );
\r
1572 byte[] bytes = Encoding.GetEncoding( "utf-16" ).GetBytes( builder.ToString() );
\r
1573 StringBuilder builder2 = new StringBuilder(0x21);
\r
1575 MD5CryptoServiceProvider m = new MD5CryptoServiceProvider();
\r
1576 byte[] buffer2 = m.ComputeHash(bytes);
\r
1577 foreach (byte num2 in buffer2)
\r
1578 builder2.Append(num2.ToString("x2"));
\r
1580 return builder2.ToString();
\r
1582 internal static void t更新条件を取得する( out bool bDrumsを更新する, out bool bGuitarを更新する, out bool bBassを更新する )
\r
1584 bDrumsを更新する = CDTXMania.ConfigIni.bDrums有効 && CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bドラムが全部オートプレイである;
\r
1585 bGuitarを更新する = CDTXMania.ConfigIni.bGuitar有効 && CDTXMania.DTX.bチップがある.Guitar && !CDTXMania.ConfigIni.bギターが全部オートプレイである;
\r
1586 bBassを更新する = CDTXMania.ConfigIni.bGuitar有効 && CDTXMania.DTX.bチップがある.Bass && !CDTXMania.ConfigIni.bベースが全部オートプレイである;
\r
1588 internal static int t総合ランク値を計算して返す( C演奏記録 Drums, C演奏記録 Guitar, C演奏記録 Bass )
\r
1590 int nTotal = Drums.n全チップ数 + Guitar.n全チップ数 + Bass.n全チップ数;
\r
1591 int nPerfect = Drums.nPerfect数_Auto含まない + Guitar.nPerfect数_Auto含まない + Bass.nPerfect数_Auto含まない; // #24569 2011.3.1 yyagi: to calculate result rank without AUTO chips
\r
1592 int nGreat = Drums.nGreat数_Auto含まない + Guitar.nGreat数_Auto含まない + Bass.nGreat数_Auto含まない; //
\r
1593 int nGood = Drums.nGood数_Auto含まない + Guitar.nGood数_Auto含まない + Bass.nGood数_Auto含まない; //
\r
1594 int nPoor = Drums.nPoor数_Auto含まない + Guitar.nPoor数_Auto含まない + Bass.nPoor数_Auto含まない; //
\r
1595 int nMiss = Drums.nMiss数_Auto含まない + Guitar.nMiss数_Auto含まない + Bass.nMiss数_Auto含まない; //
\r
1596 return tランク値を計算して返す( nTotal, nPerfect, nGreat, nGood, nPoor, nMiss );
\r
1601 #region [ private ]
\r
1602 //-----------------
\r
1603 private bool ONorOFF( char c )
\r
1605 return ( c != '0' );
\r
1607 private static char boolToChar( bool b )
\r
1615 //-----------------
\r