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 // --------------------------------/
\r
34 public int HistoryCount;
\r
35 public string[] History;
\r
36 public int BGMAdjust;
\r
40 public STセクション stセクション;
\r
41 [StructLayout( LayoutKind.Sequential )]
\r
42 public struct STセクション
\r
44 public CScoreIni.C演奏記録 HiScoreDrums;
\r
45 public CScoreIni.C演奏記録 HiSkillDrums;
\r
46 public CScoreIni.C演奏記録 HiScoreGuitar;
\r
47 public CScoreIni.C演奏記録 HiSkillGuitar;
\r
48 public CScoreIni.C演奏記録 HiScoreBass;
\r
49 public CScoreIni.C演奏記録 HiSkillBass;
\r
50 public CScoreIni.C演奏記録 LastPlayDrums; // #23595 2011.1.9 ikanick
\r
51 public CScoreIni.C演奏記録 LastPlayGuitar; //
\r
52 public CScoreIni.C演奏記録 LastPlayBass; //
\r
53 public CScoreIni.C演奏記録 this[ int index ]
\r
60 return this.HiScoreDrums;
\r
63 return this.HiSkillDrums;
\r
66 return this.HiScoreGuitar;
\r
69 return this.HiSkillGuitar;
\r
72 return this.HiScoreBass;
\r
75 return this.HiSkillBass;
\r
77 // #23595 2011.1.9 ikanick
\r
79 return this.LastPlayDrums;
\r
82 return this.LastPlayGuitar;
\r
85 return this.LastPlayBass;
\r
88 throw new IndexOutOfRangeException();
\r
95 this.HiScoreDrums = value;
\r
99 this.HiSkillDrums = value;
\r
103 this.HiScoreGuitar = value;
\r
107 this.HiSkillGuitar = value;
\r
111 this.HiScoreBass = value;
\r
115 this.HiSkillBass = value;
\r
117 // #23595 2011.1.9 ikanick
\r
119 this.LastPlayDrums = value;
\r
123 this.LastPlayGuitar = value;
\r
127 this.LastPlayBass = value;
\r
129 //------------------
\r
131 throw new IndexOutOfRangeException();
\r
135 public enum Eセクション種別 : int
\r
145 LastPlayDrums = 6, // #23595 2011.1.9 ikanick
\r
146 LastPlayGuitar = 7, //
\r
147 LastPlayBass = 8, //
\r
151 public STAUTOPLAY bAutoPlay;
\r
152 public bool bDrums有効;
\r
153 public bool bGuitar有効;
\r
154 public STDGBVALUE<bool> bHidden;
\r
155 public STDGBVALUE<bool> bLeft;
\r
156 public STDGBVALUE<bool> bLight;
\r
157 public STDGBVALUE<bool> bReverse;
\r
158 public bool bSTAGEFAILED有効;
\r
159 public STDGBVALUE<bool> bSudden;
\r
160 public bool bTight;
\r
161 public bool b演奏にMIDI入力を使用した;
\r
162 public bool b演奏にキーボードを使用した;
\r
163 public bool b演奏にジョイパッドを使用した;
\r
164 public bool b演奏にマウスを使用した;
\r
165 public double dbゲーム型スキル値;
\r
166 public double db演奏型スキル値;
\r
167 public ECYGroup eCYGroup;
\r
168 public Eダークモード eDark;
\r
169 public EFTGroup eFTGroup;
\r
170 public EHHGroup eHHGroup;
\r
171 public E打ち分け時の再生の優先順位 eHitSoundPriorityCY;
\r
172 public E打ち分け時の再生の優先順位 eHitSoundPriorityFT;
\r
173 public E打ち分け時の再生の優先順位 eHitSoundPriorityHH;
\r
174 public STDGBVALUE<Eランダムモード> eRandom;
\r
175 public Eダメージレベル eダメージレベル;
\r
176 public STDGBVALUE<float> f譜面スクロール速度;
\r
177 public string Hash;
\r
178 public int nGoodになる範囲ms;
\r
180 public int nGreatになる範囲ms;
\r
181 public int nGreat数;
\r
183 public int nPerfectになる範囲ms;
\r
184 public int nPerfect数;
\r
185 public int nPoorになる範囲ms;
\r
188 public int n演奏速度分子;
\r
189 public int n演奏速度分母;
\r
190 public int n最大コンボ数;
\r
192 public string strDTXManiaのバージョン;
\r
193 public bool レーン9モード;
\r
194 public string 最終更新日時;
\r
198 this.bAutoPlay = new STAUTOPLAY();
\r
199 this.bAutoPlay.LC = false;
\r
200 this.bAutoPlay.HH = false;
\r
201 this.bAutoPlay.SD = false;
\r
202 this.bAutoPlay.BD = false;
\r
203 this.bAutoPlay.HT = false;
\r
204 this.bAutoPlay.LT = false;
\r
205 this.bAutoPlay.FT = false;
\r
206 this.bAutoPlay.CY = false;
\r
207 this.bAutoPlay.Guitar = false;
\r
208 this.bAutoPlay.Bass = false;
\r
209 this.bSudden = new STDGBVALUE<bool>();
\r
210 this.bSudden.Drums = false;
\r
211 this.bSudden.Guitar = false;
\r
212 this.bSudden.Bass = false;
\r
213 this.bHidden = new STDGBVALUE<bool>();
\r
214 this.bHidden.Drums = false;
\r
215 this.bHidden.Guitar = false;
\r
216 this.bHidden.Bass = false;
\r
217 this.bReverse = new STDGBVALUE<bool>();
\r
218 this.bReverse.Drums = false;
\r
219 this.bReverse.Guitar = false;
\r
220 this.bReverse.Bass = false;
\r
221 this.eRandom = new STDGBVALUE<Eランダムモード>();
\r
222 this.eRandom.Drums = Eランダムモード.OFF;
\r
223 this.eRandom.Guitar = Eランダムモード.OFF;
\r
224 this.eRandom.Bass = Eランダムモード.OFF;
\r
225 this.bLight = new STDGBVALUE<bool>();
\r
226 this.bLight.Drums = false;
\r
227 this.bLight.Guitar = false;
\r
228 this.bLight.Bass = false;
\r
229 this.bLeft = new STDGBVALUE<bool>();
\r
230 this.bLeft.Drums = false;
\r
231 this.bLeft.Guitar = false;
\r
232 this.bLeft.Bass = false;
\r
233 this.f譜面スクロール速度 = new STDGBVALUE<float>();
\r
234 this.f譜面スクロール速度.Drums = 1f;
\r
235 this.f譜面スクロール速度.Guitar = 1f;
\r
236 this.f譜面スクロール速度.Bass = 1f;
\r
239 this.bGuitar有効 = true;
\r
240 this.bDrums有効 = true;
\r
241 this.bSTAGEFAILED有効 = true;
\r
242 this.eダメージレベル = Eダメージレベル.普通;
\r
243 this.nPerfectになる範囲ms = 34;
\r
244 this.nGreatになる範囲ms = 67;
\r
245 this.nGoodになる範囲ms = 84;
\r
246 this.nPoorになる範囲ms = 117;
\r
247 this.strDTXManiaのバージョン = "Unknown";
\r
249 this.Hash = "00000000000000000000000000000000";
\r
250 this.レーン9モード = true;
\r
253 public bool bフルコンボじゃない
\r
257 return !this.bフルコンボである;
\r
260 public bool bフルコンボである
\r
264 return ( ( this.n最大コンボ数 > 0 ) && ( this.n最大コンボ数 == ( this.nPerfect数 + this.nGreat数 + this.nGood数 + this.nPoor数 + this.nMiss数 ) ) );
\r
268 [StructLayout( LayoutKind.Sequential )]
\r
269 public struct STAUTOPLAY
\r
279 public bool Guitar;
\r
281 public bool this[ int index ]
\r
312 return this.Guitar;
\r
317 throw new IndexOutOfRangeException();
\r
356 this.Guitar = value;
\r
363 throw new IndexOutOfRangeException();
\r
370 /// <para>.score.ini の存在するフォルダ(絶対パス;末尾に '\' はついていない)。</para>
\r
371 /// <para>未保存などでファイル名がない場合は null。</para>
\r
373 public string iniファイルのあるフォルダ名
\r
380 /// <para>.score.ini のファイル名(絶対パス)。</para>
\r
381 /// <para>未保存などでファイル名がない場合は null。</para>
\r
383 public string iniファイル名
\r
394 this.iniファイルのあるフォルダ名 = null;
\r
395 this.iniファイル名 = null;
\r
396 STファイル stファイル = new STファイル();
\r
400 stファイル.History = new string[] { "", "", "", "", "" };
\r
401 this.stファイル = stファイル;
\r
402 STセクション stセクション = new STセクション();
\r
403 stセクション.HiScoreDrums = new C演奏記録();
\r
404 stセクション.HiSkillDrums = new C演奏記録();
\r
405 stセクション.HiScoreGuitar = new C演奏記録();
\r
406 stセクション.HiSkillGuitar = new C演奏記録();
\r
407 stセクション.HiScoreBass = new C演奏記録();
\r
408 stセクション.HiSkillBass = new C演奏記録();
\r
409 stセクション.LastPlayDrums = new C演奏記録();
\r
410 stセクション.LastPlayGuitar = new C演奏記録();
\r
411 stセクション.LastPlayBass = new C演奏記録();
\r
412 this.stセクション = stセクション;
\r
416 /// <para>初期化後にiniファイルを読み込むコンストラクタ。</para>
\r
417 /// <para>読み込んだiniに不正値があれば、それが含まれるセクションをリセットする。</para>
\r
419 public CScoreIni( string str読み込むiniファイル )
\r
422 this.t読み込み( str読み込むiniファイル );
\r
423 this.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
430 /// <para>現在の this.Record[] オブジェクトの、指定されたセクションの情報が正当であるか否かを判定する。
\r
431 /// 真偽どちらでも、その内容は書き換えない。</para>
\r
433 /// <param name="eセクション">判定するセクション。</param>
\r
434 /// <returns>正当である(整合性がある)場合は true。</returns>
\r
435 public bool b整合性がある( Eセクション種別 eセクション )
\r
437 return true; // オープンソース化に伴い、整合性チェックを無効化。(2010.10.21)
\r
441 /// 指定されたファイルの内容から MD5 値を求め、それを16進数に変換した文字列を返す。
\r
443 /// <param name="ファイル名">MD5 を求めるファイル名。</param>
\r
444 /// <returns>算出結果の MD5 を16進数で並べた文字列。</returns>
\r
445 public static string tファイルのMD5を求めて返す( string ファイル名 )
\r
447 byte[] buffer = null;
\r
448 FileStream stream = new FileStream( ファイル名, FileMode.Open, FileAccess.Read );
\r
449 buffer = new byte[ stream.Length ];
\r
450 stream.Read( buffer, 0, (int) stream.Length );
\r
452 byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash( buffer );
\r
454 StringBuilder builder = new StringBuilder( 0x21 );
\r
455 foreach( byte num in buffer2 )
\r
456 builder.Append( num.ToString( "x2" ) );
\r
458 return builder.ToString();
\r
462 /// 指定された .score.ini を読み込む。内容の真偽は判定しない。
\r
464 /// <param name="iniファイル名">読み込む .score.ini ファイルを指定します(絶対パスが安全)。</param>
\r
465 public void t読み込み( string iniファイル名 )
\r
467 this.iniファイルのあるフォルダ名 = Path.GetDirectoryName( iniファイル名 );
\r
468 this.iniファイル名 = Path.GetFileName( iniファイル名 );
\r
470 Eセクション種別 unknown = Eセクション種別.Unknown;
\r
471 if( File.Exists( iniファイル名 ) )
\r
474 StreamReader reader = new StreamReader( iniファイル名, Encoding.GetEncoding( "shift-jis" ) );
\r
475 while( ( str = reader.ReadLine() ) != null )
\r
477 str = str.Replace( '\t', ' ' ).TrimStart( new char[] { '\t', ' ' } );
\r
478 if( ( str.Length != 0 ) && ( str[ 0 ] != ';' ) )
\r
485 if( str[ 0 ] == '[' )
\r
487 StringBuilder builder = new StringBuilder( 0x20 );
\r
489 while( ( num < str.Length ) && ( str[ num ] != ']' ) )
\r
491 builder.Append( str[ num++ ] );
\r
493 string str2 = builder.ToString();
\r
494 if( str2.Equals( "File" ) )
\r
496 unknown = Eセクション種別.File;
\r
498 else if( str2.Equals( "HiScore.Drums" ) )
\r
500 unknown = Eセクション種別.HiScoreDrums;
\r
502 else if( str2.Equals( "HiSkill.Drums" ) )
\r
504 unknown = Eセクション種別.HiSkillDrums;
\r
506 else if( str2.Equals( "HiScore.Guitar" ) )
\r
508 unknown = Eセクション種別.HiScoreGuitar;
\r
510 else if( str2.Equals( "HiSkill.Guitar" ) )
\r
512 unknown = Eセクション種別.HiSkillGuitar;
\r
514 else if( str2.Equals( "HiScore.Bass" ) )
\r
516 unknown = Eセクション種別.HiScoreBass;
\r
518 else if (str2.Equals("HiSkill.Bass"))
\r
520 unknown = Eセクション種別.HiSkillBass;
\r
522 // #23595 2011.1.9 ikanick
\r
523 else if (str2.Equals("LastPlay.Drums"))
\r
525 unknown = Eセクション種別.LastPlayDrums;
\r
527 else if (str2.Equals("LastPlay.Guitar"))
\r
529 unknown = Eセクション種別.LastPlayGuitar;
\r
531 else if (str2.Equals("LastPlay.Bass"))
\r
533 unknown = Eセクション種別.LastPlayBass;
\r
535 //----------------------------------------------------
\r
538 unknown = Eセクション種別.Unknown;
\r
543 string[] strArray = str.Split( new char[] { '=' } );
\r
544 if( strArray.Length == 2 )
\r
546 str3 = strArray[ 0 ].Trim();
\r
547 str4 = strArray[ 1 ].Trim();
\r
550 case Eセクション種別.File:
\r
552 if( !str3.Equals( "Title" ) )
\r
556 this.stファイル.Title = str4;
\r
559 case Eセクション種別.HiScoreDrums:
\r
560 case Eセクション種別.HiSkillDrums:
\r
561 case Eセクション種別.HiScoreGuitar:
\r
562 case Eセクション種別.HiSkillGuitar:
\r
563 case Eセクション種別.HiScoreBass:
\r
564 case Eセクション種別.HiSkillBass:
\r
565 case Eセクション種別.LastPlayDrums:// #23595 2011.1.9 ikanick
\r
566 case Eセクション種別.LastPlayGuitar:
\r
567 case Eセクション種別.LastPlayBass:
\r
569 c演奏記録 = this.stセクション[ (int) unknown ];
\r
570 if( !str3.Equals( "Score" ) )
\r
574 c演奏記録.nスコア = long.Parse( str4 );
\r
582 if( str3.Equals( "Name" ) )
\r
584 this.stファイル.Name = str4;
\r
586 else if( str3.Equals( "Hash" ) )
\r
588 this.stファイル.Hash = str4;
\r
590 else if( str3.Equals( "PlayCountDrums" ) )
\r
592 this.stファイル.PlayCountDrums = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0x5f5e0ff, 0 );
\r
594 else if( str3.Equals( "PlayCountGuitars" ) )// #23596 11.2.5 changed ikanick
\r
596 this.stファイル.PlayCountGuitar = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0x5f5e0ff, 0 );
\r
598 else if( str3.Equals( "PlayCountBass" ) )
\r
600 this.stファイル.PlayCountBass = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0x5f5e0ff, 0 );
\r
602 // #23596 10.11.16 add ikanick------------------------------------/
\r
603 else if (str3.Equals("ClearCountDrums"))
\r
605 this.stファイル.ClearCountDrums = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 0x5f5e0ff, 0);
\r
607 else if (str3.Equals("ClearCountGuitars"))// #23596 11.2.5 changed ikanick
\r
609 this.stファイル.ClearCountGuitar = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 0x5f5e0ff, 0);
\r
611 else if (str3.Equals("ClearCountBass"))
\r
613 this.stファイル.ClearCountBass = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 0x5f5e0ff, 0);
\r
615 //----------------------------------------------------------------/
\r
616 else if( str3.Equals( "History0" ) )
\r
618 this.stファイル.History[ 0 ] = str4;
\r
620 else if( str3.Equals( "History1" ) )
\r
622 this.stファイル.History[ 1 ] = str4;
\r
624 else if( str3.Equals( "History2" ) )
\r
626 this.stファイル.History[ 2 ] = str4;
\r
628 else if( str3.Equals( "History3" ) )
\r
630 this.stファイル.History[ 3 ] = str4;
\r
632 else if( str3.Equals( "History4" ) )
\r
634 this.stファイル.History[ 4 ] = str4;
\r
636 else if( str3.Equals( "HistoryCount" ) )
\r
638 this.stファイル.HistoryCount = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0x5f5e0ff, 0 );
\r
640 else if( str3.Equals( "BGMAdjust" ) )
\r
642 this.stファイル.BGMAdjust = C変換.n値を文字列から取得して返す( str4, 0 );
\r
646 if( str3.Equals( "PlaySkill" ) )
\r
648 c演奏記録.db演奏型スキル値 = (double) decimal.Parse( str4 );
\r
650 else if( str3.Equals( "Skill" ) )
\r
652 c演奏記録.dbゲーム型スキル値 = (double) decimal.Parse( str4 );
\r
654 else if( str3.Equals( "Perfect" ) )
\r
656 c演奏記録.nPerfect数 = int.Parse( str4 );
\r
658 else if( str3.Equals( "Great" ) )
\r
660 c演奏記録.nGreat数 = int.Parse( str4 );
\r
662 else if( str3.Equals( "Good" ) )
\r
664 c演奏記録.nGood数 = int.Parse( str4 );
\r
666 else if( str3.Equals( "Poor" ) )
\r
668 c演奏記録.nPoor数 = int.Parse( str4 );
\r
670 else if( str3.Equals( "Miss" ) )
\r
672 c演奏記録.nMiss数 = int.Parse( str4 );
\r
674 else if( str3.Equals( "MaxCombo" ) )
\r
676 c演奏記録.n最大コンボ数 = int.Parse( str4 );
\r
678 else if( str3.Equals( "TotalChips" ) )
\r
680 c演奏記録.n全チップ数 = int.Parse( str4 );
\r
682 else if( str3.Equals( "AutoPlay" ) )
\r
684 if( str4.Length == 9 )
\r
686 for( int i = 0; i < 9; i++ )
\r
688 c演奏記録.bAutoPlay[ i ] = this.ONorOFF( str4[ i ] );
\r
691 else if( str4.Length == 10 )
\r
693 for( int j = 0; j < 10; j++ )
\r
695 c演奏記録.bAutoPlay[ j ] = this.ONorOFF( str4[ j ] );
\r
699 else if( str3.Equals( "TightDrums" ) )
\r
701 c演奏記録.bTight = C変換.bONorOFF( str4[ 0 ] );
\r
703 else if( str3.Equals( "SuddenDrums" ) )
\r
705 c演奏記録.bSudden.Drums = C変換.bONorOFF( str4[ 0 ] );
\r
707 else if( str3.Equals( "SuddenGuitar" ) )
\r
709 c演奏記録.bSudden.Guitar = C変換.bONorOFF( str4[ 0 ] );
\r
711 else if( str3.Equals( "SuddenBass" ) )
\r
713 c演奏記録.bSudden.Bass = C変換.bONorOFF( str4[ 0 ] );
\r
715 else if( str3.Equals( "HiddenDrums" ) )
\r
717 c演奏記録.bHidden.Drums = C変換.bONorOFF( str4[ 0 ] );
\r
719 else if( str3.Equals( "HiddenGuitar" ) )
\r
721 c演奏記録.bHidden.Guitar = C変換.bONorOFF( str4[ 0 ] );
\r
723 else if( str3.Equals( "HiddenBass" ) )
\r
725 c演奏記録.bHidden.Bass = C変換.bONorOFF( str4[ 0 ] );
\r
727 else if( str3.Equals( "ReverseDrums" ) )
\r
729 c演奏記録.bReverse.Drums = C変換.bONorOFF( str4[ 0 ] );
\r
731 else if( str3.Equals( "ReverseGuitar" ) )
\r
733 c演奏記録.bReverse.Guitar = C変換.bONorOFF( str4[ 0 ] );
\r
735 else if( str3.Equals( "ReverseBass" ) )
\r
737 c演奏記録.bReverse.Bass = C変換.bONorOFF( str4[ 0 ] );
\r
741 if( str3.Equals( "RandomGuitar" ) )
\r
743 switch( int.Parse( str4 ) )
\r
747 c演奏記録.eRandom.Guitar = Eランダムモード.OFF;
\r
752 c演奏記録.eRandom.Guitar = Eランダムモード.RANDOM;
\r
757 c演奏記録.eRandom.Guitar = Eランダムモード.SUPERRANDOM;
\r
761 throw new Exception( "RandomGuitar の値が無効です。" );
\r
763 if( str3.Equals( "RandomBass" ) )
\r
765 switch( int.Parse( str4 ) )
\r
769 c演奏記録.eRandom.Bass = Eランダムモード.OFF;
\r
774 c演奏記録.eRandom.Bass = Eランダムモード.RANDOM;
\r
779 c演奏記録.eRandom.Bass = Eランダムモード.SUPERRANDOM;
\r
783 throw new Exception( "RandomBass の値が無効です。" );
\r
785 if( str3.Equals( "LightGuitar" ) )
\r
787 c演奏記録.bLight.Guitar = C変換.bONorOFF( str4[ 0 ] );
\r
789 else if( str3.Equals( "LightBass" ) )
\r
791 c演奏記録.bLight.Bass = C変換.bONorOFF( str4[ 0 ] );
\r
793 else if( str3.Equals( "LeftGuitar" ) )
\r
795 c演奏記録.bLeft.Guitar = C変換.bONorOFF( str4[ 0 ] );
\r
797 else if( str3.Equals( "LeftBass" ) )
\r
799 c演奏記録.bLeft.Bass = C変換.bONorOFF( str4[ 0 ] );
\r
803 if( str3.Equals( "Dark" ) )
\r
805 switch( int.Parse( str4 ) )
\r
809 c演奏記録.eDark = Eダークモード.OFF;
\r
814 c演奏記録.eDark = Eダークモード.HALF;
\r
819 c演奏記録.eDark = Eダークモード.FULL;
\r
823 throw new Exception( "Dark の値が無効です。" );
\r
825 if( str3.Equals( "ScrollSpeedDrums" ) )
\r
827 c演奏記録.f譜面スクロール速度.Drums = (float) decimal.Parse( str4 );
\r
829 else if( str3.Equals( "ScrollSpeedGuitar" ) )
\r
831 c演奏記録.f譜面スクロール速度.Guitar = (float) decimal.Parse( str4 );
\r
833 else if( str3.Equals( "ScrollSpeedBass" ) )
\r
835 c演奏記録.f譜面スクロール速度.Bass = (float) decimal.Parse( str4 );
\r
837 else if( str3.Equals( "PlaySpeed" ) )
\r
839 string[] strArray2 = str4.Split( new char[] { '/' } );
\r
840 if( strArray2.Length == 2 )
\r
842 c演奏記録.n演奏速度分子 = int.Parse( strArray2[ 0 ] );
\r
843 c演奏記録.n演奏速度分母 = int.Parse( strArray2[ 1 ] );
\r
848 if( str3.Equals( "HHGroup" ) )
\r
850 switch( int.Parse( str4 ) )
\r
854 c演奏記録.eHHGroup = EHHGroup.全部打ち分ける;
\r
859 c演奏記録.eHHGroup = EHHGroup.ハイハットのみ打ち分ける;
\r
864 c演奏記録.eHHGroup = EHHGroup.左シンバルのみ打ち分ける;
\r
869 c演奏記録.eHHGroup = EHHGroup.全部共通;
\r
873 throw new Exception( "HHGroup の値が無効です。" );
\r
875 if( str3.Equals( "FTGroup" ) )
\r
877 switch( int.Parse( str4 ) )
\r
881 c演奏記録.eFTGroup = EFTGroup.打ち分ける;
\r
886 c演奏記録.eFTGroup = EFTGroup.共通;
\r
890 throw new Exception( "FTGroup の値が無効です。" );
\r
892 if( str3.Equals( "CYGroup" ) )
\r
894 switch( int.Parse( str4 ) )
\r
898 c演奏記録.eCYGroup = ECYGroup.打ち分ける;
\r
903 c演奏記録.eCYGroup = ECYGroup.共通;
\r
907 throw new Exception( "CYGroup の値が無効です。" );
\r
909 if( str3.Equals( "HitSoundPriorityHH" ) )
\r
911 switch( int.Parse( str4 ) )
\r
915 c演奏記録.eHitSoundPriorityHH = E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
920 c演奏記録.eHitSoundPriorityHH = E打ち分け時の再生の優先順位.PadがChipより優先;
\r
924 throw new Exception( "HitSoundPriorityHH の値が無効です。" );
\r
926 if( str3.Equals( "HitSoundPriorityFT" ) )
\r
928 switch( int.Parse( str4 ) )
\r
932 c演奏記録.eHitSoundPriorityFT = E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
937 c演奏記録.eHitSoundPriorityFT = E打ち分け時の再生の優先順位.PadがChipより優先;
\r
941 throw new Exception( "HitSoundPriorityFT の値が無効です。" );
\r
943 if( str3.Equals( "HitSoundPriorityCY" ) )
\r
945 switch( int.Parse( str4 ) )
\r
949 c演奏記録.eHitSoundPriorityCY = E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
954 c演奏記録.eHitSoundPriorityCY = E打ち分け時の再生の優先順位.PadがChipより優先;
\r
958 throw new Exception( "HitSoundPriorityCY の値が無効です。" );
\r
960 if( str3.Equals( "Guitar" ) )
\r
962 c演奏記録.bGuitar有効 = C変換.bONorOFF( str4[ 0 ] );
\r
964 else if( str3.Equals( "Drums" ) )
\r
966 c演奏記録.bDrums有効 = C変換.bONorOFF( str4[ 0 ] );
\r
968 else if( str3.Equals( "StageFailed" ) )
\r
970 c演奏記録.bSTAGEFAILED有効 = C変換.bONorOFF( str4[ 0 ] );
\r
974 if( str3.Equals( "DamageLevel" ) )
\r
976 switch( int.Parse( str4 ) )
\r
980 c演奏記録.eダメージレベル = Eダメージレベル.少ない;
\r
985 c演奏記録.eダメージレベル = Eダメージレベル.普通;
\r
990 c演奏記録.eダメージレベル = Eダメージレベル.大きい;
\r
994 throw new Exception( "DamageLevel の値が無効です。" );
\r
996 if( str3.Equals( "UseKeyboard" ) )
\r
998 c演奏記録.b演奏にキーボードを使用した = C変換.bONorOFF( str4[ 0 ] );
\r
1000 else if( str3.Equals( "UseMIDIIN" ) )
\r
1002 c演奏記録.b演奏にMIDI入力を使用した = C変換.bONorOFF( str4[ 0 ] );
\r
1004 else if( str3.Equals( "UseJoypad" ) )
\r
1006 c演奏記録.b演奏にジョイパッドを使用した = C変換.bONorOFF( str4[ 0 ] );
\r
1008 else if( str3.Equals( "UseMouse" ) )
\r
1010 c演奏記録.b演奏にマウスを使用した = C変換.bONorOFF( str4[ 0 ] );
\r
1012 else if( str3.Equals( "PerfectRange" ) )
\r
1014 c演奏記録.nPerfectになる範囲ms = int.Parse( str4 );
\r
1016 else if( str3.Equals( "GreatRange" ) )
\r
1018 c演奏記録.nGreatになる範囲ms = int.Parse( str4 );
\r
1020 else if( str3.Equals( "GoodRange" ) )
\r
1022 c演奏記録.nGoodになる範囲ms = int.Parse( str4 );
\r
1024 else if( str3.Equals( "PoorRange" ) )
\r
1026 c演奏記録.nPoorになる範囲ms = int.Parse( str4 );
\r
1028 else if( str3.Equals( "DTXManiaVersion" ) )
\r
1030 c演奏記録.strDTXManiaのバージョン = str4;
\r
1032 else if( str3.Equals( "DateTime" ) )
\r
1034 c演奏記録.最終更新日時 = str4;
\r
1036 else if( str3.Equals( "Hash" ) )
\r
1038 c演奏記録.Hash = str4;
\r
1040 else if( str3.Equals( "9LaneMode" ) )
\r
1042 c演奏記録.レーン9モード = C変換.bONorOFF( str4[ 0 ] );
\r
1050 catch( Exception exception )
\r
1052 Trace.TraceError( "{0}読み込みを中断します。({1})", new object[] { exception.Message, iniファイル名 } );
\r
1061 internal void tヒストリを追加する( string str追加文字列 )
\r
1063 this.stファイル.HistoryCount++;
\r
1064 for( int i = 3; i >= 0; i-- )
\r
1065 this.stファイル.History[ i + 1 ] = this.stファイル.History[ i ];
\r
1066 DateTime now = DateTime.Now;
\r
1067 this.stファイル.History[ 0 ] = string.Format( "{0:0}.{1:D2}/{2}/{3} {4}", new object[] { this.stファイル.HistoryCount, now.Year % 100, now.Month, now.Day, str追加文字列 } );
\r
1069 internal void t書き出し( string iniファイル名 )
\r
1071 this.iniファイルのあるフォルダ名 = Path.GetDirectoryName( iniファイル名 );
\r
1072 this.iniファイル名 = Path.GetFileName( iniファイル名 );
\r
1074 StreamWriter writer = new StreamWriter( iniファイル名, false, Encoding.GetEncoding( "shift-jis" ) );
\r
1075 writer.WriteLine( "[File]" );
\r
1076 writer.WriteLine( "Title={0}", this.stファイル.Title );
\r
1077 writer.WriteLine( "Name={0}", this.stファイル.Name );
\r
1078 writer.WriteLine( "Hash={0}", this.stファイル.Hash );
\r
1079 writer.WriteLine( "PlayCountDrums={0}", this.stファイル.PlayCountDrums );
\r
1080 writer.WriteLine( "PlayCountGuitars={0}", this.stファイル.PlayCountGuitar );
\r
1081 writer.WriteLine( "PlayCountBass={0}", this.stファイル.PlayCountBass );
\r
1082 writer.WriteLine( "ClearCountDrums={0}", this.stファイル.ClearCountDrums ); // #23596 10.11.16 add ikanick
\r
1083 writer.WriteLine( "ClearCountGuitars={0}", this.stファイル.ClearCountGuitar ); //
\r
1084 writer.WriteLine( "ClearCountBass={0}", this.stファイル.ClearCountBass ); //
\r
1085 writer.WriteLine( "HistoryCount={0}", this.stファイル.HistoryCount );
\r
1086 writer.WriteLine( "History0={0}", this.stファイル.History[ 0 ] );
\r
1087 writer.WriteLine( "History1={0}", this.stファイル.History[ 1 ] );
\r
1088 writer.WriteLine( "History2={0}", this.stファイル.History[ 2 ] );
\r
1089 writer.WriteLine( "History3={0}", this.stファイル.History[ 3 ] );
\r
1090 writer.WriteLine( "History4={0}", this.stファイル.History[ 4 ] );
\r
1091 writer.WriteLine( "BGMAdjust={0}", this.stファイル.BGMAdjust );
\r
1092 writer.WriteLine();
\r
1093 for( int i = 0; i < 9; i++ )
\r
1095 string[] strArray = new string[] { "HiScore.Drums", "HiSkill.Drums", "HiScore.Guitar", "HiSkill.Guitar", "HiScore.Bass", "HiSkill.Bass", "LastPlay.Drums", "LastPlay.Guitar", "LastPlay.Bass" };
\r
1096 writer.WriteLine( "[{0}]", strArray[ i ] );
\r
1097 writer.WriteLine( "Score={0}", this.stセクション[ i ].nスコア );
\r
1098 writer.WriteLine( "PlaySkill={0}", this.stセクション[ i ].db演奏型スキル値 );
\r
1099 writer.WriteLine( "Skill={0}", this.stセクション[ i ].dbゲーム型スキル値 );
\r
1100 writer.WriteLine( "Perfect={0}", this.stセクション[ i ].nPerfect数 );
\r
1101 writer.WriteLine( "Great={0}", this.stセクション[ i ].nGreat数 );
\r
1102 writer.WriteLine( "Good={0}", this.stセクション[ i ].nGood数 );
\r
1103 writer.WriteLine( "Poor={0}", this.stセクション[ i ].nPoor数 );
\r
1104 writer.WriteLine( "Miss={0}", this.stセクション[ i ].nMiss数 );
\r
1105 writer.WriteLine( "MaxCombo={0}", this.stセクション[ i ].n最大コンボ数 );
\r
1106 writer.WriteLine( "TotalChips={0}", this.stセクション[ i ].n全チップ数 );
\r
1107 writer.Write( "AutoPlay=" );
\r
1108 for( int j = 0; j < 10; j++ )
\r
1110 writer.Write( this.stセクション[ i ].bAutoPlay[ j ] ? 1 : 0 );
\r
1112 writer.WriteLine();
\r
1113 writer.WriteLine( "SuddenDrums={0}", this.stセクション[ i ].bSudden.Drums ? 1 : 0 );
\r
1114 writer.WriteLine( "SuddenGuitar={0}", this.stセクション[ i ].bSudden.Guitar ? 1 : 0 );
\r
1115 writer.WriteLine( "SuddenBass={0}", this.stセクション[ i ].bSudden.Bass ? 1 : 0 );
\r
1116 writer.WriteLine( "HiddenDrums={0}", this.stセクション[ i ].bHidden.Drums ? 1 : 0 );
\r
1117 writer.WriteLine( "HiddenGuitar={0}", this.stセクション[ i ].bHidden.Guitar ? 1 : 0 );
\r
1118 writer.WriteLine( "HiddenBass={0}", this.stセクション[ i ].bHidden.Bass ? 1 : 0 );
\r
1119 writer.WriteLine( "ReverseDrums={0}", this.stセクション[ i ].bReverse.Drums ? 1 : 0 );
\r
1120 writer.WriteLine( "ReverseGuitar={0}", this.stセクション[ i ].bReverse.Guitar ? 1 : 0 );
\r
1121 writer.WriteLine( "ReverseBass={0}", this.stセクション[ i ].bReverse.Bass ? 1 : 0 );
\r
1122 writer.WriteLine( "TightDrums={0}", this.stセクション[ i ].bTight ? 1 : 0 );
\r
1123 writer.WriteLine( "RandomGuitar={0}", (int) this.stセクション[ i ].eRandom.Guitar );
\r
1124 writer.WriteLine( "RandomBass={0}", (int) this.stセクション[ i ].eRandom.Bass );
\r
1125 writer.WriteLine( "LightGuitar={0}", this.stセクション[ i ].bLight.Guitar ? 1 : 0 );
\r
1126 writer.WriteLine( "LightBass={0}", this.stセクション[ i ].bLight.Bass ? 1 : 0 );
\r
1127 writer.WriteLine( "LeftGuitar={0}", this.stセクション[ i ].bLeft.Guitar ? 1 : 0 );
\r
1128 writer.WriteLine( "LeftBass={0}", this.stセクション[ i ].bLeft.Bass ? 1 : 0 );
\r
1129 writer.WriteLine( "Dark={0}", (int) this.stセクション[ i ].eDark );
\r
1130 writer.WriteLine( "ScrollSpeedDrums={0}", this.stセクション[ i ].f譜面スクロール速度.Drums );
\r
1131 writer.WriteLine( "ScrollSpeedGuitar={0}", this.stセクション[ i ].f譜面スクロール速度.Guitar );
\r
1132 writer.WriteLine( "ScrollSpeedBass={0}", this.stセクション[ i ].f譜面スクロール速度.Bass );
\r
1133 writer.WriteLine( "PlaySpeed={0}/{1}", this.stセクション[ i ].n演奏速度分子, this.stセクション[ i ].n演奏速度分母 );
\r
1134 writer.WriteLine( "HHGroup={0}", (int) this.stセクション[ i ].eHHGroup );
\r
1135 writer.WriteLine( "FTGroup={0}", (int) this.stセクション[ i ].eFTGroup );
\r
1136 writer.WriteLine( "CYGroup={0}", (int) this.stセクション[ i ].eCYGroup );
\r
1137 writer.WriteLine( "HitSoundPriorityHH={0}", (int) this.stセクション[ i ].eHitSoundPriorityHH );
\r
1138 writer.WriteLine( "HitSoundPriorityFT={0}", (int) this.stセクション[ i ].eHitSoundPriorityFT );
\r
1139 writer.WriteLine( "HitSoundPriorityCY={0}", (int) this.stセクション[ i ].eHitSoundPriorityCY );
\r
1140 writer.WriteLine( "Guitar={0}", this.stセクション[ i ].bGuitar有効 ? 1 : 0 );
\r
1141 writer.WriteLine( "Drums={0}", this.stセクション[ i ].bDrums有効 ? 1 : 0 );
\r
1142 writer.WriteLine( "StageFailed={0}", this.stセクション[ i ].bSTAGEFAILED有効 ? 1 : 0 );
\r
1143 writer.WriteLine( "DamageLevel={0}", (int) this.stセクション[ i ].eダメージレベル );
\r
1144 writer.WriteLine( "UseKeyboard={0}", this.stセクション[ i ].b演奏にキーボードを使用した ? 1 : 0 );
\r
1145 writer.WriteLine( "UseMIDIIN={0}", this.stセクション[ i ].b演奏にMIDI入力を使用した ? 1 : 0 );
\r
1146 writer.WriteLine( "UseJoypad={0}", this.stセクション[ i ].b演奏にジョイパッドを使用した ? 1 : 0 );
\r
1147 writer.WriteLine( "UseMouse={0}", this.stセクション[ i ].b演奏にマウスを使用した ? 1 : 0 );
\r
1148 writer.WriteLine( "PerfectRange={0}", this.stセクション[ i ].nPerfectになる範囲ms );
\r
1149 writer.WriteLine( "GreatRange={0}", this.stセクション[ i ].nGreatになる範囲ms );
\r
1150 writer.WriteLine( "GoodRange={0}", this.stセクション[ i ].nGoodになる範囲ms );
\r
1151 writer.WriteLine( "PoorRange={0}", this.stセクション[ i ].nPoorになる範囲ms );
\r
1152 writer.WriteLine( "DTXManiaVersion={0}", this.stセクション[ i ].strDTXManiaのバージョン );
\r
1153 writer.WriteLine( "DateTime={0}", this.stセクション[ i ].最終更新日時 );
\r
1154 writer.WriteLine( "Hash={0}", this.stセクション[ i ].Hash );
\r
1158 internal void t全演奏記録セクションの整合性をチェックし不整合があればリセットする()
\r
1160 for( int i = 0; i < 9; i++ )
\r
1162 if( !this.b整合性がある( (Eセクション種別) i ) )
\r
1163 this.stセクション[ i ] = new C演奏記録();
\r
1166 internal static int tランク値を計算して返す( C演奏記録 part )
\r
1168 if( part.b演奏にMIDI入力を使用した || part.b演奏にキーボードを使用した || part.b演奏にジョイパッドを使用した || part.b演奏にマウスを使用した ) // 2010.9.11
\r
1170 int nTotal = ( ( ( part.nPerfect数 + part.nGreat数 ) + part.nGood数 ) + part.nPoor数 ) + part.nMiss数;
\r
1171 return tランク値を計算して返す( nTotal, part.nPerfect数, part.nGreat数, part.nGood数, part.nPoor数, part.nMiss数 );
\r
1175 internal static int tランク値を計算して返す( int nTotal, int nPerfect, int nGreat, int nGood, int nPoor, int nMiss )
\r
1181 int num2 = nTotal - ( ( ( ( nPerfect + nGreat ) + nGood ) + nPoor ) + nMiss );
\r
1182 if( nTotal == num2 )
\r
1186 double num3 = ( (double) ( nPerfect + nGreat ) ) / ( (double) ( nTotal - num2 ) );
\r
1191 if( num3 >= 0.95 )
\r
1199 if( num3 >= 0.85 )
\r
1213 internal static double tゲーム型スキルを計算して返す( int nLevel, int nTotal, int nPerfect, int nCombo )
\r
1215 if( ( nTotal == 0 ) || ( ( nPerfect == 0 ) && ( nCombo == 0 ) ) )
\r
1218 return ( ( nLevel * ( ( ( nPerfect * 0.8 ) + ( nCombo * 0.2 ) ) / ( (double) nTotal ) ) ) / 2.0 );
\r
1220 internal static double t演奏型スキルを計算して返す( int nTotal, int nPerfect, int nGreat, int nGood, int nPoor, int nMiss )
\r
1225 int num = nTotal - ( ( ( ( nPerfect + nGreat ) + nGood ) + nPoor ) + nMiss );
\r
1226 double y = ( ( ( ( ( ( ( nPerfect * 1.0 ) + ( nGreat * 0.8 ) ) + ( nGood * 0.5 ) ) + ( nPoor * 0.2 ) ) + ( nMiss * 0.0 ) ) + ( num * 0.0 ) ) * 100.0 ) / ( (double) nTotal );
\r
1227 return ( 100.0 * ( ( Math.Pow( 1.03, y ) - 1.0 ) / ( Math.Pow( 1.03, 100.0 ) - 1.0 ) ) );
\r
1229 internal static string t演奏セクションのMD5を求めて返す( C演奏記録 cc )
\r
1231 StringBuilder builder = new StringBuilder();
\r
1232 builder.Append( cc.nスコア.ToString() );
\r
1233 builder.Append( cc.dbゲーム型スキル値.ToString( ".000000" ) );
\r
1234 builder.Append( cc.db演奏型スキル値.ToString( ".000000" ) );
\r
1235 builder.Append( cc.nPerfect数 );
\r
1236 builder.Append( cc.nGreat数 );
\r
1237 builder.Append( cc.nGood数 );
\r
1238 builder.Append( cc.nPoor数 );
\r
1239 builder.Append( cc.nMiss数 );
\r
1240 builder.Append( cc.n最大コンボ数 );
\r
1241 builder.Append( cc.n全チップ数 );
\r
1242 for( int i = 0; i < 10; i++ )
\r
1243 builder.Append( boolToChar( cc.bAutoPlay[ i ] ) );
\r
1244 builder.Append( boolToChar( cc.bTight ) );
\r
1245 builder.Append( boolToChar( cc.bSudden.Drums ) );
\r
1246 builder.Append( boolToChar( cc.bSudden.Guitar ) );
\r
1247 builder.Append( boolToChar( cc.bSudden.Bass ) );
\r
1248 builder.Append( boolToChar( cc.bHidden.Drums ) );
\r
1249 builder.Append( boolToChar( cc.bHidden.Guitar ) );
\r
1250 builder.Append( boolToChar( cc.bHidden.Bass ) );
\r
1251 builder.Append( boolToChar( cc.bReverse.Drums ) );
\r
1252 builder.Append( boolToChar( cc.bReverse.Guitar ) );
\r
1253 builder.Append( boolToChar( cc.bReverse.Bass ) );
\r
1254 builder.Append( (int) cc.eRandom.Guitar );
\r
1255 builder.Append( (int) cc.eRandom.Bass );
\r
1256 builder.Append( boolToChar( cc.bLight.Guitar ) );
\r
1257 builder.Append( boolToChar( cc.bLight.Bass ) );
\r
1258 builder.Append( boolToChar( cc.bLeft.Guitar ) );
\r
1259 builder.Append( boolToChar( cc.bLeft.Bass ) );
\r
1260 builder.Append( (int) cc.eDark );
\r
1261 builder.Append( cc.f譜面スクロール速度.Drums.ToString( ".000000" ) );
\r
1262 builder.Append( cc.f譜面スクロール速度.Guitar.ToString( ".000000" ) );
\r
1263 builder.Append( cc.f譜面スクロール速度.Bass.ToString( ".000000" ) );
\r
1264 builder.Append( cc.n演奏速度分子 );
\r
1265 builder.Append( cc.n演奏速度分母 );
\r
1266 builder.Append( (int) cc.eHHGroup );
\r
1267 builder.Append( (int) cc.eFTGroup );
\r
1268 builder.Append( (int) cc.eCYGroup );
\r
1269 builder.Append( (int) cc.eHitSoundPriorityHH );
\r
1270 builder.Append( (int) cc.eHitSoundPriorityFT );
\r
1271 builder.Append( (int) cc.eHitSoundPriorityCY );
\r
1272 builder.Append( boolToChar( cc.bGuitar有効 ) );
\r
1273 builder.Append( boolToChar( cc.bDrums有効 ) );
\r
1274 builder.Append( boolToChar( cc.bSTAGEFAILED有効 ) );
\r
1275 builder.Append( (int) cc.eダメージレベル );
\r
1276 builder.Append( boolToChar( cc.b演奏にキーボードを使用した ) );
\r
1277 builder.Append( boolToChar( cc.b演奏にMIDI入力を使用した ) );
\r
1278 builder.Append( boolToChar( cc.b演奏にジョイパッドを使用した ) );
\r
1279 builder.Append( boolToChar( cc.b演奏にマウスを使用した ) );
\r
1280 builder.Append( cc.nPerfectになる範囲ms );
\r
1281 builder.Append( cc.nGreatになる範囲ms );
\r
1282 builder.Append( cc.nGoodになる範囲ms );
\r
1283 builder.Append( cc.nPoorになる範囲ms );
\r
1284 builder.Append( cc.strDTXManiaのバージョン );
\r
1285 builder.Append( cc.最終更新日時 );
\r
1287 byte[] bytes = Encoding.GetEncoding( "shift-jis" ).GetBytes( builder.ToString() );
\r
1288 byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash( bytes );
\r
1289 StringBuilder builder2 = new StringBuilder( 0x21 );
\r
1290 foreach( byte num2 in buffer2 )
\r
1291 builder2.Append( num2.ToString( "x2" ) );
\r
1293 return builder2.ToString();
\r
1295 internal static void t更新条件を取得する( out bool bDrumsを更新する, out bool bGuitarを更新する, out bool bBassを更新する )
\r
1297 bDrumsを更新する = ( CDTXMania.ConfigIni.bDrums有効 && CDTXMania.DTX.bチップがある.Drums ) && !CDTXMania.ConfigIni.bドラムが全部オートプレイである;
\r
1298 bGuitarを更新する = ( CDTXMania.ConfigIni.bGuitar有効 && CDTXMania.DTX.bチップがある.Guitar ) && !CDTXMania.ConfigIni.bAutoPlay.Guitar;
\r
1299 bBassを更新する = ( CDTXMania.ConfigIni.bGuitar有効 && CDTXMania.DTX.bチップがある.Bass ) && !CDTXMania.ConfigIni.bAutoPlay.Bass;
\r
1301 internal static int t総合ランク値を計算して返す( C演奏記録 Drums, C演奏記録 Guitar, C演奏記録 Bass )
\r
1303 int nPerfect = ( Drums.nPerfect数 + Guitar.nPerfect数 ) + Bass.nPerfect数;
\r
1304 int nGreat = ( Drums.nGreat数 + Guitar.nGreat数 ) + Bass.nGreat数;
\r
1305 int nGood = ( Drums.nGood数 + Guitar.nGood数 ) + Bass.nGood数;
\r
1306 int nPoor = ( Drums.nPoor数 + Guitar.nPoor数 ) + Bass.nPoor数;
\r
1307 int nMiss = ( Drums.nMiss数 + Guitar.nMiss数 ) + Bass.nMiss数;
\r
1308 return tランク値を計算して返す( ( ( ( nPerfect + nGreat ) + nGood ) + nPoor ) + nMiss, nPerfect, nGreat, nGood, nPoor, nMiss );
\r
1314 #region [ private ]
\r
1315 //-----------------
\r
1316 private bool ONorOFF( char c )
\r
1318 return ( c != '0' );
\r
1320 private static char boolToChar( bool b )
\r
1328 //-----------------
\r