1
0
mirror of synced 2024-11-24 23:50:21 +01:00
OpenTaiko/TJAPlayer3/Common/CConfigIni.cs

3088 lines
119 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Diagnostics;
using FDK;
using FDK.ExtensionMethods;
namespace TJAPlayer3
{
internal class CConfigIni : INotifyPropertyChanged
{
private const int MinimumKeyboardSoundLevelIncrement = 1;
private const int MaximumKeyboardSoundLevelIncrement = 20;
private const int DefaultKeyboardSoundLevelIncrement = 5;
// クラス
#region [ CKeyAssign ]
public class CKeyAssign
{
public class CKeyAssignPad
{
public CConfigIni.CKeyAssign.STKEYASSIGN[] HH
{
get
{
return this.padHH_R;
}
set
{
this.padHH_R = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] R
{
get
{
return this.padHH_R;
}
set
{
this.padHH_R = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] SD
{
get
{
return this.padSD_G;
}
set
{
this.padSD_G = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] G
{
get
{
return this.padSD_G;
}
set
{
this.padSD_G = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] BD
{
get
{
return this.padBD_B;
}
set
{
this.padBD_B = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] B
{
get
{
return this.padBD_B;
}
set
{
this.padBD_B = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] HT
{
get
{
return this.padHT_Pick;
}
set
{
this.padHT_Pick = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] Pick
{
get
{
return this.padHT_Pick;
}
set
{
this.padHT_Pick = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LT
{
get
{
return this.padLT_Wail;
}
set
{
this.padLT_Wail = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] Wail
{
get
{
return this.padLT_Wail;
}
set
{
this.padLT_Wail = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] FT
{
get
{
return this.padFT_Cancel;
}
set
{
this.padFT_Cancel = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] Cancel
{
get
{
return this.padFT_Cancel;
}
set
{
this.padFT_Cancel = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] CY
{
get
{
return this.padCY_Decide;
}
set
{
this.padCY_Decide = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] Decide
{
get
{
return this.padCY_Decide;
}
set
{
this.padCY_Decide = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] HHO
{
get
{
return this.padHHO;
}
set
{
this.padHHO = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] RD
{
get
{
return this.padRD;
}
set
{
this.padRD = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LC
{
get
{
return this.padLC;
}
set
{
this.padLC = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LP
{
get
{
return this.padLP;
}
set
{
this.padLP = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LBD
{
get
{
return this.padLBD;
}
set
{
this.padLBD = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] Capture
{
get
{
return this.padCapture;
}
set
{
this.padCapture = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LeftRed
{
get
{
return this.padLRed;
}
set
{
this.padLRed = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] RightRed
{
get
{
return this.padRRed;
}
set
{
this.padRRed = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LeftBlue
{
get
{
return this.padLBlue;
}
set
{
this.padLBlue = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] RightBlue
{
get
{
return this.padRBlue;
}
set
{
this.padRBlue = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LeftRed2P
{
get
{
return this.padLRed2P;
}
set
{
this.padLRed2P = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] RightRed2P
{
get
{
return this.padRRed2P;
}
set
{
this.padRRed2P = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] LeftBlue2P
{
get
{
return this.padLBlue2P;
}
set
{
this.padLBlue2P = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] RightBlue2P
{
get
{
return this.padRBlue2P;
}
set
{
this.padRBlue2P = value;
}
}
public CConfigIni.CKeyAssign.STKEYASSIGN[] this[ int index ]
{
get
{
switch ( index )
{
case (int) EKeyConfigPad.HH:
return this.padHH_R;
case (int) EKeyConfigPad.SD:
return this.padSD_G;
case (int) EKeyConfigPad.BD:
return this.padBD_B;
case (int) EKeyConfigPad.HT:
return this.padHT_Pick;
case (int) EKeyConfigPad.LT:
return this.padLT_Wail;
case (int) EKeyConfigPad.FT:
return this.padFT_Cancel;
case (int) EKeyConfigPad.CY:
return this.padCY_Decide;
case (int) EKeyConfigPad.HHO:
return this.padHHO;
case (int) EKeyConfigPad.RD:
return this.padRD;
case (int) EKeyConfigPad.LC:
return this.padLC;
case (int) EKeyConfigPad.LP: // #27029 2012.1.4 from
return this.padLP; //
case (int) EKeyConfigPad.LBD: // #27029 2012.1.4 from
return this.padLBD; //
case (int) EKeyConfigPad.LRed:
return this.padLRed;
case (int) EKeyConfigPad.RRed:
return this.padRRed;
case (int) EKeyConfigPad.LBlue:
return this.padLBlue;
case (int) EKeyConfigPad.RBlue:
return this.padRBlue;
case (int) EKeyConfigPad.LRed2P:
return this.padLRed2P;
case (int) EKeyConfigPad.RRed2P:
return this.padRRed2P;
case (int) EKeyConfigPad.LBlue2P:
return this.padLBlue2P;
case (int) EKeyConfigPad.RBlue2P:
return this.padRBlue2P;
case (int) EKeyConfigPad.Capture:
return this.padCapture;
}
throw new IndexOutOfRangeException();
}
set
{
switch ( index )
{
case (int) EKeyConfigPad.HH:
this.padHH_R = value;
return;
case (int) EKeyConfigPad.SD:
this.padSD_G = value;
return;
case (int) EKeyConfigPad.BD:
this.padBD_B = value;
return;
case (int) EKeyConfigPad.Pick:
this.padHT_Pick = value;
return;
case (int) EKeyConfigPad.LT:
this.padLT_Wail = value;
return;
case (int) EKeyConfigPad.FT:
this.padFT_Cancel = value;
return;
case (int) EKeyConfigPad.CY:
this.padCY_Decide = value;
return;
case (int) EKeyConfigPad.HHO:
this.padHHO = value;
return;
case (int) EKeyConfigPad.RD:
this.padRD = value;
return;
case (int) EKeyConfigPad.LC:
this.padLC = value;
return;
case (int) EKeyConfigPad.LP:
this.padLP = value;
return;
case (int) EKeyConfigPad.LBD:
this.padLBD = value;
return;
case (int) EKeyConfigPad.LRed:
this.padLRed = value;
return;
case (int) EKeyConfigPad.RRed:
this.padRRed = value;
return;
case (int) EKeyConfigPad.LBlue:
this.padLBlue = value;
return;
case (int) EKeyConfigPad.RBlue:
this.padRBlue = value;
return;
case (int) EKeyConfigPad.LRed2P:
this.padLRed2P = value;
return;
case (int) EKeyConfigPad.RRed2P:
this.padRRed2P = value;
return;
case (int) EKeyConfigPad.LBlue2P:
this.padLBlue2P = value;
return;
case (int) EKeyConfigPad.RBlue2P:
this.padRBlue2P = value;
return;
case (int) EKeyConfigPad.Capture:
this.padCapture = value;
return;
}
throw new IndexOutOfRangeException();
}
}
#region [ private ]
//-----------------
private CConfigIni.CKeyAssign.STKEYASSIGN[] padBD_B;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padCY_Decide;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padFT_Cancel;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padHH_R;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padHHO;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padHT_Pick;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLC;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLT_Wail;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padRD;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padSD_G;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLP;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLBD;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLRed;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLBlue;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padRRed;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padRBlue;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLRed2P;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padLBlue2P;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padRRed2P;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padRBlue2P;
private CConfigIni.CKeyAssign.STKEYASSIGN[] padCapture;
//-----------------
#endregion
}
[StructLayout( LayoutKind.Sequential )]
public struct STKEYASSIGN
{
public E入力デバイス ;
public int ID;
public int ;
public STKEYASSIGN( E入力デバイス DeviceType, int nID, int nCode )
{
this. = DeviceType;
this.ID = nID;
this. = nCode;
}
}
public CKeyAssignPad Bass = new CKeyAssignPad();
public CKeyAssignPad Drums = new CKeyAssignPad();
public CKeyAssignPad Guitar = new CKeyAssignPad();
public CKeyAssignPad Taiko = new CKeyAssignPad();
public CKeyAssignPad System = new CKeyAssignPad();
public CKeyAssignPad this[ int index ]
{
get
{
switch( index )
{
case (int) EKeyConfigPart.DRUMS:
return this.Drums;
case (int) EKeyConfigPart.GUITAR:
return this.Guitar;
case (int) EKeyConfigPart.BASS:
return this.Bass;
case (int) EKeyConfigPart.TAIKO:
return this.Taiko;
case (int) EKeyConfigPart.SYSTEM:
return this.System;
}
throw new IndexOutOfRangeException();
}
set
{
switch( index )
{
case (int) EKeyConfigPart.DRUMS:
this.Drums = value;
return;
case (int) EKeyConfigPart.GUITAR:
this.Guitar = value;
return;
case (int) EKeyConfigPart.BASS:
this.Bass = value;
return;
case (int) EKeyConfigPart.TAIKO:
this.Taiko = value;
return;
case (int) EKeyConfigPart.SYSTEM:
this.System = value;
return;
}
throw new IndexOutOfRangeException();
}
}
}
#endregion
//
public enum ESoundDeviceTypeForConfig
{
ACM = 0,
// DirectSound,
ASIO,
WASAPI,
Unknown=99
}
// プロパティ
#if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
//----------------------------------------
public float[,] fGaugeFactor = new float[5,2];
public float[] fDamageLevelFactor = new float[3];
//----------------------------------------
#endif
public int nBGAlpha;
public bool bAVI有効;
public bool bBGA有効;
public bool bBGM音を発声する;
public STDGBVALUE<bool> bHidden;
public STDGBVALUE<bool> bLeft;
public STDGBVALUE<bool> bLight;
public bool bLogDTX詳細ログ出力;
public bool bLog曲検索ログ出力;
public bool bLog作成解放ログ出力;
public STDGBVALUE<bool> bReverse;
public E判定表示優先度 e判定表示優先度;
public STDGBVALUE<E判定位置> e判定位置; // #33891 2014.6.26 yyagi
public bool bScoreIniを出力する;
public bool bSTAGEFAILED有効;
public STDGBVALUE<bool> bSudden;
public bool bTight;
public STDGBVALUE<bool> bGraph; // #24074 2011.01.23 add ikanick
public bool bWave再生位置自動調整機能有効;
public bool bストイックモード;
public bool bランダムセレクトで子BOXを検索対象とする;
public bool bログ出力;
public bool b演奏情報を表示する;
public bool b垂直帰線待ちを行う;
public bool b全画面モード;
public int n初期ウィンドウ開始位置X; // #30675 2013.02.04 ikanick add
public int n初期ウィンドウ開始位置Y;
public int nウインドウwidth; // #23510 2010.10.31 yyagi add
public int nウインドウheight; // #23510 2010.10.31 yyagi add
public Dictionary<int, string> dicJoystick;
public Eダークモード eDark;
public STDGBVALUE<Eランダムモード> eRandom;
public Eダメージレベル eダメージレベル;
public CKeyAssign KeyAssign;
public int n非フォーカス時スリープms; // #23568 2010.11.04 ikanick add
public int nフレーム毎スリープms; // #xxxxx 2011.11.27 yyagi add
public int n演奏速度;
public bool b演奏速度が一倍速であるとき以外音声を再生しない;
public int n曲が選択されてからプレビュー音が鳴るまでのウェイトms;
public int n曲が選択されてからプレビュー画像が表示開始されるまでのウェイトms;
private bool _applyLoudnessMetadata;
public bool ApplyLoudnessMetadata
{
get => _applyLoudnessMetadata;
set => SetProperty(ref _applyLoudnessMetadata, value, nameof(ApplyLoudnessMetadata));
}
private double _targetLoudness;
public double TargetLoudness
{
get => _targetLoudness;
set => SetProperty(ref _targetLoudness, value, nameof(TargetLoudness));
}
private bool _applySongVol;
public bool ApplySongVol
{
get => _applySongVol;
set => SetProperty(ref _applySongVol, value, nameof(ApplySongVol));
}
private int _soundEffectLevel;
public int SoundEffectLevel
{
get => _soundEffectLevel;
set => SetProperty(ref _soundEffectLevel, value, nameof(SoundEffectLevel));
}
private int _voiceLevel;
public int VoiceLevel
{
get => _voiceLevel;
set => SetProperty(ref _voiceLevel, value, nameof(VoiceLevel));
}
private int _songPreviewLevel;
public int SongPreviewLevel
{
get => _songPreviewLevel;
set => SetProperty(ref _songPreviewLevel, value, nameof(SongPlaybackLevel));
}
private int _songPlaybackLevel;
public int SongPlaybackLevel
{
get => _songPlaybackLevel;
set => SetProperty(ref _songPlaybackLevel, value, nameof(SongPlaybackLevel));
}
private int _keyboardSoundLevelIncrement;
public int KeyboardSoundLevelIncrement
{
get => _keyboardSoundLevelIncrement;
set => SetProperty(
ref _keyboardSoundLevelIncrement,
value.Clamp(MinimumKeyboardSoundLevelIncrement, MaximumKeyboardSoundLevelIncrement),
nameof(KeyboardSoundLevelIncrement));
}
public STDGBVALUE<int> n表示可能な最小コンボ数;
public STDGBVALUE<int> n譜面スクロール速度;
public string strDTXManiaのバージョン;
public string str曲データ検索パス;
public string FontName;
public string BoxFontName;
public bool bBranchGuide;
public int nScoreMode;
public int nDefaultCourse; //2017.01.30 DD デフォルトでカーソルをあわせる難易度
public int nPlayerCount; //2017.08.18 kairera0467 マルチプレイ対応
public bool b太鼓パートAutoPlay;
public bool b太鼓パートAutoPlay2P; //2017.08.16 kairera0467 マルチプレイ対応
public bool bAuto先生の連打;
public bool b大音符判定;
public int n両手判定の待ち時間;
public int nBranchAnime;
public bool bJudgeCountDisplay;
public bool bEnableCountdownTimer;
// 各画像の表示・非表示設定
public bool ShowChara;
public bool ShowDancer;
public bool ShowRunner;
public bool ShowFooter;
public bool ShowMob;
public bool ShowPuchiChara; // リザーブ
//
public EScrollMode eScrollMode = EScrollMode.Normal;
public bool bスクロールモードを上書き = false;
public bool bHispeedRandom;
public Eステルスモード eSTEALTH;
public bool bNoInfo;
public int nDefaultSongSort;
public EGame eGameMode;
public int TokkunSkipMeasures;
public int TokkunMashInterval;
public bool bSuperHard = false;
public bool bTokkunMode = false;
public bool bJust;
public bool bEndingAnime = false; // 2017.01.27 DD 「また遊んでね」画面の有効/無効オプション追加
public STDGBVALUE<E判定文字表示位置> ;
// public int nハイハット切り捨て下限Velocity;
// public int n切り捨て下限Velocity; // #23857 2010.12.12 yyagi VelocityMin
public int nInputAdjustTimeMs;
public STDGBVALUE<int> nJudgeLinePosOffset; // #31602 2013.6.23 yyagi 判定ライン表示位置のオフセット
public bool bIsAutoResultCapture; // #25399 2011.6.9 yyagi リザルト画像自動保存機能のON/OFF制御
public int nPoliphonicSounds; // #28228 2012.5.1 yyagi レーン毎の最大同時発音数
public bool bバッファ入力を行う;
public bool bIsEnabledSystemMenu; // #28200 2012.5.1 yyagi System Menuの使用可否切替
public string strSystemSkinSubfolderFullName; // #28195 2012.5.2 yyagi Skin切替用 System/以下のサブフォルダ名
public bool bConfigIniがないかDTXManiaのバージョンが異なる
{
get
{
return ( !this.bConfigIniが存在している || !TJAPlayer3.VERSION.Equals( this.strDTXManiaのバージョン ) );
}
}
public bool bEnterがキー割り当てのどこにも使用されていない
{
get
{
for( int i = 0; i <= (int)EKeyConfigPart.SYSTEM; i++ )
{
for( int j = 0; j <= (int)EKeyConfigPad.Capture; j++ )
{
for( int k = 0; k < 0x10; k++ )
{
if( ( this.KeyAssign[ i ][ j ][ k ]. == E入力デバイス. ) && ( this.KeyAssign[ i ][ j ][ k ]. == (int)SlimDXKeys.Key.Return ) )
{
return false;
}
}
}
}
return true;
}
}
public bool bウィンドウモード
{
get
{
return !this.b全画面モード;
}
set
{
this.b全画面モード = !value;
}
}
public bool b演奏情報を表示しない
{
get
{
return !this.b演奏情報を表示する;
}
set
{
this.b演奏情報を表示する = !value;
}
}
public int n背景の透過度
{
get
{
return this.nBGAlpha;
}
set
{
if( value < 0 )
{
this.nBGAlpha = 0;
}
else if( value > 0xff )
{
this.nBGAlpha = 0xff;
}
else
{
this.nBGAlpha = value;
}
}
}
public int nRisky; // #23559 2011.6.20 yyagi Riskyでの残ミス数。0で閉店
public bool bIsAllowedDoubleClickFullscreen; // #26752 2011.11.27 yyagi ダブルクリックしてもフルスクリーンに移行しない
public STAUTOPLAY bAutoPlay;
public int nSoundDeviceType; // #24820 2012.12.23 yyagi 出力サウンドデバイス(0=ACM(にしたいが設計がきつそうならDirectShow), 1=ASIO, 2=WASAPI)
public int nWASAPIBufferSizeMs; // #24820 2013.1.15 yyagi WASAPIのバッファサイズ
// public int nASIOBufferSizeMs; // #24820 2012.12.28 yyagi ASIOのバッファサイズ
public int nASIODevice; // #24820 2013.1.17 yyagi ASIOデバイス
public bool bUseOSTimer; // #33689 2014.6.6 yyagi 演奏タイマーの種類
public bool bDynamicBassMixerManagement; // #24820
public bool bTimeStretch; // #23664 2013.2.24 yyagi ピッチ変更無しで再生速度を変更するかどうか
public STDGBVALUE<EInvisible> eInvisible; // #32072 2013.9.20 yyagi チップを非表示にする
public int nDisplayTimesMs, nFadeoutTimeMs;
public STDGBVALUE<int> nViewerScrollSpeed;
public bool bViewerVSyncWait;
public bool bViewerShowDebugStatus;
public bool bViewerTimeStretch;
public bool bViewerDrums有効, bViewerGuitar有効;
//public bool bNoMP3Streaming; // 2014.4.14 yyagi; mp3のシーク位置がおかしくなる場合は、これをtrueにすることで、wavにデコードしてからオンメモリ再生する
public int nMasterVolume;
public bool ShinuchiMode; // 真打モード
public bool FastRender; // 事前画像描画モード
public int MusicPreTimeMs; // 音源再生前の待機時間ms
// I18N choosen language
public string sLang = "jp";
/// <summary>
/// DiscordのRitch Presenceに再生中の.tjaファイルの情報を送信するかどうか。
/// </summary>
public bool SendDiscordPlayingInformation;
#if false
[StructLayout( LayoutKind.Sequential )]
public struct STAUTOPLAY // C定数のEレーンとindexを一致させること
{
public bool LC; // 0
public bool HH; // 1
public bool SD; // 2
public bool BD; // 3
public bool HT; // 4
public bool LT; // 5
public bool FT; // 6
public bool CY; // 7
public bool RD; // 8
public bool Guitar; // 9 (not used)
public bool Bass; // 10 (not used)
public bool GtR; // 11
public bool GtG; // 12
public bool GtB; // 13
public bool GtPick; // 14
public bool GtW; // 15
public bool BsR; // 16
public bool BsG; // 17
public bool BsB; // 18
public bool BsPick; // 19
public bool BsW; // 20
public bool this[ int index ]
{
get
{
switch ( index )
{
case (int) Eレーン.LC:
return this.LC;
case (int) Eレーン.HH:
return this.HH;
case (int) Eレーン.SD:
return this.SD;
case (int) Eレーン.BD:
return this.BD;
case (int) Eレーン.HT:
return this.HT;
case (int) Eレーン.LT:
return this.LT;
case (int) Eレーン.FT:
return this.FT;
case (int) Eレーン.CY:
return this.CY;
case (int) Eレーン.RD:
return this.RD;
case (int) Eレーン.Guitar:
return this.Guitar;
case (int) Eレーン.Bass:
return this.Bass;
case (int) Eレーン.GtR:
return this.GtR;
case (int) Eレーン.GtG:
return this.GtG;
case (int) Eレーン.GtB:
return this.GtB;
case (int) Eレーン.GtPick:
return this.GtPick;
case (int) Eレーン.GtW:
return this.GtW;
case (int) Eレーン.BsR:
return this.BsR;
case (int) Eレーン.BsG:
return this.BsG;
case (int) Eレーン.BsB:
return this.BsB;
case (int) Eレーン.BsPick:
return this.BsPick;
case (int) Eレーン.BsW:
return this.BsW;
}
throw new IndexOutOfRangeException();
}
set
{
switch ( index )
{
case (int) Eレーン.LC:
this.LC = value;
return;
case (int) Eレーン.HH:
this.HH = value;
return;
case (int) Eレーン.SD:
this.SD = value;
return;
case (int) Eレーン.BD:
this.BD = value;
return;
case (int) Eレーン.HT:
this.HT = value;
return;
case (int) Eレーン.LT:
this.LT = value;
return;
case (int) Eレーン.FT:
this.FT = value;
return;
case (int) Eレーン.CY:
this.CY = value;
return;
case (int) Eレーン.RD:
this.RD = value;
return;
case (int) Eレーン.Guitar:
this.Guitar = value;
return;
case (int) Eレーン.Bass:
this.Bass = value;
return;
case (int) Eレーン.GtR:
this.GtR = value;
return;
case (int) Eレーン.GtG:
this.GtG = value;
return;
case (int) Eレーン.GtB:
this.GtB = value;
return;
case (int) Eレーン.GtPick:
this.GtPick = value;
return;
case (int) Eレーン.GtW:
this.GtW = value;
return;
case (int) Eレーン.BsR:
this.BsR = value;
return;
case (int) Eレーン.BsG:
this.BsG = value;
return;
case (int) Eレーン.BsB:
this.BsB = value;
return;
case (int) Eレーン.BsPick:
this.BsPick = value;
return;
case (int) Eレーン.BsW:
this.BsW = value;
return;
}
throw new IndexOutOfRangeException();
}
}
}
#endif
#region [ STRANGE ]
public STRANGE nヒット範囲ms;
[StructLayout( LayoutKind.Sequential )]
public struct STRANGE
{
public int Perfect;
public int Great;
public int Good;
public int Poor;
public int this[ int index ]
{
get
{
switch( index )
{
case 0:
return this.Perfect;
case 1:
return this.Great;
case 2:
return this.Good;
case 3:
return this.Poor;
}
throw new IndexOutOfRangeException();
}
set
{
switch( index )
{
case 0:
this.Perfect = value;
return;
case 1:
this.Great = value;
return;
case 2:
this.Good = value;
return;
case 3:
this.Poor = value;
return;
}
throw new IndexOutOfRangeException();
}
}
}
#endregion
#region [ STLANEVALUE ]
public STLANEVALUE nVelocityMin;
[StructLayout( LayoutKind.Sequential )]
public struct STLANEVALUE
{
public int LC;
public int HH;
public int SD;
public int BD;
public int HT;
public int LT;
public int FT;
public int CY;
public int RD;
public int LP;
public int LBD;
public int Guitar;
public int Bass;
public int this[ int index ]
{
get
{
switch( index )
{
case 0:
return this.LC;
case 1:
return this.HH;
case 2:
return this.SD;
case 3:
return this.BD;
case 4:
return this.HT;
case 5:
return this.LT;
case 6:
return this.FT;
case 7:
return this.CY;
case 8:
return this.RD;
case 9:
return this.LP;
case 10:
return this.LBD;
case 11:
return this.Guitar;
case 12:
return this.Bass;
}
throw new IndexOutOfRangeException();
}
set
{
switch( index )
{
case 0:
this.LC = value;
return;
case 1:
this.HH = value;
return;
case 2:
this.SD = value;
return;
case 3:
this.BD = value;
return;
case 4:
this.HT = value;
return;
case 5:
this.LT = value;
return;
case 6:
this.FT = value;
return;
case 7:
this.CY = value;
return;
case 8:
this.RD = value;
return;
case 9:
this.LP = value;
return;
case 10:
this.LBD = value;
return;
case 11:
this.Guitar = value;
return;
case 12:
this.Bass = value;
return;
}
throw new IndexOutOfRangeException();
}
}
}
#endregion
#region[Ver.K追加オプション]
//--------------------------
//ゲーム内のオプションに加えて、
//システム周りのオプションもこのブロックで記述している。
#region[Display]
//--------------------------
public EClipDispType eClipDispType;
#endregion
#region[Position]
public Eレーンタイプ eLaneType;
public Eミラー eMirror;
#endregion
#region[System]
public bool bDirectShowMode;
#endregion
//--------------------------
#endregion
// コンストラクタ
public CConfigIni()
{
#if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
//----------------------------------------
this.fGaugeFactor[0,0] = 0.004f;
this.fGaugeFactor[0,1] = 0.006f;
this.fGaugeFactor[1,0] = 0.002f;
this.fGaugeFactor[1,1] = 0.003f;
this.fGaugeFactor[2,0] = 0.000f;
this.fGaugeFactor[2,1] = 0.000f;
this.fGaugeFactor[3,0] = -0.020f;
this.fGaugeFactor[3,1] = -0.030f;
this.fGaugeFactor[4,0] = -0.050f;
this.fGaugeFactor[4,1] = -0.050f;
this.fDamageLevelFactor[0] = 0.5f;
this.fDamageLevelFactor[1] = 1.0f;
this.fDamageLevelFactor[2] = 1.5f;
//----------------------------------------
#endif
this.strDTXManiaのバージョン = "Unknown";
this.str曲データ検索パス = @".\";
this.b全画面モード = false;
this.b垂直帰線待ちを行う = true;
this.n初期ウィンドウ開始位置X = 0; // #30675 2013.02.04 ikanick add
this.n初期ウィンドウ開始位置Y = 0;
this.nウインドウwidth = SampleFramework.GameWindowSize.Width; // #23510 2010.10.31 yyagi add
this.nウインドウheight = SampleFramework.GameWindowSize.Height; //
this.nフレーム毎スリープms = -1; // #xxxxx 2011.11.27 yyagi add
this.n非フォーカス時スリープms = 1; // #23568 2010.11.04 ikanick add
this._bGuitar有効 = true;
this._bDrums有効 = true;
this.nBGAlpha = 100;
this.eダメージレベル = Eダメージレベル.;
this.bSTAGEFAILED有効 = true;
this.bAVI有効 = false;
this.bBGA有効 = true;
this.n曲が選択されてからプレビュー音が鳴るまでのウェイトms = 1000;
this.n曲が選択されてからプレビュー画像が表示開始されるまでのウェイトms = 100;
//this.bWave再生位置自動調整機能有効 = true;
this.bWave再生位置自動調整機能有効 = false;
this.bBGM音を発声する = true;
this.bScoreIniを出力する = true;
this.bランダムセレクトで子BOXを検索対象とする = true;
this.n表示可能な最小コンボ数 = new STDGBVALUE<int>();
this.n表示可能な最小コンボ数.Drums = 10;
this.n表示可能な最小コンボ数.Guitar = 10;
this.n表示可能な最小コンボ数.Bass = 10;
this.n表示可能な最小コンボ数.Taiko = 10;
this.FontName = "MS UI Gothic";
this.BoxFontName = "MS UI Gothic";
this.ApplyLoudnessMetadata = true;
this.bEnableCountdownTimer = true;
this.sLang = "jp";
// 2018-08-28 twopointzero:
// There exists a particular large, well-known, well-curated, and
// regularly-updated collection of content for use with Taiko no
// Tatsujin simulators. A statistical analysis was performed on the
// the integrated loudness and true peak loudness of the thousands
// of songs within this collection as of late August 2018.
//
// The analysis allows us to select a target loudness which
// results in the smallest total amount of loudness adjustment
// applied to the songs of that collection. The selected target
// loudness should result in the least-noticeable average
// adjustment for the most users, assuming their collection is
// similar to the exemplar.
//
// The target loudness which achieves this is -7.4 LUFS.
this.TargetLoudness = -7.4;
this.ApplySongVol = false;
this.SoundEffectLevel = CSound.DefaultSoundEffectLevel;
this.VoiceLevel = CSound.DefaultVoiceLevel;
this.SongPreviewLevel = CSound.DefaultSongPlaybackLevel;
this.SongPlaybackLevel = CSound.DefaultSongPlaybackLevel;
this.KeyboardSoundLevelIncrement = DefaultKeyboardSoundLevelIncrement;
this.bログ出力 = true;
this.bSudden = new STDGBVALUE<bool>();
this.bHidden = new STDGBVALUE<bool>();
this.bReverse = new STDGBVALUE<bool>();
this.eRandom = new STDGBVALUE<Eランダムモード>();
this.bLight = new STDGBVALUE<bool>();
this.bLeft = new STDGBVALUE<bool>();
this.e判定位置 = new STDGBVALUE<E判定位置>(); // #33891 2014.6.26 yyagi
this. = new STDGBVALUE<E判定文字表示位置>();
this.n譜面スクロール速度 = new STDGBVALUE<int>();
this.nInputAdjustTimeMs = 0;
this.nJudgeLinePosOffset = new STDGBVALUE<int>(); // #31602 2013.6.23 yyagi
this.e判定表示優先度 = E判定表示優先度.Chipより下;
for ( int i = 0; i < 3; i++ )
{
this.bSudden[ i ] = false;
this.bHidden[ i ] = false;
this.bReverse[ i ] = false;
this.eRandom[ i ] = Eランダムモード.OFF;
this.bLight[ i ] = false;
this.bLeft[ i ] = false;
this.[ i ] = E判定文字表示位置.;
this.n譜面スクロール速度[ i ] = 9;
this.nJudgeLinePosOffset[ i ] = 0;
this.eInvisible[ i ] = EInvisible.OFF;
this.nViewerScrollSpeed[ i ] = 1;
this.e判定位置[ i ] = E判定位置.;
//this.e判定表示優先度[ i ] = E判定表示優先度.Chipより下;
}
this.n演奏速度 = 20;
this.b演奏速度が一倍速であるとき以外音声を再生しない = false;
#region [ AutoPlay ]
this.bAutoPlay = new STAUTOPLAY();
this.b太鼓パートAutoPlay = true;
this.b太鼓パートAutoPlay2P = true;
this.bAuto先生の連打 = true;
#endregion
this.nヒット範囲ms = new STRANGE();
this.nヒット範囲ms.Perfect = 30;
this.nヒット範囲ms.Great = -1; //使用しません。
this.nヒット範囲ms.Good = 100;
this.nヒット範囲ms.Poor = 130;
this.ConfigIniファイル名 = "";
this.dicJoystick = new Dictionary<int, string>( 10 );
this.tデフォルトのキーアサインに設定する();
#region [ velocityMin ]
this.nVelocityMin.LC = 0; // #23857 2011.1.31 yyagi VelocityMin
this.nVelocityMin.HH = 20;
this.nVelocityMin.SD = 0;
this.nVelocityMin.BD = 0;
this.nVelocityMin.HT = 0;
this.nVelocityMin.LT = 0;
this.nVelocityMin.FT = 0;
this.nVelocityMin.CY = 0;
this.nVelocityMin.RD = 0;
this.nVelocityMin.LP = 0;
this.nVelocityMin.LBD = 0;
#endregion
this.nRisky = 0; // #23539 2011.7.26 yyagi RISKYモード
this.bIsAutoResultCapture = false; // #25399 2011.6.9 yyagi リザルト画像自動保存機能ON/OFF
this.bバッファ入力を行う = true;
this.bIsAllowedDoubleClickFullscreen = true; // #26752 2011.11.26 ダブルクリックでのフルスクリーンモード移行を許可
this.nPoliphonicSounds = 4; // #28228 2012.5.1 yyagi レーン毎の最大同時発音数
// #24820 2013.1.15 yyagi 初期値を4から2に変更。BASS.net使用時の負荷軽減のため。
// #24820 2013.1.17 yyagi 初期値を4に戻した。動的なミキサー制御がうまく動作しているため。
this.bIsEnabledSystemMenu = true; // #28200 2012.5.1 yyagi System Menuの利用可否切替(使用可)
this.strSystemSkinSubfolderFullName = ""; // #28195 2012.5.2 yyagi 使用中のSkinサブフォルダ名
this.bTight = false; // #29500 2012.9.11 kairera0467 TIGHTモード
#region [ WASAPI/ASIO ]
this.nSoundDeviceType = FDK.COS.bIsVistaOrLater ?
(int) ESoundDeviceTypeForConfig.WASAPI : (int) ESoundDeviceTypeForConfig.ACM; // #24820 2012.12.23 yyagi 初期値はACM | #31927 2013.8.25 yyagi OSにより初期値変更
this.nWASAPIBufferSizeMs = 50; // #24820 2013.1.15 yyagi 初期値は50(0で自動設定)
this.nASIODevice = 0; // #24820 2013.1.17 yyagi
// this.nASIOBufferSizeMs = 0; // #24820 2012.12.25 yyagi 初期値は0(自動設定)
#endregion
this.bUseOSTimer = false;; // #33689 2014.6.6 yyagi 初期値はfalse (FDKのタイマー。氏考案の独自タイマー)
this.bDynamicBassMixerManagement = true; //
this.bTimeStretch = false; // #23664 2013.2.24 yyagi 初期値はfalse (再生速度変更を、ピッチ変更にて行う)
this.nDisplayTimesMs = 3000; // #32072 2013.10.24 yyagi Semi-Invisibleでの、チップ再表示期間
this.nFadeoutTimeMs = 2000; // #32072 2013.10.24 yyagi Semi-Invisibleでの、チップフェードアウト時間
bViewerVSyncWait = true;
bViewerShowDebugStatus = true;
bViewerTimeStretch = false;
bViewerDrums有効 = true;
bViewerGuitar有効 = true;
this.bBranchGuide = false;
this.nScoreMode = 2;
this.nDefaultCourse = 3;
this.nBranchAnime = 1;
this.b大音符判定 = false;
this.n両手判定の待ち時間 = 50;
this.bJudgeCountDisplay = false;
ShowChara = true;
ShowDancer = true;
ShowRunner = true;
ShowFooter = true;
ShowMob = true;
ShowPuchiChara = true;
this.eSTEALTH = Eステルスモード.OFF;
this.bNoInfo = false;
//this.bNoMP3Streaming = false;
this.nMasterVolume = 100; // #33700 2014.4.26 yyagi マスターボリュームの設定(WASAPI/ASIO用)
this.bHispeedRandom = false;
this.nDefaultSongSort = 2;
this.eGameMode = EGame.OFF;
this.TokkunMashInterval = 750;
this.bEndingAnime = false;
this.nPlayerCount = 1; //2017.08.18 kairera0467 マルチプレイ対応
ShinuchiMode = false;
FastRender = true;
MusicPreTimeMs = 1000; // 一秒
SendDiscordPlayingInformation = true;
#region[ Ver.K追加 ]
this.eLaneType = Eレーンタイプ.TypeA;
this.bDirectShowMode = false;
#endregion
}
public CConfigIni( string iniファイル名 )
: this()
{
this.tファイルから読み込み( iniファイル名 );
}
// メソッド
public void t指定した入力が既にアサイン済みである場合はそれを全削除する( E入力デバイス DeviceType, int nID, int nCode )
{
for( int i = 0; i <= (int)EKeyConfigPart.SYSTEM; i++ )
{
for( int j = 0; j <= (int)EKeyConfigPad.Capture; j++ )
{
for( int k = 0; k < 0x10; k++ )
{
if( ( ( this.KeyAssign[ i ][ j ][ k ]. == DeviceType ) && ( this.KeyAssign[ i ][ j ][ k ].ID == nID ) ) && ( this.KeyAssign[ i ][ j ][ k ]. == nCode ) )
{
for( int m = k; m < 15; m++ )
{
this.KeyAssign[ i ][ j ][ m ] = this.KeyAssign[ i ][ j ][ m + 1 ];
}
this.KeyAssign[ i ][ j ][ 15 ]. = E入力デバイス.;
this.KeyAssign[ i ][ j ][ 15 ].ID = 0;
this.KeyAssign[ i ][ j ][ 15 ]. = 0;
k--;
}
}
}
}
}
public void t書き出し( string iniファイル名 )
{
StreamWriter sw = new StreamWriter( iniファイル名, false, Encoding.GetEncoding( "Shift_JIS" ) );
sw.WriteLine( ";-------------------" );
#region [ System ]
sw.WriteLine( "[System]" );
sw.WriteLine();
#if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
//------------------------------
sw.WriteLine("; ライフゲージのパラメータ調整(調整完了後削除予定)");
sw.WriteLine("; GaugeFactorD: ドラムのPerfect, Great,... の回復量(ライフMAXを1.0としたときの値を指定)");
sw.WriteLine("; GaugeFactorG: Gt/BsのPerfect, Great,... の回復量(ライフMAXを1.0としたときの値を指定)");
sw.WriteLine("; DamageFactorD: DamageLevelがSmall, Normal, Largeの時に対するダメージ係数");
sw.WriteLine("GaugeFactorD={0}, {1}, {2}, {3}, {4}", this.fGaugeFactor[0, 0], this.fGaugeFactor[1, 0], this.fGaugeFactor[2, 0], this.fGaugeFactor[3, 0], this.fGaugeFactor[4, 0]);
sw.WriteLine("GaugeFactorG={0}, {1}, {2}, {3}, {4}", this.fGaugeFactor[0, 1], this.fGaugeFactor[1, 1], this.fGaugeFactor[2, 1], this.fGaugeFactor[3, 1], this.fGaugeFactor[4, 1]);
sw.WriteLine("DamageFactor={0}, {1}, {2}", this.fDamageLevelFactor[0], this.fDamageLevelFactor[1], fDamageLevelFactor[2]);
sw.WriteLine();
//------------------------------
#endif
#region [ Version ]
sw.WriteLine( "; リリースバージョン" );
sw.WriteLine( "; Release Version." );
sw.WriteLine( "Version={0}", TJAPlayer3.VERSION );
sw.WriteLine();
#endregion
#region [ TJAPath ]
sw.WriteLine( "; 譜面ファイルが格納されているフォルダへのパス。" );
sw.WriteLine( @"; セミコロン(;)で区切ることにより複数のパスを指定できます。(例: d:\tja\;e:\tja2\" );
sw.WriteLine( "; Pathes for TJA data." );
sw.WriteLine( @"; You can specify many pathes separated with semicolon(;). (e.g. d:\tja\;e:\tja2\)" );
sw.WriteLine( "TJAPath={0}", this.str曲データ検索パス );
sw.WriteLine();
#endregion
#region [ ]
#region [ Skinパスの絶対パス ]
Uri uriRoot = new Uri( System.IO.Path.Combine( TJAPlayer3.strEXEのあるフォルダ, "System" + System.IO.Path.DirectorySeparatorChar ) );
if ( strSystemSkinSubfolderFullName != null && strSystemSkinSubfolderFullName.Length == 0 )
{
// Config.iniが空の状態でDTXManiaをViewerとして起動_終了すると、strSystemSkinSubfolderFullName が空の状態でここに来る。
// → 初期値として Default/ を設定する。
strSystemSkinSubfolderFullName = System.IO.Path.Combine( TJAPlayer3.strEXEのあるフォルダ, "System" + System.IO.Path.DirectorySeparatorChar + "Default" + System.IO.Path.DirectorySeparatorChar );
}
Uri uriPath = new Uri( System.IO.Path.Combine( this.strSystemSkinSubfolderFullName, "." + System.IO.Path.DirectorySeparatorChar ) );
string relPath = uriRoot.MakeRelativeUri( uriPath ).ToString(); // 相対パスを取得
relPath = System.Web.HttpUtility.UrlDecode( relPath ); // デコードする
relPath = relPath.Replace( '/', System.IO.Path.DirectorySeparatorChar ); // 区切り文字が\ではなく/なので置換する
#endregion
sw.WriteLine( "; 使用するSkinのフォルダ名。" );
sw.WriteLine( "; 例えば System\\Default\\Graphics\\... などの場合は、SkinPath=.\\Default\\ を指定します。" );
sw.WriteLine( "; Skin folder path." );
sw.WriteLine( "; e.g. System\\Default\\Graphics\\... -> Set SkinPath=.\\Default\\" );
sw.WriteLine( "SkinPath={0}", relPath );
sw.WriteLine();
sw.WriteLine("; 事前画像描画機能を使うかどうか。(0: OFF, 1: ON)");
sw.WriteLine("; Use pre-textures render.");
sw.WriteLine("{0}={1}", nameof(FastRender), FastRender ? 1 : 0);
sw.WriteLine();
#endregion
#region [Language]
sw.WriteLine("; プレイ中やメニューの表示される言語を変更。");
sw.WriteLine("; Change the displayed language ingame and within the menus.");
sw.WriteLine("Lang={0}", this.sLang);
sw.WriteLine();
#endregion
#region [ Window関連 ]
sw.WriteLine( "; 画面モード(0:ウィンドウ, 1:全画面)" );
sw.WriteLine( "; Screen mode. (0:Window, 1:Fullscreen)" );
sw.WriteLine( "FullScreen={0}", this.b全画面モード ? 1 : 0 );
sw.WriteLine();
sw.WriteLine("; ウインドウモード時の画面幅"); // #23510 2010.10.31 yyagi add
sw.WriteLine("; A width size in the window mode."); //
sw.WriteLine("WindowWidth={0}", this.nウインドウwidth); //
sw.WriteLine(); //
sw.WriteLine("; ウインドウモード時の画面高さ"); //
sw.WriteLine("; A height size in the window mode."); //
sw.WriteLine("WindowHeight={0}", this.nウインドウheight); //
sw.WriteLine(); //
sw.WriteLine( "; ウィンドウモード時の位置X" ); // #30675 2013.02.04 ikanick add
sw.WriteLine( "; X position in the window mode." ); //
sw.WriteLine( "WindowX={0}", this.n初期ウィンドウ開始位置X ); //
sw.WriteLine(); //
sw.WriteLine( "; ウィンドウモード時の位置Y" ); //
sw.WriteLine( "; Y position in the window mode." ); //
sw.WriteLine( "WindowY={0}", this.n初期ウィンドウ開始位置Y ); //
sw.WriteLine(); //
sw.WriteLine( "; ウインドウをダブルクリックした時にフルスクリーンに移行するか(0:移行しない,1:移行する)" ); // #26752 2011.11.27 yyagi
sw.WriteLine( "; Whether double click to go full screen mode or not.(0:No, 1:Yes)" ); //
sw.WriteLine( "DoubleClickFullScreen={0}", this.bIsAllowedDoubleClickFullscreen? 1 : 0); //
sw.WriteLine(); //
sw.WriteLine( "; ALT+SPACEのメニュー表示を抑制するかどうか(0:抑制する 1:抑制しない)" ); // #28200 2012.5.1 yyagi
sw.WriteLine( "; Whether ALT+SPACE menu would be masked or not.(0=masked 1=not masked)" ); //
sw.WriteLine( "EnableSystemMenu={0}", this.bIsEnabledSystemMenu? 1 : 0 ); //
sw.WriteLine(); //
sw.WriteLine( "; 非フォーカス時のsleep値[ms]" ); // #23568 2011.11.04 ikanick add
sw.WriteLine( "; A sleep time[ms] while the window is inactive." ); //
sw.WriteLine( "BackSleep={0}", this.n非フォーカス時スリープms ); // そのまま引用(苦笑)
sw.WriteLine(); //
#endregion
#region [ ]
sw.WriteLine("; フォントレンダリングに使用するフォント名");
sw.WriteLine("; Font name used for font rendering.");
sw.WriteLine("FontName={0}", this.FontName);
sw.WriteLine();
sw.WriteLine("; Boxの説明文のフォントレンダリングに使用するフォント名");
sw.WriteLine("; Font name used for font rendering.");
sw.WriteLine("BoxFontName={0}", this.BoxFontName);
sw.WriteLine();
#endregion
#region [ (VSync, sleep) ]
sw.WriteLine("; 垂直帰線同期(0:OFF,1:ON)");
sw.WriteLine( "VSyncWait={0}", this.b垂直帰線待ちを行う ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; フレーム毎のsleep値[ms] (-1でスリープ無し, 0以上で毎フレームスリープ。動画キャプチャ等で活用下さい)" ); // #xxxxx 2011.11.27 yyagi add
sw.WriteLine( "; A sleep time[ms] per frame." ); //
sw.WriteLine( "SleepTimePerFrame={0}", this.nフレーム毎スリープms ); //
sw.WriteLine(); //
#endregion
#region [ WASAPI/ASIO関連 ]
sw.WriteLine( "; サウンド出力方式(0=ACM(って今はまだDirectSoundですが), 1=ASIO, 2=WASAPI)" );
sw.WriteLine( "; WASAPIはVista以降のOSで使用可能。推奨方式はWASAPI。" );
sw.WriteLine( "; なお、WASAPIが使用不可ならASIOを、ASIOが使用不可ならACMを使用します。" );
sw.WriteLine( "; Sound device type(0=ACM, 1=ASIO, 2=WASAPI)" );
sw.WriteLine( "; WASAPI can use on Vista or later OSs." );
sw.WriteLine( "; If WASAPI is not available, DTXMania try to use ASIO. If ASIO can't be used, ACM is used." );
sw.WriteLine( "SoundDeviceType={0}", (int) this.nSoundDeviceType );
sw.WriteLine();
sw.WriteLine( "; WASAPI使用時のサウンドバッファサイズ" );
sw.WriteLine( "; (0=デバイスに設定されている値を使用, 19999=バッファサイズ(単位:ms)の手動指定" );
sw.WriteLine( "; WASAPI Sound Buffer Size." );
sw.WriteLine( "; (0=Use system default buffer size, 1-9999=specify the buffer size(ms) by yourself)" );
sw.WriteLine( "WASAPIBufferSizeMs={0}", (int) this.nWASAPIBufferSizeMs );
sw.WriteLine();
sw.WriteLine( "; ASIO使用時のサウンドデバイス" );
sw.WriteLine( "; 存在しないデバイスを指定すると、DTXManiaが起動しないことがあります。" );
sw.WriteLine( "; Sound device used by ASIO." );
sw.WriteLine( "; Don't specify unconnected device, as the DTXMania may not bootup." );
string[] asiodev = CEnumerateAllAsioDevices.GetAllASIODevices();
for ( int i = 0; i < asiodev.Length; i++ )
{
sw.WriteLine( "; {0}: {1}", i, asiodev[ i ] );
}
sw.WriteLine( "ASIODevice={0}", (int) this.nASIODevice );
sw.WriteLine();
//sw.WriteLine( "; ASIO使用時のサウンドバッファサイズ" );
//sw.WriteLine( "; (0=デバイスに設定されている値を使用, 19999=バッファサイズ(単位:ms)の手動指定" );
//sw.WriteLine( "; ASIO Sound Buffer Size." );
//sw.WriteLine( "; (0=Use the value specified to the device, 1-9999=specify the buffer size(ms) by yourself)" );
//sw.WriteLine( "ASIOBufferSizeMs={0}", (int) this.nASIOBufferSizeMs );
//sw.WriteLine();
//sw.WriteLine( "; Bass.Mixの制御を動的に行うか否か。" );
//sw.WriteLine( "; ONにすると、ギター曲などチップ音の多い曲も再生できますが、画面が少しがたつきます。" );
//sw.WriteLine( "; (0=行わない, 1=行う)" );
//sw.WriteLine( "DynamicBassMixerManagement={0}", this.bDynamicBassMixerManagement ? 1 : 0 );
//sw.WriteLine();
sw.WriteLine( "; WASAPI/ASIO時に使用する演奏タイマーの種類" );
sw.WriteLine( "; Playback timer used for WASAPI/ASIO" );
sw.WriteLine( "; (0=FDK Timer, 1=System Timer)" );
sw.WriteLine( "SoundTimerType={0}", this.bUseOSTimer ? 1 : 0 );
sw.WriteLine();
//sw.WriteLine( "; 全体ボリュームの設定" );
//sw.WriteLine( "; (0=無音 100=最大。WASAPI/ASIO時のみ有効)" );
//sw.WriteLine( "; Master volume settings" );
//sw.WriteLine( "; (0=Silent - 100=Max)" );
//sw.WriteLine( "MasterVolume={0}", this.nMasterVolume );
//sw.WriteLine();
#endregion
sw.WriteLine( "; 背景画像の半透明割合(0:透明255:不透明)" );
sw.WriteLine( "; Transparency for background image in playing screen.(0:tranaparent - 255:no transparent)" );
sw.WriteLine( "BGAlpha={0}", this.nBGAlpha );
sw.WriteLine();
sw.WriteLine( "; ゲージゼロでSTAGE FAILED (0:OFF, 1:ON)" );
sw.WriteLine( "StageFailed={0}", this.bSTAGEFAILED有効 ? 1 : 0 );
sw.WriteLine();
#region [ AVI/BGA ]
sw.WriteLine( "; AVIの表示(0:OFF, 1:ON)" );
sw.WriteLine( "AVI={0}", this.bAVI有効 ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; BGAの表示(0:OFF, 1:ON)" );
sw.WriteLine( "BGA={0}", this.bBGA有効 ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; 動画表示モード( 0:表示しない, 1:背景のみ, 2:窓表示のみ, 3:両方)" );
sw.WriteLine( "ClipDispType={0}", (int) this.eClipDispType );
sw.WriteLine();
#endregion
#region [ ]
sw.WriteLine( "; 曲選択からプレビュー音の再生までのウェイト[ms]" );
sw.WriteLine( "PreviewSoundWait={0}", this.n曲が選択されてからプレビュー音が鳴るまでのウェイトms );
sw.WriteLine();
sw.WriteLine( "; 曲選択からプレビュー画像表示までのウェイト[ms]" );
sw.WriteLine( "PreviewImageWait={0}", this.n曲が選択されてからプレビュー画像が表示開始されるまでのウェイトms );
sw.WriteLine();
#endregion
//sw.WriteLine( "; Waveの再生位置自動補正(0:OFF, 1:ON)" );
//sw.WriteLine( "AdjustWaves={0}", this.bWave再生位置自動調整機能有効 ? 1 : 0 );
#region [ BGM/ ]
sw.WriteLine( "; BGM の再生(0:OFF, 1:ON)" );
sw.WriteLine( "BGMSound={0}", this.bBGM音を発声する ? 1 : 0 );
sw.WriteLine();
#endregion
sw.WriteLine( "; 演奏記録(~.score.iniの出力 (0:OFF, 1:ON)" );
sw.WriteLine( "SaveScoreIni={0}", this.bScoreIniを出力する ? 1 : 0 );
sw.WriteLine();
sw.WriteLine("; 最小表示コンボ数");
sw.WriteLine("MinComboDrums={0}", this.n表示可能な最小コンボ数.Drums);
sw.WriteLine();
sw.WriteLine( "; RANDOM SELECT で子BOXを検索対象に含める (0:OFF, 1:ON)" );
sw.WriteLine( "RandomFromSubBox={0}", this.bランダムセレクトで子BOXを検索対象とする ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; 演奏情報を表示する (0:OFF, 1:ON)" );
sw.WriteLine( "; Showing playing info on the playing screen. (0:OFF, 1:ON)" );
sw.WriteLine( "ShowDebugStatus={0}", this.b演奏情報を表示する ? 1 : 0 );
sw.WriteLine();
sw.WriteLine("; BS1770GAIN によるラウドネスメータの測量を適用する (0:OFF, 1:ON)");
sw.WriteLine( "; Apply BS1770GAIN loudness metadata (0:OFF, 1:ON)" );
sw.WriteLine( "{0}={1}", nameof(ApplyLoudnessMetadata), this.ApplyLoudnessMetadata ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( $"; BS1770GAIN によるラウドネスメータの目標値 (0). ({CSound.MinimumLufs}-{CSound.MaximumLufs})" );
sw.WriteLine( $"; Loudness Target in dB (decibels) relative to full scale (0). ({CSound.MinimumLufs}-{CSound.MaximumLufs})" );
sw.WriteLine( "{0}={1}", nameof(TargetLoudness), TargetLoudness );
sw.WriteLine();
sw.WriteLine("; .tjaファイルのSONGVOLヘッダを音源の音量に適用する (0:OFF, 1:ON)");
sw.WriteLine( "; Apply SONGVOL (0:OFF, 1:ON)" );
sw.WriteLine( "{0}={1}", nameof(ApplySongVol), this.ApplySongVol ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( $"; 効果音の音量 ({CSound.MinimumGroupLevel}-{CSound.MaximumGroupLevel}%)" );
sw.WriteLine( $"; Sound effect level ({CSound.MinimumGroupLevel}-{CSound.MaximumGroupLevel}%)" );
sw.WriteLine( "{0}={1}", nameof(SoundEffectLevel), SoundEffectLevel );
sw.WriteLine();
sw.WriteLine( $"; 各ボイス、コンボボイスの音量 ({CSound.MinimumGroupLevel}-{CSound.MaximumGroupLevel}%)" );
sw.WriteLine( $"; Voice level ({CSound.MinimumGroupLevel}-{CSound.MaximumGroupLevel}%)" );
sw.WriteLine( "{0}={1}", nameof(VoiceLevel), VoiceLevel );
sw.WriteLine();
sw.WriteLine( $"; ゲーム中の音源の音量 ({CSound.MinimumGroupLevel}-{CSound.MaximumGroupLevel}%)" );
sw.WriteLine( $"; Song playback level ({CSound.MinimumGroupLevel}-{CSound.MaximumGroupLevel}%)" );
sw.WriteLine( "{0}={1}", nameof(SongPlaybackLevel), SongPlaybackLevel );
sw.WriteLine();
sw.WriteLine( $"; キーボードによる音量変更の増加量、減少量 ({MinimumKeyboardSoundLevelIncrement}-{MaximumKeyboardSoundLevelIncrement})" );
sw.WriteLine( $"; Keyboard sound level increment ({MinimumKeyboardSoundLevelIncrement}-{MaximumKeyboardSoundLevelIncrement})" );
sw.WriteLine( "{0}={1}", nameof(KeyboardSoundLevelIncrement), KeyboardSoundLevelIncrement );
sw.WriteLine($"; 音源再生前の空白時間 (ms)");
sw.WriteLine($"; Blank time before music source to play. (ms)");
sw.WriteLine("{0}={1}", nameof(MusicPreTimeMs), MusicPreTimeMs);
sw.WriteLine();
sw.WriteLine( "; ストイックモード(0:OFF, 1:ON)" );
sw.WriteLine( "; Stoic mode. (0:OFF, 1:ON)" );
sw.WriteLine( "StoicMode={0}", this.bストイックモード ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; バッファ入力モード(0:OFF, 1:ON)" );
sw.WriteLine( "; Using Buffered input (0:OFF, 1:ON)" );
sw.WriteLine( "BufferedInput={0}", this.bバッファ入力を行う ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; リザルト画像自動保存機能(0:OFF, 1:ON)" ); // #25399 2011.6.9 yyagi
sw.WriteLine( "; Set \"1\" if you'd like to save result screen image automatically"); //
sw.WriteLine( "; when you get hiscore/hiskill."); //
sw.WriteLine( "AutoResultCapture={0}", this.bIsAutoResultCapture? 1 : 0 ); //
sw.WriteLine();
sw.WriteLine("; Discordに再生中の譜面情報を送信する(0:OFF, 1:ON)"); // #25399 2011.6.9 yyagi
sw.WriteLine("; Share Playing .tja file infomation on Discord."); //
sw.WriteLine("{0}={1}", nameof(SendDiscordPlayingInformation), SendDiscordPlayingInformation ? 1 : 0); //
sw.WriteLine();
sw.WriteLine( "; 再生速度変更を、ピッチ変更で行うかどうか(0:ピッチ変更, 1:タイムストレッチ" ); // #23664 2013.2.24 yyagi
sw.WriteLine( "; (WASAPI/ASIO使用時のみ有効) " );
sw.WriteLine( "; Set \"0\" if you'd like to use pitch shift with PlaySpeed." ); //
sw.WriteLine( "; Set \"1\" for time stretch." ); //
sw.WriteLine( "; (Only available when you're using using WASAPI or ASIO)" ); //
sw.WriteLine( "TimeStretch={0}", this.bTimeStretch ? 1 : 0 ); //
sw.WriteLine();
//sw.WriteLine( "; WASAPI/ASIO使用時に、MP3をストリーム再生するかどうか(0:ストリーム再生する, 1:しない)" ); //
//sw.WriteLine( "; (mp3のシークがおかしくなる場合は、これを1にしてください) " ); //
//sw.WriteLine( "; Set \"0\" if you'd like to use mp3 streaming playback on WASAPI/ASIO." ); //
//sw.WriteLine( "; Set \"1\" not to use streaming playback for mp3." ); //
//sw.WriteLine( "; (If you feel illegal seek with mp3, please set it to 1.)" ); //
//sw.WriteLine( "NoMP3Streaming={0}", this.bNoMP3Streaming ? 1 : 0 ); //
//sw.WriteLine();
sw.WriteLine( "; 動画再生にDirectShowを使用する(0:OFF, 1:ON)" );
sw.WriteLine( "; 動画再生にDirectShowを使うことによって、再生時の負担を軽減できます。");
sw.WriteLine( "; ただし使用時にはセットアップが必要になるのでご注意ください。");
sw.WriteLine( "DirectShowMode={0}", this.bDirectShowMode ? 1 : 0 );
sw.WriteLine();
#region [ Adjust ]
sw.WriteLine( "; 判定タイミング調整(-9999)[ms]" );
sw.WriteLine("; Revision value to adjust judgment timing."); //
sw.WriteLine("InputAdjustTime={0}", this.nInputAdjustTimeMs); //
sw.WriteLine();
sw.WriteLine( "; 判定ラインの表示位置調整(ドラム, ギター, ベース)(-9999)[px]" ); // #31602 2013.6.23 yyagi 判定ラインの表示位置オフセット
sw.WriteLine( "; Offset value to adjust displaying judgement line for the drums, guitar and bass." ); //
sw.WriteLine( "JudgeLinePosOffsetDrums={0}", this.nJudgeLinePosOffset.Drums ); //
sw.WriteLine();
#endregion
sw.WriteLine( "; 「また遊んでね」画面(0:OFF, 1:ON)" );
sw.WriteLine( "EndingAnime={0}", this.bEndingAnime ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( ";-------------------" );
#endregion
#region [ AutoPlay ]
sw.WriteLine("[AutoPlay]");
sw.WriteLine();
sw.WriteLine("; 自動演奏(0:OFF, 1:ON)");
sw.WriteLine("Taiko={0}", this.b太鼓パートAutoPlay ? 1 : 0);
sw.WriteLine("Taiko2P={0}", this.b太鼓パートAutoPlay2P ? 1 : 0);
sw.WriteLine("TaikoAutoRoll={0}", this.bAuto先生の連打 ? 1 : 0);
sw.WriteLine();
sw.WriteLine(";-------------------");
#endregion
#region [ HitRange ]
sw.WriteLine("[HitRange]");
sw.WriteLine();
sw.WriteLine("; PerfectPoor とみなされる範囲[ms]");
sw.WriteLine("Perfect={0}", this.nヒット範囲ms.Perfect);
sw.WriteLine("Good={0}", this.nヒット範囲ms.Good);
sw.WriteLine("Poor={0}", this.nヒット範囲ms.Poor);
sw.WriteLine();
sw.WriteLine(";-------------------");
#endregion
#region [ Log ]
sw.WriteLine( "[Log]" );
sw.WriteLine();
sw.WriteLine( "; Log出力(0:OFF, 1:ON)" );
sw.WriteLine( "OutputLog={0}", this.bログ出力 ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; 曲データ検索に関するLog出力(0:OFF, 1:ON)" );
sw.WriteLine( "TraceSongSearch={0}", this.bLog曲検索ログ出力 ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; 画像やサウンドの作成_解放に関するLog出力(0:OFF, 1:ON)" );
sw.WriteLine( "TraceCreatedDisposed={0}", this.bLog作成解放ログ出力 ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; DTX読み込み詳細に関するLog出力(0:OFF, 1:ON)" );
sw.WriteLine( "TraceDTXDetails={0}", this.bLogDTX詳細ログ出力 ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( ";-------------------" );
#endregion
#region [ PlayOption ]
sw.WriteLine( "[PlayOption]" );
sw.WriteLine();
sw.WriteLine("; 各画像の表示設定");
sw.WriteLine("; キャラクター画像を表示する (0:OFF, 1:ON)");
sw.WriteLine("ShowChara={0}", ShowChara ? 1 : 0);
sw.WriteLine("; ダンサー画像を表示する (0:OFF, 1:ON)");
sw.WriteLine("ShowDancer={0}", ShowDancer ? 1 : 0);
sw.WriteLine("; ランナー画像を表示する (0:OFF, 1:ON)");
sw.WriteLine("ShowRunner={0}", ShowRunner ? 1 : 0);
sw.WriteLine("; モブ画像を表示する (0:OFF, 1:ON)");
sw.WriteLine("ShowMob={0}", ShowMob ? 1 : 0);
sw.WriteLine("; フッター画像 (0:OFF, 1:ON)");
sw.WriteLine("ShowFooter={0}", ShowFooter ? 1 : 0);
sw.WriteLine("; ぷちキャラ画像 (0:OFF, 1:ON)");
sw.WriteLine("ShowPuchiChara={0}", ShowPuchiChara ? 1 : 0);
sw.WriteLine();
sw.WriteLine( "; DARKモード(0:OFF, 1:HALF, 2:FULL)" );
sw.WriteLine( "Dark={0}", (int) this.eDark );
sw.WriteLine();
sw.WriteLine();
sw.WriteLine("; 選曲画面でのタイマーを有効にするかどうか(0:無効,1:有効)");
sw.WriteLine("; Enable countdown in songselect.(0:No, 1:Yes)");
sw.WriteLine("EnableCountDownTimer={0}", this.bEnableCountdownTimer ? 1 : 0);
sw.WriteLine();
#region [ SUDDEN ]
sw.WriteLine( "; ドラムSUDDENモード(0:OFF, 1:ON)" );
sw.WriteLine( "DrumsSudden={0}", this.bSudden.Drums ? 1 : 0 );
sw.WriteLine();
#endregion
#region [ HIDDEN ]
sw.WriteLine( "; ドラムHIDDENモード(0:OFF, 1:ON)" );
sw.WriteLine( "DrumsHidden={0}", this.bHidden.Drums ? 1 : 0 );
sw.WriteLine();
#endregion
#region [ Invisible ]
sw.WriteLine( "; ドラムチップ非表示モード (0:OFF, 1=SEMI, 2:FULL)" );
sw.WriteLine( "; Drums chip invisible mode" );
sw.WriteLine( "DrumsInvisible={0}", (int) this.eInvisible.Drums );
sw.WriteLine();
//sw.WriteLine( "; Semi-InvisibleでMissった時のチップ再表示時間(ms)" );
//sw.WriteLine( "InvisibleDisplayTimeMs={0}", (int) this.nDisplayTimesMs );
//sw.WriteLine();
//sw.WriteLine( "; Semi-InvisibleでMissってチップ再表示時間終了後のフェードアウト時間(ms)" );
//sw.WriteLine( "InvisibleFadeoutTimeMs={0}", (int) this.nFadeoutTimeMs );
//sw.WriteLine();
#endregion
sw.WriteLine( "; ドラムREVERSEモード(0:OFF, 1:ON)" );
sw.WriteLine( "DrumsReverse={0}", this.bReverse.Drums ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; RISKYモード(0:OFF, 1-10)" ); // #23559 2011.6.23 yyagi
sw.WriteLine( "; RISKY mode. 0=OFF, 1-10 is the times of misses to be Failed." ); //
sw.WriteLine( "Risky={0}", this.nRisky ); //
sw.WriteLine();
sw.WriteLine( "; TIGHTモード(0:OFF, 1:ON)" ); // #29500 2012.9.11 kairera0467
sw.WriteLine( "; TIGHT mode. 0=OFF, 1=ON " );
sw.WriteLine( "DrumsTight={0}", this.bTight ? 1 : 0 );
sw.WriteLine();
sw.WriteLine("; ドラム譜面スクロール速度(0:x0.1, 9:x1.0, 14:x1.5,…,1999:x200.0)");
sw.WriteLine( "DrumsScrollSpeed={0}", this.n譜面スクロール速度.Drums );
sw.WriteLine();
sw.WriteLine( "; 演奏速度(540)(→x5/20x40/20)" );
sw.WriteLine( "PlaySpeed={0}", this.n演奏速度 );
sw.WriteLine();
sw.WriteLine("; 演奏速度が一倍速であるときのみBGMを再生する(0:OFF, 1:ON)");
sw.WriteLine("PlaySpeedNotEqualOneNoSound={0}", this.b演奏速度が一倍速であるとき以外音声を再生しない ? 1 : 0);
sw.WriteLine();
sw.WriteLine("; デフォルトで選択される難易度");
sw.WriteLine("DefaultCourse={0}", this.nDefaultCourse);
sw.WriteLine();
sw.WriteLine( "; 譜面分岐のガイド表示(0:OFF, 1:ON)" );
sw.WriteLine( "BranchGuide={0}", this.bGraph.Drums ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; スコア計算方法(0:旧配点, 1:旧筐体配点, 2:新配点)" );
sw.WriteLine( "ScoreMode={0}", this.nScoreMode );
sw.WriteLine();
sw.WriteLine("; 真打モード (0:OFF, 1:ON)");
sw.WriteLine("; Fixed score mode (0:OFF, 1:ON)");
sw.WriteLine("{0}={1}", nameof(ShinuchiMode), ShinuchiMode ? 1 : 0);
//sw.WriteLine( "; 1ーツごとのスクロール速度をランダムで変更します。(0:OFF, 1:ON)" );
//sw.WriteLine( "HispeedRandom={0}", this.bHispeedRandom ? 1 : 0 );
//sw.WriteLine();
sw.WriteLine( "; 大音符の両手入力待機時間(ms)" );
sw.WriteLine( "BigNotesWaitTime={0}", this.n両手判定の待ち時間 );
sw.WriteLine();
sw.WriteLine( "; 大音符の両手判定(0:OFF, 1:ON)" );
sw.WriteLine( "BigNotesJudge={0}", this.b大音符判定 ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; NoInfo(0:OFF, 1:ON)" );
sw.WriteLine( "NoInfo={0}", this.bNoInfo ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; 譜面分岐のアニメーション(0:714, 1:15)" );
sw.WriteLine( "BranchAnime={0}", this.nBranchAnime );
sw.WriteLine();
sw.WriteLine( "; デフォルトの曲ソート(0:絶対パス順, 1:ジャンル名ソートOLD, 2:ジャンル名ソートNEW )" );
sw.WriteLine( "0:Path, 1:GenreName(AC8AC14), 2GenreName(AC15)" );
sw.WriteLine( "DefaultSongSort={0}", this.nDefaultSongSort );
sw.WriteLine();
sw.WriteLine( "; RANDOMモード(0:OFF, 1:Random, 2:Mirorr 3:SuperRandom, 4:HyperRandom)" );
sw.WriteLine( "TaikoRandom={0}", (int) this.eRandom.Taiko );
sw.WriteLine();
sw.WriteLine( "; STEALTHモード(0:OFF, 1:ドロン, 2:ステルス)" );
sw.WriteLine( "TaikoStealth={0}", (int) this.eSTEALTH );
sw.WriteLine();
sw.WriteLine( "; ゲーム(0:OFF, 1:完走!叩ききりまショー!, 2:完走!叩ききりまショー!(激辛) )" );
sw.WriteLine( "GameMode={0}", (int) this.eGameMode );
sw.WriteLine();
sw.WriteLine();
sw.WriteLine("; 特訓モード時にPgUp/PgDnで何小節飛ばすか");
sw.WriteLine("TokkunSkipMeasures={0}", this.TokkunSkipMeasures);
sw.WriteLine();
sw.WriteLine("; 特訓モード時にジャンプポイントに飛ばすための時間(ms)");
sw.WriteLine("; 指定ms以内に5回縁を叩きましょう");
sw.WriteLine("{1}={0}", this.TokkunMashInterval, nameof(this.TokkunMashInterval));
sw.WriteLine();
sw.WriteLine( "; JUST(0:OFF, 1:ON)" );
sw.WriteLine( "Just={0}", this.bJust ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; 判定数の表示(0:OFF, 1:ON)" );
sw.WriteLine( "JudgeCountDisplay={0}", this.bJudgeCountDisplay ? 1 : 0 );
sw.WriteLine();
sw.WriteLine( "; プレイ人数" );
sw.WriteLine( "PlayerCount={0}", this.nPlayerCount );
sw.WriteLine();
//sw.WriteLine( "; 選曲画面の初期選択難易度(ベータ版)" );
//sw.WriteLine( "DifficultPriority={0}", this.bJudgeCountDisplay ? 1 : 0 );
//sw.WriteLine();
sw.WriteLine( ";-------------------" );
#endregion
#region [ GUID ]
sw.WriteLine( "[GUID]" );
sw.WriteLine();
foreach( KeyValuePair<int, string> pair in this.dicJoystick )
{
sw.WriteLine( "JoystickID={0},{1}", pair.Key, pair.Value );
}
#endregion
#region [ DrumsKeyAssign ]
sw.WriteLine();
sw.WriteLine( ";-------------------" );
sw.WriteLine( "; キーアサイン" );
sw.WriteLine( "; 項 Keyboard → 'K''0'+キーコード(10進数)" );
sw.WriteLine( "; Mouse → 'N''0'+ボタン番号(07)" );
sw.WriteLine( "; MIDI In → 'M'デバイス番号1桁(09,AZ)+ノート番号(10進数)" );
sw.WriteLine( "; Joystick → 'J'デバイス番号1桁(09,AZ) 0 ...... X減少(左)ボタン" );
sw.WriteLine( "; 1 ...... X増加(右)ボタン" );
sw.WriteLine( "; 2 ...... Y減少(上)ボタン" );
sw.WriteLine( "; 3 ...... Y増加(下)ボタン" );
sw.WriteLine( "; 4 ...... Z減少(前)ボタン" );
sw.WriteLine( "; 5 ...... Z増加(後)ボタン" );
sw.WriteLine( "; 6133.. ボタン1128" );
sw.WriteLine( "; これらの項目を 16 個まで指定可能(',' で区切って記述)。" );
sw.WriteLine( ";" );
sw.WriteLine( "; 表記例HH=K044,M042,J16" );
sw.WriteLine( "; → HiHat を Keyboard の 44 ('Z'), MidiIn#0 の 42, JoyPad#1 の 6(ボタン1) に割当て" );
sw.WriteLine( ";" );
sw.WriteLine( "; ※Joystick のデバイス番号とデバイスとの関係は [GUID] セクションに記してあるものが有効。" );
sw.WriteLine( ";" );
sw.WriteLine();
sw.WriteLine( "[DrumsKeyAssign]" );
sw.WriteLine();
sw.Write( "LeftRed=" );
this.tキーの書き出し( sw, this.KeyAssign.Drums.LeftRed );
sw.WriteLine();
sw.Write( "RightRed=" );
this.tキーの書き出し( sw, this.KeyAssign.Drums.RightRed );
sw.WriteLine();
sw.Write( "LeftBlue=" ); // #27029 2012.1.4 from
this.tキーの書き出し( sw, this.KeyAssign.Drums.LeftBlue ); //
sw.WriteLine(); //
sw.Write( "RightBlue=" ); // #27029 2012.1.4 from
this.tキーの書き出し( sw, this.KeyAssign.Drums.RightBlue ); //
sw.WriteLine();
sw.Write( "LeftRed2P=" );
this.tキーの書き出し( sw, this.KeyAssign.Drums.LeftRed2P );
sw.WriteLine();
sw.Write( "RightRed2P=" );
this.tキーの書き出し( sw, this.KeyAssign.Drums.RightRed2P );
sw.WriteLine();
sw.Write( "LeftBlue2P=" ); // #27029 2012.1.4 from
this.tキーの書き出し( sw, this.KeyAssign.Drums.LeftBlue2P ); //
sw.WriteLine(); //
sw.Write( "RightBlue2P=" ); // #27029 2012.1.4 from
this.tキーの書き出し( sw, this.KeyAssign.Drums.RightBlue2P ); //
sw.WriteLine();
sw.WriteLine();
#endregion
#region [ SystemkeyAssign ]
sw.WriteLine( "[SystemKeyAssign]" );
sw.WriteLine();
sw.Write( "Capture=" );
this.tキーの書き出し( sw, this.KeyAssign.System.Capture );
sw.WriteLine();
sw.WriteLine();
#endregion
sw.Close();
}
public void tファイルから読み込み( string iniファイル名 )
{
this.ConfigIniファイル名 = iniファイル名;
this.bConfigIniが存在している = File.Exists( this.ConfigIniファイル名 );
if( this.bConfigIniが存在している )
{
string str;
this.tキーアサインを全部クリアする();
using ( StreamReader reader = new StreamReader( this.ConfigIniファイル名, Encoding.GetEncoding( "Shift_JIS" ) ) )
{
str = reader.ReadToEnd();
}
t文字列から読み込み( str );
CDTXVersion version = new CDTXVersion( this.strDTXManiaのバージョン );
//if( version.n整数部 <= 69 )
//{
// this.tデフォルトのキーアサインに設定する();
//}
}
}
private void t文字列から読み込み( string strAllSettings ) // 2011.4.13 yyagi; refactored to make initial KeyConfig easier.
{
Eセクション種別 unknown = Eセクション種別.Unknown;
string[] delimiter = { "\n" };
string[] strSingleLine = strAllSettings.Split( delimiter, StringSplitOptions.RemoveEmptyEntries );
foreach ( string s in strSingleLine )
{
string str = s.Replace( '\t', ' ' ).TrimStart( new char[] { '\t', ' ' } );
if ( ( str.Length != 0 ) && ( str[ 0 ] != ';' ) )
{
try
{
string str3;
string str4;
if ( str[ 0 ] == '[' )
{
#region [ ]
//-----------------------------
StringBuilder builder = new StringBuilder( 0x20 );
int num = 1;
while ( ( num < str.Length ) && ( str[ num ] != ']' ) )
{
builder.Append( str[ num++ ] );
}
string str2 = builder.ToString();
if ( str2.Equals( "System" ) )
{
unknown = Eセクション種別.System;
}
else if (str2.Equals("AutoPlay"))
{
unknown = Eセクション種別.AutoPlay;
}
else if (str2.Equals("HitRange"))
{
unknown = Eセクション種別.HitRange;
}
else if ( str2.Equals( "Log" ) )
{
unknown = Eセクション種別.Log;
}
else if ( str2.Equals( "PlayOption" ) )
{
unknown = Eセクション種別.PlayOption;
}
else if ( str2.Equals( "ViewerOption" ) )
{
unknown = Eセクション種別.ViewerOption;
}
else if ( str2.Equals( "GUID" ) )
{
unknown = Eセクション種別.GUID;
}
else if ( str2.Equals( "DrumsKeyAssign" ) )
{
unknown = Eセクション種別.DrumsKeyAssign;
}
else if ( str2.Equals( "SystemKeyAssign" ) )
{
unknown = Eセクション種別.SystemKeyAssign;
}
else if( str2.Equals( "Temp" ) )
{
unknown = Eセクション種別.Temp;
}
else
{
unknown = Eセクション種別.Unknown;
}
//-----------------------------
#endregion
}
else
{
string[] strArray = str.Split( new char[] { '=' } );
if( strArray.Length == 2 )
{
str3 = strArray[ 0 ].Trim();
str4 = strArray[ 1 ].Trim();
switch( unknown )
{
#region [ [System] ]
//-----------------------------
case Eセクション種別.System:
{
#if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
//----------------------------------------
if (str3.Equals("GaugeFactorD"))
{
int p = 0;
string[] splittedFactor = str4.Split(',');
foreach (string s in splittedFactor) {
this.fGaugeFactor[p++, 0] = Convert.ToSingle(s);
}
} else
if (str3.Equals("GaugeFactorG"))
{
int p = 0;
string[] splittedFactor = str4.Split(',');
foreach (string s in splittedFactor)
{
this.fGaugeFactor[p++, 1] = Convert.ToSingle(s);
}
}
else
if (str3.Equals("DamageFactor"))
{
int p = 0;
string[] splittedFactor = str4.Split(',');
foreach (string s in splittedFactor)
{
this.fDamageLevelFactor[p++] = Convert.ToSingle(s);
}
}
else
//----------------------------------------
#endif
#region [ Version ]
if ( str3.Equals( "Version" ) )
{
this.strDTXManiaのバージョン = str4;
}
#endregion
#region [ TJAPath ]
else if( str3.Equals( "TJAPath" ) )
{
this.str曲データ検索パス = str4;
}
#endregion
else if( str3.Equals("Lang"))
{
CLangManager.langAttach(str4);
}
#region [ skin関係 ]
else if ( str3.Equals( "SkinPath" ) )
{
string absSkinPath = str4;
if ( !System.IO.Path.IsPathRooted( str4 ) )
{
absSkinPath = System.IO.Path.Combine( TJAPlayer3.strEXEのあるフォルダ, "System" );
absSkinPath = System.IO.Path.Combine( absSkinPath, str4 );
Uri u = new Uri( absSkinPath );
absSkinPath = u.AbsolutePath.ToString(); // str4内に相対パスがある場合に備える
absSkinPath = System.Web.HttpUtility.UrlDecode( absSkinPath ); // デコードする
absSkinPath = absSkinPath.Replace( '/', System.IO.Path.DirectorySeparatorChar ); // 区切り文字が\ではなく/なので置換する
}
if ( absSkinPath[ absSkinPath.Length - 1 ] != System.IO.Path.DirectorySeparatorChar ) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する
{
absSkinPath += System.IO.Path.DirectorySeparatorChar;
}
this.strSystemSkinSubfolderFullName = absSkinPath;
}
else if (str3.Equals(nameof(FastRender)))
{
FastRender = C変換.bONorOFF(str4[0]);
}
#endregion
#region [ Window関係 ]
else if (str3.Equals("FullScreen"))
{
this.b全画面モード = C変換.bONorOFF(str4[0]);
}
else if ( str3.Equals( "WindowX" ) ) // #30675 2013.02.04 ikanick add
{
this.n初期ウィンドウ開始位置X = C変換.n値を文字列から取得して範囲内に丸めて返す(
str4, 0, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width - 1 , this.n初期ウィンドウ開始位置X );
}
else if ( str3.Equals( "WindowY" ) ) // #30675 2013.02.04 ikanick add
{
this.n初期ウィンドウ開始位置Y = C変換.n値を文字列から取得して範囲内に丸めて返す(
str4, 0, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height - 1 , this.n初期ウィンドウ開始位置Y );
}
else if ( str3.Equals( "WindowWidth" ) ) // #23510 2010.10.31 yyagi add
{
this.nウインドウwidth = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 1, 65535, this.nウインドウwidth );
if( this.nウインドウwidth <= 0 )
{
this.nウインドウwidth = SampleFramework.GameWindowSize.Width;
}
}
else if( str3.Equals( "WindowHeight" ) ) // #23510 2010.10.31 yyagi add
{
this.nウインドウheight = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 1, 65535, this.nウインドウheight );
if( this.nウインドウheight <= 0 )
{
this.nウインドウheight = SampleFramework.GameWindowSize.Height;
}
}
else if ( str3.Equals( "DoubleClickFullScreen" ) ) // #26752 2011.11.27 yyagi
{
this.bIsAllowedDoubleClickFullscreen = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "EnableSystemMenu" ) ) // #28200 2012.5.1 yyagi
{
this.bIsEnabledSystemMenu = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "BackSleep" ) ) // #23568 2010.11.04 ikanick add
{
this.n非フォーカス時スリープms = C変換.n値を文字列から取得して範囲内にちゃんと丸めて返す( str4, 0, 50, this.n非フォーカス時スリープms );
}
#endregion
#region [ WASAPI/ASIO関係 ]
else if ( str3.Equals( "SoundDeviceType" ) )
{
this.nSoundDeviceType = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, this.nSoundDeviceType );
}
else if ( str3.Equals( "WASAPIBufferSizeMs" ) )
{
this.nWASAPIBufferSizeMs = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 9999, this.nWASAPIBufferSizeMs );
}
else if ( str3.Equals( "ASIODevice" ) )
{
string[] asiodev = CEnumerateAllAsioDevices.GetAllASIODevices();
this.nASIODevice = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, asiodev.Length - 1, this.nASIODevice );
}
//else if ( str3.Equals( "ASIOBufferSizeMs" ) )
//{
// this.nASIOBufferSizeMs = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 9999, this.nASIOBufferSizeMs );
//}
//else if ( str3.Equals( "DynamicBassMixerManagement" ) )
//{
// this.bDynamicBassMixerManagement = C変換.bONorOFF( str4[ 0 ] );
//}
else if ( str3.Equals( "SoundTimerType" ) ) // #33689 2014.6.6 yyagi
{
this.bUseOSTimer = C変換.bONorOFF( str4[ 0 ] );
}
//else if ( str3.Equals( "MasterVolume" ) )
//{
// this.nMasterVolume = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 100, this.nMasterVolume );
//}
#endregion
#region [ ]
else if (str3.Equals("FontName"))
{
this.FontName = str4;
}
else if (str3.Equals("BoxFontName"))
{
this.BoxFontName = str4;
}
#endregion
else if ( str3.Equals( "VSyncWait" ) )
{
this.b垂直帰線待ちを行う = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "SleepTimePerFrame" ) ) // #23568 2011.11.27 yyagi
{
this.nフレーム毎スリープms = C変換.n値を文字列から取得して範囲内にちゃんと丸めて返す( str4, -1, 50, this.nフレーム毎スリープms );
}
else if( str3.Equals( "BGAlpha" ) )
{
this.n背景の透過度 = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0xff, this.n背景の透過度 );
}
else if( str3.Equals( "DamageLevel" ) )
{
this.eダメージレベル = (Eダメージレベル) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, (int) this.eダメージレベル );
}
else if ( str3.Equals( "StageFailed" ) )
{
this.bSTAGEFAILED有効 = C変換.bONorOFF( str4[ 0 ] );
}
#region [ AVI/BGA ]
else if( str3.Equals( "AVI" ) )
{
this.bAVI有効 = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "BGA" ) )
{
this.bBGA有効 = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "ClipDispType" ) )
{
this.eClipDispType = (EClipDispType)C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 3, (int) this.eClipDispType );
}
#endregion
#region [ ]
else if( str3.Equals( "PreviewSoundWait" ) )
{
this.n曲が選択されてからプレビュー音が鳴るまでのウェイトms = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0x5f5e0ff, this.n曲が選択されてからプレビュー音が鳴るまでのウェイトms );
}
else if( str3.Equals( "PreviewImageWait" ) )
{
this.n曲が選択されてからプレビュー画像が表示開始されるまでのウェイトms = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0x5f5e0ff, this.n曲が選択されてからプレビュー画像が表示開始されるまでのウェイトms );
}
#endregion
//else if( str3.Equals( "AdjustWaves" ) )
//{
// this.bWave再生位置自動調整機能有効 = C変換.bONorOFF( str4[ 0 ] );
//}
#region [ BGM/ ]
else if( str3.Equals( "BGMSound" ) )
{
this.bBGM音を発声する = C変換.bONorOFF( str4[ 0 ] );
}
#endregion
else if( str3.Equals( "SaveScoreIni" ) )
{
this.bScoreIniを出力する = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "RandomFromSubBox" ) )
{
this.bランダムセレクトで子BOXを検索対象とする = C変換.bONorOFF( str4[ 0 ] );
}
#region [ ]
else if( str3.Equals( "MinComboDrums" ) )
{
this.n表示可能な最小コンボ数.Drums = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 1, 0x1869f, this.n表示可能な最小コンボ数.Drums );
}
#endregion
else if( str3.Equals( "ShowDebugStatus" ) )
{
this.b演奏情報を表示する = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( nameof(ApplyLoudnessMetadata) ) )
{
this.ApplyLoudnessMetadata = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( nameof(TargetLoudness) ) )
{
this.TargetLoudness = C変換.db値を文字列から取得して範囲内に丸めて返す( str4, CSound.MinimumLufs.ToDouble(), CSound.MaximumLufs.ToDouble(), this.TargetLoudness );
}
else if( str3.Equals( nameof(ApplySongVol) ) )
{
this.ApplySongVol = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( nameof(SoundEffectLevel) ) )
{
this.SoundEffectLevel = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, CSound.MinimumGroupLevel, CSound.MaximumGroupLevel, this.SoundEffectLevel );
}
else if( str3.Equals( nameof(VoiceLevel) ) )
{
this.VoiceLevel = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, CSound.MinimumGroupLevel, CSound.MaximumGroupLevel, this.VoiceLevel );
}
else if( str3.Equals( nameof(SongPreviewLevel) ) )
{
this.SongPreviewLevel = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, CSound.MinimumGroupLevel, CSound.MaximumGroupLevel, this.SongPreviewLevel );
}
else if( str3.Equals( nameof(KeyboardSoundLevelIncrement) ) )
{
this.KeyboardSoundLevelIncrement = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, MinimumKeyboardSoundLevelIncrement, MaximumKeyboardSoundLevelIncrement, this.KeyboardSoundLevelIncrement );
}
else if( str3.Equals(nameof(MusicPreTimeMs)))
{
MusicPreTimeMs = int.Parse(str4);
}
else if( str3.Equals( "StoicMode" ) )
{
this.bストイックモード = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "JudgeDispPriority" ) )
{
this.e判定表示優先度 = (E判定表示優先度) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1, (int) this.e判定表示優先度 );
}
else if ( str3.Equals( "AutoResultCapture" ) ) // #25399 2011.6.9 yyagi
{
this.bIsAutoResultCapture = C変換.bONorOFF( str4[ 0 ] );
}
else if (str3.Equals(nameof(SendDiscordPlayingInformation)))
{
SendDiscordPlayingInformation = C変換.bONorOFF(str4[0]);
}
else if ( str3.Equals( "TimeStretch" ) ) // #23664 2013.2.24 yyagi
{
this.bTimeStretch = C変換.bONorOFF( str4[ 0 ] );
}
#region [ AdjustTime ]
else if( str3.Equals( "InputAdjustTime" ) )
{
this.nInputAdjustTimeMs = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, -99, 99, this.nInputAdjustTimeMs );
}
else if ( str3.Equals( "JudgeLinePosOffsetDrums" ) ) // #31602 2013.6.23 yyagi
{
this.nJudgeLinePosOffset.Drums = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, -99, 99, this.nJudgeLinePosOffset.Drums );
}
else if ( str3.Equals( "JudgeLinePosOffsetGuitar" ) ) // #31602 2013.6.23 yyagi
{
this.nJudgeLinePosOffset.Guitar = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, -99, 99, this.nJudgeLinePosOffset.Guitar );
}
else if ( str3.Equals( "JudgeLinePosOffsetBass" ) ) // #31602 2013.6.23 yyagi
{
this.nJudgeLinePosOffset.Bass = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, -99, 99, this.nJudgeLinePosOffset.Bass );
}
else if ( str3.Equals( "JudgeLinePosModeGuitar" ) ) // #33891 2014.6.26 yyagi
{
this.e判定位置.Guitar = (E判定位置) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, (int) this.e判定位置.Guitar );
}
else if ( str3.Equals( "JudgeLinePosModeBass" ) ) // #33891 2014.6.26 yyagi
{
this.e判定位置.Bass = (E判定位置) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, (int) this.e判定位置.Bass );
}
#endregion
else if( str3.Equals( "BufferedInput" ) )
{
this.bバッファ入力を行う = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "PolyphonicSounds" ) ) // #28228 2012.5.1 yyagi
{
this.nPoliphonicSounds = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 1, 8, this.nPoliphonicSounds );
}
#region [ VelocityMin ]
else if ( str3.Equals( "LCVelocityMin" ) ) // #23857 2010.12.12 yyagi
{
this.nVelocityMin.LC = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.LC );
}
else if( str3.Equals( "HHVelocityMin" ) )
{
this.nVelocityMin.HH = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.HH );
}
else if( str3.Equals( "SDVelocityMin" ) ) // #23857 2011.1.31 yyagi
{
this.nVelocityMin.SD = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.SD );
}
else if( str3.Equals( "BDVelocityMin" ) ) // #23857 2011.1.31 yyagi
{
this.nVelocityMin.BD = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.BD );
}
else if( str3.Equals( "HTVelocityMin" ) ) // #23857 2011.1.31 yyagi
{
this.nVelocityMin.HT = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.HT );
}
else if( str3.Equals( "LTVelocityMin" ) ) // #23857 2011.1.31 yyagi
{
this.nVelocityMin.LT = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.LT );
}
else if( str3.Equals( "FTVelocityMin" ) ) // #23857 2011.1.31 yyagi
{
this.nVelocityMin.FT = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.FT );
}
else if( str3.Equals( "CYVelocityMin" ) ) // #23857 2011.1.31 yyagi
{
this.nVelocityMin.CY = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.CY );
}
else if( str3.Equals( "RDVelocityMin" ) ) // #23857 2011.1.31 yyagi
{
this.nVelocityMin.RD = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 127, this.nVelocityMin.RD );
}
#endregion
//else if ( str3.Equals( "NoMP3Streaming" ) )
//{
// this.bNoMP3Streaming = C変換.bONorOFF( str4[ 0 ] );
//}
#region[ Ver.K追加 ]
else if ( str3.Equals( "DirectShowMode" ) ) // #28228 2012.5.1 yyagi
{
this.bDirectShowMode = C変換.bONorOFF( str4[ 0 ] ); ;
}
#endregion
else if( str3.Equals( "EndingAnime" ) )
{
this.bEndingAnime = C変換.bONorOFF( str4[ 0 ] );
}
continue;
}
//-----------------------------
#endregion
#region [ [AutoPlay] ]
//-----------------------------
case Eセクション種別.AutoPlay:
if (str3.Equals("Taiko"))
{
this.b太鼓パートAutoPlay = C変換.bONorOFF(str4[0]);
}
else if (str3.Equals("Taiko2P"))
{
this.b太鼓パートAutoPlay2P = C変換.bONorOFF(str4[0]);
}
else if (str3.Equals("TaikoAutoRoll"))
{
this.bAuto先生の連打 = C変換.bONorOFF(str4[0]);
}
continue;
//-----------------------------
#endregion
#region [ [HitRange] ]
//-----------------------------
case Eセクション種別.HitRange:
if (str3.Equals("Perfect"))
{
this.nヒット範囲ms.Perfect = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 0x3e7, this.nヒット範囲ms.Perfect);
}
else if (str3.Equals("Great"))
{
this.nヒット範囲ms.Great = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 0x3e7, this.nヒット範囲ms.Great);
}
else if (str3.Equals("Good"))
{
this.nヒット範囲ms.Good = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 0x3e7, this.nヒット範囲ms.Good);
}
else if (str3.Equals("Poor"))
{
this.nヒット範囲ms.Poor = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 0x3e7, this.nヒット範囲ms.Poor);
}
continue;
//-----------------------------
#endregion
#region [ [Log] ]
//-----------------------------
case Eセクション種別.Log:
{
if( str3.Equals( "OutputLog" ) )
{
this.bログ出力 = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "TraceCreatedDisposed" ) )
{
this.bLog作成解放ログ出力 = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "TraceDTXDetails" ) )
{
this.bLogDTX詳細ログ出力 = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "TraceSongSearch" ) )
{
this.bLog曲検索ログ出力 = C変換.bONorOFF( str4[ 0 ] );
}
continue;
}
//-----------------------------
#endregion
#region [ [PlayOption] ]
//-----------------------------
case Eセクション種別.PlayOption:
{
if (str3.Equals("ShowChara"))
{
ShowChara = C変換.bONorOFF(str4[0]);
}
else if( str3.Equals("ShowDancer"))
{
ShowDancer = C変換.bONorOFF(str4[0]);
}
else if (str3.Equals("ShowRunner"))
{
ShowRunner = C変換.bONorOFF(str4[0]);
}
else if (str3.Equals("ShowMob"))
{
ShowMob = C変換.bONorOFF(str4[0]);
}
else if (str3.Equals("ShowFooter"))
{
ShowFooter = C変換.bONorOFF(str4[0]);
}
else if (str3.Equals("ShowPuchiChara"))
{
ShowPuchiChara = C変換.bONorOFF(str4[0]);
}
else if( str3.Equals( "Dark" ) )
{
this.eDark = (Eダークモード) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, (int) this.eDark );
}
else if( str3.Equals( "ScrollMode" ) )
{
this.eScrollMode = ( EScrollMode )C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, 0 );
}
else if (str3.Equals("EnableCountDownTimer"))
{
this.bEnableCountdownTimer = C変換.bONorOFF(str4[0]);
}
#region [ Sudden ]
else if( str3.Equals( "DrumsSudden" ) )
{
this.bSudden.Drums = C変換.bONorOFF( str4[ 0 ] );
}
#endregion
#region [ Hidden ]
else if( str3.Equals( "DrumsHidden" ) )
{
this.bHidden.Drums = C変換.bONorOFF( str4[ 0 ] );
}
#endregion
#region [ Invisible ]
else if ( str3.Equals( "DrumsInvisible" ) )
{
this.eInvisible.Drums = (EInvisible) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, (int) this.eInvisible.Drums );
}
//else if ( str3.Equals( "InvisibleDisplayTimeMs" ) )
//{
// this.nDisplayTimesMs = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 9999999, (int) this.nDisplayTimesMs );
//}
//else if ( str3.Equals( "InvisibleFadeoutTimeMs" ) )
//{
// this.nFadeoutTimeMs = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 9999999, (int) this.nFadeoutTimeMs );
//}
#endregion
else if ( str3.Equals( "DrumsReverse" ) )
{
this.bReverse.Drums = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "DrumsPosition" ) )
{
this..Drums = (E判定文字表示位置) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, (int) this..Drums );
}
else if( str3.Equals( "DrumsScrollSpeed" ) )
{
this.n譜面スクロール速度.Drums = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 0x7cf, this.n譜面スクロール速度.Drums );
}
else if( str3.Equals( "PlaySpeed" ) )
{
this.n演奏速度 = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 5, 400, this.n演奏速度 );
}
else if (str3.Equals("PlaySpeedNotEqualOneNoSound"))
{
this.b演奏速度が一倍速であるとき以外音声を再生しない = C変換.bONorOFF(str4[0]);
}
//else if ( str3.Equals( "JudgeDispPriorityDrums" ) )
//{
// this.e判定表示優先度.Drums = (E判定表示優先度) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1, (int) this.e判定表示優先度.Drums );
//}
//else if ( str3.Equals( "JudgeDispPriorityGuitar" ) )
//{
// this.e判定表示優先度.Guitar = (E判定表示優先度) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1, (int) this.e判定表示優先度.Guitar );
//}
//else if ( str3.Equals( "JudgeDispPriorityBass" ) )
//{
// this.e判定表示優先度.Bass = (E判定表示優先度) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1, (int) this.e判定表示優先度.Bass );
//}
else if ( str3.Equals( "Risky" ) ) // #23559 2011.6.23 yyagi
{
this.nRisky = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 10, this.nRisky );
}
else if ( str3.Equals( "DrumsTight" ) )
{
this.bTight = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "BranchGuide" ) )
{
this.bBranchGuide = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "DefaultCourse" ) ) //2017.01.30 DD
{
this.nDefaultCourse = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 4, this.nDefaultCourse );
}
else if ( str3.Equals( "ScoreMode" ) )
{
this.nScoreMode = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 3, this.nScoreMode );
}
else if ( str3.Equals( "HispeedRandom" ) )
{
this.bHispeedRandom = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "BigNotesWaitTime" ) )
{
this.n両手判定の待ち時間 = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 1, 100, this.n両手判定の待ち時間 );
}
else if ( str3.Equals( "BigNotesJudge" ) )
{
this.b大音符判定 = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "BranchAnime" ) )
{
this.nBranchAnime = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1, this.nBranchAnime );
}
else if ( str3.Equals( "NoInfo" ) )
{
this.bNoInfo = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "DefaultSongSort" ) )
{
this.nDefaultSongSort = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, this.nDefaultSongSort );
}
else if( str3.Equals( "TaikoRandom" ) )
{
this.eRandom.Taiko = (Eランダムモード) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 4, (int) this.eRandom.Taiko );
}
else if( str3.Equals( "TaikoStealth" ) )
{
this.eSTEALTH = (Eステルスモード) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 3, (int) this.eSTEALTH );
}
else if( str3.Equals( "GameMode" ) )
{
this.eGameMode = (EGame) C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 2, (int) this.eGameMode );
}
else if (str3.Equals("TokkunSkipMeasures"))
{
this.TokkunSkipMeasures = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 9999, this.TokkunSkipMeasures);
}
else if (str3.Equals(nameof(TokkunMashInterval)))
{
this.TokkunMashInterval = C変換.n値を文字列から取得して範囲内に丸めて返す(str4, 0, 9999, this.TokkunMashInterval);
}
else if( str3.Equals( "JudgeCountDisplay" ) )
{
this.bJudgeCountDisplay = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "Just" ) )
{
this.bJust = C変換.bONorOFF( str4[ 0 ] );
}
else if( str3.Equals( "PlayerCount" ) )
{
this.nPlayerCount = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 1, 2, this.nPlayerCount );
}
else if(str3.Equals(nameof(ShinuchiMode)))
{
ShinuchiMode = C変換.bONorOFF(str4[0]);
}
continue;
}
//-----------------------------
#endregion
#region [ [ViewerOption] ]
//-----------------------------
case Eセクション種別.ViewerOption:
{
if ( str3.Equals( "ViewerDrumsScrollSpeed" ) )
{
this.nViewerScrollSpeed.Drums = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1999, this.nViewerScrollSpeed.Drums );
}
else if ( str3.Equals( "ViewerGuitarScrollSpeed" ) )
{
this.nViewerScrollSpeed.Guitar = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1999, this.nViewerScrollSpeed.Guitar );
}
else if ( str3.Equals( "ViewerBassScrollSpeed" ) )
{
this.nViewerScrollSpeed.Bass = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 0, 1999, this.nViewerScrollSpeed.Bass );
}
else if ( str3.Equals( "ViewerVSyncWait" ) )
{
this.bViewerVSyncWait = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "ViewerShowDebugStatus" ) )
{
this.bViewerShowDebugStatus = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "ViewerTimeStretch" ) )
{
this.bViewerTimeStretch = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "ViewerGuitar" ) )
{
this.bViewerGuitar有効 = C変換.bONorOFF( str4[ 0 ] );
}
else if ( str3.Equals( "ViewerDrums" ) )
{
this.bViewerDrums有効 = C変換.bONorOFF( str4[ 0 ] );
}
continue;
}
//-----------------------------
#endregion
#region [ [GUID] ]
//-----------------------------
case Eセクション種別.GUID:
if( str3.Equals( "JoystickID" ) )
{
this.tJoystickIDの取得( str4 );
}
continue;
//-----------------------------
#endregion
#region [ [DrumsKeyAssign] ]
//-----------------------------
case Eセクション種別.DrumsKeyAssign:
{
if( str3.Equals( "LeftRed" ) )
{
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.LeftRed );
}
else if( str3.Equals( "RightRed" ) )
{
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.RightRed );
}
else if( str3.Equals( "LeftBlue" ) ) // #27029 2012.1.4 from
{ //
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.LeftBlue ); //
} //
else if( str3.Equals( "RightBlue" ) ) // #27029 2012.1.4 from
{ //
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.RightBlue ); //
}
else if( str3.Equals( "LeftRed2P" ) )
{
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.LeftRed2P );
}
else if( str3.Equals( "RightRed2P" ) )
{
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.RightRed2P );
}
else if( str3.Equals( "LeftBlue2P" ) ) // #27029 2012.1.4 from
{ //
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.LeftBlue2P ); //
} //
else if( str3.Equals( "RightBlue2P" ) ) // #27029 2012.1.4 from
{ //
this.tキーの読み出しと設定( str4, this.KeyAssign.Drums.RightBlue2P ); //
}
continue;
}
//-----------------------------
#endregion
#region [ [SystemKeyAssign] ]
//-----------------------------
case Eセクション種別.SystemKeyAssign:
if( str3.Equals( "Capture" ) )
{
this.tキーの読み出しと設定( str4, this.KeyAssign.System.Capture );
}
continue;
//-----------------------------
#endregion
}
}
}
continue;
}
catch ( Exception exception )
{
Trace.TraceError( exception.ToString() );
Trace.TraceError( "例外が発生しましたが処理を継続します。 (93c4c5cd-4996-4e8c-a82f-a179ff590b44)" );
continue;
}
}
}
}
/// <summary>
/// ギターとベースのキーアサイン入れ替え
/// </summary>
//public void SwapGuitarBassKeyAssign() // #24063 2011.1.16 yyagi
//{
// for ( int j = 0; j <= (int)EKeyConfigPad.Capture; j++ )
// {
// CKeyAssign.STKEYASSIGN t; //= new CConfigIni.CKeyAssign.STKEYASSIGN();
// for ( int k = 0; k < 16; k++ )
// {
// t = this.KeyAssign[ (int)EKeyConfigPart.GUITAR ][ j ][ k ];
// this.KeyAssign[ (int)EKeyConfigPart.GUITAR ][ j ][ k ] = this.KeyAssign[ (int)EKeyConfigPart.BASS ][ j ][ k ];
// this.KeyAssign[ (int)EKeyConfigPart.BASS ][ j ][ k ] = t;
// }
// }
// this.bIsSwappedGuitarBass = !bIsSwappedGuitarBass;
//}
// その他
#region [ private ]
//-----------------
private enum Eセクション種別
{
Unknown,
System,
Log,
PlayOption,
ViewerOption,
AutoPlay,
HitRange,
GUID,
DrumsKeyAssign,
SystemKeyAssign,
Temp,
}
private bool _bDrums有効;
private bool _bGuitar有効;
private bool bConfigIniが存在している;
private string ConfigIniファイル名;
private void tJoystickIDの取得( string strキー記述 )
{
string[] strArray = strキー記述.Split( new char[] { ',' } );
if( strArray.Length >= 2 )
{
int result = 0;
if( ( int.TryParse( strArray[ 0 ], out result ) && ( result >= 0 ) ) && ( result <= 9 ) )
{
if( this.dicJoystick.ContainsKey( result ) )
{
this.dicJoystick.Remove( result );
}
this.dicJoystick.Add( result, strArray[ 1 ] );
}
}
}
private void tキーアサインを全部クリアする()
{
this.KeyAssign = new CKeyAssign();
for( int i = 0; i <= (int)EKeyConfigPart.SYSTEM; i++ )
{
for( int j = 0; j <= (int)EKeyConfigPad.Capture; j++ )
{
this.KeyAssign[ i ][ j ] = new CKeyAssign.STKEYASSIGN[ 16 ];
for( int k = 0; k < 16; k++ )
{
this.KeyAssign[ i ][ j ][ k ] = new CKeyAssign.STKEYASSIGN( E入力デバイス., 0, 0 );
}
}
}
}
private void tキーの書き出し( StreamWriter sw, CKeyAssign.STKEYASSIGN[] assign )
{
bool flag = true;
for( int i = 0; i < 0x10; i++ )
{
if( assign[ i ]. == E入力デバイス. )
{
continue;
}
if( !flag )
{
sw.Write( ',' );
}
flag = false;
switch( assign[ i ]. )
{
case E入力デバイス.:
sw.Write( 'K' );
break;
case E入力デバイス.MIDI入力:
sw.Write( 'M' );
break;
case E入力デバイス.:
sw.Write( 'J' );
break;
case E入力デバイス.:
sw.Write( 'N' );
break;
}
sw.Write( "{0}{1}", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring( assign[ i ].ID, 1 ), assign[ i ]. ); // #24166 2011.1.15 yyagi: to support ID > 10, change 2nd character from Decimal to 36-numeral system. (e.g. J1023 -> JA23)
}
}
private void tキーの読み出しと設定( string strキー記述, CKeyAssign.STKEYASSIGN[] assign )
{
string[] strArray = strキー記述.Split( new char[] { ',' } );
for( int i = 0; ( i < strArray.Length ) && ( i < 0x10 ); i++ )
{
E入力デバイス e入力デバイス;
int id;
int code;
string str = strArray[ i ].Trim().ToUpper();
if ( str.Length >= 3 )
{
e入力デバイス = E入力デバイス.;
switch ( str[ 0 ] )
{
case 'J':
e入力デバイス = E入力デバイス.;
break;
case 'K':
e入力デバイス = E入力デバイス.;
break;
case 'L':
continue;
case 'M':
e入力デバイス = E入力デバイス.MIDI入力;
break;
case 'N':
e入力デバイス = E入力デバイス.;
break;
}
}
else
{
continue;
}
id = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf( str[ 1 ] ); // #24166 2011.1.15 yyagi: to support ID > 10, change 2nd character from Decimal to 36-numeral system. (e.g. J1023 -> JA23)
if( ( ( id >= 0 ) && int.TryParse( str.Substring( 2 ), out code ) ) && ( ( code >= 0 ) && ( code <= 0xff ) ) )
{
this.t指定した入力が既にアサイン済みである場合はそれを全削除する( e入力デバイス, id, code );
assign[ i ]. = e入力デバイス;
assign[ i ].ID = id;
assign[ i ]. = code;
}
}
}
private void tデフォルトのキーアサインに設定する()
{
this.tキーアサインを全部クリアする();
string strDefaultKeyAssign = @"
[DrumsKeyAssign]
LeftRed=K015
RightRed=K019
LeftBlue=K013
RightBlue=K020
LeftRed2P=K011
RightRed2P=K023
LeftBlue2P=K012
RightBlue2P=K047
[SystemKeyAssign]
Capture=K065
";
t文字列から読み込み( strDefaultKeyAssign );
}
//-----------------
#endregion
public event PropertyChangedEventHandler PropertyChanged;
private bool SetProperty<T>(ref T storage, T value, string propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
storage = value;
OnPropertyChanged(propertyName);
return true;
}
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}