1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Runtime.Serialization;
4 using System.Diagnostics;
8 using SlimDXKey = SlimDX.DirectInput.Key;
13 /// DataContract はフィールドまたはプロパティを XML にシリアライズできます。
14 /// DataMember が付いているメンバだけがシリアライズされます。シリアライズ可能な型については MSDN を参照してください。
15 /// DataMember が付いていないメンバはデシリアライズ時に別途指定される既定値になります。
16 /// これらは OnDeserialized 属性がついたメソッドで処理します。
19 /// ・新しいバージョンで EnumMember, DataMember の 変数名を変更しないでください。
20 /// 変更しても以前の値を保持したい場合は Name プロパティ (EnumMember の場合 Value プロパティ) に前の名前を入力してください。
21 /// (例 : [DataMember(Name="old_hoge")]。
22 /// ・DataMember の 型を変更しないでください。
23 /// ・使用しなくなった DataMember を削除しないでください。
24 /// ・デシリアライズで例外が起きた場合 Config.xml はリセットされます。
26 /// ---- 新しくオプションを追加する場合 ----
28 /// ・DTXMania の新しいバージョンで DataMember を追加する場合 Order 属性値を設定してください。
29 /// 値は他の DataMember の Order 値の中でもっとも大きい値 +1 (無い場合 1 あるいは DTXMania のバージョン) としてください。
30 /// (例: [DataMember(Order=1 / Order=105 etc.. )]public OptionInteger new_hoge;
31 /// 異なる DataMember が同じ Order 値を持っていても構いません。
32 /// ・DataMember に関連する型には原則 DataContract が必要です (enum など)。
33 /// これがないと正しくシリアライズ / デシリアライズできません。
34 /// ・メンバは Deserializing メソッドでインスタンスを生成してください。
35 /// ・DefaultDeserializer で説明文や制約を設定 (Initialize メソッド) してください。
36 /// ラベルや説明文は xml には書き出されませんので、デシリアライズ後にこの処理が必要です。
37 /// このとき Initialize しようとしている値が null でないかチェックして、
38 /// null であれば必ず Deserializing メソッド内と同様にインスタンスを生成してください。
39 /// ・CActConfigList で新しく追加した項目を list に追加してください。
42 public class CConfigXml : IExtensibleDataObject, ICloneable
44 public static readonly int AssignableCodes = 16;
47 /// ExtensibleDataObject はラウンドトリップを有効にします。
48 /// 前のバージョンの DTXMania で新しい Config.xml を読み込んだ時でも
49 /// デシリアライズされなかったメンバの情報は失われません。
51 private ExtensionDataObject extobj;
52 public ExtensionDataObject ExtensionData
65 /// とりあえずshallow copyによるClone()。
67 /// <returns>自身を複製したCConfigXmlクラス。</returns>
70 return (CConfigXml) MemberwiseClone();
77 public COptionBool bForceScalingAVI;
80 public COptionBool bAVI;
82 public COptionBool bBGA;
84 public COptionBool bBGMPlay;
86 public COptionBool bLog;
88 public COptionBool bLogDTX;
90 public COptionBool bLogEnumerateSongs;
92 public COptionBool bLogCreateRelease;
94 public COptionEnum<EJudgeDisplayPriority> eJudgePriority;
96 public COptionBool bScoreIni;
98 public COptionBool bStageFailed;
100 // #29500 2012.9.11 kairera0467 TIGHTモード
101 public COptionBool bTight;
103 public COptionBool bWaveAdjust;
105 public COptionBool bCymbalFree;
107 public COptionBool bStoicMode;
109 public COptionBool bDrumsHitSound;
111 public COptionBool bFillin;
113 public COptionBool bRandSubBox;
115 public COptionBool bDebugInfo;
117 public COptionBool bAudience;
119 public COptionBool bVSyncWait;
121 public COptionBool bItalicFontSongSelect;
123 public COptionBool bBoldFontSongSelect;
125 public COptionBool bFullScreen;
127 public COptionBool bViewerVSyncWait;
129 public COptionBool bViewerShowDebugStatus;
131 public COptionBool bViewerTimeStretch;
133 public COptionBool bViewerDrumsActive;
135 public COptionBool bViewerGuitarActive;
137 public COptionBool bBufferedInput;
139 // #25399 2011.6.9 yyagi リザルト画像自動保存機能ON/OFF
140 public COptionBool bIsAutoResultCapture;
142 // #28200 2012.5.1 yyagi System Menuの利用可否切替(使用可)
143 public COptionBool bIsEnabledSystemMenu;
145 // #28195 2012.5.6 yyagi box.defによるスキン切替機能を使用するか否か
146 public COptionBool bUseBoxDefSkin;
147 public bool bConfigIniが存在している;
149 public COptionBool bLoadSoundSpeed;
151 // #26752 2011.11.26 ダブルクリックでのフルスクリーンモード移行を許可
152 public COptionBool bIsAllowedDoubleClickFullscreen;
154 // #33689 2014.6.6 yyagi 演奏タイマーの種類,初期値はfalse (FDKのタイマー。FROM氏考案の独自タイマー)
155 public COptionBool bUseOSTimer;
158 public COptionBool bDynamicBassMixerManagement;
160 // #23664 2013.2.24 yyagi ピッチ変更無しで再生速度を変更するかどうか,初期値はfalse (再生速度変更を、ピッチ変更にて行う)
161 public COptionBool bTimeStretch;
162 [DataMember( Order = 105 )]
163 // #34825 2016.4.27 yyagi DTXMania動作中のみ、電源プランをHighpowerに変更するかどうか
164 public COptionBool bForceHighPowerPlan;
165 [DataMember( Order = 105 )]
166 // #36261 2016.4.27 yyagi WASAPI動作をevent drivenにするかどうか
167 public COptionBool bEventDrivenWASAPI;
168 [DataMember( Order = 105 )]
170 public COptionString strLanguage;
171 // public COptionStringList strLanguageList;
173 // #36177 2016.7.30 ikanick
174 [DataMember( Order = 105 )]
175 public COptionBool bLoadDTXDetail;
177 [DataMember(Order = 113)]
178 public COptionBool bShowSongPath; // #38404 2018.7.30 add yyagi
182 public COptionInteger nBGAlpha;
184 public Coordinates.CRect rcWindow;
186 public Coordinates.CRect rcWindow_backup; // Viewerとしての使用時は、Playerとして使用する際のウインドウ情報をバックアップしておき、終了時に復元する
187 // 内部保持するだけの情報であるため、Config.xmlに保存する必要はなく、[DataMember]は不要
190 public Coordinates.CRect rcViewerWindow;
193 public COptionInteger nMasterVolume;
195 public COptionInteger nSleepUnfocusMs;
197 public COptionInteger nSleepPerFrameMs;
199 public COptionInteger nPlaySpeed;
201 public COptionInteger nPreSoundWeightMs;
203 public COptionInteger nPreImageWeightMs;
205 public COptionInteger nAutoVolume;
207 public COptionInteger nChipVolume;
209 public COptionInteger nFontSizeDotSongSelect;
211 // #23559 2011.6.20 yyagi Riskyでの残ミス数。0で閉店
212 public COptionInteger nRisky;
214 // #32072 2013.10.24 yyagi Semi-Invisibleでの、チップ再表示期間
215 public COptionInteger nChipDisplayTimeMs;
217 // #32072 2013.10.24 yyagi Semi-Invisibleでの、チップフェードアウト時間
218 public COptionInteger nChipFadeoutTimeMs;
220 // #28228 2012.5.1 yyagi レーン毎の最大同時発音数
221 // #24820 2013.1.15 yyagi 初期値を4から2に変更。BASS.net使用時の負荷軽減のため。
222 // #24820 2013.1.17 yyagi 初期値を4に戻した。動的なミキサー制御がうまく動作しているため。
223 public COptionInteger nPolyphonicSounds;
225 // #24820 2013.1.15 yyagi WASAPIのバッファサイズ(WASAPI排他時)または更新間隔(WASAPI共有時)。初期値は更新間隔=2。(0で自動設定)
226 public COptionInteger nWASAPIBufferSizeMs;
230 public COptionEnum<ECYGroup> eCYGroup;
232 public COptionEnum<EDark> eDark;
234 public COptionEnum<EFTGroup> eFTGroup;
236 public COptionEnum<EHHGroup> eHHGroup;
238 // #27029 2012.1.4 from HHPedalとBassPedalのグルーピング
239 public COptionEnum<EBDGroup> eBDGroup;
241 public COptionEnum<EHitSoundPriority> eHitSoundPriorityCY;
243 public COptionEnum<EHitSoundPriority> eHitSoundPriorityFT;
245 public COptionEnum<EHitSoundPriority> eHitSoundPriorityHH;
247 public COptionEnum<EActiveInstrument> eActiveInst;
249 // #25370 2011.6.3 yyagi ズレ時間表示
250 public COptionEnum<EShowLagType> nShowLagType;
252 // #24820 2012.12.23 yyagi 初期値はACM | #31927 2013.8.25 yyagi OSにより初期値変更
253 // 出力サウンドデバイス(0=ACM(にしたいが設計がきつそうならDirectShow), 1=ASIO, 2=WASAPI)
254 public COptionEnum<ESoundDeviceTypeForConfig> nSoundDeviceType;
256 // #27029 2012.1.5 from:
257 // BDGroup が FP|BD→FP&BD に変化した際に自動変化するパラメータの値のバックアップ。FP&BD→FP|BD の時に元に戻す。
258 // これらのバックアップ値は、BDGroup が FP&BD 状態の時にのみ Config.ini に出力され、BDGroup が FP|BD に戻ったら Config.ini から消える。
259 public COptionEnum<EHHGroup> Backup1BDHHGroup;
261 public COptionEnum<EHitSoundPriority> Backup1BDPriotiry;
263 public COptionEnum<EDamage> eDamageLevel;
266 public COptionString strDTXManiaVersion;
268 public COptionString strSongDataPath;
270 public COptionString strFontSongSelect;
272 // #28195 2012.5.2 yyagi 使用中のSkinサブフォルダ名
273 public COptionString strSystemSkinSubfolderPath;
276 // #24820 2013.1.17 yyagi ASIOデバイス
277 public COptionStringList strASIODevice;
279 [DataMember( Order = 106 )]
280 public COptionEnum<EClickType> eClickType;
281 [DataMember( Order = 106 )]
282 public COptionInteger nClickHighVolume;
283 [DataMember( Order = 106 )]
284 public COptionInteger nClickLowVolume;
288 public STDGBSValue<COptionBool> bLight;
290 public STDGBSValue<COptionBool> bReverse;
292 public STDGBSValue<COptionBool> bGraph;
294 public STDGBSValue<COptionBool> bEmphasizePlaySound;
296 public STDGBSValue<COptionEnum<EAutoGhostData>> eAutoGhost;
298 public STDGBSValue<COptionEnum<ETargetGhostData>> eTargetGhost;
300 public STDGBSValue<COptionEnum<ERandom>> eRandom;
302 public STDGBSValue<COptionEnum<ESudHidInv>> eSudHidInv;
304 public STDGBSValue<COptionInteger> nMinComboDisp;
306 public STDGBSValue<COptionInteger> nScrollSpeed;
309 public STDGBSValue<COptionInteger> nInputAdjustTimeMs;
312 public STDGBSValue<COptionInteger> nJudgeLinePosOffset;
314 public STDGBSValue<COptionInteger> nViewerScrollSpeed;
317 public STDGBSValue<COptionFloat> fJudgeLinePosOffsetBase;
320 public COptionPadBool bAutoPlay;
323 // #23857 2011.1.31 yyagi VelocityMin
324 public STPadValue<COptionInteger> nVelocityMin;
326 public STPadValue<COptionKeyAssign[]> KeyAssign;
328 public STJudgeValue<COptionInteger> nHitRange;
330 public COptionDictionary<int, string> dicJoystick;
333 public STDGBSValue<COptionBool> bDisplayCombo;
335 public STDGBSValue<COptionBool> bDisplayJudge;
340 /// 楽器左端座標。ここを基準に各パーツを配置する。
343 public STDGBSValue<STInstValue<COptionInteger>> cdInstX;
345 public STInstValue<COptionInteger> cdDebugX;
347 public STInstValue<COptionInteger> cdDebugY;
349 public STInstValue<COptionInteger> cdLegacyAVIX;
351 public STInstValue<COptionInteger> cdLegacyAVIY;
353 public STDGBSValue<STInstValue<COptionInteger>> cdComboX;
355 public STDGBSValue<STInstValue<COptionInteger>> cdComboY;
357 public STDGBSValue<COptionInteger> cdJudgeLineY;
359 public STDGBSValue<COptionInteger> cdJudgeY;
361 public STLaneValue<COptionInteger> cdLaneOrder;
363 public STDGBSValue<COptionInteger> nSuddenFrom;
365 public STDGBSValue<COptionInteger> nHiddenFrom;
367 /// 旧AVIを強制的にウインドウ全体に表示するときの、X座標
368 /// (114で...FullMovieXから...ScalewdMovieXに改名)
370 [DataMember(Order = 114)]
371 public STInstValue<COptionInteger> cdForceScaledMovieX; // #38362 2018.7.19 add yyagi
373 /// 旧AVIを強制的にウインドウ全体に表示するときの、Y座標
374 /// (114で...FullMovieYから...ScalewdMovieYに改名)
376 [DataMember(Order = 114)]
377 public STInstValue<COptionInteger> cdForceScaledMovieY; // #38362 2018.7.19 add yyagi
379 /// 旧AVIを強制的にウインドウ全体に表示するときに、センタリング表示するかどうか
382 //[DataMember(Order = 113)]
383 //public STInstValue<COptionBool> bForceFullMovieCentering; // #38362 2018.7.19 add yyagi
386 /// 旧AVIを強制的にウインドウ全体に表示するときの、width
388 [DataMember(Order = 114)]
389 public STInstValue<COptionInteger> cdForceScaledMovieW; // #38362 2019.1.8 add yyagi
391 /// 旧AVIを強制的にウインドウ全体に表示するときの、height
393 [DataMember(Order = 114)]
394 public STInstValue<COptionInteger> cdForceScaledMovieH; // #38362 2018.1.8 add yyagi
397 public int GetLaneX(ELane e)
399 EPart p = EPart.Drums;
400 ELane start = ELane.DrumsLaneMin;
401 ELane end = ELane.DrumsLaneMax;
402 if (e >= ELane.GuitarLaneMin && e < ELane.GuitarLaneMax)
405 start = ELane.GuitarLaneMin;
406 end = ELane.GuitarLaneMax;
408 if (e >= ELane.BassLaneMin && e < ELane.BassLaneMax)
411 start = ELane.BassLaneMin;
412 end = ELane.BassLaneMax;
414 int ret = cdInstX[p][eActiveInst];
415 int order = cdLaneOrder[e];
416 for (ELane t = start; t < end; ++t)
418 if (cdLaneOrder[t] < order)
426 public int GetLaneW(ELane e)
439 public void AdjustLaneOrders(EPart p)
441 ELane min = ELane.DrumsLaneMin;
442 ELane max = ELane.DrumsLaneMax;
443 if (p == EPart.Guitar)
445 min = ELane.GuitarLaneMin;
446 max = ELane.GuitarLaneMax;
448 else if (p == EPart.Bass)
450 min = ELane.BassLaneMin;
451 max = ELane.BassLaneMax;
454 bool[] used = new bool[max - min];
455 for (ELane t = min; t < max; ++t)
457 used[cdLaneOrder[t]] = true;
459 for (int i = 0; i < used.Length; ++i)
463 for (ELane t = min; t < max; ++t)
465 for (ELane t2 = t + 1; t2 < max; ++t2)
467 if (cdLaneOrder[t].Value == cdLaneOrder[t2].Value)
469 cdLaneOrder[t].Value = (int)(min + i);
484 public void Deserializing(StreamingContext sc)
486 // #xxxxx 2011.11.27 yyagi add
487 // #23568 2010.11.04 ikanick add
488 // #34069 2014.7.23 yyagi 初回起動時のwindow sizeは、CDTXMania側で設定する(-> 1280x720にする)
489 // #30675 2013.02.04 ikanick add
490 // #23580 2011.1.3 yyagi
491 // #31602 2013.6.23 yyagi
492 //this.strDTXManiaのバージョン = "Unknown";
495 bFullScreen = new COptionBool(false);
496 bVSyncWait = new COptionBool(true);
497 bStageFailed = new COptionBool(true);
498 bForceScalingAVI = new COptionBool(false);
499 bAVI = new COptionBool(true);
500 bBGA = new COptionBool(true);
501 bFillin = new COptionBool(true);
502 bLogDTX = new COptionBool(false);
503 bLogEnumerateSongs = new COptionBool(false);
504 bLogCreateRelease = new COptionBool(false);
505 bCymbalFree = new COptionBool(false);
506 bStoicMode = new COptionBool(false);
507 bItalicFontSongSelect = new COptionBool(false);
508 bWaveAdjust = new COptionBool(true);
509 bBGMPlay = new COptionBool(true);
510 bDrumsHitSound = new COptionBool(true);
511 bAudience = new COptionBool(true);
512 bScoreIni = new COptionBool(true);
513 bRandSubBox = new COptionBool(true);
514 bBoldFontSongSelect = new COptionBool(true);
515 bDebugInfo = new COptionBool(false);
516 bLog = new COptionBool(true);
517 bAutoPlay = new COptionPadBool();
518 for ( EPad pad = EPad.DrumsPadMin; pad < EPad.DrumsPadMax; ++pad )
520 bAutoPlay[ pad ] = new COptionBool( false );
522 for ( EPad pad = EPad.GuitarPadMin; pad < EPad.BassPadMax; ++pad )
524 bAutoPlay[ pad ] = new COptionBool( true );
526 bAutoPlay[ EPad.Capture ] = new COptionBool( true );
527 bViewerVSyncWait = new COptionBool( true );
528 bViewerShowDebugStatus = new COptionBool(true);
529 bViewerTimeStretch = new COptionBool(false);
530 bViewerDrumsActive = new COptionBool(true);
531 bViewerGuitarActive = new COptionBool(true);
532 bLoadSoundSpeed = new COptionBool(true);
533 bIsAutoResultCapture = new COptionBool(false);
534 bBufferedInput = new COptionBool(true);
535 bIsAllowedDoubleClickFullscreen = new COptionBool(true);
536 bIsEnabledSystemMenu = new COptionBool(true);
537 bUseBoxDefSkin = new COptionBool(true);
538 bTight = new COptionBool(false);
539 bUseOSTimer = new COptionBool(false);
540 bDynamicBassMixerManagement = new COptionBool(true);
541 bTimeStretch = new COptionBool(false);
542 nSoundDeviceType = new COptionEnum<ESoundDeviceTypeForConfig>(
543 FDK.COS.bIsVistaOrLater() ?
544 (FDK.COS.bIsWin10OrLater()? ESoundDeviceTypeForConfig.WASAPI_Shared : ESoundDeviceTypeForConfig.WASAPI_Exclusive)
545 : ESoundDeviceTypeForConfig.DSound
547 bForceHighPowerPlan = new COptionBool( false );
548 bEventDrivenWASAPI = new COptionBool( false );
549 bLoadDTXDetail = new COptionBool( false );
550 bShowSongPath = new COptionBool( false );
553 strSongDataPath = new COptionString(@".\");
554 strFontSongSelect = new COptionString("MS PGothic");
555 strDTXManiaVersion = new COptionString(CDTXMania.VERSION);
556 strSystemSkinSubfolderPath = new COptionString(@".\Default\");
559 eDamageLevel = new COptionEnum<EDamage>(EDamage.Normal);
560 eJudgePriority = new COptionEnum<EJudgeDisplayPriority>(EJudgeDisplayPriority.Under);
561 eCYGroup = new COptionEnum<ECYGroup>(ECYGroup.Off);
562 eDark = new COptionEnum<EDark>(EDark.Off);
563 eFTGroup = new COptionEnum<EFTGroup>(EFTGroup.Off);
564 eHHGroup = new COptionEnum<EHHGroup>(EHHGroup.Off);
565 eBDGroup = new COptionEnum<EBDGroup>(EBDGroup.Off);
566 Backup1BDHHGroup = new COptionEnum<EHHGroup>(EHHGroup.Off);
567 Backup1BDPriotiry = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
568 eHitSoundPriorityCY = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
569 eHitSoundPriorityFT = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
570 eHitSoundPriorityHH = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
571 eJudgePriority = new COptionEnum<EJudgeDisplayPriority>(EJudgeDisplayPriority.Under);
572 eActiveInst = new COptionEnum<EActiveInstrument>(EActiveInstrument.Both);
573 nShowLagType = new COptionEnum<EShowLagType>(EShowLagType.Off);
576 rcWindow = new Coordinates.CRect(100, 100, 1280, 720);
577 rcWindow_backup = new Coordinates.CRect( 100, 100, 1280, 720 );
578 nSleepPerFrameMs = new COptionInteger( -1 );
579 nSleepUnfocusMs = new COptionInteger(1);
580 nBGAlpha = new COptionInteger(100);
581 nPreSoundWeightMs = new COptionInteger(1000);
582 nPreImageWeightMs = new COptionInteger(100);
583 nFontSizeDotSongSelect = new COptionInteger(20);
584 nAutoVolume = new COptionInteger(80);
585 nChipVolume = new COptionInteger(100);
586 nPlaySpeed = new COptionInteger(20);
588 nHitRange = new STJudgeValue<COptionInteger>();
589 nHitRange.Perfect = new COptionInteger(34);
590 nHitRange.Great = new COptionInteger(67);
591 nHitRange.Good = new COptionInteger(84);
592 nHitRange.Poor = new COptionInteger(117);
594 nVelocityMin = new STPadValue<COptionInteger>();
595 for (EPad pad = EPad.Min; pad < EPad.Max; ++pad)
597 nVelocityMin[pad] = new COptionInteger(0);
599 nVelocityMin.HH.Value = 20;
601 nRisky = new COptionInteger(0);
602 nWASAPIBufferSizeMs = new COptionInteger(2);
603 nChipDisplayTimeMs = new COptionInteger(3000);
604 nChipFadeoutTimeMs = new COptionInteger(2000);
605 rcViewerWindow = new Coordinates.CRect(100, 100, 640, 360);
606 nMasterVolume = new COptionInteger(100);
607 nPolyphonicSounds = new COptionInteger(2); // #38474 2018.8.3 yyagi 4 -> 2, to reduce sound mixing load
609 eClickType = new COptionEnum<EClickType>(EClickType.Off);
610 nClickHighVolume = new COptionInteger(100);
611 nClickLowVolume = new COptionInteger(100);
614 bEmphasizePlaySound = new STDGBSValue<COptionBool>();
615 bReverse = new STDGBSValue<COptionBool>();
616 bLight = new STDGBSValue<COptionBool>();
617 bGraph = new STDGBSValue<COptionBool>();
618 bDisplayCombo = new STDGBSValue<COptionBool>();
619 bDisplayJudge = new STDGBSValue<COptionBool>();
621 nScrollSpeed = new STDGBSValue<COptionInteger>();
622 nMinComboDisp = new STDGBSValue<COptionInteger>();
623 nInputAdjustTimeMs = new STDGBSValue<COptionInteger>();
624 nJudgeLinePosOffset = new STDGBSValue<COptionInteger>();
625 nSuddenFrom = new STDGBSValue<COptionInteger>();
626 nHiddenFrom = new STDGBSValue<COptionInteger>();
628 eRandom = new STDGBSValue<COptionEnum<ERandom>>();
629 eAutoGhost = new STDGBSValue<COptionEnum<EAutoGhostData>>();
630 eTargetGhost = new STDGBSValue<COptionEnum<ETargetGhostData>>();
631 eSudHidInv = new STDGBSValue<COptionEnum<ESudHidInv>>();
634 for (EPart i = EPart.Drums; i <= EPart.Unknown; i++)
636 bEmphasizePlaySound[i] = new COptionBool(true);
637 bReverse[i] = new COptionBool(false);
638 eRandom[i] = new COptionEnum<ERandom>(ERandom.Off);
639 bLight[i] = new COptionBool(false);
640 bGraph[i] = new COptionBool(false);
641 bDisplayJudge[i] = new COptionBool(true);
642 bDisplayCombo[i] = new COptionBool(true);
644 nScrollSpeed[i] = new COptionInteger(1);
645 nInputAdjustTimeMs[i] = new COptionInteger(0);
646 nJudgeLinePosOffset[i] = new COptionInteger(0);
647 nViewerScrollSpeed[i] = new COptionInteger(1);
648 nMinComboDisp[i] = new COptionInteger(2);
649 nSuddenFrom[i] = new COptionInteger(450); // +100 FI
650 nHiddenFrom[i] = new COptionInteger(225); // +100 FO
652 eAutoGhost[i] = new COptionEnum<EAutoGhostData>(EAutoGhostData.Perfect);
653 eTargetGhost[i] = new COptionEnum<ETargetGhostData>(ETargetGhostData.None);
654 eSudHidInv[i] = new COptionEnum<ESudHidInv>(ESudHidInv.Off);
656 fJudgeLinePosOffsetBase[i] = new COptionFloat(0f);
659 dicJoystick = new COptionDictionary<int, string>();
660 dicJoystick.Value = new Dictionary<int, string>(10);
662 string[] asiodevs = CEnumerateAllAsioDevices.GetAllASIODevices();
663 strASIODevice = new COptionStringList(asiodevs.Length > 0 ? asiodevs[0] : null);
665 strLanguage = new COptionString( "" ); // "default"でなく"" にすること。そうすることで、Locale情報を使った初期化がなされる。
666 // strLanguageList = new COptionStringList("");
669 cdInstX = new STDGBSValue<STInstValue<COptionInteger>>();
670 cdInstX.Drums = new STInstValue<COptionInteger>();
671 cdInstX.Drums.DrOnly = new COptionInteger(SampleFramework.GameWindowSize.Width / 2 - 314);
672 cdInstX.Guitar = new STInstValue<COptionInteger>();
673 cdInstX.Guitar.GBOnly = new COptionInteger(480 - 72 * 4);
674 cdInstX.Bass = new STInstValue<COptionInteger>();
675 cdInstX.Bass.GBOnly = new COptionInteger(SampleFramework.GameWindowSize.Width - 480);
676 cdInstX.Drums.Both = new COptionInteger(cdInstX.Drums.DrOnly);
677 cdInstX.Guitar.Both = new COptionInteger(cdInstX.Guitar.GBOnly);
678 cdInstX.Bass.Both = new COptionInteger(cdInstX.Bass.GBOnly);
680 cdDebugX = new STInstValue<COptionInteger>();
681 cdDebugX.DrOnly = new COptionInteger(450 * 3);
682 cdDebugX.Both = new COptionInteger(450 * 3);
683 cdDebugX.GBOnly = new COptionInteger(cdInstX.Drums.DrOnly);
685 cdDebugY = new STInstValue<COptionInteger>();
686 cdDebugY.Both = new COptionInteger(200);
687 cdDebugY.DrOnly = new COptionInteger(200);
688 cdDebugY.GBOnly = new COptionInteger(200);
690 cdLegacyAVIX = new STInstValue<COptionInteger>();
691 cdLegacyAVIX.Both = new COptionInteger(619 + 682);
692 cdLegacyAVIX.DrOnly = new COptionInteger(619 + 682);
693 cdLegacyAVIX.GBOnly = new COptionInteger(682);
695 cdLegacyAVIY = new STInstValue<COptionInteger>();
696 cdLegacyAVIY.Both = new COptionInteger(128);
697 cdLegacyAVIY.DrOnly = new COptionInteger(128);
698 cdLegacyAVIY.GBOnly = new COptionInteger(128);
700 #region [ #38362 ForcedFullScreen X, Y, W, H ]
701 cdForceScaledMovieX = new STInstValue<COptionInteger>();
702 cdForceScaledMovieX.Both = new COptionInteger(0);
703 cdForceScaledMovieX.DrOnly = new COptionInteger(0);
704 cdForceScaledMovieX.GBOnly = new COptionInteger(0);
706 cdForceScaledMovieY = new STInstValue<COptionInteger>();
707 cdForceScaledMovieY.Both = new COptionInteger(0);
708 cdForceScaledMovieY.DrOnly = new COptionInteger(0);
709 cdForceScaledMovieY.GBOnly = new COptionInteger(0);
711 cdForceScaledMovieW = new STInstValue<COptionInteger>();
712 cdForceScaledMovieW.Both = new COptionInteger(1920);
713 cdForceScaledMovieW.DrOnly = new COptionInteger(1920);
714 cdForceScaledMovieW.GBOnly = new COptionInteger(1920);
716 cdForceScaledMovieH = new STInstValue<COptionInteger>();
717 cdForceScaledMovieH.Both = new COptionInteger(1080);
718 cdForceScaledMovieH.DrOnly = new COptionInteger(1080);
719 cdForceScaledMovieH.GBOnly = new COptionInteger(1080);
721 //bForceFullMovieCentering = new STInstValue<COptionBool>();
722 //bForceFullMovieCentering.Both = new COptionBool(true);
723 //bForceFullMovieCentering.DrOnly = new COptionBool(true);
724 //bForceFullMovieCentering.GBOnly = new COptionBool(true);
727 cdComboX = new STDGBSValue<STInstValue<COptionInteger>>();
728 cdComboX.Drums = new STInstValue<COptionInteger>();
729 cdComboX.Drums.Both = new COptionInteger(cdInstX.Drums.Both + (72 * 5 + 85 * 2 + 99) / 2);
730 cdComboX.Drums.DrOnly = new COptionInteger(cdInstX.Drums.DrOnly + (72 * 5 + 85 * 2 + 99) / 2);
731 cdComboX.Guitar = new STInstValue<COptionInteger>();
732 cdComboX.Guitar.Both = new COptionInteger(cdInstX.Guitar.Both + 72 * 2);
733 cdComboX.Guitar.GBOnly = new COptionInteger(cdInstX.Guitar.GBOnly + 72 * 2);
734 cdComboX.Bass = new STInstValue<COptionInteger>();
735 cdComboX.Bass.Both = new COptionInteger(cdInstX.Bass.Both + 72 * 2);
736 cdComboX.Bass.GBOnly = new COptionInteger(cdInstX.Bass.GBOnly + 72 * 2);
738 cdComboY = new STDGBSValue<STInstValue<COptionInteger>>();
739 cdComboY.Drums = new STInstValue<COptionInteger>();
740 cdComboY.Drums.Both = new COptionInteger(100);
741 cdComboY.Drums.DrOnly = new COptionInteger(100);
742 cdComboY.Guitar = new STInstValue<COptionInteger>();
743 cdComboY.Guitar.Both = new COptionInteger(700);
744 cdComboY.Guitar.GBOnly = new COptionInteger(700);
745 cdComboY.Bass = new STInstValue<COptionInteger>();
746 cdComboY.Bass.Both = new COptionInteger(700);
747 cdComboY.Bass.GBOnly = new COptionInteger(700);
749 cdJudgeLineY = new STDGBSValue<COptionInteger>();
750 cdJudgeLineY.Drums = new COptionInteger(942);
751 cdJudgeLineY.Guitar = new COptionInteger(138);
752 cdJudgeLineY.Bass = new COptionInteger(138);
754 cdJudgeY = new STDGBSValue<COptionInteger>();
755 cdJudgeY.Drums = new COptionInteger(350);
756 cdJudgeY.Guitar = new COptionInteger(600);
757 cdJudgeY.Bass = new COptionInteger(600);
759 cdLaneOrder = new STLaneValue<COptionInteger>();
760 for (ELane lane = ELane.DrumsLaneMin; lane < ELane.BassLaneMax; ++lane)
762 cdLaneOrder[lane] = new COptionInteger(0);
765 cdLaneOrder.HH.Value = 1;
766 cdLaneOrder.SD.Value = 2;
767 cdLaneOrder.BD.Value = 3;
768 cdLaneOrder.HT.Value = 4;
769 cdLaneOrder.LT.Value = 5;
770 cdLaneOrder.FT.Value = 6;
771 cdLaneOrder.CY.Value = 7;
773 cdLaneOrder.GtR.Value = 0;
774 cdLaneOrder.GtG.Value = 1;
775 cdLaneOrder.GtB.Value = 2;
776 cdLaneOrder.GtW.Value = 3;
778 cdLaneOrder.BsR.Value = 0;
779 cdLaneOrder.BsG.Value = 1;
780 cdLaneOrder.GtB.Value = 2;
781 cdLaneOrder.BsW.Value = 3;
783 bConfigIniが存在している = System.IO.File.Exists(CDTXMania.Instance.strEXEのあるフォルダ + "Config.xml");
784 SetDefaultKeyAssign();
788 /// 保存する必要がない値はここで設定してください。
789 /// 設定しない場合 DataMember 以外のメンバはすべてその型の規定値になります。
791 /// <param name="sc">ストリーミングコンテキスト。使用しません。</param>
793 public void DefaultDeserializer(StreamingContext sc)
796 CResources cr = CDTXMania.Instance.Resources;
797 bFullScreen.Initialize( "strCfgSysFullScreen" );
798 bVSyncWait.Initialize( "strCfgSysVSync" );
799 bStageFailed.Initialize( "strCfgSysStageFailed");
800 bForceScalingAVI.Initialize( "strCfgSysForceScalingAVI" );
801 bAVI.Initialize( "strCfgSysAVI" );
802 bBGA.Initialize( "strCfgSysBGA" );
803 bLog.Initialize( "strCfgSysLog" );
804 bStoicMode.Initialize( "strCfgSysStoic" );
805 bWaveAdjust.Initialize( "strCfgSysAdjustWaves" );
806 bBGMPlay.Initialize( "strCfgSysBGM" );
807 bAudience.Initialize( "strCfgSysAudience" );
808 bScoreIni.Initialize( "strCfgSysSaveScoreIni" );
809 bRandSubBox.Initialize( "strCfgSysRandSubBox" );
810 bAutoPlay.HH.Initialize( "strCfgDrAutoHHC" );
811 bAutoPlay.HHO.Initialize( "strCfgDrAutoHHO" );
812 bAutoPlay.SD.Initialize( "strCfgDrAutoSD" );
813 bAutoPlay.BD.Initialize( "strCfgDrAutoBD" );
814 bAutoPlay.HT.Initialize( "strCfgDrAutoHT" );
815 bAutoPlay.LT.Initialize( "strCfgDrAutoLT" );
816 bAutoPlay.FT.Initialize( "strCfgDrAutoFT" );
817 bAutoPlay.CY.Initialize( "strCfgDrAutoCY" );
818 bAutoPlay.RD.Initialize( "strCfgDrAutoRD" );
819 bAutoPlay.LC.Initialize( "strCfgDrAutoLCY" );
820 bAutoPlay.GtR.Initialize( "strCfgGtAutoR" );
821 bAutoPlay.GtG.Initialize( "strCfgGtAutoG" );
822 bAutoPlay.GtB.Initialize( "strCfgGtAutoB" );
823 bAutoPlay.GtPick.Initialize( "strCfgGtAutoPick" );
824 bAutoPlay.GtWail.Initialize( "strCfgGtAutoWailing" );
825 bAutoPlay.BsR.Initialize( "strCfgBsAutoR" );
826 bAutoPlay.BsG.Initialize( "strCfgBsAutoG" );
827 bAutoPlay.BsB.Initialize( "strCfgBsAutoB" );
828 bAutoPlay.BsPick.Initialize( "strCfgBsAutoPick" );
829 bAutoPlay.BsWail.Initialize( "strCfgBsAutoWailing" );
830 bAutoPlay.Capture.Initialize( "strCfgCapture" );
832 bLoadSoundSpeed.Initialize( "strCfgSysSoundLoadLimiter" );
833 bIsAutoResultCapture.Initialize( "strCfgSysAutoResultCapture" );
834 bBufferedInput.Initialize( "strCfgSysBufferingInput" );
835 bUseBoxDefSkin.Initialize( "strCfgSysUseBoxDefSkin" );
836 bUseOSTimer.Initialize( "strCfgSysUseOSTimer" );
837 bTimeStretch.Initialize( "strCfgSysTimeStretch" );
838 bForceHighPowerPlan.Initialize( "strCfgSysForceHighPowerPlan" );
839 bEventDrivenWASAPI.Initialize( "strCfgSysWASAPIEventDriven" );
840 bLoadDTXDetail.Initialize( "strCfgSysLoadDTXDetail" ); // #36177 2016.7.30 ikanick
842 bCymbalFree.Initialize( "strCfgDrCymbalFree" );
843 bDrumsHitSound.Initialize( "strCfgDrChipSound" );
844 bFillin.Initialize( "strCfgDrFillin" );
845 bTight.Initialize( "strCfgDrTight" );
847 bItalicFontSongSelect.Initialize("", "");
848 bBoldFontSongSelect.Initialize("", "");
849 bLogDTX.Initialize("", "");
850 bLogEnumerateSongs.Initialize("", "");
851 bLogCreateRelease.Initialize("", "");
852 bViewerVSyncWait.Initialize("", "");
853 bViewerShowDebugStatus.Initialize("", "");
854 bViewerTimeStretch.Initialize("", "");
855 bViewerDrumsActive.Initialize("", "");
856 bViewerGuitarActive.Initialize("", "");
857 bIsAllowedDoubleClickFullscreen.Initialize("", "");
858 bIsEnabledSystemMenu.Initialize("", "");
859 bDynamicBassMixerManagement.Initialize("", "");
860 bDebugInfo.Initialize( "strCfgSysDebugInfo" );
862 bShowSongPath.Initialize( "strCfgShowSongPath" );
865 nSoundDeviceType.Initialize( "strCfgSysSoundDeviceType", typeof(ESoundDeviceTypeForConfig));
866 eDamageLevel.Initialize( "strCfgSysDamageLevel", typeof(EDamage));
867 eJudgePriority.Initialize( "strCfgSysJudgePriority", typeof(EJudgeDisplayPriority));
868 eCYGroup.Initialize( "strCfgDrCYGroup", typeof(ECYGroup));
869 eDark.Initialize( "strCfgSysDark", typeof(EDark));
870 eFTGroup.Initialize( "strCfgDrFTGroup", typeof(EFTGroup));
871 eHHGroup.Initialize( "strCfgDrHHGroup", typeof(EHHGroup));
872 eBDGroup.Initialize( "strCfgDrBDGroup", typeof(EBDGroup));
873 Backup1BDHHGroup.Initialize("", "", typeof(EHHGroup));
874 Backup1BDPriotiry.Initialize("", "", typeof(EHitSoundPriority));
875 eHitSoundPriorityCY.Initialize( "strCfgDrCYPriority", typeof(EHitSoundPriority));
876 eHitSoundPriorityFT.Initialize( "strCfgDrFTPriority", typeof(EHitSoundPriority));
877 eHitSoundPriorityHH.Initialize( "strCfgDrHHPriority", typeof(EHitSoundPriority));
878 // eJudgePriority.Initialize("Judge Priority", Properties.Resources.strCfgSysJudgePriority, typeof(EJudgeDisplayPriority));
879 eActiveInst.Initialize( "strCfgSysPlayMode", typeof(EActiveInstrument));
880 nShowLagType.Initialize( "strCfgSysShowLagType", typeof(EShowLagType));
882 eClickType.Initialize( "strCfgSysClickType", typeof( EClickType ) );
883 nClickHighVolume.Initialize( "strCfgSysClickHighVolume", 0, 101 );
884 nClickLowVolume.Initialize( "strCfgSysClickLowVolume", 0, 101 );
888 nSleepPerFrameMs.Initialize( "strCfgSysSleepPerFrame", -1, 33 );
889 nSleepUnfocusMs.Initialize( "strCfgSysSleepUnfocus", 0, 33 );
890 nBGAlpha.Initialize( "strCfgSysBGAAlpha", 0, 256 );
891 nPreSoundWeightMs.Initialize( "strCfgSysPreSoundWait", 0, 10001);
892 nPreImageWeightMs.Initialize( "strCfgSysPreImageWait", 0, 10001);
893 nFontSizeDotSongSelect.Initialize("", "", 5);
894 nAutoVolume.Initialize( "strCfgSysAutoVolume", 0, 101);
895 nChipVolume.Initialize( "strCfgSysChipVolume", 0, 101);
896 nPlaySpeed.Initialize( "strCfgSysPlaySpeed", 5, 41);
897 nPlaySpeed.ValueFormatter = (x) =>
899 return "x" + (x / 20f).ToString("0.000");
901 nHitRange.Perfect.Initialize( "strCfgRangePerfect", 0 );
902 nHitRange.Great.Initialize( "strCfgRangeGreat", 0 );
903 nHitRange.Good.Initialize( "strCfgRangeGood", 0 );
904 nHitRange.Poor.Initialize( "strCfgRangePoor", 0 );
905 nVelocityMin.LC.Initialize( "strCfgDrLCVelocityMin", 0, 128 );
906 nVelocityMin.HH.Initialize( "strCfgDrHHVelocityMin", 0, 128 );
907 nVelocityMin.SD.Initialize( "strCfgDrSDVelocityMin", 0, 128 );
908 nVelocityMin.BD.Initialize( "strCfgDrBDVelocityMin", 0, 128 );
909 nVelocityMin.HT.Initialize( "strCfgDrHTVelocityMin", 0, 128 );
910 nVelocityMin.LT.Initialize( "strCfgDrLTVelocityMin", 0, 128 );
911 nVelocityMin.FT.Initialize( "strCfgDrFTVelocityMin", 0, 128 );
912 nVelocityMin.CY.Initialize( "strCfgDrCYVelocityMin", 0, 128 );
913 nVelocityMin.RD.Initialize( "strCfgDrRDVelocityMin", 0, 128 );
914 nRisky.Initialize( "strCfgSysRisky", 0, 100 );
915 nWASAPIBufferSizeMs.Initialize( "strCfgSysWASAPIBufSize", 0, 100001);
916 nChipDisplayTimeMs.Initialize("", "", 0);
917 nChipFadeoutTimeMs.Initialize("", "", 0);
919 nMasterVolume.Initialize( "strCfgSysMasterVolume", 0, 201);
920 nPolyphonicSounds.Initialize( "strCfgSysPolyphonicSounds", 1, 11 );
923 for (EPart i = EPart.Drums; i <= EPart.Unknown; i++)
925 bEmphasizePlaySound[i].Initialize( "strCfgDgbChipSoundMonitor" );
926 bReverse[i].Initialize( "strCfgDgbReverse" );
927 eRandom[i].Initialize( "strCfgDgbRandom", typeof(ERandom) );
928 bLight[i].Initialize( "strCfgDgbLight" );
929 bDisplayCombo[i].Initialize( "strCfgDgbDisplayCombo" );
930 bDisplayJudge[i].Initialize( "strCfgDgbDisplayJudge" );
931 bGraph[i].Initialize( "strCfgDgbDisplayGraph" );
932 nScrollSpeed[i].Initialize( "strCfgDgbScrollSpeed", 1, 101);
933 nScrollSpeed[i].ValueFormatter = (x) =>
935 return "x" + (x * 0.5f).ToString("0.0");
937 nInputAdjustTimeMs[i].Initialize( "strCfgDgbInputAdjust", -99, 100);
938 nJudgeLinePosOffset[i].Initialize("", "", -SampleFramework.GameWindowSize.Height, SampleFramework.GameWindowSize.Height + 1);
939 nViewerScrollSpeed[i].Initialize("", "", 1, 101);
940 nMinComboDisp[i].Initialize( "strCfgDgbMinComboDisp", 2, 100001);
941 nSuddenFrom[i].Initialize( "strCfgDgbSuddenFrom", 0, SampleFramework.GameWindowSize.Height + 1);
942 nHiddenFrom[i].Initialize( "strCfgDgbHiddenFrom", 0, SampleFramework.GameWindowSize.Height + 1);
943 eAutoGhost[i].Initialize( "strCfgDgbAutoGhost", typeof(EAutoGhostData));
944 eTargetGhost[i].Initialize( "strCfgDgbTargetGhost", typeof(ETargetGhostData));
945 eSudHidInv[i].Initialize( "strCfgDgbSudHidInv", typeof(ESudHidInv));
947 fJudgeLinePosOffsetBase[i].Initialize("", "");
950 string[] asiodevs = CEnumerateAllAsioDevices.GetAllASIODevices();
951 strASIODevice.Initialize( "strCfgSysASIODevice", asiodevs);
954 cdInstX.Drums.Both.Initialize("strCfgDispDrumsXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
955 cdInstX.Drums.DrOnly.Initialize("strCfgDispDrumsXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
956 cdInstX.Guitar.Both.Initialize("strCfgDispGuitarXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
957 cdInstX.Guitar.GBOnly.Initialize("strCfgDispGuitarXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
958 cdInstX.Bass.Both.Initialize("strCfgDispBassXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
959 cdInstX.Bass.GBOnly.Initialize("strCfgDispBassXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
961 cdDebugX.DrOnly.Initialize("strCfgDispDebugXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
962 cdDebugX.Both.Initialize("strCfgDispDebugXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
963 cdDebugX.GBOnly.Initialize("strCfgDispDebugXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
964 cdDebugY.DrOnly.Initialize("strCfgDispDebugYDr", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
965 cdDebugY.Both.Initialize("strCfgDispDebugYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
966 cdDebugY.GBOnly.Initialize("strCfgDispDebugYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
968 cdLegacyAVIX.DrOnly.Initialize("strCfgDispAVIXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
969 cdLegacyAVIX.Both.Initialize("strCfgDispAVIXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
970 cdLegacyAVIX.GBOnly.Initialize("strCfgDispAVIXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
971 cdLegacyAVIY.DrOnly.Initialize("strCfgDispAVIYDr", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
972 cdLegacyAVIY.Both.Initialize("strCfgDispAVIYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
973 cdLegacyAVIY.GBOnly.Initialize("strCfgDispAVIYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
975 cdForceScaledMovieX.DrOnly.Initialize("strCfgForceScaledAVIXDr", -SampleFramework.GameWindowSize.Width, 1 + SampleFramework.GameWindowSize.Width, crdStep);
976 cdForceScaledMovieX.Both.Initialize("strCfgForceScaledAVIXBoth", -SampleFramework.GameWindowSize.Width, 1 + SampleFramework.GameWindowSize.Width, crdStep);
977 cdForceScaledMovieX.GBOnly.Initialize("strCfgForceScaledAVIXGB", -SampleFramework.GameWindowSize.Width, 1 + SampleFramework.GameWindowSize.Width, crdStep);
979 cdForceScaledMovieY.DrOnly.Initialize("strCfgForceScaledAVIYDr", -SampleFramework.GameWindowSize.Height, 1 + SampleFramework.GameWindowSize.Height, crdStep);
980 cdForceScaledMovieY.Both.Initialize("strCfgForceScaledAVIYBoth", -SampleFramework.GameWindowSize.Height, 1 + SampleFramework.GameWindowSize.Height, crdStep);
981 cdForceScaledMovieY.GBOnly.Initialize("strCfgForceScaledAVIYGB", -SampleFramework.GameWindowSize.Height, 1 + SampleFramework.GameWindowSize.Height, crdStep);
983 cdForceScaledMovieW.DrOnly.Initialize("strCfgForceScaledAVIWDr", 1, 1 + SampleFramework.GameWindowSize.Width, crdStep);
984 cdForceScaledMovieW.Both.Initialize("strCfgForceScaledAVIWBoth", 1, 1 + SampleFramework.GameWindowSize.Width, crdStep);
985 cdForceScaledMovieW.GBOnly.Initialize("strCfgForceScaledAVIWGB", 1, 1 + SampleFramework.GameWindowSize.Width, crdStep);
987 cdForceScaledMovieH.DrOnly.Initialize("strCfgForceScaledAVIHDr", 1, 1 + SampleFramework.GameWindowSize.Height, crdStep);
988 cdForceScaledMovieH.Both.Initialize("strCfgForceScaledAVIHBoth", 1, 1 + SampleFramework.GameWindowSize.Height, crdStep);
989 cdForceScaledMovieH.GBOnly.Initialize("strCfgForceScaledAVIHGB", 1, 1 + SampleFramework.GameWindowSize.Height, crdStep);
991 //bForceFullMovieCentering.DrOnly.Initialize("strCfgForceFullMovieCenteringDr");
992 //bForceFullMovieCentering.Both.Initialize("strCfgForceFullMovieCenteringBoth");
993 //bForceFullMovieCentering.GBOnly.Initialize("strCfgForceFullMovieCenteringGB");
995 cdComboX.Drums.Both.Initialize("strCfgDispDrComboXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
996 cdComboX.Drums.DrOnly.Initialize("strCfgDispDrComboXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
997 cdComboX.Guitar.Both.Initialize("strCfgDispGtComboXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
998 cdComboX.Guitar.GBOnly.Initialize("strCfgDispGtComboXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
999 cdComboX.Bass.Both.Initialize("strCfgDispBsComboXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
1000 cdComboX.Bass.GBOnly.Initialize("strCfgDispBsComboXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
1002 cdComboY.Drums.Both.Initialize("strCfgDispDrComboYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1003 cdComboY.Drums.DrOnly.Initialize("strCfgDispDrComboYDr", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1004 cdComboY.Guitar.Both.Initialize("strCfgDispGtComboYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1005 cdComboY.Guitar.GBOnly.Initialize("strCfgDispGtComboYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1006 cdComboY.Bass.Both.Initialize("strCfgDispBsComboYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1007 cdComboY.Bass.GBOnly.Initialize("strCfgDispBsComboYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1009 cdJudgeLineY.Drums.Initialize("strCfgDispDrJudgeLine", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1010 cdJudgeLineY.Guitar.Initialize("strCfgDispGtJudgeLine", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1011 cdJudgeLineY.Bass.Initialize("strCfgDispBsJudgeLine", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1013 cdJudgeY.Drums.Initialize("strCfgDispDrJudge", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1014 cdJudgeY.Guitar.Initialize("strCfgDispGtJudge", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1015 cdJudgeY.Bass.Initialize("strCfgDispBsJudge", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1017 cdLaneOrder.LC.Initialize("strCfgDispLaneOrderLC", 0, 8);
1018 cdLaneOrder.HH.Initialize("strCfgDispLaneOrderHH", 0, 8);
1019 cdLaneOrder.SD.Initialize("strCfgDispLaneOrderSD", 0, 8);
1020 cdLaneOrder.BD.Initialize("strCfgDispLaneOrderBD", 0, 8);
1021 cdLaneOrder.HT.Initialize("strCfgDispLaneOrderHT", 0, 8);
1022 cdLaneOrder.LT.Initialize("strCfgDispLaneOrderLT", 0, 8);
1023 cdLaneOrder.FT.Initialize("strCfgDispLaneOrderFT", 0, 8);
1024 cdLaneOrder.CY.Initialize("strCfgDispLaneOrderCY", 0, 8);
1026 cdLaneOrder.GtR.Initialize("strCfgDispLaneOrderGtR", 0, 4);
1027 cdLaneOrder.GtG.Initialize("strCfgDispLaneOrderGtG", 0, 4);
1028 cdLaneOrder.GtB.Initialize("strCfgDispLaneOrderGtB", 0, 4);
1029 cdLaneOrder.GtW.Initialize("strCfgDispLaneOrderGtW", 0, 4);
1031 cdLaneOrder.BsR.Initialize("strCfgDispLaneOrderBsR", 0, 4);
1032 cdLaneOrder.BsG.Initialize("strCfgDispLaneOrderBsG", 0, 4);
1033 cdLaneOrder.BsB.Initialize("strCfgDispLaneOrderBsB", 0, 4);
1034 cdLaneOrder.BsW.Initialize("strCfgDispLaneOrderBsW", 0, 4);
1036 SetEnterDelegates();
1041 Deserializing(new StreamingContext());
1042 DefaultDeserializer(new StreamingContext());
1045 public void SetEnterDelegates()
1047 bFullScreen.OnEnterDelegate = () =>
1049 CDTXMania.Instance.b次のタイミングで全画面_ウィンドウ切り替えを行う = true;
1053 bVSyncWait.OnEnterDelegate = () =>
1055 CDTXMania.Instance.b次のタイミングで垂直帰線同期切り替えを行う = true;
1058 eBDGroup.OnEnterDelegate = () =>
1061 if (eBDGroup == EBDGroup.Group)
1063 // #27029 2012.1.5 from: 変更前の状態をバックアップする。
1064 Backup1BDHHGroup.Value = eHHGroup;
1065 Backup1BDPriotiry.Value = eHitSoundPriorityHH;
1067 // HH Group ... HH-0 → HH-2 / HH-1 → HH-3 / HH-2 → 変更なし / HH-3 → 変更なし
1068 if (eHHGroup == EHHGroup.Off)
1070 eHHGroup.Value = EHHGroup.LC_HH;
1072 if (eHHGroup == EHHGroup.HO_HC)
1074 eHHGroup.Value = EHHGroup.Group;
1077 // HH Priority ... C>P → 変更なし / P>C → C>P
1078 if (eHitSoundPriorityHH == EHitSoundPriority.Pad)
1080 eHitSoundPriorityHH.Value = EHitSoundPriority.Chip;
1085 eHHGroup = Backup1BDHHGroup;
1086 eHitSoundPriorityHH = Backup1BDPriotiry;
1090 bUseBoxDefSkin.OnEnterDelegate = () =>
1092 CSkin.bUseBoxDefSkin = bUseBoxDefSkin;
1095 bBufferedInput.OnEnterDelegate = () =>
1097 // #36433 2016.7.18 yyagi
1098 // BufferedInputのON/OFFを切り替えると、OFFからONへの切り替えの際に、Enterが再入されてしまい
1099 // OFFに戻ってしまう(つまり切り替えができない)問題への対策。
1100 // BufferedInputの切り替え時に、入力バッファをクリアする処理を追加する。
1102 ( CDTXMania.Instance.Pad.bDecidePadIsPressedDGB() ||
1103 ( CDTXMania.Instance.ConfigIni.bEnterがキー割り当てのどこにも使用されていない &&
1104 CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Return )
1110 CDTXMania.Instance.Input管理.tポーリング(
1111 CDTXMania.Instance.bApplicationActive, CDTXMania.Instance.ConfigIni.bBufferedInput );
1118 public bool bConfigIniがないかDTXManiaのバージョンが異なる
1122 return (!bConfigIniが存在している || !CDTXMania.VERSION.Equals(strDTXManiaVersion));
1126 public bool bEnterがキー割り当てのどこにも使用されていない
1130 for (EPad j = EPad.Min; j < EPad.Max; j++)
1132 for (int k = 0; k < AssignableCodes; k++)
1134 if ((KeyAssign[j][k].入力デバイス == EInputDevice.Keyboard) &&
1135 (KeyAssign[j][k].コード == (int)SlimDXKey.Return))
1145 public bool bウィンドウモード
1149 return !this.bFullScreen;
1153 this.bFullScreen.Value = !value;
1157 public bool bGuitar有効
1161 return eActiveInst == EActiveInstrument.GBOnly || eActiveInst == EActiveInstrument.Both;
1165 public bool bDrums有効
1169 return eActiveInst == EActiveInstrument.DrOnly || eActiveInst == EActiveInstrument.Both;
1173 public bool b楽器有効(EPart inst)
1175 if (inst == EPart.Drums)
1179 else if (inst == EPart.Guitar || inst == EPart.Bass)
1186 public bool bIsAutoPlay(EPart inst)
1189 if (inst == EPart.Drums)
1191 ret = bAutoPlay.IsAllTrue(EPart.Drums);
1193 else if (inst == EPart.Guitar)
1195 ret = bAutoPlay.IsAllTrue(EPart.Guitar);
1197 else if (inst == EPart.Bass)
1199 ret = bAutoPlay.IsAllTrue(EPart.Bass);
1204 public bool b演奏情報を表示する
1208 return this.bDebugInfo;
1212 this.bDebugInfo.Value = value;
1216 // #24063 2011.1.16 yyagi ギターとベースの切り替え
1217 public bool bIsSwappedGuitarBass
1223 // #24415 2011.2.21 yyagi FLIP中にalt-f4終了で、AUTOフラグがswapした状態でconfig.iniが出力されてしまうことを避けるためのフラグ
1224 public bool bIsSwappedGuitarBass_AutoFlagsAreSwapped
1230 // #35417 2015.8.18 yyagi FLIP中にalt-f4終了で、演奏設定がswapした状態でconfig.iniが出力されてしまうことを避けるためのフラグ
1231 public bool bIsSwappedGuitarBass_PlaySettingsAreSwapped
1237 public void SwapGuitarBassInfos_AutoFlags()
1239 Func<EPad, EPad, bool> AutoSwapper = (x, y) =>
1241 bool t = bAutoPlay[y];
1242 bAutoPlay[y].Value = bAutoPlay[x];
1243 bAutoPlay[x].Value = t;
1247 AutoSwapper(EPad.GtR, EPad.BsR);
1248 AutoSwapper(EPad.GtG, EPad.BsG);
1249 AutoSwapper(EPad.GtB, EPad.BsB);
1250 AutoSwapper(EPad.GtWail, EPad.BsWail);
1251 AutoSwapper(EPad.GtPick, EPad.BsPick);
1253 bIsSwappedGuitarBass_AutoFlagsAreSwapped = !bIsSwappedGuitarBass_AutoFlagsAreSwapped;
1256 public void t指定した入力が既にアサイン済みである場合はそれを全削除する(EInputDevice DeviceType, int nID, int nCode)
1258 for (EPad j = EPad.Min; j < EPad.Max; j++)
1260 for (int k = 0; k < AssignableCodes; k++)
1262 if (((KeyAssign[j][k].入力デバイス == DeviceType) &&
1263 (KeyAssign[j][k].ID == nID)) &&
1264 (KeyAssign[j][k].コード == nCode))
1266 for (int m = k; m < AssignableCodes - 1; m++)
1268 KeyAssign[j][m].CopyFrom(KeyAssign[j][m + 1].Value);
1270 KeyAssign[j][AssignableCodes - 1].Reset();
1277 private void ClearKeyAssign()
1279 KeyAssign = new STPadValue<COptionKeyAssign[]>();
1280 for (EPad j = EPad.Min; j < EPad.Max; ++j)
1282 KeyAssign[j] = new COptionKeyAssign[AssignableCodes];
1283 for (int k = 0; k < AssignableCodes; ++k)
1285 KeyAssign[j][k] = new COptionKeyAssign();
1289 private void SetDefaultKeyAssign()
1291 if (KeyAssign == null)
1296 SetKeyAssignFromString( strDefaultKeyAssign );
1298 private void SetKeyAssignFromString( string strParam )
1300 if (strParam == null)
1304 string[] paramLines = strParam.Split( new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries );
1305 if (paramLines.Length <= 1)
1307 Debug.WriteLine( "デフォルトのキーアサインを設定できませんでした1: " + strParam );
1311 Dictionary<string, EPad> dicStrEPad = new Dictionary<string, EPad>()
1320 { "HHO", EPad.HHO },
1324 { "GtR", EPad.GtR },
1325 { "GtG", EPad.GtG },
1326 { "GtB", EPad.GtB },
1327 { "GtPick", EPad.GtPick },
1328 { "GtWail", EPad.GtWail },
1329 { "GtDecide", EPad.GtDecide },
1330 { "GtCancel", EPad.GtCancel },
1331 { "BsR", EPad.BsR },
1332 { "BsG", EPad.BsG },
1333 { "BsB", EPad.BsB },
1334 { "BsPick", EPad.BsPick },
1335 { "BsWail", EPad.BsWail },
1336 { "BsDecide", EPad.BsDecide },
1337 { "BsCancel", EPad.BsCancel },
1338 { "Capture", EPad.Capture}
1341 foreach ( string param in paramLines )
1343 string[] tmp = param.Split( '=' );
1344 if ( tmp.Length != 2 )
1346 Debug.WriteLine( "デフォルトのキーアサインを設定できませんでした2: " + param );
1350 string strPad = tmp[ 0 ];
1351 string[] keys = tmp[ 1 ].Split( ',' );
1352 if ( keys.Length <= 0 )
1354 Debug.WriteLine( "デフォルトのキーアサインを設定できませんでした3: " + tmp[ 1 ] );
1358 bool b = dicStrEPad.TryGetValue( strPad, out e );
1361 Debug.WriteLine( "デフォルトキーアサインの文字列に誤りがあります1: " + strPad );
1364 foreach ( string key in keys )
1366 char cInputDevice = key[ 0 ];
1368 switch (cInputDevice)
1370 case 'K': eid = EInputDevice.Keyboard; break;
1371 case 'M': eid = EInputDevice.MIDIIn; break;
1372 case 'J': eid = EInputDevice.JoyPad; break;
1373 case 'N': eid = EInputDevice.Mouse; break;
1374 default: eid = EInputDevice.Unknown; break;
1376 int nID = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf( key[ 1 ] ); // #24166 2011.1.15 yyagi: to support ID > 10, change 2nd character from Decimal to 36-numeral system. (e.g. J1023 -> JA23)
1377 int nCode = Convert.ToInt32( key.Substring( 2 ) );
1379 KeyAssign[ e ][ count ].Value.InputDevice = eid;
1380 KeyAssign[ e ][ count ].Value.ID = nID;
1381 KeyAssign[ e ][ count ].Value.Code = nCode;
1384 // Debug.WriteLine( eid.ToString() + nID.ToString() + nCode.ToString() );
1389 const string strDefaultKeyAssign = @"
1391 SD=K033,M025,M026,M027,M028,M029,M031,M032,M034,M037,M038,M040,M0113
1392 BD=K012,K0126,M033,M035,M036,M0112
1395 FT=K023,M041,M043,M045
1396 CY=K022,M049,M052,M055,M057,M091
1398 RD=K020,M051,M053,M059,M089
1420 private string GetRelativePath( string strBasePath, string strTargetPath )
1422 string strRelativePath = strTargetPath;
1425 Uri uri = new Uri( strBasePath );
1426 strRelativePath = Uri.UnescapeDataString( uri.MakeRelativeUri( new Uri( strTargetPath ) ).ToString() ).Replace( '/', '\\' );
1428 catch ( UriFormatException )
1432 return strRelativePath;