diff --git a/OpenTaiko/src/Common/CConfigIni.cs b/OpenTaiko/src/Common/CConfigIni.cs index 42887ae5..ed5f6705 100644 --- a/OpenTaiko/src/Common/CConfigIni.cs +++ b/OpenTaiko/src/Common/CConfigIni.cs @@ -1210,7 +1210,7 @@ namespace OpenTaiko { for (int j = 0; j < (int)EKeyConfigPad.Max; j++) { for (int k = 0; k < 0x10; k++) { if ((this.KeyAssign[i][j][k].InputDevice == EInputDevice.Keyboard) && - (this.KeyAssign[i][j][k].Code == (int)SlimDXKeys.Key.Return)) { + (this.KeyAssign[i][j][k].Code == (int)SlimDXKeys.Key.Return)) { return false; } } @@ -1641,8 +1641,8 @@ namespace OpenTaiko { this.bBufferedInputs = true; this.bIsAllowedDoubleClickFullscreen = false; // #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に戻した。動的なミキサー制御がうまく動作しているため。 + // #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モード @@ -1657,7 +1657,7 @@ namespace OpenTaiko { nBassBufferSizeMs = 1; 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(自動設定) + // this.nASIOBufferSizeMs = 0; // #24820 2012.12.25 yyagi 初期値は0(自動設定) #endregion @@ -1760,8 +1760,7 @@ namespace OpenTaiko { bool isMenu = pad is EKeyConfigPad.Decide or EKeyConfigPad.RightChange or EKeyConfigPad.LeftChange; for (int i = 0; i <= (int)EKeyConfigPart.System; i++) { // Do not restrict duplicate keybinds for System controls - for (int j = 0; j < (int)EKeyConfigPad.Capture; j++) - { + for (int j = 0; j < (int)EKeyConfigPad.Capture; j++) { bool isJMenu = j is (int)EKeyConfigPad.LeftChange or (int)EKeyConfigPad.RightChange or (int)EKeyConfigPad.Decide; @@ -1770,8 +1769,8 @@ namespace OpenTaiko { } for (int k = 0; k < 0x10; k++) { if (this.KeyAssign[i][j][k].InputDevice != deviceType || - this.KeyAssign[i][j][k].ID != nID || - this.KeyAssign[i][j][k].Code != nCode) { + this.KeyAssign[i][j][k].ID != nID || + this.KeyAssign[i][j][k].Code != nCode) { continue; } @@ -2633,7 +2632,7 @@ namespace OpenTaiko { string str; this.ClearAllKeyAssignments(); using (StreamReader reader = - new StreamReader(this.ConfigIniFileName, Encoding.GetEncoding(OpenTaiko.sEncType))) { + new StreamReader(this.ConfigIniFileName, Encoding.GetEncoding(OpenTaiko.sEncType))) { str = reader.ReadToEnd(); } @@ -2705,41 +2704,41 @@ namespace OpenTaiko { this.nLayoutType = int.Parse(value); break; case "SaveFileName": { - var _s = value.Split(new char[] { ',' }); + var _s = value.Split(new char[] { ',' }); - // Ignore custom save file names if duplicates - if (!_s.GroupBy(x => x).Any(g => g.Count() > 1)) { - for (int i = 0; i < Math.Min(5, _s.Length); i++) { - this.sSaveFile[i] = _s[i]; + // Ignore custom save file names if duplicates + if (!_s.GroupBy(x => x).Any(g => g.Count() > 1)) { + for (int i = 0; i < Math.Min(5, _s.Length); i++) { + this.sSaveFile[i] = _s[i]; + } } - } - break; - } + break; + } case "IgnoreSongUnlockables": this.bIgnoreSongUnlockables = CConversion.bONorOFF(value[0]); break; case "SkinPath": { - string absSkinPath = value; - if (!System.IO.Path.IsPathRooted(value)) { - absSkinPath = System.IO.Path.Combine(OpenTaiko.strEXEのあるフォルダ, "System"); - absSkinPath = System.IO.Path.Combine(absSkinPath, value); - Uri u = new Uri(absSkinPath); - absSkinPath = u.AbsolutePath.ToString(); // str4内に相対パスがある場合に備える - absSkinPath = System.Web.HttpUtility.UrlDecode(absSkinPath); // デコードする - absSkinPath = - absSkinPath.Replace('/', System.IO.Path.DirectorySeparatorChar); // 区切り文字が\ではなく/なので置換する - } + string absSkinPath = value; + if (!System.IO.Path.IsPathRooted(value)) { + absSkinPath = System.IO.Path.Combine(OpenTaiko.strEXEのあるフォルダ, "System"); + absSkinPath = System.IO.Path.Combine(absSkinPath, value); + 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; - } + if (absSkinPath[absSkinPath.Length - 1] != + System.IO.Path.DirectorySeparatorChar) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する + { + absSkinPath += System.IO.Path.DirectorySeparatorChar; + } - this.strSystemSkinSubfolderFullName = absSkinPath; - break; - } + this.strSystemSkinSubfolderFullName = absSkinPath; + break; + } case nameof(this.PreAssetsLoading): this.PreAssetsLoading = CConversion.bONorOFF(value[0]); break; @@ -2767,21 +2766,21 @@ namespace OpenTaiko { value, 0, 9999, this.nWindowBaseYPosition); break; case "WindowWidth": { - this.nWindowWidth = CConversion.ParseIntInRange(value, 1, 65535, this.nWindowWidth); - if (this.nWindowWidth <= 0) { - this.nWindowWidth = SampleFramework.GameWindowSize.Width; - } + this.nWindowWidth = CConversion.ParseIntInRange(value, 1, 65535, this.nWindowWidth); + if (this.nWindowWidth <= 0) { + this.nWindowWidth = SampleFramework.GameWindowSize.Width; + } - break; - } + break; + } case "WindowHeight": { - this.nWindowHeight = CConversion.ParseIntInRange(value, 1, 65535, this.nWindowHeight); - if (this.nWindowHeight <= 0) { - this.nWindowHeight = SampleFramework.GameWindowSize.Height; - } + this.nWindowHeight = CConversion.ParseIntInRange(value, 1, 65535, this.nWindowHeight); + if (this.nWindowHeight <= 0) { + this.nWindowHeight = SampleFramework.GameWindowSize.Height; + } - break; - } + break; + } case "DoubleClickFullScreen": this.bIsAllowedDoubleClickFullscreen = CConversion.bONorOFF(value[0]); break; @@ -2801,10 +2800,10 @@ namespace OpenTaiko { this.nWASAPIBufferSizeMs = CConversion.ParseIntInRange(value, 0, 9999, this.nWASAPIBufferSizeMs); break; case "ASIODevice": { - string[] asiodev = CEnumerateAllAsioDevices.GetAllASIODevices(); - this.nASIODevice = CConversion.ParseIntInRange(value, 0, asiodev.Length - 1, this.nASIODevice); - break; - } + string[] asiodev = CEnumerateAllAsioDevices.GetAllASIODevices(); + this.nASIODevice = CConversion.ParseIntInRange(value, 0, asiodev.Length - 1, this.nASIODevice); + break; + } case "SoundTimerType": this.bUseOSTimer = CConversion.bONorOFF(value[0]); break; @@ -3417,122 +3416,122 @@ namespace OpenTaiko { private void ProcessSystemKeyAssignmentSection(string key, string value) { switch (key) { case "Capture": { - this.ReadAndSetKey(value, this.KeyAssign.System.Capture); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.Capture); + break; + } case "SongVolumeIncrease": { - this.ReadAndSetKey(value, this.KeyAssign.System.SongVolIncrease); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.SongVolIncrease); + break; + } case "SongVolumeDecrease": { - this.ReadAndSetKey(value, this.KeyAssign.System.SongVolDecrease); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.SongVolDecrease); + break; + } case "DisplayHits": { - this.ReadAndSetKey(value, this.KeyAssign.System.DisplayHits); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.DisplayHits); + break; + } case "DisplayDebug": { - this.ReadAndSetKey(value, this.KeyAssign.System.DisplayDebug); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.DisplayDebug); + break; + } case "QuickConfig": { - this.ReadAndSetKey(value, this.KeyAssign.System.QuickConfig); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.QuickConfig); + break; + } case "NewHeya": { - this.ReadAndSetKey(value, this.KeyAssign.System.NewHeya); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.NewHeya); + break; + } case "SortSongs": { - this.ReadAndSetKey(value, this.KeyAssign.System.SortSongs); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.SortSongs); + break; + } case "ToggleAutoP1": { - this.ReadAndSetKey(value, this.KeyAssign.System.ToggleAutoP1); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.ToggleAutoP1); + break; + } case "ToggleAutoP2": { - this.ReadAndSetKey(value, this.KeyAssign.System.ToggleAutoP2); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.ToggleAutoP2); + break; + } case "ToggleTrainingMode": { - this.ReadAndSetKey(value, this.KeyAssign.System.ToggleTrainingMode); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.ToggleTrainingMode); + break; + } case "CycleVideoDisplayMode": { - this.ReadAndSetKey(value, this.KeyAssign.System.CycleVideoDisplayMode); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.System.CycleVideoDisplayMode); + break; + } } } private void ProcessTrainingKeyAssignmentSection(string key, string value) { switch (key) { case "TrainingIncreaseScrollSpeed": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingIncreaseScrollSpeed); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingIncreaseScrollSpeed); + break; + } case "TrainingDecreaseScrollSpeed": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingDecreaseScrollSpeed); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingDecreaseScrollSpeed); + break; + } case "TrainingIncreaseSongSpeed": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingIncreaseSongSpeed); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingIncreaseSongSpeed); + break; + } case "TrainingDecreaseSongSpeed": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingDecreaseSongSpeed); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingDecreaseSongSpeed); + break; + } case "TrainingToggleAuto": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingToggleAuto); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingToggleAuto); + break; + } case "TrainingBranchNormal": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBranchNormal); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBranchNormal); + break; + } case "TrainingBranchExpert": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBranchExpert); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBranchExpert); + break; + } case "TrainingBranchMaster": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBranchMaster); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBranchMaster); + break; + } case "TrainingPause": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingPause); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingPause); + break; + } case "TrainingBookmark": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBookmark); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingBookmark); + break; + } case "TrainingMoveForwardMeasure": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingMoveForwardMeasure); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingMoveForwardMeasure); + break; + } case "TrainingMoveBackMeasure": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingMoveBackMeasure); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingMoveBackMeasure); + break; + } case "TrainingSkipForwardMeasure": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingSkipForwardMeasure); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingSkipForwardMeasure); + break; + } case "TrainingSkipBackMeasure": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingSkipBackMeasure); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingSkipBackMeasure); + break; + } case "TrainingJumpToFirstMeasure": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingJumpToFirstMeasure); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingJumpToFirstMeasure); + break; + } case "TrainingJumpToLastMeasure": { - this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingJumpToLastMeasure); - break; - } + this.ReadAndSetKey(value, this.KeyAssign.Drums.TrainingJumpToLastMeasure); + break; + } } } @@ -3563,7 +3562,7 @@ namespace OpenTaiko { Temp, } - private Dictionary> sectionProcess; + private Dictionary> sectionProcess = new Dictionary>(); private bool _bDrumsEnabled; private bool _bGuitarEnabled; diff --git a/OpenTaiko/src/Common/CSkin.cs b/OpenTaiko/src/Common/CSkin.cs index 410e85d3..8280f74c 100644 --- a/OpenTaiko/src/Common/CSkin.cs +++ b/OpenTaiko/src/Common/CSkin.cs @@ -3,9 +3,9 @@ using System.Drawing; using System.Text; using FDK; -namespace OpenTaiko { - // グローバル定数 - +namespace OpenTaiko { + // グローバル定数 + public enum Eシステムサウンド { BGMオプション画面 = 0, BGMコンフィグ画面, @@ -22,9 +22,9 @@ namespace OpenTaiko { SOUND曲読込開始音, SOUND決定音, SOUND取消音, - SOUND変更音, - //SOUND赤, - //SOUND青, + SOUND変更音, + //SOUND赤, + //SOUND青, SOUND風船, SOUND曲決定音, SOUND成績発表, @@ -33,21 +33,21 @@ namespace OpenTaiko { sound特訓ジャンプポイント, sound特訓スキップ音, SOUND特訓スクロール, - Count // システムサウンド総数の計算用 + Count // システムサウンド総数の計算用 } - internal class CSkin : IDisposable { - // Class - - public class CSystemSound : IDisposable { - // static フィールド - + internal class CSkin : IDisposable { + // Class + + public class CSystemSound : IDisposable { + // static フィールド + public static CSkin.CSystemSound r最後に再生した排他システムサウンド; - private readonly ESoundGroup _soundGroup; - - // フィールド、プロパティ - + private readonly ESoundGroup _soundGroup; + + // フィールド、プロパティ + public bool bPlayed; public bool bCompact対象; public bool bLoop; @@ -123,9 +123,9 @@ namespace OpenTaiko { } return sound.TotalPlayTime; } - } - - + } + + /// /// コンストラクタ /// @@ -141,11 +141,11 @@ namespace OpenTaiko { _soundGroup = soundGroup; this.bNotLoadedYet = true; this.bPlayed = false; - } - - - // メソッド - + } + + + // メソッド + public void tLoading() { this.bNotLoadedYet = false; this.bLoadedSuccessfuly = false; @@ -157,7 +157,7 @@ namespace OpenTaiko { return; } - for (int i = 0; i < 2; i++) // 一旦Cloneを止めてASIO対応に専念 + for (int i = 0; i < 2; i++) // 一旦Cloneを止めてASIO対応に専念 { try { this.rSound[i] = OpenTaiko.SoundManager?.tCreateSound(CSkin.Path(this.strFileName), _soundGroup); @@ -211,10 +211,10 @@ namespace OpenTaiko { } } } - } - + } + #region [ IDisposable 実装 ] - //----------------- + //----------------- public void Dispose() { if (!this.bDisposed) { for (int i = 0; i < 2; i++) { @@ -226,66 +226,66 @@ namespace OpenTaiko { this.bLoadedSuccessfuly = false; this.bDisposed = true; } - } - //----------------- + } + //----------------- #endregion - + #region [ private ] - //----------------- + //----------------- private bool bDisposed; private int nNextPlayingSoundNumber; - private CSound[] rSound = new CSound[2]; - //----------------- + private CSound[] rSound = new CSound[2]; + //----------------- #endregion - } - - - // Properties - - // Hitsounds - - public CHitSounds hsHitSoundsInformations = null; - - // Character specific voice samples - - // Sounds{System.IO.Path.DirectorySeparatorChar}Clear - + } + + + // Properties + + // Hitsounds + + public CHitSounds hsHitSoundsInformations = null; + + // Character specific voice samples + + // Sounds{System.IO.Path.DirectorySeparatorChar}Clear + public CSystemSound[] voiceClearFailed = new CSystemSound[5]; public CSystemSound[] voiceClearClear = new CSystemSound[5]; public CSystemSound[] voiceClearFullCombo = new CSystemSound[5]; public CSystemSound[] voiceClearAllPerfect = new CSystemSound[5]; public CSystemSound[] voiceAIWin = new CSystemSound[5]; - public CSystemSound[] voiceAILose = new CSystemSound[5]; - - // Sounds{System.IO.Path.DirectorySeparatorChar}Menu - + public CSystemSound[] voiceAILose = new CSystemSound[5]; + + // Sounds{System.IO.Path.DirectorySeparatorChar}Menu + public CSystemSound[] voiceMenuSongSelect = new CSystemSound[5]; public CSystemSound[] voiceMenuSongDecide = new CSystemSound[5]; public CSystemSound[] voiceMenuSongDecide_AI = new CSystemSound[5]; public CSystemSound[] voiceMenuDiffSelect = new CSystemSound[5]; public CSystemSound[] voiceMenuDanSelectStart = new CSystemSound[5]; public CSystemSound[] voiceMenuDanSelectPrompt = new CSystemSound[5]; - public CSystemSound[] voiceMenuDanSelectConfirm = new CSystemSound[5]; - - // Sounds{System.IO.Path.DirectorySeparatorChar}Title - - public CSystemSound[] voiceTitleSanka = new CSystemSound[5]; - - // Sounds{System.IO.Path.DirectorySeparatorChar}Tower - - public CSystemSound[] voiceTowerMiss = new CSystemSound[5]; - - // Sounds{System.IO.Path.DirectorySeparatorChar}Result - + public CSystemSound[] voiceMenuDanSelectConfirm = new CSystemSound[5]; + + // Sounds{System.IO.Path.DirectorySeparatorChar}Title + + public CSystemSound[] voiceTitleSanka = new CSystemSound[5]; + + // Sounds{System.IO.Path.DirectorySeparatorChar}Tower + + public CSystemSound[] voiceTowerMiss = new CSystemSound[5]; + + // Sounds{System.IO.Path.DirectorySeparatorChar}Result + public CSystemSound[] voiceResultBestScore = new CSystemSound[5]; public CSystemSound[] voiceResultClearFailed = new CSystemSound[5]; public CSystemSound[] voiceResultClearSuccess = new CSystemSound[5]; public CSystemSound[] voiceResultDanFailed = new CSystemSound[5]; public CSystemSound[] voiceResultDanRedPass = new CSystemSound[5]; - public CSystemSound[] voiceResultDanGoldPass = new CSystemSound[5]; - - // General sound effects (Skin specific) - + public CSystemSound[] voiceResultDanGoldPass = new CSystemSound[5]; + + // General sound effects (Skin specific) + public CSystemSound bgmオプション画面 = null; public CSystemSound bgmコンフィグ画面 = null; public CSystemSound bgm起動画面 = null; @@ -305,8 +305,8 @@ namespace OpenTaiko { public CSystemSound soundEntry = null; public CSystemSound soundError = null; public CSystemSound soundsanka = null; - public CSystemSound soundBomb = null; - //add + public CSystemSound soundBomb = null; + //add public CSystemSound sound曲決定音 = null; public CSystemSound soundSongDecide_AI = null; public CSystemSound bgmリザルトイン音 = null; @@ -359,14 +359,14 @@ namespace OpenTaiko { public CSystemSound soundCrownIn = null; public CSystemSound soundRankIn = null; - public CSystemSound soundSelectAnnounce = null; - - // Tower Sfx + public CSystemSound soundSelectAnnounce = null; + + // Tower Sfx public CSystemSound soundTowerMiss = null; - public CSystemSound bgmTowerResult = null; - - //public Cシステムサウンド soundRed = null; - //public Cシステムサウンド soundBlue = null; + public CSystemSound bgmTowerResult = null; + + //public Cシステムサウンド soundRed = null; + //public Cシステムサウンド soundBlue = null; public CSystemSound soundBalloon = null; public CSystemSound soundKusudama = null; public CSystemSound soundKusudamaMiss = null; @@ -422,14 +422,14 @@ namespace OpenTaiko { return this.bgmコンフィグ画面; case Eシステムサウンド.BGM選曲画面: - return this.bgm選曲画面; - - //case Eシステムサウンド.SOUND赤: - // return this.soundRed; - - //case Eシステムサウンド.SOUND青: - // return this.soundBlue; - + return this.bgm選曲画面; + + //case Eシステムサウンド.SOUND赤: + // return this.soundRed; + + //case Eシステムサウンド.SOUND青: + // return this.soundBlue; + case Eシステムサウンド.SOUND風船: return this.soundBalloon; @@ -535,32 +535,32 @@ namespace OpenTaiko { } throw new IndexOutOfRangeException(); } - } - - - // スキンの切り替えについて___ - // - // _スキンの種類は大きく分けて2種類。Systemスキンとboxdefスキン。 - //  前者はSystem/フォルダにユーザーが自らインストールしておくスキン。 - //  後者はbox.defで指定する、曲データ制作者が提示するスキン。 - // - // _Config画面で、2種のスキンを区別無く常時使用するよう設定することができる。 - // _box.defの#SKINPATH 設定により、boxdefスキンを一時的に使用するよう設定する。 - //  (box.defの効果の及ばない他のmuxic boxでは、当該boxdefスキンの有効性が無くなる) - // - // これを実現するために___ - // _Systemスキンの設定情報と、boxdefスキンの設定情報は、分離して持つ。 - //  (strSystem~~ と、strBoxDef~~~) - // _Config画面からは前者のみ書き換えできるようにし、 - //  選曲画面からは後者のみ書き換えできるようにする。(SetCurrent...()) - // _読み出しは両者から行えるようにすると共に - //  選曲画面用に二種の情報を区別しない読み出し方法も提供する(GetCurrent...) - + } + + + // スキンの切り替えについて___ + // + // _スキンの種類は大きく分けて2種類。Systemスキンとboxdefスキン。 + //  前者はSystem/フォルダにユーザーが自らインストールしておくスキン。 + //  後者はbox.defで指定する、曲データ制作者が提示するスキン。 + // + // _Config画面で、2種のスキンを区別無く常時使用するよう設定することができる。 + // _box.defの#SKINPATH 設定により、boxdefスキンを一時的に使用するよう設定する。 + //  (box.defの効果の及ばない他のmuxic boxでは、当該boxdefスキンの有効性が無くなる) + // + // これを実現するために___ + // _Systemスキンの設定情報と、boxdefスキンの設定情報は、分離して持つ。 + //  (strSystem~~ と、strBoxDef~~~) + // _Config画面からは前者のみ書き換えできるようにし、 + //  選曲画面からは後者のみ書き換えできるようにする。(SetCurrent...()) + // _読み出しは両者から行えるようにすると共に + //  選曲画面用に二種の情報を区別しない読み出し方法も提供する(GetCurrent...) + private object lockBoxDefSkin; - public static bool bUseBoxDefSkin = true; // box.defからのスキン変更を許容するか否か - + public static bool bUseBoxDefSkin = true; // box.defからのスキン変更を許容するか否か + public string strSystemSkinRoot = null; - public string[] strSystemSkinSubfolders = null; // ListだとignoreCaseな検索が面倒なので、配列に逃げる :-) + public string[] strSystemSkinSubfolders = null; // ListだとignoreCaseな検索が面倒なので、配列に逃げる :-) private string[] _strBoxDefSkinSubfolders = null; public string[] strBoxDefSkinSubfolders { get { @@ -573,11 +573,11 @@ namespace OpenTaiko { _strBoxDefSkinSubfolders = value; } } - } // 別スレッドからも書き込みアクセスされるため、スレッドセーフなアクセス法を提供 - - private static string strSystemSkinSubfolderFullName; // Config画面で設定されたスキン - private static string strBoxDefSkinSubfolderFullName = ""; // box.defで指定されているスキン - + } // 別スレッドからも書き込みアクセスされるため、スレッドセーフなアクセス法を提供 + + private static string strSystemSkinSubfolderFullName; // Config画面で設定されたスキン + private static string strBoxDefSkinSubfolderFullName = ""; // box.defで指定されているスキン + /// /// スキンパス名をフルパスで取得する /// @@ -589,7 +589,7 @@ namespace OpenTaiko { } else { return strBoxDefSkinSubfolderFullName; } - } + } /// /// スキンパス名をフルパスで設定する /// @@ -601,10 +601,10 @@ namespace OpenTaiko { } else { strBoxDefSkinSubfolderFullName = value; } - } - - - // Constructor + } + + + // Constructor public CSkin(string _strSkinSubfolderFullName, bool _bUseBoxDefSkin) { lockBoxDefSkin = new object(); strSystemSkinSubfolderFullName = _strSkinSubfolderFullName; @@ -623,8 +623,8 @@ namespace OpenTaiko { private string InitializeSkinPathRoot() { strSystemSkinRoot = System.IO.Path.Combine(OpenTaiko.strEXEのあるフォルダ, "System" + System.IO.Path.DirectorySeparatorChar); return strSystemSkinRoot; - } - + } + /// /// Skin(Sounds)を再読込する準備をする(再生停止,Dispose,ファイル名再設定)。 /// あらかじめstrSkinSubfolderを適切に設定しておくこと。 @@ -656,18 +656,18 @@ namespace OpenTaiko { this.soundゲーム終了音 = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Game end.ogg", false, true, false, ESoundGroup.Voice); this.soundステージクリア音 = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Stage clear.ogg", false, true, true, ESoundGroup.Voice); this.soundフルコンボ音 = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Full combo.ogg", false, false, true, ESoundGroup.Voice); - this.sound曲読込開始音 = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Now loading.ogg", false, true, true, ESoundGroup.Unknown); - //this.bgm選曲画面 = new Cシステムサウンド(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Select BGM.ogg", true, true, false, ESoundGroup.SongPlayback); - //this.soundSongSelectChara = new Cシステムサウンド(@$"Sounds{System.IO.Path.DirectorySeparatorChar}SongSelect Chara.ogg", false, false, false, ESoundGroup.SongPlayback); + this.sound曲読込開始音 = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Now loading.ogg", false, true, true, ESoundGroup.Unknown); + //this.bgm選曲画面 = new Cシステムサウンド(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Select BGM.ogg", true, true, false, ESoundGroup.SongPlayback); + //this.soundSongSelectChara = new Cシステムサウンド(@$"Sounds{System.IO.Path.DirectorySeparatorChar}SongSelect Chara.ogg", false, false, false, ESoundGroup.SongPlayback); this.soundSkip = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Skip.ogg", false, false, false, ESoundGroup.SoundEffect); this.SoundBanapas = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Banapas.ogg", false, false, false, ESoundGroup.SoundEffect); this.soundEntry = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Entry.ogg", true, false, false, ESoundGroup.Voice); - this.soundError = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Error.ogg", false, false, false, ESoundGroup.SoundEffect); - //this.soundsanka = new Cシステムサウンド(@$"Sounds{System.IO.Path.DirectorySeparatorChar}sanka.ogg", false, false, false, ESoundGroup.Voice); - this.soundBomb = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Bomb.ogg", false, false, false, ESoundGroup.SoundEffect); - - //this.soundRed = new Cシステムサウンド( @$"Sounds{System.IO.Path.DirectorySeparatorChar}dong.ogg", false, false, true, ESoundType.SoundEffect ); - //this.soundBlue = new Cシステムサウンド( @$"Sounds{System.IO.Path.DirectorySeparatorChar}ka.ogg", false, false, true, ESoundType.SoundEffect ); + this.soundError = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Error.ogg", false, false, false, ESoundGroup.SoundEffect); + //this.soundsanka = new Cシステムサウンド(@$"Sounds{System.IO.Path.DirectorySeparatorChar}sanka.ogg", false, false, false, ESoundGroup.Voice); + this.soundBomb = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Bomb.ogg", false, false, false, ESoundGroup.SoundEffect); + + //this.soundRed = new Cシステムサウンド( @$"Sounds{System.IO.Path.DirectorySeparatorChar}dong.ogg", false, false, true, ESoundType.SoundEffect ); + //this.soundBlue = new Cシステムサウンド( @$"Sounds{System.IO.Path.DirectorySeparatorChar}ka.ogg", false, false, true, ESoundType.SoundEffect ); this.soundBalloon = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}balloon.ogg", false, false, true, ESoundGroup.SoundEffect); this.soundKusudama = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Kusudama.ogg", false, false, true, ESoundGroup.SoundEffect); this.soundKusudamaMiss = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}KusudamaMiss.ogg", false, false, true, ESoundGroup.SoundEffect); @@ -714,9 +714,9 @@ namespace OpenTaiko { this.soundEncyclopediaBGM = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Encyclopedia{System.IO.Path.DirectorySeparatorChar}BGM.ogg", true, false, false, ESoundGroup.SongPlayback); this.soundTowerSelectBGM = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Tower{System.IO.Path.DirectorySeparatorChar}BGM.ogg", true, false, false, ESoundGroup.SongPlayback); - soundExToExtra = new CSystemSound[1] { new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}SongSelect{System.IO.Path.DirectorySeparatorChar}0{System.IO.Path.DirectorySeparatorChar}ExToExtra.ogg", false, false, false, ESoundGroup.SoundEffect) }; // Placeholder until Komi decides - soundExtraToEx = new CSystemSound[1] { new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}SongSelect{System.IO.Path.DirectorySeparatorChar}0{System.IO.Path.DirectorySeparatorChar}ExtraToEx.ogg", false, false, false, ESoundGroup.SoundEffect) }; // what to do with it lol - + soundExToExtra = new CSystemSound[1] { new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}SongSelect{System.IO.Path.DirectorySeparatorChar}0{System.IO.Path.DirectorySeparatorChar}ExToExtra.ogg", false, false, false, ESoundGroup.SoundEffect) }; // Placeholder until Komi decides + soundExtraToEx = new CSystemSound[1] { new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}SongSelect{System.IO.Path.DirectorySeparatorChar}0{System.IO.Path.DirectorySeparatorChar}ExtraToEx.ogg", false, false, false, ESoundGroup.SoundEffect) }; // what to do with it lol + calibrationTick = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Calibrate.ogg", false, false, false, ESoundGroup.SoundEffect); soundModal = new CSystemSound[6]; @@ -726,18 +726,18 @@ namespace OpenTaiko { soundModal[soundModal.Length - 1] = new CSystemSound(@$"Sounds{System.IO.Path.DirectorySeparatorChar}Modals{System.IO.Path.DirectorySeparatorChar}Coin.ogg", false, false, false, ESoundGroup.SoundEffect); ReloadSkin(); - tReadSkinConfig(); - - //hsHitSoundsInformations = new CHitSounds(Path(@$"Sounds{System.IO.Path.DirectorySeparatorChar}HitSounds{System.IO.Path.DirectorySeparatorChar}HitSounds.json")); + tReadSkinConfig(); + + //hsHitSoundsInformations = new CHitSounds(Path(@$"Sounds{System.IO.Path.DirectorySeparatorChar}HitSounds{System.IO.Path.DirectorySeparatorChar}HitSounds.json")); hsHitSoundsInformations = new CHitSounds(@$"Global{System.IO.Path.DirectorySeparatorChar}HitSounds{System.IO.Path.DirectorySeparatorChar}HitSounds.json"); } public void ReloadSkin() { for (int i = 0; i < nシステムサウンド数; i++) { - if (!this[i].bExclusive) // BGM系以外のみ読み込む。(BGM系は必要になったときに読み込む) + if (!this[i].bExclusive) // BGM系以外のみ読み込む。(BGM系は必要になったときに読み込む) { CSystemSound cシステムサウンド = this[i]; - if (!OpenTaiko.bコンパクトモード || cシステムサウンド.bCompact対象) { + if (cシステムサウンド.bCompact対象) { try { cシステムサウンド.tLoading(); Trace.TraceInformation("システムサウンドを読み込みました。({0})", cシステムサウンド.strFileName); @@ -751,9 +751,9 @@ namespace OpenTaiko { } } } - } - - + } + + /// /// Skinの一覧を再取得する。 /// System/*****/Graphics (やSounds/) というフォルダ構成を想定している。 @@ -763,44 +763,44 @@ namespace OpenTaiko { /// 2. System/*****/ で最初にenumerateされたもの /// 3. System/ (従来互換) /// - public void ReloadSkinPaths() { + public void ReloadSkinPaths() { #region [ まず System/*** をenumerateする ] string[] tempSkinSubfolders = System.IO.Directory.GetDirectories(strSystemSkinRoot, "*"); strSystemSkinSubfolders = new string[tempSkinSubfolders.Length]; int size = 0; - for (int i = 0; i < tempSkinSubfolders.Length; i++) { + for (int i = 0; i < tempSkinSubfolders.Length; i++) { #region [ 検出したフォルダがスキンフォルダかどうか確認する] if (!bIsValid(tempSkinSubfolders[i])) - continue; + continue; #endregion #region [ スキンフォルダと確認できたものを、strSkinSubfoldersに入れる ] - // フォルダ名末尾に必ず{System.IO.Path.DirectorySeparatorChar}をつけておくこと。さもないとConfig読み出し側(必ず{System.IO.Path.DirectorySeparatorChar}をつける)とマッチできない + // フォルダ名末尾に必ず{System.IO.Path.DirectorySeparatorChar}をつけておくこと。さもないとConfig読み出し側(必ず{System.IO.Path.DirectorySeparatorChar}をつける)とマッチできない if (tempSkinSubfolders[i][tempSkinSubfolders[i].Length - 1] != System.IO.Path.DirectorySeparatorChar) { tempSkinSubfolders[i] += System.IO.Path.DirectorySeparatorChar; } strSystemSkinSubfolders[size] = tempSkinSubfolders[i]; Trace.TraceInformation("SkinPath検出: {0}", strSystemSkinSubfolders[size]); - size++; + size++; #endregion } Trace.TraceInformation("SkinPath入力: {0}", strSystemSkinSubfolderFullName); Array.Resize(ref strSystemSkinSubfolders, size); - Array.Sort(strSystemSkinSubfolders); // BinarySearch実行前にSortが必要 + Array.Sort(strSystemSkinSubfolders); // BinarySearch実行前にSortが必要 #endregion - + #region [ 現在のSkinパスがbox.defスキンをCONFIG指定していた場合のために、最初にこれが有効かチェックする。有効ならこれを使う。 ] if (bIsValid(strSystemSkinSubfolderFullName) && Array.BinarySearch(strSystemSkinSubfolders, strSystemSkinSubfolderFullName, StringComparer.InvariantCultureIgnoreCase) < 0) { strBoxDefSkinSubfolders = new string[1] { strSystemSkinSubfolderFullName }; return; - } + } #endregion - + #region [ 次に、現在のSkinパスが存在するか調べる。あれば終了。] if (Array.BinarySearch(strSystemSkinSubfolders, strSystemSkinSubfolderFullName, StringComparer.InvariantCultureIgnoreCase) >= 0) - return; + return; #endregion #region [ カレントのSkinパスが消滅しているので、以下で再設定する。] /// 以下の優先順位で現在使用中のSkinパスを再設定する。 @@ -813,31 +813,31 @@ namespace OpenTaiko { StringComparer.InvariantCultureIgnoreCase) >= 0) { strSystemSkinSubfolderFullName = tempSkinPath_default; return; - } + } #endregion #region [ System/SkinFiles.*****/ で最初にenumerateされたものを、カレントSkinパスに再設定する ] if (strSystemSkinSubfolders.Length > 0) { strSystemSkinSubfolderFullName = strSystemSkinSubfolders[0]; return; - } + } #endregion #region [ System/ に、カレントSkinパスを再設定する。] strSystemSkinSubfolderFullName = strSystemSkinRoot; - strSystemSkinSubfolders = new string[1] { strSystemSkinSubfolderFullName }; + strSystemSkinSubfolders = new string[1] { strSystemSkinSubfolderFullName }; #endregion #endregion - } - - // メソッド - + } + + // メソッド + public static string Path(string strファイルの相対パス) { if (strBoxDefSkinSubfolderFullName == "" || !bUseBoxDefSkin) { return System.IO.Path.Combine(strSystemSkinSubfolderFullName, strファイルの相対パス); } else { return System.IO.Path.Combine(strBoxDefSkinSubfolderFullName, strファイルの相対パス); } - } - + } + /// /// フルパス名を与えると、スキン名として、ディレクトリ名末尾の要素を返す /// 例: C:{System.IO.Path.DirectorySeparatorChar}foo{System.IO.Path.DirectorySeparatorChar}bar{System.IO.Path.DirectorySeparatorChar} なら、barを返す @@ -846,10 +846,10 @@ namespace OpenTaiko { /// スキン名 public static string GetSkinName(string skinPathFullName) { if (skinPathFullName != null) { - if (skinPathFullName == "") // 「box.defで未定義」用 + if (skinPathFullName == "") // 「box.defで未定義」用 skinPathFullName = strSystemSkinSubfolderFullName; string[] tmp = skinPathFullName.Split(System.IO.Path.DirectorySeparatorChar); - return tmp[tmp.Length - 2]; // ディレクトリ名の最後から2番目の要素がスキン名(最後の要素はnull。元stringの末尾が{System.IO.Path.DirectorySeparatorChar}なので。) + return tmp[tmp.Length - 2]; // ディレクトリ名の最後から2番目の要素がスキン名(最後の要素はnull。元stringの末尾が{System.IO.Path.DirectorySeparatorChar}なので。) } return null; } @@ -872,8 +872,8 @@ namespace OpenTaiko { return b; } return null; - } - + } + /// /// スキンパス名が妥当かどうか /// (タイトル画像にアクセスできるかどうかで判定する) @@ -895,8 +895,8 @@ namespace OpenTaiko { } } - } - + } + /// /// 変数の初期化 /// @@ -908,13 +908,13 @@ namespace OpenTaiko { public void LoadSkinConfigFromFile(string path, ref string work) { if (!File.Exists(Path(path))) return; using (var streamReader = new StreamReader(Path(path), Encoding.GetEncoding(OpenTaiko.sEncType))) { - while (streamReader.Peek() > -1) // 一行ずつ読み込む。 + while (streamReader.Peek() > -1) // 一行ずつ読み込む。 { var nowLine = streamReader.ReadLine(); - if (nowLine.StartsWith("#include")) { - // #include hogehoge.iniにぶち当たった + if (nowLine.StartsWith("#include")) { + // #include hogehoge.iniにぶち当たった var includePath = nowLine.Substring("#include ".Length).Trim(); - LoadSkinConfigFromFile(includePath, ref work); // 再帰的に読み込む + LoadSkinConfigFromFile(includePath, ref work); // 再帰的に読み込む } else { work += nowLine + Environment.NewLine; } @@ -929,7 +929,7 @@ namespace OpenTaiko { } - private void t文字列から読み込み(string strAllSettings) // 2011.4.13 yyagi; refactored to make initial KeyConfig easier. + private void t文字列から読み込み(string strAllSettings) // 2011.4.13 yyagi; refactored to make initial KeyConfig easier. { string[] delimiter = { "\n" }; string[] strSingleLine = strAllSettings.Split(delimiter, StringSplitOptions.RemoveEmptyEntries); @@ -942,10 +942,10 @@ namespace OpenTaiko { string[] strArray = str.Split(new char[] { '=' }); if (strArray.Length == 2) { strCommand = strArray[0].Trim(); - strParam = strArray[1].Trim(); - + strParam = strArray[1].Trim(); + #region [Skin Settings] - + void ParseInt32(Action setValue) { if (int.TryParse(strParam, out var unparsedValue)) { setValue(unparsedValue); @@ -972,23 +972,23 @@ namespace OpenTaiko { Resolution[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region [Background Scroll] - + case "Background_Scroll_Y": { string[] strSplit = strParam.Split(','); for (int i = 0; i < 2; i++) { this.Background_Scroll_Y[i] = int.Parse(strSplit[i]); } break; - } - + } + #endregion - + #region [Taiko Mode] - //----------------------------- + //----------------------------- case "ScrollFieldP1Y": { this.nScrollFieldY[0] = CConversion.StringToInt(strParam, 192); break; @@ -1021,13 +1021,13 @@ namespace OpenTaiko { case "NowStageDisp": { this.b現在のステージ数を表示しない = CConversion.bONorOFF(strParam[0]); break; - } - - //----------------------------- + } + + //----------------------------- #endregion - + #region [Result screen] - //----------------------------- + //----------------------------- case "ResultPanelP1X": { this.nResultPanelP1X = CConversion.StringToInt(strParam, 515); break; @@ -1051,20 +1051,20 @@ namespace OpenTaiko { case "ResultScoreP1Y": { this.nResultScoreP1Y = CConversion.StringToInt(strParam, 252); break; - } - //----------------------------- + } + //----------------------------- #endregion - - + + #region 新・SkinConfig - + #region Startup case nameof(StartUp_LangSelect_FontSize): { StartUp_LangSelect_FontSize = int.Parse(strParam); break; - } + } #endregion - + #region Title case nameof(Title_LoadingPinInstances): { Title_LoadingPinInstances = int.Parse(strParam); @@ -1360,9 +1360,9 @@ namespace OpenTaiko { case "Title_VerticalBar": { Title_VerticalBar = CConversion.bONorOFF(strParam[0]); break; - } + } #endregion - + #region Config case "Config_Arrow_X": { string[] strSplit = strParam.Split(','); @@ -1529,19 +1529,19 @@ namespace OpenTaiko { Config_Calibration_Highlights[i / 4] = new Rectangle(int.Parse(strSplit[i]), int.Parse(strSplit[i + 1]), int.Parse(strSplit[i + 2]), int.Parse(strSplit[i + 3])); } break; - } + } #endregion - + #region [Mod Icons] - - + + /* * public int[] ModIcons_OffsetX = { 0, 30, 60, 90, 0, 30, 60, 90 }; public int[] ModIcons_OffsetY = { 0, 0, 0, 0, 30, 30, 30, 30 }; public int[] ModIcons_OffsetX_Menu = { 0, 30, 60, 90, 120, 150, 180, 210 }; public int[] ModIcons_OffsetY_Menu = { 0, 0, 0, 0, 0, 0, 0, 0 }; - */ - + */ + case "ModIcons_OffsetX": { string[] strSplit = strParam.Split(','); for (int i = 0; i < 8; i++) { @@ -1569,10 +1569,10 @@ namespace OpenTaiko { ModIcons_OffsetY_Menu[i] = int.Parse(strSplit[i]); } break; - } - + } + #endregion - + #region SongSelect case "SongSelect_BoxExplanation_X": { SongSelect_BoxExplanation_X = int.Parse(strParam); @@ -2887,9 +2887,9 @@ namespace OpenTaiko { case nameof(SongSelect_Rotate_Chara): { SongSelect_Rotate_Chara = strParam.Split(',').ToArray(); break; - } + } #endregion - + #region DaniSelect /* case "DaniSelect_Dan_Text_X": @@ -2908,7 +2908,7 @@ namespace OpenTaiko { DaniSelect_Dan_Text_Y[i] = int.Parse(strSplit[i]); } } - */ + */ case "DaniSelect_DanSides_X": { string[] strSplit = strParam.Split(','); for (int i = 0; i < 2; i++) { @@ -3216,9 +3216,9 @@ namespace OpenTaiko { DaniSelect_DanIcon_Color[i] = ColorTranslator.FromHtml(strSplit[i]); } break; - } + } #endregion - + #region SongLoading case nameof(SongLoading_Plate_X): { SongLoading_Plate_X = int.Parse(strParam); @@ -3357,9 +3357,9 @@ namespace OpenTaiko { DaniSelect_DanPlateTitle_Offset[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region Game case "Game_Notes_Anime": { Game_Notes_Anime = CConversion.bONorOFF(strParam[0]); @@ -3571,8 +3571,8 @@ namespace OpenTaiko { Game_ScoreRank_4P[i] = int.Parse(strSplit[i]); } break; - } - + } + #region CourseSymbol case "Game_CourseSymbol_X": { string[] strSplit = strParam.Split(','); @@ -3643,9 +3643,9 @@ namespace OpenTaiko { Game_CourseSymbol_Back_Rect_5P[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region PanelFont case nameof(Game_MusicName_X): { Game_MusicName_X = int.Parse(strParam); @@ -3817,10 +3817,10 @@ namespace OpenTaiko { Game_Judge_Meter_MissRate[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - - // Chara read + + // Chara read #region Chara case "Game_Chara_X": { string[] strSplit = strParam.Split(','); @@ -3864,8 +3864,8 @@ namespace OpenTaiko { if (int.Parse(strParam) > 0) Game_Chara_Balloon_FadeOut = int.Parse(strParam); break; - } - // パターン数の設定はTextureLoader.csで反映されます。 + } + // パターン数の設定はTextureLoader.csで反映されます。 case "Game_Chara_Motion_Normal": { Game_Chara_Motion_Normal = strParam; break; @@ -3889,9 +3889,9 @@ namespace OpenTaiko { case "Game_Chara_Beat_GoGo": { ParseInt32(value => Game_Chara_Beat_GoGo = value); break; - } + } #endregion - + #region Mob case "Game_Mob_Beat": { ParseInt32(value => Game_Mob_Beat = value); @@ -3900,9 +3900,9 @@ namespace OpenTaiko { case "Game_Mob_Ptn_Beat": { ParseInt32(value => Game_Mob_Ptn_Beat = value); break; - } + } #endregion - + #region Score case "Game_Score_X": { string[] strSplit = strParam.Split(','); @@ -4001,10 +4001,10 @@ namespace OpenTaiko { Game_Score_AddBonus_5P[i] = int.Parse(strSplit[i]); } break; - } - + } + #endregion - + #region Taiko case "Game_Taiko_Background_X": { string[] strSplit = strParam.Split(','); @@ -4343,9 +4343,9 @@ namespace OpenTaiko { Game_Taiko_Frame_5P[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region Gauge case "Game_Gauge_X": { string[] strSplit = strParam.Split(','); @@ -4553,9 +4553,9 @@ namespace OpenTaiko { Gauge_Soul_Fire_5P[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region Balloon case "Game_Balloon_Combo_X": { string[] strSplit = strParam.Split(','); @@ -4794,10 +4794,10 @@ namespace OpenTaiko { Game_Balloon_Balloon_Number_5P[i] = int.Parse(strSplit[i]); } break; - } - + } + #endregion - + #region Effects case nameof(Game_Effect_Roll_StartPoint_X): { Game_Effect_Roll_StartPoint_X = strParam.Split(',').Select(int.Parse).ToArray(); @@ -5018,12 +5018,12 @@ namespace OpenTaiko { Game_Effect_Fire_5P[i] = int.Parse(strSplit[i]); } break; - } - + } + #endregion - + #region Lane - + case "Game_Lane_X": { string[] strSplit = strParam.Split(','); for (int i = 0; i < 2; i++) { @@ -5066,12 +5066,12 @@ namespace OpenTaiko { Game_Lane_5P[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region Runner #endregion - + #region Dan_C case nameof(Game_DanC_Title_ForeColor): { Game_DanC_Title_ForeColor = ColorTranslator.FromHtml(strParam); @@ -5237,10 +5237,10 @@ namespace OpenTaiko { case nameof(Game_DanC_SubTitle_MaxWidth): { ParseInt32(value => Game_DanC_SubTitle_MaxWidth = value); break; - } - + } + #endregion - + #region PuchiChara case nameof(Game_PuchiChara_X): { Game_PuchiChara_X = strParam.Split(',').Select(int.Parse).ToArray(); @@ -5293,9 +5293,9 @@ namespace OpenTaiko { case nameof(Game_PuchiChara_SineTimer): { Game_PuchiChara_SineTimer = double.Parse(strParam); break; - } + } #endregion - + #region Training case "Game_Training_DownBG": { string[] strSplit = strParam.Split(','); @@ -5353,9 +5353,9 @@ namespace OpenTaiko { case nameof(Game_Training_BigNumber_Width): { Game_Training_BigNumber_Width = int.Parse(strParam); break; - } + } #endregion - + #region Tower case "Game_Tower_Sky_Gradient": { string[] strSplit = strParam.Split(','); @@ -5412,9 +5412,9 @@ namespace OpenTaiko { Game_Tower_Miss[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region AIBattle case "Game_AIBattle_CharaMove": { Game_AIBattle_CharaMove = int.Parse(strParam); @@ -5552,11 +5552,11 @@ namespace OpenTaiko { Game_AIBattle_Judge_Number_Interval[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #endregion - + #region Result case "Result_Use1PUI": { Result_Use1PUI = CConversion.bONorOFF(strParam[0]); @@ -6062,11 +6062,11 @@ namespace OpenTaiko { case nameof(Result_StageText_ForeColor): { Result_StageText_ForeColor = ColorTranslator.FromHtml(strParam); break; - } - //case nameof(Result_StageText_ForeColor_Red): - //{ - // Result_StageText_ForeColor_Red = ColorTranslator.FromHtml(strParam); - //} + } + //case nameof(Result_StageText_ForeColor_Red): + //{ + // Result_StageText_ForeColor_Red = ColorTranslator.FromHtml(strParam); + //} case nameof(Result_MusicName_BackColor): { Result_MusicName_BackColor = ColorTranslator.FromHtml(strParam); break; @@ -6074,12 +6074,12 @@ namespace OpenTaiko { case nameof(Result_StageText_BackColor): { Result_StageText_BackColor = ColorTranslator.FromHtml(strParam); break; - } - //case nameof(Result_StageText_BackColor_Red): - //{ - // Result_StageText_BackColor_Red = ColorTranslator.FromHtml(strParam); - //} - + } + //case nameof(Result_StageText_BackColor_Red): + //{ + // Result_StageText_BackColor_Red = ColorTranslator.FromHtml(strParam); + //} + case "Result_NamePlate_X": { string[] strSplit = strParam.Split(','); for (int i = 0; i < 2; i++) { @@ -6545,10 +6545,10 @@ namespace OpenTaiko { Result_ModIcons_5P[i] = int.Parse(strSplit[i]); } break; - } - + } + #endregion - + #region AIResult case "Result_AIBattle_Batch": { string[] strSplit = strParam.Split(','); @@ -6588,9 +6588,9 @@ namespace OpenTaiko { Result_AIBattle_WinFlag[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region DanResult case "DanResult_StatePanel": { string[] strSplit = strParam.Split(','); @@ -6791,9 +6791,9 @@ namespace OpenTaiko { case "DanResult_Font_DanTitles_Size": { DanResult_Font_DanTitles_Size = int.Parse(strParam); break; - } + } #endregion - + #region TowerResult case "TowerResult_ScoreRankEffect": { string[] strSplit = strParam.Split(','); @@ -6869,9 +6869,9 @@ namespace OpenTaiko { case "TowerResult_Font_TowerText72": { TowerResult_Font_TowerText72 = int.Parse(strParam); break; - } + } #endregion - + #region Heya case "Heya_Main_Menu_X": { string[] strSplit = strParam.Split(','); @@ -6975,9 +6975,9 @@ namespace OpenTaiko { Heya_DescriptionTextOrigin[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region OnlineLounge case "OnlineLounge_Side_Menu": { string[] strSplit = strParam.Split(','); @@ -7077,9 +7077,9 @@ namespace OpenTaiko { case "OnlineLounge_Font_OLFontLarge": { OnlineLounge_Font_OLFontLarge = int.Parse(strParam); break; - } + } #endregion - + #region TowerSelect case "TowerSelect_Title_Size": { TowerSelect_Title_Size = int.Parse(strParam); @@ -7132,9 +7132,9 @@ namespace OpenTaiko { TowerSelect_Bar_Y[i] = int.Parse(strSplit[i]); } break; - } + } #endregion - + #region OpenEncyclopedia case "OpenEncyclopedia_Context_Item2": { string[] strSplit = strParam.Split(','); @@ -7181,24 +7181,24 @@ namespace OpenTaiko { case "OpenEncyclopedia_Font_EncyclopediaMenu_Size": { OpenEncyclopedia_Font_EncyclopediaMenu_Size = int.Parse(strParam); break; - } + } #endregion - + #region Exit case "Exit_Duration": { Exit_Duration = int.Parse(strParam); break; - } + } #endregion - + #region Font - case nameof(Font_Edge_Ratio): //Config画面や簡易メニューのフォントについて(rhimm) + case nameof(Font_Edge_Ratio): //Config画面や簡易メニューのフォントについて(rhimm) { if (int.Parse(strParam) > 0) Font_Edge_Ratio = int.Parse(strParam); break; } - case nameof(Font_Edge_Ratio_Vertical): //TITLEやSUBTITLEなど、縦に書かれることのあるフォントについて(rhimm) + case nameof(Font_Edge_Ratio_Vertical): //TITLEやSUBTITLEなど、縦に書かれることのあるフォントについて(rhimm) { if (int.Parse(strParam) > 0) Font_Edge_Ratio_Vertical = int.Parse(strParam); @@ -7211,9 +7211,9 @@ namespace OpenTaiko { case nameof(Text_Correction_Y): { Text_Correction_Y = int.Parse(strParam); break; - } + } #endregion - + #region PopupMenu case "PopupMenu_Menu_Title": { string[] strSplit = strParam.Split(','); @@ -7260,9 +7260,9 @@ namespace OpenTaiko { case "PopupMenu_Font_Size": { PopupMenu_Font_Size = int.Parse(strParam); break; - } + } #endregion - + #region NamePlate case "NamePlate_Title_Offset": { string[] strSplit = strParam.Split(','); @@ -7330,9 +7330,9 @@ namespace OpenTaiko { case "NamePlate_Font_Dan_Size": { NamePlate_Font_Dan_Size = int.Parse(strParam); break; - } + } #endregion - + #region Modal case "Modal_Title_Full": { string[] strSplit = strParam.Split(','); @@ -7475,7 +7475,7 @@ namespace OpenTaiko { Modal_Text_Half_Move_5P[i] = int.Parse(strSplit[i]); } break; - } + } #endregion default: foreach (string code in CLangManager.Langcodes) { @@ -7494,8 +7494,8 @@ namespace OpenTaiko { if (HPrivateFastFont.FontExists(Path(strParam))) _boxFontNameLocalized.Add(code, strParam); } } - break; - + break; + #endregion } } @@ -7509,15 +7509,15 @@ namespace OpenTaiko { } } - private void t座標の追従設定() { - // + private void t座標の追従設定() { + // if (bFieldBgPointOverride == true) { } - } - + } + #region [ IDisposable 実装 ] - //----------------- + //----------------- public void Dispose() { if (!this.bDisposed済み) { for (int i = 0; i < this.nシステムサウンド数; i++) @@ -7525,62 +7525,62 @@ namespace OpenTaiko { this.bDisposed済み = true; } - } - //----------------- + } + //----------------- #endregion - - - // その他 - + + + // その他 + #region [ private ] - //----------------- - private bool bDisposed済み; - //----------------- + //----------------- + private bool bDisposed済み; + //----------------- #endregion - + #region 背景(スクロール) - public int[] Background_Scroll_Y = new int[] { 0, 536 }; + public int[] Background_Scroll_Y = new int[] { 0, 536 }; #endregion - - + + #region[ 座標 ] - //2017.08.11 kairera0467 DP実用化に向けてint配列に変更 - - //フィールド位置 Xは判定枠部分の位置。Yはフィールドの最上部の座標。 - //現時点ではノーツ画像、Senotes画像、判定枠が連動する。 - //Xは中央基準描画、Yは左上基準描画 + //2017.08.11 kairera0467 DP実用化に向けてint配列に変更 + + //フィールド位置 Xは判定枠部分の位置。Yはフィールドの最上部の座標。 + //現時点ではノーツ画像、Senotes画像、判定枠が連動する。 + //Xは中央基準描画、Yは左上基準描画 public int[] nScrollFieldX = new int[] { 349, 349 }; public int[] nScrollFieldY = new int[] { 192, 368 }; public int[] nScrollField_4P = new int[] { 349, 46 }; - public int[] nScrollField_5P = new int[] { 349, 27 }; - - //中心座標指定 + public int[] nScrollField_5P = new int[] { 349, 27 }; + + //中心座標指定 public int[] nJudgePointX = new int[] { 413, 413, 413, 413 }; - public int[] nJudgePointY = new int[] { 256, 433, 0, 0 }; - - //フィールド背景画像 - //ScrollField座標への追従設定が可能。 - //分岐背景、ゴーゴー背景が連動する。(全て同じ大きさ、位置で作成すること。) - //左上基準描画 - public bool bFieldBgPointOverride = false; - //SEnotes - //音符座標に加算 + public int[] nJudgePointY = new int[] { 256, 433, 0, 0 }; + + //フィールド背景画像 + //ScrollField座標への追従設定が可能。 + //分岐背景、ゴーゴー背景が連動する。(全て同じ大きさ、位置で作成すること。) + //左上基準描画 + public bool bFieldBgPointOverride = false; + //SEnotes + //音符座標に加算 public int[] nSENotesX = new int[] { -2, -2 }; public int[] nSENotesY = new int[] { 131, 131 }; public int[] nSENotes_4P = new int[] { -2, 100 }; - public int[] nSENotes_5P = new int[] { -2, 94 }; - - //光る太鼓部分 + public int[] nSENotes_5P = new int[] { -2, 94 }; + + //光る太鼓部分 public int nMtaikoBackgroundX = 0; public int nMtaikoBackgroundY = 184; public int nMtaikoFieldX = 0; public int nMtaikoFieldY = 184; public int nMtaikoMainX = 0; - public int nMtaikoMainY = 0; - - //コンボ + public int nMtaikoMainY = 0; + + //コンボ public int[] nComboNumberX = new int[] { 0, 0, 0, 0 }; public int[] nComboNumberY = new int[] { 212, 388, 0, 0 }; public int[] nComboNumberTextY = new int[] { 271, 447, 0, 0 }; @@ -7589,10 +7589,10 @@ namespace OpenTaiko { public float fComboNumberSpacing_l = 0; public EDifficultyDisplayType eDiffDispMode; - public bool b現在のステージ数を表示しない; - - //リザルト画面 - //現在のデフォルト値はダミーです。 + public bool b現在のステージ数を表示しない; + + //リザルト画面 + //現在のデフォルト値はダミーです。 public int nResultPanelP1X = 0; public int nResultPanelP1Y = 0; public int nResultPanelP2X = 515; @@ -7615,26 +7615,26 @@ namespace OpenTaiko { public int nResultGaugeBaseP2X = 555; public int nResultGaugeBaseP2Y = 122; public int nResultGaugeBodyP1X = 559; - public int nResultGaugeBodyP1Y = 125; + public int nResultGaugeBodyP1Y = 125; #endregion - + public string[] strStringを配列に直す(string str) { string[] strArray = str.Split(','); return strArray; } public enum RollColorMode { - None, // PS4, Switchなど - All, // 旧筐体(旧作含む) - WithoutStart // 新筐体 + None, // PS4, Switchなど + All, // 旧筐体(旧作含む) + WithoutStart // 新筐体 } - public enum ReferencePoint //テクスチャ描画の基準点を変更可能にするための値(rhimm) + public enum ReferencePoint //テクスチャ描画の基準点を変更可能にするための値(rhimm) { Center, Left, Right - } - + } + #region 新・SkinConfig #region General public string Skin_Name = "Unknown"; @@ -7644,11 +7644,11 @@ namespace OpenTaiko { public string FontName { get { return _fontNameLocalized.TryGetValue(CLangManager.fetchLang(), out string value) ? value : ""; } } private Dictionary _fontNameLocalized = new Dictionary(); public string BoxFontName { get { return _boxFontNameLocalized.TryGetValue(CLangManager.fetchLang(), out string value) ? value : ""; } } - private Dictionary _boxFontNameLocalized = new Dictionary(); + private Dictionary _boxFontNameLocalized = new Dictionary(); #endregion - + #region Config - + public int[] Config_Arrow_X = new int[] { 552, 552 }; public int[] Config_Arrow_Y = new int[] { 297, 363 }; @@ -7686,19 +7686,19 @@ namespace OpenTaiko { new Rectangle(371, 724, 371, 209), new Rectangle(774, 724, 371, 209), new Rectangle(1179, 724, 371, 209) - }; - + }; + #endregion - + #region Puchichara - + public int Puchichara_Ptn; - public string[] Puchicharas_Name; - + public string[] Puchicharas_Name; + #endregion - + #region Characters - + public int Characters_Ptn; public string[] Characters_DirName; public int[] Characters_Normal_Ptn, @@ -7746,10 +7746,10 @@ namespace OpenTaiko { Characters_Tower_Standing_Tired_Ptn, Characters_Tower_Climbing_Tired_Ptn, Characters_Tower_Running_Tired_Ptn, - Characters_Tower_Clear_Tired_Ptn; - - // Config - + Characters_Tower_Clear_Tired_Ptn; + + // Config + public int[][] Characters_Resolution; public int[][] Characters_Heya_Render_Offset; public bool[] Characters_UseResult1P; @@ -7826,22 +7826,22 @@ namespace OpenTaiko { public int[] Characters_Result_Normal_AnimationDuration; public int[] Characters_Result_Clear_AnimationDuration; public int[] Characters_Result_Failed_In_AnimationDuration; - public int[] Characters_Result_Failed_AnimationDuration; - + public int[] Characters_Result_Failed_AnimationDuration; + #endregion - + #region [Adjustments] public int[] Adjustments_MenuPuchichara_X = new int[] { -100, 100 }; - public int[] Adjustments_MenuPuchichara_Y = new int[] { -100, -100 }; - + public int[] Adjustments_MenuPuchichara_Y = new int[] { -100, -100 }; + #endregion - + #region [Startup] - public int StartUp_LangSelect_FontSize = 16; + public int StartUp_LangSelect_FontSize = 16; #endregion - + #region [Title Screen] - + public int Title_LoadingPinInstances = 5; public int Title_LoadingPinFrameCount = 8; public int Title_LoadingPinCycle = 320; @@ -7904,10 +7904,10 @@ namespace OpenTaiko { public int[] Title_ModeSelect_Bar_Center_BoxText = new int[] { 640, 397 }; public bool Title_VerticalText = false; - public bool Title_VerticalBar = false; - + public bool Title_VerticalBar = false; + #endregion - + #region SongSelect public string[] SongSelect_GenreName = { "ポップス", "アニメ", "ゲームバラエティ", "ナムコオリジナル", "クラシック", "バラエティ", "キッズ", "ボーカロイド", "最近遊んだ曲" }; @@ -8207,11 +8207,11 @@ namespace OpenTaiko { public string[] SongSelect_CorrectionY_Chara = { "ここにY座標を補正したい文字をカンマで区切って記入" }; public int SongSelect_CorrectionX_Chara_Value = 0; public int SongSelect_CorrectionY_Chara_Value = 0; - public string[] SongSelect_Rotate_Chara = { "ここに90℃回転させたい文字をカンマで区切って記入" }; - + public string[] SongSelect_Rotate_Chara = { "ここに90℃回転させたい文字をカンマで区切って記入" }; + #endregion #region DaniSelect - + public int[] DaniSelect_DanSides_X = new int[] { 243, 1199 }; public int[] DaniSelect_DanSides_Y = new int[] { 143, 143 }; @@ -8292,7 +8292,7 @@ namespace OpenTaiko { Color.Gray, Color.DarkGreen, Color.Black - }; + }; #endregion #region SongLoading public int SongLoading_Plate_X = 640; @@ -8326,13 +8326,13 @@ namespace OpenTaiko { public Color SongLoading_Title_BackColor = ColorTranslator.FromHtml("#000000"); public Color SongLoading_SubTitle_ForeColor = ColorTranslator.FromHtml("#000000"); public Color SongLoading_SubTitle_BackColor = ColorTranslator.FromHtml("#00000000"); - public bool SongLoading_Plate_ScreenBlend = false; - + public bool SongLoading_Plate_ScreenBlend = false; + #endregion #region Game - - // Game parameters here - + + // Game parameters here + public bool Game_Notes_Anime = false; public int[] Game_Notes_Size = new int[] { 130, 130 }; public int[] Game_SENote_Size = new int[] { 136, 30 }; @@ -8374,10 +8374,10 @@ namespace OpenTaiko { public int[] Game_ScoreRank_4P = new int[] { 87, 88 }; public int[] Game_ScoreRank_5P = new int[] { 87, 80 }; - public DBSkinPreset.SkinPreset Game_SkinScenes = null; - + public DBSkinPreset.SkinPreset Game_SkinScenes = null; + #region Chara - + public int[] Game_Chara_X = new int[] { 0, 0 }; public int[] Game_Chara_Y = new int[] { 0, 537 }; public int[] Game_Chara_Balloon_X = new int[] { 240, 240, 0, 0 }; @@ -8402,21 +8402,21 @@ namespace OpenTaiko { public int Game_Chara_Beat_GoGo = 2; public int Game_Chara_Balloon_Timer = 28; public int Game_Chara_Balloon_Delay = 500; - public int Game_Chara_Balloon_FadeOut = 84; - + public int Game_Chara_Balloon_FadeOut = 84; + #endregion - + #region Dancer - + public int[] Game_Dancer_X = new int[] { 640, 430, 856, 215, 1070 }; public int[] Game_Dancer_Y = new int[] { 500, 500, 500, 500, 500 }; public string Game_Dancer_Motion = "0"; - public int[] Game_Dancer_Gauge = new int[] { 0, 0, 0, 40, 80 }; - + public int[] Game_Dancer_Gauge = new int[] { 0, 0, 0, 40, 80 }; + #endregion - + #region Tower - + public int Game_Tower_Ptn; public int[] Game_Tower_Ptn_Deco, Game_Tower_Ptn_Base; @@ -8428,13 +8428,13 @@ namespace OpenTaiko { public int[] Game_Tower_Ptn_Don_Standing, Game_Tower_Ptn_Don_Jump, Game_Tower_Ptn_Don_Climbing, - Game_Tower_Ptn_Don_Running; - + Game_Tower_Ptn_Don_Running; + #endregion - + #region Mob public int Game_Mob_Beat, - Game_Mob_Ptn_Beat = 1; + Game_Mob_Ptn_Beat = 1; #endregion #region CourseSymbol public int[] Game_CourseSymbol_X = new int[] { -4, -4 }; @@ -8449,7 +8449,7 @@ namespace OpenTaiko { public int[] Game_CourseSymbol_Back_5P = new int[] { 896, 39 }; public int[] Game_CourseSymbol_Back_Rect_4P = new int[] { 0, 128, 384, 129 }; - public int[] Game_CourseSymbol_Back_Rect_5P = new int[] { 0, 140, 384, 105 }; + public int[] Game_CourseSymbol_Back_Rect_5P = new int[] { 0, 140, 384, 105 }; #endregion #region PanelFont public int Game_MusicName_X = 1260; @@ -8475,8 +8475,8 @@ namespace OpenTaiko { public Color Game_StageText_BackColor = ColorTranslator.FromHtml("#000000"); public Color Game_Lyric_BackColor = ColorTranslator.FromHtml("#0000FF"); public Color[] Game_Lyric_VTTForeColor = new Color[] { Color.White, Color.Lime, Color.Cyan, Color.Red, Color.Yellow, Color.Magenta, Color.Blue, Color.Black }; - public Color[] Game_Lyric_VTTBackColor = new Color[] { Color.White, Color.Lime, Color.Cyan, Color.Red, Color.Yellow, Color.Magenta, Color.Blue, Color.Black }; - + public Color[] Game_Lyric_VTTBackColor = new Color[] { Color.White, Color.Lime, Color.Cyan, Color.Red, Color.Yellow, Color.Magenta, Color.Blue, Color.Black }; + #endregion #region Score public int[] Game_Score_X = new int[] { 20, 20, 0, 0 }; @@ -8495,7 +8495,7 @@ namespace OpenTaiko { public int[] Game_Score_Add_5P = new int[] { 20, 86 }; public int[] Game_Score_AddBonus_4P = new int[] { 20, 134 }; - public int[] Game_Score_AddBonus_5P = new int[] { 20, 126 }; + public int[] Game_Score_AddBonus_5P = new int[] { 20, 126 }; #endregion #region Taiko public int[] Game_Taiko_Background_X = new int[] { 0, 0 }; @@ -8557,8 +8557,8 @@ namespace OpenTaiko { public int[] Game_Taiko_Combo_Text_5P = new int[] { 268, 91 }; public int[] Game_Taiko_Frame_4P = new int[] { 333, 8 }; - public int[] Game_Taiko_Frame_5P = new int[] { 333, 0 }; - + public int[] Game_Taiko_Frame_5P = new int[] { 333, 0 }; + #endregion #region Gauge public int[] Game_Gauge_X = new int[] { 492, 492 }; @@ -8597,8 +8597,8 @@ namespace OpenTaiko { public int[] Gauge_Soul_5P = new int[] { 1184, -20 }; public int[] Gauge_Soul_Fire_4P = new int[] { 1112, -85 }; - public int[] Gauge_Soul_Fire_5P = new int[] { 1112, -93 }; - + public int[] Gauge_Soul_Fire_5P = new int[] { 1112, -93 }; + #endregion #region Balloon public int[] Game_Balloon_Combo_X = new int[] { 253, 253 }; @@ -8640,7 +8640,7 @@ namespace OpenTaiko { public int[] Game_Balloon_Balloon_Number_5P = new int[] { 423, 87 }; public int Game_Kusudama_Number_X = 960; - public int Game_Kusudama_Number_Y = 540; + public int Game_Kusudama_Number_Y = 540; #endregion #region Effects public int[] Game_Effect_Roll_StartPoint_X = new int[] { 56, -10, 200, 345, 100, 451, 600, 260, -30, 534, 156, 363 }; @@ -8656,19 +8656,19 @@ namespace OpenTaiko { public float[] Game_Effect_Roll_Speed_2P_X = new float[] { 0.6f }; public float[] Game_Effect_Roll_Speed_2P_Y = new float[] { 0.6f }; public int Game_Effect_Roll_Ptn; - public int[] Game_Effect_NotesFlash = new int[] { 180, 180, 16 }; // Width, Height, Ptn + public int[] Game_Effect_NotesFlash = new int[] { 180, 180, 16 }; // Width, Height, Ptn public int Game_Effect_NotesFlash_Timer = 20; public int[] Game_Effect_GoGoSplash = new int[] { 300, 400, 30 }; public int[] Game_Effect_GoGoSplash_X = new int[] { 120, 300, 520, 760, 980, 1160 }; public int[] Game_Effect_GoGoSplash_Y = new int[] { 740, 730, 720, 720, 730, 740 }; public bool Game_Effect_GoGoSplash_Rotate = true; - public int Game_Effect_GoGoSplash_Timer = 18; - // super-flying-notes AioiLight + public int Game_Effect_GoGoSplash_Timer = 18; + // super-flying-notes AioiLight public int[] Game_Effect_FlyingNotes_StartPoint_X = new int[] { 414, 414 }; public int[] Game_Effect_FlyingNotes_StartPoint_Y = new int[] { 260, 434 }; - public int[] Game_Effect_FlyingNotes_EndPoint_X = new int[] { 1222, 1222 }; // 1P, 2P + public int[] Game_Effect_FlyingNotes_EndPoint_X = new int[] { 1222, 1222 }; // 1P, 2P public int[] Game_Effect_FlyingNotes_EndPoint_Y = new int[] { 164, 554 }; - public int[] Game_Effect_FlyingNotes_EndPoint_X_AI = new int[] { 1222, 1222 }; // 1P, 2P + public int[] Game_Effect_FlyingNotes_EndPoint_X_AI = new int[] { 1222, 1222 }; // 1P, 2P public int[] Game_Effect_FlyingNotes_EndPoint_Y_AI = new int[] { -230, 820 }; public int Game_Effect_FlyingNotes_Sine = 220; @@ -8698,7 +8698,7 @@ namespace OpenTaiko { public int[] Game_Effects_Hit_Explosion_5P = new int[] { 284, -39 }; public int[] Game_Effect_Fire_4P = new int[] { 240, -75 }; - public int[] Game_Effect_Fire_5P = new int[] { 240, -94 }; + public int[] Game_Effect_Fire_5P = new int[] { 240, -94 }; #endregion #region Lane public int[] Game_Lane_X = new int[] { 333, 333 }; @@ -8707,7 +8707,7 @@ namespace OpenTaiko { public int[] Game_Lane_Sub_Y = new int[] { 326, 502 }; public int[] Game_Lane_4P = new int[] { 333, 46 }; - public int[] Game_Lane_5P = new int[] { 333, 39 }; + public int[] Game_Lane_5P = new int[] { 333, 39 }; #endregion #region Runner #endregion @@ -8720,11 +8720,11 @@ namespace OpenTaiko { public int[] Game_PuchiChara_BalloonY = new int[] { 240, 500 }; public int[] Game_PuchiChara_KusudamaX = new int[] { 290, 690, 90, 890, 490 }; public int[] Game_PuchiChara_KusudamaY = new int[] { 420, 420, 420, 420, 420 }; - public float[] Game_PuchiChara_Scale = new float[] { 0.6f, 0.8f }; // 通常時、 ふうせん連打時 - public int[] Game_PuchiChara = new int[] { 256, 256, 2 }; // Width, Height, Ptn + public float[] Game_PuchiChara_Scale = new float[] { 0.6f, 0.8f }; // 通常時、 ふうせん連打時 + public int[] Game_PuchiChara = new int[] { 256, 256, 2 }; // Width, Height, Ptn public int Game_PuchiChara_Sine = 20; public int Game_PuchiChara_Timer = 4800; - public double Game_PuchiChara_SineTimer = 2; + public double Game_PuchiChara_SineTimer = 2; #endregion #region Dan-C public Color Game_DanC_Title_ForeColor = ColorTranslator.FromHtml("#FFFFFF"); @@ -8744,8 +8744,8 @@ namespace OpenTaiko { public int[] Game_DanC_Number_Small_Number_Offset = new int[] { 285, 38 }; public int[] Game_DanC_Exam_Offset = new int[] { 222, 27 }; - public int[] Game_DanC_X = new int[] { 807, 70, 70, 70 }; // 329, 437 - public int[] Game_DanC_Y = new int[] { 116, 292, 292, 292 }; // { 116, 190, 236, 292 }; + public int[] Game_DanC_X = new int[] { 807, 70, 70, 70 }; // 329, 437 + public int[] Game_DanC_Y = new int[] { 116, 292, 292, 292 }; // { 116, 190, 236, 292 }; public int[] Game_DanC_Base_Offset_X = new int[] { 0, 503 }; public int[] Game_DanC_Base_Offset_Y = new int[] { 0, 0 }; public int[] Game_DanC_SmallBase_Offset_X = new int[] { 745, 410 }; @@ -8775,8 +8775,8 @@ namespace OpenTaiko { public int[] Game_DanC_Percent_Hit_Score_Padding = new int[] { 20, 20, 20 }; public float Game_DanC_Number_Small_Scale = 0.92f; - public float Game_DanC_Exam_Number_Scale = 0.47f; - + public float Game_DanC_Exam_Number_Scale = 0.47f; + #endregion #region Training public int[] Game_Training_DownBG = new int[] { 0, 360 }; @@ -8790,7 +8790,7 @@ namespace OpenTaiko { public int[] Game_Training_CurrentMeasureCount_XY = { 254, 370 }; public int[] Game_Training_SpeedDisplay_XY = { 110, 370 }; public int Game_Training_SmallNumber_Width = 17; - public int Game_Training_BigNumber_Width = 20; + public int Game_Training_BigNumber_Width = 20; #endregion #region Tower public int[] Game_Tower_Sky_Gradient = new int[] { 0, 360 }; @@ -8812,7 +8812,7 @@ namespace OpenTaiko { public int[] Game_Tower_Font_TouTatsuKaiSuu = new int[] { 350, 32 }; public int[] Game_Tower_Font_Kai = new int[] { 550, 104 }; - public int Game_Tower_Font_TowerText = 28; + public int Game_Tower_Font_TowerText = 28; #endregion #region AIBattle public int Game_AIBattle_CharaMove = 71; @@ -8845,12 +8845,12 @@ namespace OpenTaiko { public int[] Game_AIBattle_Judge_Number_Roll_X = new int[] { 107, 107 }; public int[] Game_AIBattle_Judge_Number_Roll_Y = new int[] { 125, 488 }; - public int[] Game_AIBattle_Judge_Number_Interval = new int[] { 10, 0 }; + public int[] Game_AIBattle_Judge_Number_Interval = new int[] { 10, 0 }; #endregion - + #endregion #region Result - + public bool Result_Use1PUI = false; public int[] Result_UIMove_4P_X = new int[] { 0, 320, 640, 960 }; public int[] Result_UIMove_4P_Y = new int[] { 0, 0, 0, 0 }; @@ -9072,11 +9072,11 @@ namespace OpenTaiko { public int[] Result_NamePlate_5P = new int[] { 31, 621 }; public int[] Result_ModIcons_4P = new int[] { 15, 678 }; - public int[] Result_ModIcons_5P = new int[] { -17, 678 }; + public int[] Result_ModIcons_5P = new int[] { -17, 678 }; #endregion - + #region AIResult - + public int[] Result_AIBattle_Batch = new int[] { 884, 188 }; public int[] Result_AIBattle_Batch_Move = new int[] { 104, 43 }; public int[] Result_AIBattle_SectionPlate_Offset = new int[] { 55, 8 }; @@ -9084,12 +9084,12 @@ namespace OpenTaiko { public int[] Result_AIBattle_SectionText_Offset = new int[] { 110, 27 }; public int Result_AIBattle_SectionText_Scale = 13; - public int[] Result_AIBattle_WinFlag = new int[] { 946, 526 }; - + public int[] Result_AIBattle_WinFlag = new int[] { 946, 526 }; + #endregion - + #region DanResult - + public int[] DanResult_StatePanel = new int[] { 0, -4 }; public int[] DanResult_SongPanel_Main_X = new int[] { 255, 255, 255 }; @@ -9132,12 +9132,12 @@ namespace OpenTaiko { public int[] DanResult_Rank = new int[] { 130, 380 }; - public int DanResult_Font_DanTitles_Size = 24; - + public int DanResult_Font_DanTitles_Size = 24; + #endregion - + #region TowerResult - + public int[] TowerResult_ScoreRankEffect = new int[] { 1000, 220 }; public int[] TowerResult_Toutatsu = new int[] { 196, 160 }; @@ -9153,12 +9153,12 @@ namespace OpenTaiko { public int TowerResult_Font_TowerText = 28; public int TowerResult_Font_TowerText48 = 48; - public int TowerResult_Font_TowerText72 = 72; - + public int TowerResult_Font_TowerText72 = 72; + #endregion - + #region Heya - + public int[] Heya_Main_Menu_X = new int[] { 164, 164, 164, 164, 164 }; public int[] Heya_Main_Menu_Y = new int[] { 26, 106, 186, 266, 346 }; public int[] Heya_Main_Menu_Font_Offset = new int[] { 0, 14 }; @@ -9174,12 +9174,12 @@ namespace OpenTaiko { public int[] Heya_Side_Menu_Font_Offset = new int[] { 0, 14 }; public int[] Heya_InfoSection = new int[] { 620, 560 }; public int[] Heya_DescriptionTextOrigin = new int[] { 0, 0 }; - public int Heya_Font_Scale = 14; - + public int Heya_Font_Scale = 14; + #endregion - + #region OnlineLounge - + public int[] OnlineLounge_Side_Menu = new int[] { 640, 360 }; public int[] OnlineLounge_Side_Menu_Text_Offset = new int[] { 0, 18 }; public int[] OnlineLounge_Side_Menu_Move = new int[] { 0, 80 }; @@ -9198,12 +9198,12 @@ namespace OpenTaiko { public int[] OnlineLounge_Downloading = new int[] { 640, 605 }; public int OnlineLounge_Font_OLFont = 14; - public int OnlineLounge_Font_OLFontLarge = 28; - + public int OnlineLounge_Font_OLFontLarge = 28; + #endregion - + #region TowerSelect - + public int TowerSelect_Title_Size = 30; public int TowerSelect_Title_MaxWidth = 230; public int[] TowerSelect_Title_Offset = new int[] { 0, -30 }; @@ -9212,35 +9212,35 @@ namespace OpenTaiko { public int[] TowerSelect_SubTitle_Offset = new int[] { 0, 10 }; public int TowerSelect_Bar_Count = 7; public int[] TowerSelect_Bar_X = new int[] { -260, 40, 340, 640, 940, 1240, 1540 }; - public int[] TowerSelect_Bar_Y = new int[] { 420, 400, 380, 360, 380, 400, 420 }; - + public int[] TowerSelect_Bar_Y = new int[] { 420, 400, 380, 360, 380, 400, 420 }; + #endregion - + #region OpenEncyclopedia - + public int[] OpenEncyclopedia_Context_Item2 = new int[] { 960, 180 }; public int[] OpenEncyclopedia_Context_Item3 = new int[] { 640, 360 }; public int[] OpenEncyclopedia_Context_PageText = new int[] { 960, 720 }; public int[] OpenEncyclopedia_Side_Menu = new int[] { 320, 360 }; public int[] OpenEncyclopedia_Side_Menu_Move = new int[] { 0, 90 }; public int[] OpenEncyclopedia_Side_Menu_Text_Offset = new int[] { 0, 0 }; - public int OpenEncyclopedia_Font_EncyclopediaMenu_Size = 14; - + public int OpenEncyclopedia_Font_EncyclopediaMenu_Size = 14; + #endregion - + #region Exit - public int Exit_Duration = 3000; + public int Exit_Duration = 3000; #endregion - + #region Font public int Font_Edge_Ratio = 30; public int Font_Edge_Ratio_Vertical = 30; public int Text_Correction_X = 0; - public int Text_Correction_Y = 0; + public int Text_Correction_Y = 0; #endregion - + #region NamePlate - + public int[] NamePlate_Title_Offset = new int[] { 124, 22 }; public int[] NamePlate_Dan_Offset = new int[] { 69, 44 }; public int[] NamePlate_Name_Offset_Normal = new int[] { 121, 36 }; @@ -9254,26 +9254,26 @@ namespace OpenTaiko { public int NamePlate_Font_Name_Size_Normal = 15; public int NamePlate_Font_Name_Size_WithTitle = 12; public int NamePlate_Font_Title_Size = 11; - public int NamePlate_Font_Dan_Size = 12; - + public int NamePlate_Font_Dan_Size = 12; + #endregion - + #region [Mod icons] - + public int[] ModIcons_OffsetX = { 0, 30, 60, 90, 0, 30, 60, 90 }; public int[] ModIcons_OffsetY = { 0, 0, 0, 0, 30, 30, 30, 30 }; public int[] ModIcons_OffsetX_Menu = { 0, 30, 60, 90, 120, 150, 180, 210 }; - public int[] ModIcons_OffsetY_Menu = { 0, 0, 0, 0, 0, 0, 0, 0 }; - + public int[] ModIcons_OffsetY_Menu = { 0, 0, 0, 0, 0, 0, 0, 0 }; + #endregion - + #region Modal - + public int[] Modal_Title_Full = new int[] { 640, 140 }; public int[] Modal_Title_Half_X = new int[] { 320, 960 }; public int[] Modal_Title_Half_Y = new int[] { 290, 290 }; - public int[] Modal_Text_Full = new int[] { 640, 327 };//445 + public int[] Modal_Text_Full = new int[] { 640, 327 };//445 public int[] Modal_Text_Full_Move = new int[] { 0, 118 }; public int[] Modal_Text_Half_X = new int[] { 320, 960 }; public int[] Modal_Text_Half_Y = new int[] { 383, 383 }; @@ -9297,22 +9297,22 @@ namespace OpenTaiko { public int[] Modal_Text_Half_Y_5P = new int[] { 107, 107, 347, 347, 587 }; public int[] Modal_Text_Half_Move_4P = new int[] { 0, 59 }; - public int[] Modal_Text_Half_Move_5P = new int[] { 0, 40 }; - + public int[] Modal_Text_Half_Move_5P = new int[] { 0, 40 }; + #endregion - + #region PopupMenu - + public int[] PopupMenu_Menu_Title = new int[2] { 460, 40 }; public int[] PopupMenu_Title = new int[2] { 540, 44 }; public int[] PopupMenu_Menu_Highlight = new int[2] { 480, 46 }; public int[] PopupMenu_MenuItem_Name = new int[2] { 480, 77 }; public int[] PopupMenu_MenuItem_Value = new int[2] { 630, 77 }; public int[] PopupMenu_Move = new int[2] { 0, 32 }; - public int PopupMenu_Font_Size = 18; - + public int PopupMenu_Font_Size = 18; + #endregion - + #endregion } } diff --git a/OpenTaiko/src/Common/OpenTaiko.cs b/OpenTaiko/src/Common/OpenTaiko.cs index ddbd5281..af82d214 100755 --- a/OpenTaiko/src/Common/OpenTaiko.cs +++ b/OpenTaiko/src/Common/OpenTaiko.cs @@ -14,8 +14,8 @@ using SkiaSharp; using Rectangle = System.Drawing.Rectangle; namespace OpenTaiko { - internal class OpenTaiko : Game { - // Properties + internal class OpenTaiko : Game { + // Properties #region [ properties ] public static readonly string VERSION = Assembly.GetExecutingAssembly().GetName().Version.ToString(); public static readonly string AppDisplayThreePartVersion = GetAppDisplayThreePartVersion(); @@ -40,8 +40,8 @@ namespace OpenTaiko { ?.InformationalVersion ?? $"{GetAppDisplayThreePartVersion()} (unknown informational version)"; public static readonly string SLIMDXDLL = "c_net20x86_Jun2010"; - public static readonly string D3DXDLL = "d3dx9_43.dll"; // June 2010 - + public static readonly string D3DXDLL = "d3dx9_43.dll"; // June 2010 + public static CStage latestSongSelect { get; private set; @@ -55,10 +55,6 @@ namespace OpenTaiko { get; private set; } - public static bool bコンパクトモード { - get; - private set; - } public static CConfigIni ConfigIni { get; private set; @@ -67,8 +63,8 @@ namespace OpenTaiko { public static CVisualLogManager VisualLogManager { get; private set; - } - + } + #region [DTX instances] public static CDTX DTX { get { @@ -170,10 +166,10 @@ namespace OpenTaiko { return OpenTaiko.DTX_5P; } return null; - } - + } + #endregion - + public static CSongReplay[] ReplayInstances = new CSongReplay[5]; public static bool IsPerformingCalibration; @@ -185,7 +181,7 @@ namespace OpenTaiko { public static CInputManager InputManager { get; private set; - } + } #region [ 入力範囲ms ] public static int nPerfect範囲ms { get { @@ -230,7 +226,7 @@ namespace OpenTaiko { } return ConfigIni.nHitRangeMs.Poor; } - } + } #endregion public static CPad Pad { get; @@ -246,7 +242,7 @@ namespace OpenTaiko { } public static CSongs管理 Songs管理 { get; - set; // 2012.1.26 yyagi private解除 CStage起動でのdesirialize読み込みのため + set; // 2012.1.26 yyagi private解除 CStage起動でのdesirialize読み込みのため } public static CEnumSongs EnumSongs { get; @@ -394,24 +390,24 @@ namespace OpenTaiko { public string assemblyName; public Version Version; } - private static Size currentClientSize // #23510 2010.10.27 add yyagi to keep current window size + private static Size currentClientSize // #23510 2010.10.27 add yyagi to keep current window size { get; set; } - public static CDTXVmode DTXVmode // #28821 2014.1.23 yyagi + public static CDTXVmode DTXVmode // #28821 2014.1.23 yyagi { get; set; } - public static DiscordRpcClient DiscordClient; - - // 0 : 1P, 1 : 2P + public static DiscordRpcClient DiscordClient; + + // 0 : 1P, 1 : 2P public static int SaveFile = 0; - public static SaveFile[] SaveFileInstances = new SaveFile[5]; - - // 0 : Hidari, 1 : Migi (1P only) + public static SaveFile[] SaveFileInstances = new SaveFile[5]; + + // 0 : Hidari, 1 : Migi (1P only) public static int PlayerSide = 0; public static int GetActualPlayer(int player) { @@ -424,12 +420,12 @@ namespace OpenTaiko { public static bool P1IsBlue() { return (OpenTaiko.PlayerSide == 1 && OpenTaiko.ConfigIni.nPlayerCount == 1); - } - + } + #endregion - - // Constructor - + + // Constructor + public OpenTaiko() : base("OpenTaiko.ico") { OpenTaiko.app = this; } @@ -448,19 +444,19 @@ namespace OpenTaiko { } } - public static CCounter BeatScaling; - + public static CCounter BeatScaling; + /// /// Returns true for this session if the game fails to locate Config.ini.
/// This could be treated as the player's first time launching the game. ///
- public static bool ConfigIsNew; - - - - // メソッド - - + public static bool ConfigIsNew; + + + + // メソッド + + #region [ #24609 リザルト画像をpngで保存する ] // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill. /// /// リザルト画像のキャプチャと保存。 @@ -489,26 +485,26 @@ namespace OpenTaiko { GetScreenShotAsync(save); return success; - } + } #endregion - - // Game 実装 - - - protected override void Configuration() { + + // Game 実装 + + + protected override void Configuration() { #region [ strEXEのあるフォルダを決定する ] - //----------------- - strEXEのあるフォルダ = Environment.CurrentDirectory + Path.DirectorySeparatorChar; - // END #23629 2010.11.13 from - //----------------- + //----------------- + strEXEのあるフォルダ = Environment.CurrentDirectory + Path.DirectorySeparatorChar; + // END #23629 2010.11.13 from + //----------------- #endregion - + ConfigIni = new CConfigIni(); string path = strEXEのあるフォルダ + "Config.ini"; if (File.Exists(path)) { - try { - // Load config info + try { + // Load config info ConfigIni.LoadFromFile(path); } catch (Exception e) { Trace.TraceError(e.ToString()); @@ -593,7 +589,7 @@ namespace OpenTaiko { protected override void Update() { InputManager?.Polling(OpenTaiko.ConfigIni.bBufferedInputs); } - protected override void Draw() { + protected override void Draw() { #if !DEBUG try #endif @@ -608,16 +604,16 @@ namespace OpenTaiko { float scale = 1.0f + ((1.0f - value) / 40.0f); Camera *= Matrix4X4.CreateScale(scale, scale, 1.0f); if (BeatScaling.CurrentValue == BeatScaling.EndValue) BeatScaling = null; - } - - // #xxxxx 2013.4.8 yyagi; sleepの挿入位置を、EndScnene~Present間から、BeginScene前に移動。描画遅延を小さくするため。 - + } + + // #xxxxx 2013.4.8 yyagi; sleepの挿入位置を、EndScnene~Present間から、BeginScene前に移動。描画遅延を小さくするため。 + if (r現在のステージ != null) { OpenTaiko.NamePlate.lcNamePlate.Update(); - this.n進行描画の戻り値 = (r現在のステージ != null) ? r現在のステージ.Draw() : 0; - + this.n進行描画の戻り値 = (r現在のステージ != null) ? r現在のステージ.Draw() : 0; + #region [ プラグインの進行描画 ] - //--------------------- + //--------------------- foreach (STPlugin sp in this.PluginList) { Directory.SetCurrentDirectory(sp.pluginDirectory); @@ -627,23 +623,23 @@ namespace OpenTaiko { sp.plugin.On進行描画(null, null); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - //--------------------- + } + //--------------------- #endregion - - - CScoreIni scoreIni = null; - - #region [ 曲検索スレッドの起動/終了 ] // ここに"Enumerating Songs..."表示を集約 - if (!OpenTaiko.bコンパクトモード) { - actEnumSongs.Draw(); // "Enumerating Songs..."アイコンの描画 - } + + + CScoreIni scoreIni = null; + + #region [ 曲検索スレッドの起動/終了 ] + // ここに"Enumerating Songs..."表示を集約 + actEnumSongs.Draw(); // "Enumerating Songs..."アイコンの描画 + switch (r現在のステージ.eStageID) { case CStage.EStage.Title: case CStage.EStage.Config: case CStage.EStage.SongSelect: case CStage.EStage.SongLoading: - if (EnumSongs != null) { + if (EnumSongs != null) { #region [ (特定条件時) 曲検索スレッドの起動_開始 ] if (r現在のステージ.eStageID == CStage.EStage.Title && r直前のステージ.eStageID == CStage.EStage.StartUp && @@ -655,15 +651,15 @@ namespace OpenTaiko { actEnumSongs.CreateUnmanagedResource(); } OpenTaiko.stageSongSelect.bIsEnumeratingSongs = true; - EnumSongs.Init(); // 取得した曲数を、新インスタンスにも与える - EnumSongs.StartEnumFromDisk(); // 曲検索スレッドの起動_開始 - } + EnumSongs.Init(); // 取得した曲数を、新インスタンスにも与える + EnumSongs.StartEnumFromDisk(); // 曲検索スレッドの起動_開始 + } #endregion - + #region [ 曲検索の中断と再開 ] if (r現在のステージ.eStageID == CStage.EStage.SongSelect && !EnumSongs.IsSongListEnumCompletelyDone) { switch (this.n進行描画の戻り値) { - case 0: // 何もない + case 0: // 何もない EnumSongs.Resume(); EnumSongs.IsSlowdown = false; actEnumSongs.Activate(); @@ -673,8 +669,8 @@ namespace OpenTaiko { } break; - case 2: // 曲決定 - EnumSongs.Suspend(); // #27060 バックグラウンドの曲検索を一時停止 + case 2: // 曲決定 + EnumSongs.Suspend(); // #27060 バックグラウンドの曲検索を一時停止 actEnumSongs.DeActivate(); if (!ConfigIni.PreAssetsLoading) { actEnumSongs.ReleaseManagedResource(); @@ -682,19 +678,19 @@ namespace OpenTaiko { } break; } - } + } #endregion - + #region [ 曲探索中断待ち待機 ] if (r現在のステージ.eStageID == CStage.EStage.SongLoading && !EnumSongs.IsSongListEnumCompletelyDone && - EnumSongs.thDTXFileEnumerate != null) // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist. + EnumSongs.thDTXFileEnumerate != null) // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist. { - EnumSongs.WaitUntilSuspended(); // 念のため、曲検索が一時中断されるまで待機 - } + EnumSongs.WaitUntilSuspended(); // 念のため、曲検索が一時中断されるまで待機 + } #endregion - + #region [ 曲検索が完了したら、実際の曲リストに反映する ] - // CStage選曲.On活性化() に回した方がいいかな? + // CStage選曲.On活性化() に回した方がいいかな? if (EnumSongs.IsSongListEnumerated) { actEnumSongs.DeActivate(); if (!ConfigIni.PreAssetsLoading) { @@ -706,52 +702,35 @@ namespace OpenTaiko { bool bRemakeSongTitleBar = (r現在のステージ.eStageID == CStage.EStage.SongSelect) ? true : false; OpenTaiko.stageSongSelect.Refresh(EnumSongs.Songs管理, bRemakeSongTitleBar); EnumSongs.SongListEnumCompletelyDone(); - } + } #endregion } break; - } + } #endregion - + switch (r現在のステージ.eStageID) { case CStage.EStage.None: break; - case CStage.EStage.StartUp: + case CStage.EStage.StartUp: #region [ *** ] - //----------------------------- + //----------------------------- if (this.n進行描画の戻り値 != 0) { - if (!bコンパクトモード) { - r現在のステージ.DeActivate(); - if (!ConfigIni.PreAssetsLoading) { - r現在のステージ.ReleaseManagedResource(); - r現在のステージ.ReleaseUnmanagedResource(); - } - Trace.TraceInformation("----------------------"); - Trace.TraceInformation("■ Title"); - stageタイトル.Activate(); - if (!ConfigIni.PreAssetsLoading) { - stageタイトル.CreateManagedResource(); - stageタイトル.CreateUnmanagedResource(); - } - r直前のステージ = r現在のステージ; - r現在のステージ = stageタイトル; - } else { - r現在のステージ.DeActivate(); - if (!ConfigIni.PreAssetsLoading) { - r現在のステージ.ReleaseManagedResource(); - r現在のステージ.ReleaseUnmanagedResource(); - } - Trace.TraceInformation("----------------------"); - Trace.TraceInformation("■ Song Loading"); - stage曲読み込み.Activate(); - if (!ConfigIni.PreAssetsLoading) { - stage曲読み込み.CreateManagedResource(); - stage曲読み込み.CreateUnmanagedResource(); - } - r直前のステージ = r現在のステージ; - r現在のステージ = stage曲読み込み; + r現在のステージ.DeActivate(); + if (!ConfigIni.PreAssetsLoading) { + r現在のステージ.ReleaseManagedResource(); + r現在のステージ.ReleaseUnmanagedResource(); } + Trace.TraceInformation("----------------------"); + Trace.TraceInformation("■ Title"); + stageタイトル.Activate(); + if (!ConfigIni.PreAssetsLoading) { + stageタイトル.CreateManagedResource(); + stageタイトル.CreateUnmanagedResource(); + } + r直前のステージ = r現在のステージ; + r現在のステージ = stageタイトル; foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.Onステージ変更(); @@ -759,18 +738,18 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - } - //----------------------------- + } + //----------------------------- #endregion break; - case CStage.EStage.Title: + case CStage.EStage.Title: #region [ *** ] - //----------------------------- + //----------------------------- switch (this.n進行描画の戻り値) { - case (int)CStageタイトル.E戻り値.GAMESTART: + case (int)CStageタイトル.E戻り値.GAMESTART: #region [ 選曲処理へ ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -786,14 +765,14 @@ namespace OpenTaiko { r直前のステージ = r現在のステージ; r現在のステージ = stageSongSelect; - OpenTaiko.latestSongSelect = stageSongSelect; - //----------------------------- + OpenTaiko.latestSongSelect = stageSongSelect; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.DANGAMESTART: + case (int)CStageタイトル.E戻り値.DANGAMESTART: #region [ 段位選択処理へ ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -808,14 +787,14 @@ namespace OpenTaiko { } r直前のステージ = r現在のステージ; r現在のステージ = stage段位選択; - OpenTaiko.latestSongSelect = stage段位選択; - //----------------------------- + OpenTaiko.latestSongSelect = stage段位選択; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.TAIKOTOWERSSTART: + case (int)CStageタイトル.E戻り値.TAIKOTOWERSSTART: #region [Online Lounge] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -829,14 +808,14 @@ namespace OpenTaiko { stageTowerSelect.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stageTowerSelect; - //----------------------------- + r現在のステージ = stageTowerSelect; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.HEYA: + case (int)CStageタイトル.E戻り値.HEYA: #region [Heya menu] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -850,14 +829,14 @@ namespace OpenTaiko { stageHeya.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stageHeya; - //----------------------------- + r現在のステージ = stageHeya; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.ONLINELOUNGE: + case (int)CStageタイトル.E戻り値.ONLINELOUNGE: #region [Online Lounge] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -871,14 +850,14 @@ namespace OpenTaiko { stageOnlineLounge.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stageOnlineLounge; - //----------------------------- + r現在のステージ = stageOnlineLounge; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.ENCYCLOPEDIA: + case (int)CStageタイトル.E戻り値.ENCYCLOPEDIA: #region [Online Lounge] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -892,14 +871,14 @@ namespace OpenTaiko { stageOpenEncyclopedia.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stageOpenEncyclopedia; - //----------------------------- + r現在のステージ = stageOpenEncyclopedia; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.CONFIG: + case (int)CStageタイトル.E戻り値.CONFIG: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -913,14 +892,14 @@ namespace OpenTaiko { stageコンフィグ.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stageコンフィグ; - //----------------------------- + r現在のステージ = stageコンフィグ; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.EXIT: + case (int)CStageタイトル.E戻り値.EXIT: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -934,14 +913,14 @@ namespace OpenTaiko { stage終了.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stage終了; - //----------------------------- + r現在のステージ = stage終了; + //----------------------------- #endregion break; - case (int)CStageタイトル.E戻り値.AIBATTLEMODE: + case (int)CStageタイトル.E戻り値.AIBATTLEMODE: #region [ 選曲処理へ ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -961,8 +940,8 @@ namespace OpenTaiko { ConfigIni.nPreviousPlayerCount = ConfigIni.nPlayerCount; ConfigIni.nPlayerCount = 2; ConfigIni.bAIBattleMode = true; - ConfigIni.tInitializeAILevel(); - //----------------------------- + ConfigIni.tInitializeAILevel(); + //----------------------------- #endregion break; @@ -972,20 +951,20 @@ namespace OpenTaiko { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.Onステージ変更(); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - - //----------------------------- + } + + //----------------------------- #endregion break; - case CStage.EStage.Config: + case CStage.EStage.Config: #region [ *** ] - //----------------------------- + //----------------------------- if (this.n進行描画の戻り値 != 0) { switch (r直前のステージ.eStageID) { - case CStage.EStage.Title: + case CStage.EStage.Title: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1009,13 +988,13 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - case CStage.EStage.SongSelect: + + case CStage.EStage.SongSelect: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1038,23 +1017,23 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion } return; - } - //----------------------------- + } + //----------------------------- #endregion break; - case CStage.EStage.SongSelect: + case CStage.EStage.SongSelect: #region [ *** ] - //----------------------------- + //----------------------------- switch (this.n進行描画の戻り値) { - case (int)CStage選曲.E戻り値.タイトルに戻る: + case (int)CStage選曲.E戻り値.タイトルに戻る: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1076,12 +1055,12 @@ namespace OpenTaiko { if (ConfigIni.bAIBattleMode == true) { ConfigIni.nPlayerCount = ConfigIni.nPreviousPlayerCount; ConfigIni.bAIBattleMode = false; - } + } /* Skin.bgm選曲画面イン.t停止する(); Skin.bgm選曲画面.t停止する(); - */ - + */ + foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.Onステージ変更(); @@ -1089,13 +1068,13 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - case (int)CStage選曲.E戻り値.選曲した: + + case (int)CStage選曲.E戻り値.選曲した: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1109,12 +1088,12 @@ namespace OpenTaiko { stage曲読み込み.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stage曲読み込み; - + r現在のステージ = stage曲読み込み; + /* Skin.bgm選曲画面イン.t停止する(); Skin.bgm選曲画面.t停止する(); - */ + */ CSongSelectSongManager.stopSong(); CSongSelectSongManager.enable(); @@ -1125,35 +1104,35 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - // case (int) CStage選曲.E戻り値.オプション呼び出し: + + // case (int) CStage選曲.E戻り値.オプション呼び出し: #region [ *** ] - // //----------------------------- - // r現在のステージ.On非活性化(); - // Trace.TraceInformation( "----------------------" ); - // Trace.TraceInformation( "■ オプション" ); - // stageオプション.On活性化(); - // r直前のステージ = r現在のステージ; - // r現在のステージ = stageオプション; - // - // foreach( STPlugin pg in this.listプラグイン ) - // { - // Directory.SetCurrentDirectory( pg.strプラグインフォルダ ); - // pg.plugin.Onステージ変更(); - // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ ); - // } - // - // this.tガベージコレクションを実行する(); - // break; - // //----------------------------- + // //----------------------------- + // r現在のステージ.On非活性化(); + // Trace.TraceInformation( "----------------------" ); + // Trace.TraceInformation( "■ オプション" ); + // stageオプション.On活性化(); + // r直前のステージ = r現在のステージ; + // r現在のステージ = stageオプション; + // + // foreach( STPlugin pg in this.listプラグイン ) + // { + // Directory.SetCurrentDirectory( pg.strプラグインフォルダ ); + // pg.plugin.Onステージ変更(); + // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ ); + // } + // + // this.tガベージコレクションを実行する(); + // break; + // //----------------------------- #endregion - - case (int)CStage選曲.E戻り値.コンフィグ呼び出し: + + case (int)CStage選曲.E戻り値.コンフィグ呼び出し: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1179,14 +1158,14 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - case (int)CStage選曲.E戻り値.スキン変更: - + + case (int)CStage選曲.E戻り値.スキン変更: + #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1197,20 +1176,20 @@ namespace OpenTaiko { stageChangeSkin.Activate(); r直前のステージ = r現在のステージ; r現在のステージ = stageChangeSkin; - break; - //----------------------------- + break; + //----------------------------- #endregion - } - //----------------------------- + } + //----------------------------- #endregion break; - case CStage.EStage.DanDojoSelect: + case CStage.EStage.DanDojoSelect: #region [ *** ] switch (this.n進行描画の戻り値) { - case (int)CStage選曲.E戻り値.タイトルに戻る: + case (int)CStage選曲.E戻り値.タイトルに戻る: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1224,12 +1203,12 @@ namespace OpenTaiko { stageタイトル.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stageタイトル; - + r現在のステージ = stageタイトル; + /* Skin.bgm選曲画面イン.t停止する(); Skin.bgm選曲画面.t停止する(); - */ + */ CSongSelectSongManager.stopSong(); CSongSelectSongManager.enable(); @@ -1240,14 +1219,14 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - case (int)CStage選曲.E戻り値.選曲した: + + case (int)CStage選曲.E戻り値.選曲した: #region [ *** ] - //----------------------------- - + //----------------------------- + r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1270,19 +1249,19 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - } + } #endregion break; - case CStage.EStage.Heya: + case CStage.EStage.Heya: #region [ *** ] switch (this.n進行描画の戻り値) { - case (int)CStage選曲.E戻り値.タイトルに戻る: + case (int)CStage選曲.E戻り値.タイトルに戻る: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1308,35 +1287,35 @@ namespace OpenTaiko { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - } + } #endregion break; - case CStage.EStage.SongLoading: + case CStage.EStage.SongLoading: #region [ *** ] - //----------------------------- - DTXVmode.Refreshed = false; // 曲のリロード中に発生した再リロードは、無視する。 + //----------------------------- + DTXVmode.Refreshed = false; // 曲のリロード中に発生した再リロードは、無視する。 if (this.n進行描画の戻り値 != 0) { - OpenTaiko.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11) + OpenTaiko.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11) r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); r現在のステージ.ReleaseUnmanagedResource(); - } + } #region [ ESC押下時は、曲の読み込みを中止して選曲画面に戻る ] - if (this.n進行描画の戻り値 == (int)ESongLoadingScreenReturnValue.LoadCanceled) { - //DTX.t全チップの再生停止(); + if (this.n進行描画の戻り値 == (int)ESongLoadingScreenReturnValue.LoadCanceled) { + //DTX.t全チップの再生停止(); if (DTX != null) { DTX.DeActivate(); DTX.ReleaseManagedResource(); DTX.ReleaseUnmanagedResource(); - } - - // ??? - + } + + // ??? + /* if (stage選曲.n確定された曲の難易度[0] == (int)Difficulty.Dan) { @@ -1354,8 +1333,8 @@ namespace OpenTaiko { r直前のステージ = r現在のステージ; r現在のステージ = stage選曲; } - */ - + */ + Trace.TraceInformation("----------------------"); Trace.TraceInformation("■ Return to song select menu"); OpenTaiko.latestSongSelect.Activate(); @@ -1363,9 +1342,9 @@ namespace OpenTaiko { OpenTaiko.latestSongSelect.CreateManagedResource(); OpenTaiko.latestSongSelect.CreateUnmanagedResource(); } - r直前のステージ = r現在のステージ; - - // Seek latest registered song select screen + r直前のステージ = r現在のステージ; + + // Seek latest registered song select screen r現在のステージ = OpenTaiko.latestSongSelect; foreach (STPlugin pg in this.PluginList) { @@ -1375,11 +1354,11 @@ namespace OpenTaiko { } break; - } + } #endregion - + Trace.TraceInformation("----------------------"); - Trace.TraceInformation("■ Gameplay (Drum Screen)"); + Trace.TraceInformation("■ Gameplay (Drum Screen)"); #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化 for (int i = 0; i < 5; i++) { @@ -1401,14 +1380,14 @@ for (int i = 0; i < 3; i++) { } this.tガベージコレクションを実行する(); - } - //----------------------------- + } + //----------------------------- #endregion break; - case CStage.EStage.Game: + case CStage.EStage.Game: #region [ *** ] - + #region [ DTXVモード中にDTXCreatorから指示を受けた場合の処理 ] if (DTXVmode.Enabled && DTXVmode.Refreshed) { DTXVmode.Refreshed = false; @@ -1419,38 +1398,38 @@ for (int i = 0; i < 3; i++) { this.previewSound.tStopSound(); this.previewSound.Dispose(); this.previewSound = null; - } - //{ - // int lastd = 0; - // int f = 0; - // for ( int i = 0; i < swlist1.Count; i++ ) - // { - // int d1 = swlist1[ i ]; - // int d2 = swlist2[ i ]; - // int d3 = swlist3[ i ]; - // int d4 = swlist4[ i ]; - // int d5 = swlist5[ i ]; - - // int dif = d1 - lastd; - // string s = ""; - // if ( 16 <= dif && dif <= 17 ) - // { - // } - // else - // { - // s = "★"; - // } - // Trace.TraceInformation( "frame {0:D4}: {1:D3} ( {2:D3}, {3:D3} - {7:D3}, {4:D3} ) {5}, n現在時刻={6}", f, dif, d1, d2, d3, s, d4, d5 ); - // lastd = d1; - // f++; - // } - // swlist1.Clear(); - // swlist2.Clear(); - // swlist3.Clear(); - // swlist4.Clear(); - // swlist5.Clear(); - - //} + } + //{ + // int lastd = 0; + // int f = 0; + // for ( int i = 0; i < swlist1.Count; i++ ) + // { + // int d1 = swlist1[ i ]; + // int d2 = swlist2[ i ]; + // int d3 = swlist3[ i ]; + // int d4 = swlist4[ i ]; + // int d5 = swlist5[ i ]; + + // int dif = d1 - lastd; + // string s = ""; + // if ( 16 <= dif && dif <= 17 ) + // { + // } + // else + // { + // s = "★"; + // } + // Trace.TraceInformation( "frame {0:D4}: {1:D3} ( {2:D3}, {3:D3} - {7:D3}, {4:D3} ) {5}, n現在時刻={6}", f, dif, d1, d2, d3, s, d4, d5 ); + // lastd = d1; + // f++; + // } + // swlist1.Clear(); + // swlist2.Clear(); + // swlist3.Clear(); + // swlist4.Clear(); + // swlist5.Clear(); + + //} } else if (DTXVmode.Command == CDTXVmode.ECommand.Play) { if (DTXVmode.NeedReload) { OpenTaiko.stage演奏ドラム画面.t再読込(); @@ -1465,11 +1444,11 @@ for (int i = 0; i < 3; i++) { OpenTaiko.stage演奏ドラム画面.t演奏位置の変更(OpenTaiko.DTXVmode.nStartBar, 0); } } - } + } #endregion - + switch (this.n進行描画の戻り値) { - case (int)EGameplayScreenReturnValue.ReloadAndReplay: + case (int)EGameplayScreenReturnValue.ReloadAndReplay: #region [ DTXファイルを再読み込みして、再演奏 ] DTX.t全チップの再生停止(); DTX.DeActivate(); @@ -1488,31 +1467,31 @@ for (int i = 0; i < 3; i++) { r直前のステージ = r現在のステージ; r現在のステージ = stage曲読み込み; this.tガベージコレクションを実行する(); - break; + break; #endregion - - //case (int) E演奏画面の戻り値.再演奏: + + //case (int) E演奏画面の戻り値.再演奏: #region [ 再読み込み無しで、再演奏 ] #endregion - // break; - + // break; + case (int)EGameplayScreenReturnValue.Continue: break; - case (int)EGameplayScreenReturnValue.PerformanceInterrupted: + case (int)EGameplayScreenReturnValue.PerformanceInterrupted: #region [ 演奏キャンセル ] - //----------------------------- - + //----------------------------- + #region [ プラグイン On演奏キャンセル() の呼び出し ] - //--------------------- + //--------------------- foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.On演奏キャンセル(scoreIni); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - //--------------------- + } + //--------------------- #endregion - + DTX.t全チップの再生停止(); DTX.DeActivate(); DTX.ReleaseManagedResource(); @@ -1521,10 +1500,10 @@ for (int i = 0; i < 3; i++) { if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); r現在のステージ.ReleaseUnmanagedResource(); - } - - // Play cancelled return screen - + } + + // Play cancelled return screen + /* if(stage選曲.n確定された曲の難易度[0] == (int)Difficulty.Dan) { @@ -1542,8 +1521,8 @@ for (int i = 0; i < 3; i++) { r直前のステージ = r現在のステージ; r現在のステージ = stage選曲; } - */ - + */ + Trace.TraceInformation("----------------------"); Trace.TraceInformation("■ Return to song select menu"); OpenTaiko.latestSongSelect.Activate(); @@ -1551,41 +1530,41 @@ for (int i = 0; i < 3; i++) { OpenTaiko.latestSongSelect.CreateManagedResource(); OpenTaiko.latestSongSelect.CreateUnmanagedResource(); } - r直前のステージ = r現在のステージ; - - // Seek latest registered song select screen - r現在のステージ = OpenTaiko.latestSongSelect; - + r直前のステージ = r現在のステージ; + + // Seek latest registered song select screen + r現在のステージ = OpenTaiko.latestSongSelect; + #region [ プラグイン Onステージ変更() の呼び出し ] - //--------------------- + //--------------------- foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.Onステージ変更(); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - //--------------------- + } + //--------------------- #endregion - + this.tガベージコレクションを実行する(); this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - case (int)EGameplayScreenReturnValue.StageFailed: + + case (int)EGameplayScreenReturnValue.StageFailed: #region [ 演奏失敗(StageFailed) ] - //----------------------------- - + //----------------------------- + #region [ プラグイン On演奏失敗() の呼び出し ] - //--------------------- + //--------------------- foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.On演奏失敗(scoreIni); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - //--------------------- + } + //--------------------- #endregion - + DTX.t全チップの再生停止(); DTX.DeActivate(); DTX.ReleaseManagedResource(); @@ -1604,42 +1583,42 @@ for (int i = 0; i < 3; i++) { stageSongSelect.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stageSongSelect; - + r現在のステージ = stageSongSelect; + #region [ プラグイン Onステージ変更() の呼び出し ] - //--------------------- + //--------------------- foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.Onステージ変更(); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - //--------------------- + } + //--------------------- #endregion - + this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - case (int)EGameplayScreenReturnValue.StageCleared: + + case (int)EGameplayScreenReturnValue.StageCleared: #region [ 演奏クリア ] - //----------------------------- - - // Fetch the results of the finished play + //----------------------------- + + // Fetch the results of the finished play CScoreIni.C演奏記録 c演奏記録_Drums; - stage演奏ドラム画面.t演奏結果を格納する(out c演奏記録_Drums); - - + stage演奏ドラム画面.t演奏結果を格納する(out c演奏記録_Drums); + + #region [ プラグイン On演奏クリア() の呼び出し ] - //--------------------- + //--------------------- foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.On演奏クリア(scoreIni); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - //--------------------- + } + //--------------------- #endregion - + r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1654,31 +1633,31 @@ for (int i = 0; i < 3; i++) { stage結果.CreateUnmanagedResource(); } r直前のステージ = r現在のステージ; - r現在のステージ = stage結果; - + r現在のステージ = stage結果; + #region [ プラグイン Onステージ変更() の呼び出し ] - //--------------------- + //--------------------- foreach (STPlugin pg in this.PluginList) { Directory.SetCurrentDirectory(pg.pluginDirectory); pg.plugin.Onステージ変更(); Directory.SetCurrentDirectory(OpenTaiko.strEXEのあるフォルダ); - } - //--------------------- + } + //--------------------- #endregion - - break; - //----------------------------- + + break; + //----------------------------- #endregion - } - //----------------------------- + } + //----------------------------- #endregion break; - case CStage.EStage.Results: + case CStage.EStage.Results: #region [ *** ] - //----------------------------- - if (this.n進行描画の戻り値 != 0) { - //DTX.t全チップの再生一時停止(); + //----------------------------- + if (this.n進行描画の戻り値 != 0) { + //DTX.t全チップの再生一時停止(); DTX.t全チップの再生停止とミキサーからの削除(); DTX.DeActivate(); DTX.ReleaseManagedResource(); @@ -1688,11 +1667,11 @@ for (int i = 0; i < 3; i++) { r現在のステージ.ReleaseManagedResource(); r現在のステージ.ReleaseUnmanagedResource(); } - this.tガベージコレクションを実行する(); - - - // After result screen - + this.tガベージコレクションを実行する(); + + + // After result screen + /* if (stage選曲.n確定された曲の難易度[0] == (int)Difficulty.Dan) { @@ -1710,8 +1689,8 @@ for (int i = 0; i < 3; i++) { r直前のステージ = r現在のステージ; r現在のステージ = stage選曲; } - */ - + */ + Trace.TraceInformation("----------------------"); Trace.TraceInformation("■ Return to song select menu"); OpenTaiko.latestSongSelect.Activate(); @@ -1719,9 +1698,9 @@ for (int i = 0; i < 3; i++) { OpenTaiko.latestSongSelect.CreateManagedResource(); OpenTaiko.latestSongSelect.CreateUnmanagedResource(); } - r直前のステージ = r現在のステージ; - - // Seek latest registered song select screen + r直前のステージ = r現在のステージ; + + // Seek latest registered song select screen r現在のステージ = OpenTaiko.latestSongSelect; stageSongSelect.NowSong++; @@ -1733,18 +1712,18 @@ for (int i = 0; i < 3; i++) { } this.tガベージコレクションを実行する(); - } - //----------------------------- + } + //----------------------------- #endregion break; - case CStage.EStage.TaikoTowers: + case CStage.EStage.TaikoTowers: #region [ *** ] switch (this.n進行描画の戻り値) { - case (int)EReturnValue.ReturnToTitle: + case (int)EReturnValue.ReturnToTitle: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1754,12 +1733,12 @@ for (int i = 0; i < 3; i++) { Trace.TraceInformation("■ Title"); stageタイトル.Activate(); r直前のステージ = r現在のステージ; - r現在のステージ = stageタイトル; - + r現在のステージ = stageタイトル; + /* Skin.bgm選曲画面イン.t停止する(); Skin.bgm選曲画面.t停止する(); - */ + */ CSongSelectSongManager.stopSong(); CSongSelectSongManager.enable(); @@ -1770,13 +1749,13 @@ for (int i = 0; i < 3; i++) { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - - case (int)EReturnValue.SongChoosen: + + case (int)EReturnValue.SongChoosen: #region [ *** ] - //----------------------------- + //----------------------------- latestSongSelect = stageTowerSelect; r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { @@ -1800,16 +1779,16 @@ for (int i = 0; i < 3; i++) { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - } + } #endregion break; - case CStage.EStage.ChangeSkin: + case CStage.EStage.ChangeSkin: #region [ *** ] - //----------------------------- + //----------------------------- if (this.n進行描画の戻り値 != 0) { r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { @@ -1826,28 +1805,28 @@ for (int i = 0; i < 3; i++) { r直前のステージ = r現在のステージ; r現在のステージ = stageSongSelect; this.tガベージコレクションを実行する(); - } - //----------------------------- + } + //----------------------------- #endregion break; - case CStage.EStage.End: + case CStage.EStage.End: #region [ *** ] - //----------------------------- + //----------------------------- if (this.n進行描画の戻り値 != 0) { base.Exit(); return; - } - //----------------------------- + } + //----------------------------- #endregion break; - default: + default: #region [ *** ] switch (this.n進行描画の戻り値) { - case (int)CStage選曲.E戻り値.タイトルに戻る: + case (int)CStage選曲.E戻り値.タイトルに戻る: #region [ *** ] - //----------------------------- + //----------------------------- r現在のステージ.DeActivate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.ReleaseManagedResource(); @@ -1873,10 +1852,10 @@ for (int i = 0; i < 3; i++) { } this.tガベージコレクションを実行する(); - break; - //----------------------------- + break; + //----------------------------- #endregion - } + } #endregion break; } @@ -1895,8 +1874,8 @@ for (int i = 0; i < 3; i++) { Camera *= Matrix4X4.CreateTranslation(fCamXOffset / 1280, fCamYOffset / 720, 1f); - if (OpenTaiko.DTX != null) { - //object rendering + if (OpenTaiko.DTX != null) { + //object rendering foreach (KeyValuePair pair in OpenTaiko.DTX.listObj) { pair.Value.tDraw(); } @@ -1908,17 +1887,17 @@ for (int i = 0; i < 3; i++) { if (r現在のステージ != null && r現在のステージ.eStageID != CStage.EStage.StartUp && OpenTaiko.Tx.Network_Connection != null) { if (Math.Abs(SoundManager.PlayTimer.SystemTimeMs - this.前回のシステム時刻ms) > 10000) { this.前回のシステム時刻ms = SoundManager.PlayTimer.SystemTimeMs; - Task.Factory.StartNew(() => { - //IPv4 8.8.8.8にPingを送信する(timeout 5000ms) + Task.Factory.StartNew(() => { + //IPv4 8.8.8.8にPingを送信する(timeout 5000ms) PingReply reply = new Ping().Send("8.8.8.8", 5000); this.bネットワークに接続中 = reply.Status == IPStatus.Success; }); } OpenTaiko.Tx.Network_Connection.t2D描画(GameWindowSize.Width - (OpenTaiko.Tx.Network_Connection.szTextureSize.Width / 2), GameWindowSize.Height - OpenTaiko.Tx.Network_Connection.szTextureSize.Height, new Rectangle((OpenTaiko.Tx.Network_Connection.szTextureSize.Width / 2) * (this.bネットワークに接続中 ? 0 : 1), 0, OpenTaiko.Tx.Network_Connection.szTextureSize.Width / 2, OpenTaiko.Tx.Network_Connection.szTextureSize.Height)); - } - // オーバレイを描画する(テクスチャの生成されていない起動ステージは例外 - - // Display log cards + } + // オーバレイを描画する(テクスチャの生成されていない起動ステージは例外 + + // Display log cards VisualLogManager.Display(); if (r現在のステージ != null && r現在のステージ.eStageID != CStage.EStage.StartUp && OpenTaiko.Tx.Overlay != null) { @@ -1926,7 +1905,7 @@ for (int i = 0; i < 3; i++) { } } - if (OpenTaiko.ConfigIni.KeyAssign.KeyIsPressed(OpenTaiko.ConfigIni.KeyAssign.System.Capture)) { + if (OpenTaiko.ConfigIni.KeyAssign.KeyIsPressed(OpenTaiko.ConfigIni.KeyAssign.System.Capture)) { #if DEBUG if (OpenTaiko.InputManager.Keyboard.KeyPressing((int)SlimDXKeys.Key.LeftControl)) { if (r現在のステージ.eStageID != CStage.EStage.Game) { @@ -1942,42 +1921,42 @@ for (int i = 0; i < 3; i++) { r現在のステージ.CreateUnmanagedResource(); } } - } else { - // Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode ); + } else { + // Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode ); string strFullPath = Path.Combine(OpenTaiko.strEXEのあるフォルダ, "Capture_img"); strFullPath = Path.Combine(strFullPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ".png"); SaveResultScreen(strFullPath); - } + } #else string strFullPath = Path.Combine(OpenTaiko.strEXEのあるフォルダ, "Capture_img"); strFullPath = Path.Combine(strFullPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ".png"); SaveResultScreen(strFullPath); #endif - } - + } + #region [ 全画面_ウインドウ切り替え ] if (this.b次のタイミングで全画面_ウィンドウ切り替えを行う) { ConfigIni.bFullScreen = !ConfigIni.bFullScreen; app.ToggleWindowMode(); this.b次のタイミングで全画面_ウィンドウ切り替えを行う = false; - } + } #endregion #region [ 垂直基線同期切り替え ] if (this.b次のタイミングで垂直帰線同期切り替えを行う) { VSync = ConfigIni.bEnableVSync; this.b次のタイミングで垂直帰線同期切り替えを行う = false; - } + } #endregion - + #if DEBUG if (OpenTaiko.InputManager.Keyboard.KeyPressed((int)SlimDXKeys.Key.F11)) OpenTaiko.ConfigIni.DEBUG_bShowImgui = !OpenTaiko.ConfigIni.DEBUG_bShowImgui; if (OpenTaiko.ConfigIni.DEBUG_bShowImgui) - ImGuiDebugWindow.Draw(); + ImGuiDebugWindow.Draw(); #endif - } + } #if !DEBUG catch( Exception e ) { @@ -1989,12 +1968,12 @@ for (int i = 0; i < 3; i++) { throw e; } #endif - } - - // その他 - + } + + // その他 + #region [ 汎用ヘルパー ] - //----------------- + //----------------- public static CTexture tテクスチャの生成(string fileName) { return tテクスチャの生成(fileName, false); } @@ -2057,8 +2036,8 @@ for (int i = 0; i < 3; i++) { Trace.TraceError("Texture generation has failed. ({0})", fileName); return null; } - } - + } + /// プロパティ、インデクサには ref は使用できないので注意。 public static void tDisposeSafely(ref T obj) { if (obj == null) @@ -2072,7 +2051,7 @@ for (int i = 0; i < 3; i++) { obj = default(T); } - public static void t安全にDisposeする(ref T[] array) where T : class, IDisposable //2020.08.01 Mr-Ojii twopointzero氏のソースコードをもとに追加 + public static void t安全にDisposeする(ref T[] array) where T : class, IDisposable //2020.08.01 Mr-Ojii twopointzero氏のソースコードをもとに追加 { if (array == null) { return; @@ -2082,8 +2061,8 @@ for (int i = 0; i < 3; i++) { array[i]?.Dispose(); array[i] = null; } - } - + } + /// /// そのフォルダの連番画像の最大値を返す。 /// @@ -2093,8 +2072,8 @@ for (int i = 0; i < 3; i++) { num++; } return num; - } - + } + /// /// 曲名テクスチャの縮小倍率を返す。 /// @@ -2107,8 +2086,8 @@ for (int i = 0; i < 3; i++) { if (cTexture.szTextureSize.Width <= samePixel) scalingRate = 1.0f; return scalingRate; - } - + } + /// /// 難易度を表す数字を列挙体に変換します。 /// @@ -2133,13 +2112,13 @@ for (int i = 0; i < 3; i++) { default: throw new IndexOutOfRangeException(); } - } - - //----------------- + } + + //----------------- #endregion - + #region [ private ] - //----------------- + //----------------- private bool bマウスカーソル表示中 = true; private bool b終了処理完了済み; public bool bネットワークに接続中 { get; private set; } = false; @@ -2150,8 +2129,8 @@ for (int i = 0; i < 3; i++) { public List listトップレベルActivities; private int n進行描画の戻り値; - private string strWindowTitle - // ayo komi isn't this useless code? - tfd500 + private string strWindowTitle + // ayo komi isn't this useless code? - tfd500 { get { if (DTXVmode.Enabled) { @@ -2167,12 +2146,12 @@ for (int i = 0; i < 3; i++) { private set; } - private void t起動処理() { - + private void t起動処理() { + #region [ Read Config.ini and Database files ] - //--------------------- - - // Port <= 0.5.4 NamePlate.json to Pre 0.6.0 b1 Saves\ + //--------------------- + + // Port <= 0.5.4 NamePlate.json to Pre 0.6.0 b1 Saves\ NamePlateConfig = new NamePlateConfig(); NamePlateConfig.tNamePlateConfig(); @@ -2189,20 +2168,20 @@ for (int i = 0; i < 3; i++) { if (!File.Exists("Saves.db3")) { File.Copy(@$".init{Path.DirectorySeparatorChar}Saves.db3", "Saves.db3"); - } - // Add a condition here (if old Saves\ format save files exist) to port them to database (?) - SaveFileInstances = DBSaves.FetchSaveInstances(); - - //--------------------- + } + // Add a condition here (if old Saves\ format save files exist) to port them to database (?) + SaveFileInstances = DBSaves.FetchSaveInstances(); + + //--------------------- #endregion - + #region [ ログ出力開始 ] - //--------------------- + //--------------------- Trace.AutoFlush = true; if (ConfigIni.bOutputLogs) { try { Trace.Listeners.Add(new CTraceLogListener(new StreamWriter(System.IO.Path.Combine(strEXEのあるフォルダ, "OpenTaiko.log"), false, Encoding.GetEncoding(OpenTaiko.sEncType)))); - } catch (System.UnauthorizedAccessException) // #24481 2011.2.20 yyagi + } catch (System.UnauthorizedAccessException) // #24481 2011.2.20 yyagi { int c = (CultureInfo.CurrentUICulture.TwoLetterISOLanguageName == "ja") ? 0 : 1; string[] mes_writeErr = { @@ -2220,35 +2199,35 @@ for (int i = 0; i < 3; i++) { Trace.TraceInformation("■ Application Info:"); Trace.TraceInformation("OS Version: " + Environment.OSVersion); Trace.TraceInformation("Processors: " + Environment.ProcessorCount.ToString()); - Trace.TraceInformation("CLR Version: " + Environment.Version.ToString()); - //--------------------- + Trace.TraceInformation("CLR Version: " + Environment.Version.ToString()); + //--------------------- #endregion - + #region [ DTXVmodeクラス の初期化 ] - //--------------------- + //--------------------- DTXVmode = new CDTXVmode(); - DTXVmode.Enabled = false; - //--------------------- + DTXVmode.Enabled = false; + //--------------------- #endregion - - - DTX = null; - + + + DTX = null; + #region [ Skin の初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initializing skin..."); - Trace.Indent(); + Trace.Indent(); #if !DEBUG try #endif { Skin = new CSkin(OpenTaiko.ConfigIni.strSystemSkinSubfolderFullName, false); - OpenTaiko.ConfigIni.strSystemSkinSubfolderFullName = OpenTaiko.Skin.GetCurrentSkinSubfolderFullName(true); // 旧指定のSkinフォルダが消滅していた場合に備える - + OpenTaiko.ConfigIni.strSystemSkinSubfolderFullName = OpenTaiko.Skin.GetCurrentSkinSubfolderFullName(true); // 旧指定のSkinフォルダが消滅していた場合に備える + ChangeResolution(OpenTaiko.Skin.Resolution[0], OpenTaiko.Skin.Resolution[1]); Trace.TraceInformation("Skin successfully initialized."); - } + } #if !DEBUG catch (Exception e) { @@ -2260,12 +2239,12 @@ for (int i = 0; i < 3; i++) { Trace.Unindent(); } #endif - - //--------------------- + + //--------------------- #endregion - //----------- + //----------- #region [ Timer の初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initializing timer..."); Trace.Indent(); try { @@ -2273,13 +2252,13 @@ for (int i = 0; i < 3; i++) { Trace.TraceInformation("Timer successfully initialized."); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion - //----------- - + //----------- + #region [ FPS カウンタの初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initializing FPS counter..."); Trace.Indent(); try { @@ -2287,11 +2266,11 @@ for (int i = 0; i < 3; i++) { Trace.TraceInformation("FPS counter initialized."); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ act文字コンソールの初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initializing console..."); Trace.Indent(); try { @@ -2307,11 +2286,11 @@ for (int i = 0; i < 3; i++) { Trace.TraceError("Console failed to initialize."); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ Input管理 の初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initializing DirectInput and MIDI input..."); Trace.Indent(); try { @@ -2357,11 +2336,11 @@ for (int i = 0; i < 3; i++) { throw; } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ Pad の初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initialize pad..."); Trace.Indent(); try { @@ -2372,11 +2351,11 @@ for (int i = 0; i < 3; i++) { Trace.TraceError("Pad failed to initialize."); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ Sound管理 の初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initializing sound device..."); Trace.Indent(); try { @@ -2401,16 +2380,16 @@ for (int i = 0; i < 3; i++) { SoundManager = new SoundManager(Window_, soundDeviceType, OpenTaiko.ConfigIni.nBassBufferSizeMs, - OpenTaiko.ConfigIni.nWASAPIBufferSizeMs, - // CDTXMania.ConfigIni.nASIOBufferSizeMs, + OpenTaiko.ConfigIni.nWASAPIBufferSizeMs, + // CDTXMania.ConfigIni.nASIOBufferSizeMs, 0, OpenTaiko.ConfigIni.nASIODevice, OpenTaiko.ConfigIni.bUseOSTimer - ); - //Sound管理 = FDK.CSound管理.Instance; - //Sound管理.t初期化( soundDeviceType, 0, 0, CDTXMania.ConfigIni.nASIODevice, base.Window.Handle ); - - + ); + //Sound管理 = FDK.CSound管理.Instance; + //Sound管理.t初期化( soundDeviceType, 0, 0, CDTXMania.ConfigIni.nASIODevice, base.Window.Handle ); + + Trace.TraceInformation("Initializing loudness scanning, song gain control, and sound group level control..."); Trace.Indent(); try { @@ -2442,16 +2421,16 @@ for (int i = 0; i < 3; i++) { throw new NullReferenceException("No sound devices are enabled. Please check your audio settings.", e); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ Songs管理 の初期化 ] - //--------------------- + //--------------------- Trace.TraceInformation("Initializing song list..."); Trace.Indent(); try { - Songs管理 = new CSongs管理(); - // Songs管理_裏読 = new CSongs管理(); + Songs管理 = new CSongs管理(); + // Songs管理_裏読 = new CSongs管理(); EnumSongs = new CEnumSongs(); actEnumSongs = new CActEnumSongs(); Trace.TraceInformation("Song list initialized."); @@ -2460,16 +2439,16 @@ for (int i = 0; i < 3; i++) { Trace.TraceError("Song list failed to initialize."); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ Random の初期化 ] - //--------------------- - Random = new Random(); - //--------------------- + //--------------------- + Random = new Random(); + //--------------------- #endregion #region [ Stages initialisation ] - //--------------------- + //--------------------- r現在のステージ = null; r直前のステージ = null; stage起動 = new CStage起動(); @@ -2505,11 +2484,11 @@ for (int i = 0; i < 3; i++) { this.listトップレベルActivities.Add(stage演奏ドラム画面); this.listトップレベルActivities.Add(stage結果); this.listトップレベルActivities.Add(stageChangeSkin); - this.listトップレベルActivities.Add(stage終了); - //--------------------- + this.listトップレベルActivities.Add(stage終了); + //--------------------- #endregion #region [ プラグインの検索と生成 ] - //--------------------- + //--------------------- PluginHost = new CPluginHost(); Trace.TraceInformation("Initializing and generating plugins..."); @@ -2519,11 +2498,11 @@ for (int i = 0; i < 3; i++) { Trace.TraceInformation("Plugin generation and initialization complete."); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ プラグインの初期化 ] - //--------------------- + //--------------------- if (this.PluginList != null && this.PluginList.Count > 0) { Trace.TraceInformation("Initializing plugin(s)..."); Trace.Indent(); @@ -2542,11 +2521,11 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - - //--------------------- + } + + //--------------------- #endregion - + #region Discordの処理 DiscordClient = new DiscordRpcClient("939341030141096007"); DiscordClient?.Initialize(); @@ -2559,30 +2538,26 @@ for (int i = 0; i < 3; i++) { LargeImageKey = OpenTaiko.LargeImageKey, LargeImageText = OpenTaiko.LargeImageText, } - }); + }); #endregion - - - Trace.TraceInformation("Application successfully started."); - - + + + Trace.TraceInformation("Application successfully started."); + + #region [ 最初のステージの起動 ] - //--------------------- + //--------------------- Trace.TraceInformation("----------------------"); Trace.TraceInformation("■ Startup"); - if (OpenTaiko.bコンパクトモード) { - r現在のステージ = stage曲読み込み; - } else { - r現在のステージ = stage起動; - } + r現在のステージ = stage起動; r現在のステージ.Activate(); if (!ConfigIni.PreAssetsLoading) { r現在のステージ.CreateManagedResource(); r現在のステージ.CreateUnmanagedResource(); - } - - //--------------------- + } + + //--------------------- #endregion } @@ -2598,10 +2573,10 @@ for (int i = 0; i < 3; i++) { private void t終了処理() { if (!this.b終了処理完了済み) { Trace.TraceInformation("----------------------"); - Trace.TraceInformation("■ Shutdown"); + Trace.TraceInformation("■ Shutdown"); #region [ 曲検索の終了処理 ] - //--------------------- - + //--------------------- + if (actEnumSongs != null) { Trace.TraceInformation("Ending enumeration of songs..."); Trace.Indent(); @@ -2615,12 +2590,12 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region [ 現在のステージの終了処理 ] - //--------------------- - if (OpenTaiko.r現在のステージ != null && OpenTaiko.r現在のステージ.IsActivated) // #25398 2011.06.07 MODIFY FROM + //--------------------- + if (OpenTaiko.r現在のステージ != null && OpenTaiko.r現在のステージ.IsActivated) // #25398 2011.06.07 MODIFY FROM { Trace.TraceInformation("Exiting stage..."); Trace.Indent(); @@ -2634,11 +2609,11 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region [ プラグインの終了処理 ] - //--------------------- from this point this is where i gave up - tfd500 + //--------------------- from this point this is where i gave up - tfd500 if (this.PluginList != null && this.PluginList.Count > 0) { Trace.TraceInformation("Ending all plugins..."); Trace.Indent(); @@ -2655,26 +2630,26 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region Discordの処理 - DiscordClient?.Dispose(); + DiscordClient?.Dispose(); #endregion #region [ 曲リストの終了処理 ] - //--------------------- + //--------------------- if (Songs管理 != null) { Trace.TraceInformation("Ending song list..."); Trace.Indent(); - try { + try { #pragma warning disable SYSLIB0011 if (EnumSongs.IsSongListEnumCompletelyDone) { BinaryFormatter songlistdb_ = new BinaryFormatter(); using Stream songlistdb = File.OpenWrite($"{OpenTaiko.strEXEのあるフォルダ}songlist.db"); songlistdb_.Serialize(songlistdb, Songs管理.listSongsDB); - } + } #pragma warning restore SYSLIB0011 - + Songs管理 = null; Trace.TraceInformation("Song list terminated."); } catch (Exception exception) { @@ -2683,14 +2658,14 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region TextureLoaderの処理 - Tx.DisposeTexture(); + Tx.DisposeTexture(); #endregion #region [ スキンの終了処理 ] - //--------------------- + //--------------------- if (Skin != null) { Trace.TraceInformation("Terminating skin..."); Trace.Indent(); @@ -2704,11 +2679,11 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region [ DirectSoundの終了処理 ] - //--------------------- + //--------------------- if (SoundManager != null) { Trace.TraceInformation("Ending DirectSound devices..."); Trace.Indent(); @@ -2722,11 +2697,11 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region [ パッドの終了処理 ] - //--------------------- + //--------------------- if (Pad != null) { Trace.TraceInformation("Ending pads..."); Trace.Indent(); @@ -2739,11 +2714,11 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region [ DirectInput, MIDI入力の終了処理 ] - //--------------------- + //--------------------- if (InputManager != null) { Trace.TraceInformation("Ending DirectInput and MIDI devices..."); Trace.Indent(); @@ -2757,11 +2732,11 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region [ 文字コンソールの終了処理 ] - //--------------------- + //--------------------- if (actTextConsole != null) { Trace.TraceInformation("Ending console..."); Trace.Indent(); @@ -2777,11 +2752,11 @@ for (int i = 0; i < 3; i++) { } finally { Trace.Unindent(); } - } - //--------------------- + } + //--------------------- #endregion #region [ FPSカウンタの終了処理 ] - //--------------------- + //--------------------- Trace.TraceInformation("Ending FPS counter..."); Trace.Indent(); try { @@ -2791,11 +2766,11 @@ for (int i = 0; i < 3; i++) { Trace.TraceInformation("FPS counter terminated."); } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ タイマの終了処理 ] - //--------------------- + //--------------------- Trace.TraceInformation("Ending timer..."); Trace.Indent(); try { @@ -2808,11 +2783,11 @@ for (int i = 0; i < 3; i++) { } } finally { Trace.Unindent(); - } - //--------------------- + } + //--------------------- #endregion #region [ Config.iniの出力 ] - //--------------------- + //--------------------- Trace.TraceInformation("Outputting Config.ini..."); Trace.TraceInformation("This only needs to be done once, unless you have deleted the file!"); string str = strEXEのあるフォルダ + "Config.ini"; @@ -2849,16 +2824,16 @@ for (int i = 0; i < 3; i++) { Trace.TraceInformation("Deinitialized loudness scanning, song gain control, and sound group level control."); } - ConfigIni = null; - - //--------------------- + ConfigIni = null; + + //--------------------- #endregion #region [ DTXVmodeの終了処理 ] - //--------------------- + //--------------------- if (DTXVmode != null) { DTXVmode = null; - } - //--------------------- + } + //--------------------- #endregion Trace.TraceInformation("OpenTaiko has closed down successfully."); this.b終了処理完了済み = true; @@ -2884,9 +2859,9 @@ for (int i = 0; i < 3; i++) { private void ChangeResolution(int nWidth, int nHeight) { GameWindowSize.Width = nWidth; - GameWindowSize.Height = nHeight; - - //WindowSize = new Silk.NET.Maths.Vector2D(nWidth, nHeight); + GameWindowSize.Height = nHeight; + + //WindowSize = new Silk.NET.Maths.Vector2D(nWidth, nHeight); } public void RefreshSkin() { @@ -2913,35 +2888,35 @@ for (int i = 0; i < 3; i++) { OpenTaiko.stage結果.RefreshSkin(); CActSelectPopupMenu.RefleshSkin(); CActSelect段位リスト.RefleshSkin(); - } + } #region [ Windowイベント処理 ] - private void SearchAndGeneratePluginsInFolder(string PluginFolderPath, string PluginTypeName) { - // 指定されたパスが存在しないとエラー + private void SearchAndGeneratePluginsInFolder(string PluginFolderPath, string PluginTypeName) { + // 指定されたパスが存在しないとエラー if (!Directory.Exists(PluginFolderPath)) { Trace.TraceWarning("The plugin folder does not exist. (" + PluginFolderPath + ")"); return; - } - - // (1) すべての *.dll について… + } + + // (1) すべての *.dll について… string[] strDLLs = System.IO.Directory.GetFiles(PluginFolderPath, "*.dll"); foreach (string dllName in strDLLs) { - try { - // (1-1) dll をアセンブリとして読み込む。 - System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(dllName); - - // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる - foreach (Type t in asm.GetTypes()) { - // (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効 - if (t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface(PluginTypeName) != null) { - // (1-4) クラス名からインスタンスを作成する + try { + // (1-1) dll をアセンブリとして読み込む。 + System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(dllName); + + // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる + foreach (Type t in asm.GetTypes()) { + // (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効 + if (t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface(PluginTypeName) != null) { + // (1-4) クラス名からインスタンスを作成する var st = new STPlugin() { plugin = (IPluginActivity)asm.CreateInstance(t.FullName), pluginDirectory = Path.GetDirectoryName(dllName), assemblyName = asm.GetName().Name, Version = asm.GetName().Version, - }; - - // (1-5) プラグインリストへ登録 + }; + + // (1-5) プラグインリストへ登録 this.PluginList.Add(st); Trace.TraceInformation("Plugin {0} ({1}, {2}, {3}) has been loaded.", t.FullName, Path.GetFileName(dllName), st.assemblyName, st.Version.ToString()); } @@ -2950,17 +2925,17 @@ for (int i = 0; i < 3; i++) { Trace.TraceError(e.ToString()); Trace.TraceInformation(dllName + "could not be used to generate a plugin. Skipping plugin."); } - } - - // (2) サブフォルダがあれば再帰する + } + + // (2) サブフォルダがあれば再帰する string[] strDirs = Directory.GetDirectories(PluginFolderPath, "*"); foreach (string dir in strDirs) this.SearchAndGeneratePluginsInFolder(dir + Path.DirectorySeparatorChar, PluginTypeName); - } - //----------------- + } + //----------------- #endregion #endregion - + #region [ EXTENDED VARIABLES ] public static float fCamXOffset; public static float fCamYOffset; @@ -2971,7 +2946,7 @@ for (int i = 0; i < 3; i++) { public static float fCamXScale = 1.0f; public static float fCamYScale = 1.0f; - public static Color4 borderColor = new Color4(1f, 0f, 0f, 0f); + public static Color4 borderColor = new Color4(1f, 0f, 0f, 0f); #endregion } } diff --git a/OpenTaiko/src/Stages/02.Title/CEnumSongs.cs b/OpenTaiko/src/Stages/02.Title/CEnumSongs.cs index 72a6c1a5..4c298b09 100644 --- a/OpenTaiko/src/Stages/02.Title/CEnumSongs.cs +++ b/OpenTaiko/src/Stages/02.Title/CEnumSongs.cs @@ -1,437 +1,433 @@ -using System.Diagnostics; -using System.Runtime.Serialization.Formatters.Binary; - -namespace OpenTaiko { - internal class CEnumSongs // #27060 2011.2.7 yyagi 曲リストを取得するクラス - { // ファイルキャッシュ(songslist.db)からの取得と、ディスクからの取得を、この一つのクラスに集約。 - - public CSongs管理 Songs管理 // 曲の探索結果はこのSongs管理に読み込まれる - { - get; - private set; - } - - public bool IsSongListEnumCompletelyDone // 曲リスト探索と、実際の曲リストへの反映が完了した? - { - get { - return (this.state == DTXEnumState.CompletelyDone); - } - } - public bool IsEnumerating { - get { - if (thDTXFileEnumerate == null) { - return false; - } - return thDTXFileEnumerate.IsAlive; - } - } - public bool IsSongListEnumerated // 曲リスト探索が完了したが、実際の曲リストへの反映はまだ? - { - get { - return (this.state == DTXEnumState.Enumeratad); - } - } - public bool IsSongListEnumStarted // 曲リスト探索開始後?(探索完了も含む) - { - get { - return (this.state != DTXEnumState.None); - } - } - public void SongListEnumCompletelyDone() { - this.state = DTXEnumState.CompletelyDone; - this.Songs管理 = null; // GCはOSに任せる - } - public bool IsSlowdown // #PREMOVIE再生中は検索負荷を落とす - { - get { - return this.Songs管理.bIsSlowdown; - } - set { - this.Songs管理.bIsSlowdown = value; - } - } - - public void ChangeEnumeratePriority(ThreadPriority tp) { - if (this.thDTXFileEnumerate != null && this.thDTXFileEnumerate.IsAlive == true) { - this.thDTXFileEnumerate.Priority = tp; - } - } - private readonly string strPathSongsDB = OpenTaiko.strEXEのあるフォルダ + "songs.db"; - private readonly string strPathSongList = OpenTaiko.strEXEのあるフォルダ + "songlist.db"; - - public Thread thDTXFileEnumerate { - get; - private set; - } - private enum DTXEnumState { - None, - Ongoing, - Suspended, - Enumeratad, // 探索完了、現在の曲リストに未反映 - CompletelyDone // 探索完了、現在の曲リストに反映完了 - } - private DTXEnumState state = DTXEnumState.None; - - - /// - /// Constractor - /// - public CEnumSongs() { - this.Songs管理 = new CSongs管理(); - } - - public void Init() { - - } - - /// - /// 曲リストのキャッシュ(songlist.db)取得スレッドの開始 - /// - public void StartEnumFromCache() { - this.thDTXFileEnumerate = new Thread(new ThreadStart(this.t曲リストの構築1)); - this.thDTXFileEnumerate.Name = "曲リストの構築"; - this.thDTXFileEnumerate.IsBackground = true; - this.thDTXFileEnumerate.Start(); - } - - /// - /// - /// - public delegate void AsyncDelegate(); - - /// - /// 曲検索スレッドの開始 - /// - public void StartEnumFromDisk(bool hard_reload = false) { - if (state == DTXEnumState.None || state == DTXEnumState.CompletelyDone) { - Trace.TraceInformation("★曲データ検索スレッドを起動しました。"); - lock (this) { - state = DTXEnumState.Ongoing; - } - // this.autoReset = new AutoResetEvent( true ); - - if (this.Songs管理 == null) // Enumerating Songs完了後、CONFIG画面から再スキャンしたときにこうなる - { - this.Songs管理 = new CSongs管理(); - } - if (hard_reload) - this.thDTXFileEnumerate = new Thread(new ThreadStart(this.HardReloadSongList)); - else - this.thDTXFileEnumerate = new Thread(new ThreadStart(this.ReloadSongList)); - this.thDTXFileEnumerate.Name = "曲リストの構築"; - this.thDTXFileEnumerate.IsBackground = true; - this.thDTXFileEnumerate.Priority = System.Threading.ThreadPriority.Lowest; - this.thDTXFileEnumerate.Start(); - } - } - - private void HardReloadSongList() { - this.t曲リストの構築2(true); - } - private void ReloadSongList() { - this.t曲リストの構築2(false); - } - - /// - /// 曲探索スレッドのサスペンド - /// - public void Suspend() { - if (this.state != DTXEnumState.CompletelyDone && - ((thDTXFileEnumerate.ThreadState & (System.Threading.ThreadState.Background)) != 0)) { - // this.thDTXFileEnumerate.Suspend(); // obsoleteにつき使用中止 - this.Songs管理.bIsSuspending = true; - this.state = DTXEnumState.Suspended; - Trace.TraceInformation("★曲データ検索スレッドを中断しました。"); - } - } - - /// - /// 曲探索スレッドのレジューム - /// - public void Resume() { - if (this.state == DTXEnumState.Suspended) { - if ((this.thDTXFileEnumerate.ThreadState & (System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.StopRequested)) != 0) // - { - // this.thDTXFileEnumerate.Resume(); // obsoleteにつき使用中止 - this.Songs管理.bIsSuspending = false; - this.Songs管理.AutoReset.Set(); - this.state = DTXEnumState.Ongoing; - Trace.TraceInformation("★曲データ検索スレッドを再開しました。"); - } - } - } - - /// - /// 曲探索スレッドにサスペンド指示を出してから、本当にサスペンド状態に遷移するまでの間、ブロックする - /// 500ms * 10回=5秒でタイムアウトし、サスペンド完了して無くてもブロック解除する - /// - public void WaitUntilSuspended() { - // 曲検索が一時中断されるまで待機 - for (int i = 0; i < 10; i++) { - if (this.state == DTXEnumState.CompletelyDone || - (thDTXFileEnumerate.ThreadState & (System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.Background | System.Threading.ThreadState.Stopped)) != 0) { - break; - } - Trace.TraceInformation("★曲データ検索スレッドの中断待ちです: {0}", this.thDTXFileEnumerate.ThreadState.ToString()); - Thread.Sleep(500); - } - - } - - /// - /// 曲探索スレッドを強制終了する - /// - public void Abort() { - if (thDTXFileEnumerate != null) { - thDTXFileEnumerate.Abort(); - thDTXFileEnumerate = null; - this.state = DTXEnumState.None; - - this.Songs管理 = null; // Songs管理を再初期化する (途中まで作った曲リストの最後に、一から重複して追記することにならないようにする。) - this.Songs管理 = new CSongs管理(); - } - } - - - - /// - /// songlist.dbからの曲リスト構築 - /// - public void t曲リストの構築1() { - // !注意! - // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、 - // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16) - // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9) - DateTime now = DateTime.Now; - - try { - #region [ 0) システムサウンドの構築 ] - //----------------------------- - OpenTaiko.stage起動.ePhaseID = CStage.EPhase.Startup_0_CreateSystemSound; - - Trace.TraceInformation("0) システムサウンドを構築します。"); - Trace.Indent(); - - try { - OpenTaiko.Skin.bgm起動画面.tPlay(); - for (int i = 0; i < OpenTaiko.Skin.nシステムサウンド数; i++) { - if (!OpenTaiko.Skin[i].bExclusive) // BGM系以外のみ読み込む。(BGM系は必要になったときに読み込む) - { - CSkin.CSystemSound cシステムサウンド = OpenTaiko.Skin[i]; - if (!OpenTaiko.bコンパクトモード || cシステムサウンド.bCompact対象) { - try { - cシステムサウンド.tLoading(); - Trace.TraceInformation("システムサウンドを読み込みました。({0})", cシステムサウンド.strFileName); - //if ( ( cシステムサウンド == CDTXMania.Skin.bgm起動画面 ) && cシステムサウンド.b読み込み成功 ) - //{ - // cシステムサウンド.t再生する(); - //} - } catch (FileNotFoundException) { - Trace.TraceWarning("システムサウンドが存在しません。({0})", cシステムサウンド.strFileName); - } catch (Exception e) { - Trace.TraceWarning(e.ToString()); - Trace.TraceWarning("システムサウンドの読み込みに失敗しました。({0})", cシステムサウンド.strFileName); - } - } - } - } - lock (OpenTaiko.stage起動.list進行文字列) { - OpenTaiko.stage起動.list進行文字列.Add("SYSTEM SOUND...OK"); - } - } finally { - Trace.Unindent(); - } - //----------------------------- - #endregion - - if (OpenTaiko.bコンパクトモード) { - Trace.TraceInformation("コンパクトモードなので残りの起動処理は省略します。"); - return; - } - } finally { - OpenTaiko.stage起動.ePhaseID = CStage.EPhase.Startup_6_LoadTextures; - TimeSpan span = (TimeSpan)(DateTime.Now - now); - Trace.TraceInformation("起動所要時間: {0}", span.ToString()); - lock (this) // #28700 2012.6.12 yyagi; state change must be in finally{} for exiting as of compact mode. - { - state = DTXEnumState.CompletelyDone; - } - } - } - - - /// - /// 起動してタイトル画面に遷移した後にバックグラウンドで発生させる曲検索 - /// #27060 2012.2.6 yyagi - /// - private void t曲リストの構築2(bool hard_reload = false) { - // !注意! - // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、 - // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16) - // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9) - - DateTime now = DateTime.Now; - - try { - if (hard_reload) { - if (File.Exists($"{OpenTaiko.strEXEのあるフォルダ}songlist.db")) - File.Delete($"{OpenTaiko.strEXEのあるフォルダ}songlist.db"); - } - Deserialize(); - - #region [ 2) 曲データの検索 ] - //----------------------------- - // base.eフェーズID = CStage.Eフェーズ.起動2_曲を検索してリストを作成する; - - Trace.TraceInformation("enum2) 曲データを検索します。"); - Trace.Indent(); - - try { - if (!string.IsNullOrEmpty(OpenTaiko.ConfigIni.strSongsPath)) { - CSongDict.tClearSongNodes(); - string[] strArray = OpenTaiko.ConfigIni.strSongsPath.Split(new char[] { ';' }); - if (strArray.Length > 0) { - // 全パスについて… - foreach (string str in strArray) { - string path = str; - if (!Path.IsPathRooted(path)) { - path = OpenTaiko.strEXEのあるフォルダ + str; // 相対パスの場合、絶対パスに直す(2010.9.16) - } - - if (!string.IsNullOrEmpty(path)) { - Trace.TraceInformation("検索パス: " + path); - Trace.Indent(); - - try { - this.Songs管理.t曲を検索してリストを作成する(path, true); - } catch (Exception e) { - Trace.TraceError(e.ToString()); - Trace.TraceError("例外が発生しましたが処理を継続します。 (105fd674-e722-4a4e-bd9a-e6f82ac0b1d3)"); - } finally { - Trace.Unindent(); - } - } - } - } - } else { - Trace.TraceWarning("曲データの検索パス(TJAPath)の指定がありません。"); - } - } finally { - Trace.TraceInformation("曲データの検索を完了しました。[{0}曲{1}スコア]", this.Songs管理.n検索された曲ノード数, this.Songs管理.n検索されたスコア数); - Trace.Unindent(); - } - // lock ( this.list進行文字列 ) - // { - // this.list進行文字列.Add( string.Format( "{0} ... {1} scores ({2} songs)", "Enumerating songs", this..Songs管理_裏読.n検索されたスコア数, this.Songs管理_裏読.n検索された曲ノード数 ) ); - // } - //----------------------------- - #endregion - #region [ 4) songs.db になかった曲データをファイルから読み込んで反映 ] - //----------------------------- - // base.eフェーズID = CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する; - - /* - int num2 = this.Songs管理.n検索されたスコア数 - this.Songs管理.nスコアキャッシュから反映できたスコア数; - - Trace.TraceInformation( "{0}, {1}", this.Songs管理.n検索されたスコア数, this.Songs管理.nスコアキャッシュから反映できたスコア数 ); - Trace.TraceInformation( "enum4) songs.db になかった曲データ[{0}スコア]の情報をファイルから読み込んで反映します。", num2 ); - Trace.Indent(); - - try - { - this.Songs管理.tSongsDBになかった曲をファイルから読み込んで反映する(); - } - catch ( Exception e ) - { - Trace.TraceError( e.ToString() ); - Trace.TraceError( "例外が発生しましたが処理を継続します。 (276bb40f-6406-40c1-9f03-e2a9869dbc88)" ); - } - finally - { - Trace.TraceInformation( "曲データへの反映を完了しました。[{0}/{1}スコア]", this.Songs管理.nファイルから反映できたスコア数, num2 ); - Trace.Unindent(); - } - // lock ( this.list進行文字列 ) - // { - // this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from files", CDTXMania.Songs管理_裏読.nファイルから反映できたスコア数, CDTXMania.Songs管理_裏読.n検索されたスコア数 - cs.nスコアキャッシュから反映できたスコア数 ) ); - // } - */ - //----------------------------- - #endregion - #region [ 5) 曲リストへの後処理の適用 ] - //----------------------------- - // base.eフェーズID = CStage.Eフェーズ.起動5_曲リストへ後処理を適用する; - - Trace.TraceInformation("enum5) 曲リストへの後処理を適用します。"); - Trace.Indent(); - - try { - this.Songs管理.t曲リストへ後処理を適用する(); - } catch (Exception e) { - Trace.TraceError(e.ToString()); - Trace.TraceError("例外が発生しましたが処理を継続します。 (6480ffa0-1cc1-40d4-9cc9-aceeecd0264b)"); - } finally { - Trace.TraceInformation("曲リストへの後処理を完了しました。"); - Trace.Unindent(); - } - // lock ( this.list進行文字列 ) - // { - // this.list進行文字列.Add( string.Format( "{0} ... OK", "Building songlists" ) ); - // } - //----------------------------- - #endregion - - // if ( !bSucceededFastBoot ) // songs2.db読み込みに成功したなら、songs2.dbを新たに作らない - #region [ 7) songs2.db への保存 ] // #27060 2012.1.26 yyagi - Trace.TraceInformation("enum7) 曲データの情報を songlist.db へ出力します。"); - Trace.Indent(); - - SerializeSongList(); - Trace.TraceInformation("songlist.db への出力を完了しました。"); - Trace.Unindent(); - //----------------------------- - #endregion - // } - - } finally { - // base.eフェーズID = CStage.Eフェーズ.起動7_完了; - TimeSpan span = (TimeSpan)(DateTime.Now - now); - Trace.TraceInformation("曲探索所要時間: {0}", span.ToString()); - } - lock (this) { - // state = DTXEnumState.Done; // DoneにするのはCDTXMania.cs側にて。 - state = DTXEnumState.Enumeratad; - } - } - - -#pragma warning disable SYSLIB0011 - /// - /// 曲リストのserialize - /// - private void SerializeSongList() { - BinaryFormatter songlistdb_ = new BinaryFormatter(); - using Stream songlistdb = File.OpenWrite($"{OpenTaiko.strEXEのあるフォルダ}songlist.db"); - songlistdb_.Serialize(songlistdb, Songs管理.listSongsDB); - } - - /// - /// 曲リストのdeserialize - /// - /// - /// - public void Deserialize() { - try { - if (File.Exists($"{OpenTaiko.strEXEのあるフォルダ}songlist.db")) { - BinaryFormatter songlistdb_ = new BinaryFormatter(); - using Stream songlistdb = File.OpenRead($"{OpenTaiko.strEXEのあるフォルダ}songlist.db"); - this.Songs管理.listSongsDB = (Dictionary)songlistdb_.Deserialize(songlistdb); - } - } catch (Exception exception) { - this.Songs管理.listSongsDB = new(); - } finally { - } - } -#pragma warning restore SYSLIB0011 - } -} +using System.Diagnostics; +using System.Runtime.Serialization.Formatters.Binary; + +namespace OpenTaiko { + internal class CEnumSongs // #27060 2011.2.7 yyagi 曲リストを取得するクラス + { // ファイルキャッシュ(songslist.db)からの取得と、ディスクからの取得を、この一つのクラスに集約。 + + public CSongs管理 Songs管理 // 曲の探索結果はこのSongs管理に読み込まれる + { + get; + private set; + } + + public bool IsSongListEnumCompletelyDone // 曲リスト探索と、実際の曲リストへの反映が完了した? + { + get { + return (this.state == DTXEnumState.CompletelyDone); + } + } + public bool IsEnumerating { + get { + if (thDTXFileEnumerate == null) { + return false; + } + return thDTXFileEnumerate.IsAlive; + } + } + public bool IsSongListEnumerated // 曲リスト探索が完了したが、実際の曲リストへの反映はまだ? + { + get { + return (this.state == DTXEnumState.Enumeratad); + } + } + public bool IsSongListEnumStarted // 曲リスト探索開始後?(探索完了も含む) + { + get { + return (this.state != DTXEnumState.None); + } + } + public void SongListEnumCompletelyDone() { + this.state = DTXEnumState.CompletelyDone; + this.Songs管理 = null; // GCはOSに任せる + } + public bool IsSlowdown // #PREMOVIE再生中は検索負荷を落とす + { + get { + return this.Songs管理.bIsSlowdown; + } + set { + this.Songs管理.bIsSlowdown = value; + } + } + + public void ChangeEnumeratePriority(ThreadPriority tp) { + if (this.thDTXFileEnumerate != null && this.thDTXFileEnumerate.IsAlive == true) { + this.thDTXFileEnumerate.Priority = tp; + } + } + private readonly string strPathSongsDB = OpenTaiko.strEXEのあるフォルダ + "songs.db"; + private readonly string strPathSongList = OpenTaiko.strEXEのあるフォルダ + "songlist.db"; + + public Thread thDTXFileEnumerate { + get; + private set; + } + private enum DTXEnumState { + None, + Ongoing, + Suspended, + Enumeratad, // 探索完了、現在の曲リストに未反映 + CompletelyDone // 探索完了、現在の曲リストに反映完了 + } + private DTXEnumState state = DTXEnumState.None; + + + /// + /// Constractor + /// + public CEnumSongs() { + this.Songs管理 = new CSongs管理(); + } + + public void Init() { + + } + + /// + /// 曲リストのキャッシュ(songlist.db)取得スレッドの開始 + /// + public void StartEnumFromCache() { + this.thDTXFileEnumerate = new Thread(new ThreadStart(this.t曲リストの構築1)); + this.thDTXFileEnumerate.Name = "曲リストの構築"; + this.thDTXFileEnumerate.IsBackground = true; + this.thDTXFileEnumerate.Start(); + } + + /// + /// + /// + public delegate void AsyncDelegate(); + + /// + /// 曲検索スレッドの開始 + /// + public void StartEnumFromDisk(bool hard_reload = false) { + if (state == DTXEnumState.None || state == DTXEnumState.CompletelyDone) { + Trace.TraceInformation("★曲データ検索スレッドを起動しました。"); + lock (this) { + state = DTXEnumState.Ongoing; + } + // this.autoReset = new AutoResetEvent( true ); + + if (this.Songs管理 == null) // Enumerating Songs完了後、CONFIG画面から再スキャンしたときにこうなる + { + this.Songs管理 = new CSongs管理(); + } + if (hard_reload) + this.thDTXFileEnumerate = new Thread(new ThreadStart(this.HardReloadSongList)); + else + this.thDTXFileEnumerate = new Thread(new ThreadStart(this.ReloadSongList)); + this.thDTXFileEnumerate.Name = "曲リストの構築"; + this.thDTXFileEnumerate.IsBackground = true; + this.thDTXFileEnumerate.Priority = System.Threading.ThreadPriority.Lowest; + this.thDTXFileEnumerate.Start(); + } + } + + private void HardReloadSongList() { + this.t曲リストの構築2(true); + } + private void ReloadSongList() { + this.t曲リストの構築2(false); + } + + /// + /// 曲探索スレッドのサスペンド + /// + public void Suspend() { + if (this.state != DTXEnumState.CompletelyDone && + ((thDTXFileEnumerate.ThreadState & (System.Threading.ThreadState.Background)) != 0)) { + // this.thDTXFileEnumerate.Suspend(); // obsoleteにつき使用中止 + this.Songs管理.bIsSuspending = true; + this.state = DTXEnumState.Suspended; + Trace.TraceInformation("★曲データ検索スレッドを中断しました。"); + } + } + + /// + /// 曲探索スレッドのレジューム + /// + public void Resume() { + if (this.state == DTXEnumState.Suspended) { + if ((this.thDTXFileEnumerate.ThreadState & (System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.StopRequested)) != 0) // + { + // this.thDTXFileEnumerate.Resume(); // obsoleteにつき使用中止 + this.Songs管理.bIsSuspending = false; + this.Songs管理.AutoReset.Set(); + this.state = DTXEnumState.Ongoing; + Trace.TraceInformation("★曲データ検索スレッドを再開しました。"); + } + } + } + + /// + /// 曲探索スレッドにサスペンド指示を出してから、本当にサスペンド状態に遷移するまでの間、ブロックする + /// 500ms * 10回=5秒でタイムアウトし、サスペンド完了して無くてもブロック解除する + /// + public void WaitUntilSuspended() { + // 曲検索が一時中断されるまで待機 + for (int i = 0; i < 10; i++) { + if (this.state == DTXEnumState.CompletelyDone || + (thDTXFileEnumerate.ThreadState & (System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.Background | System.Threading.ThreadState.Stopped)) != 0) { + break; + } + Trace.TraceInformation("★曲データ検索スレッドの中断待ちです: {0}", this.thDTXFileEnumerate.ThreadState.ToString()); + Thread.Sleep(500); + } + + } + + /// + /// 曲探索スレッドを強制終了する + /// + public void Abort() { + if (thDTXFileEnumerate != null) { + thDTXFileEnumerate.Abort(); + thDTXFileEnumerate = null; + this.state = DTXEnumState.None; + + this.Songs管理 = null; // Songs管理を再初期化する (途中まで作った曲リストの最後に、一から重複して追記することにならないようにする。) + this.Songs管理 = new CSongs管理(); + } + } + + + + /// + /// songlist.dbからの曲リスト構築 + /// + public void t曲リストの構築1() { + // !注意! + // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、 + // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16) + // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9) + DateTime now = DateTime.Now; + + try { + #region [ 0) システムサウンドの構築 ] + //----------------------------- + OpenTaiko.stage起動.ePhaseID = CStage.EPhase.Startup_0_CreateSystemSound; + + Trace.TraceInformation("0) システムサウンドを構築します。"); + Trace.Indent(); + + try { + OpenTaiko.Skin.bgm起動画面.tPlay(); + for (int i = 0; i < OpenTaiko.Skin.nシステムサウンド数; i++) { + if (!OpenTaiko.Skin[i].bExclusive) // BGM系以外のみ読み込む。(BGM系は必要になったときに読み込む) + { + CSkin.CSystemSound cシステムサウンド = OpenTaiko.Skin[i]; + if (cシステムサウンド.bCompact対象) { + try { + cシステムサウンド.tLoading(); + Trace.TraceInformation("システムサウンドを読み込みました。({0})", cシステムサウンド.strFileName); + //if ( ( cシステムサウンド == CDTXMania.Skin.bgm起動画面 ) && cシステムサウンド.b読み込み成功 ) + //{ + // cシステムサウンド.t再生する(); + //} + } catch (FileNotFoundException) { + Trace.TraceWarning("システムサウンドが存在しません。({0})", cシステムサウンド.strFileName); + } catch (Exception e) { + Trace.TraceWarning(e.ToString()); + Trace.TraceWarning("システムサウンドの読み込みに失敗しました。({0})", cシステムサウンド.strFileName); + } + } + } + } + lock (OpenTaiko.stage起動.list進行文字列) { + OpenTaiko.stage起動.list進行文字列.Add("SYSTEM SOUND...OK"); + } + } finally { + Trace.Unindent(); + } + //----------------------------- + #endregion + + } finally { + OpenTaiko.stage起動.ePhaseID = CStage.EPhase.Startup_6_LoadTextures; + TimeSpan span = (TimeSpan)(DateTime.Now - now); + Trace.TraceInformation("起動所要時間: {0}", span.ToString()); + lock (this) // #28700 2012.6.12 yyagi; state change must be in finally{} for exiting as of compact mode. + { + state = DTXEnumState.CompletelyDone; + } + } + } + + + /// + /// 起動してタイトル画面に遷移した後にバックグラウンドで発生させる曲検索 + /// #27060 2012.2.6 yyagi + /// + private void t曲リストの構築2(bool hard_reload = false) { + // !注意! + // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、 + // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16) + // 構築が完了したら、DTXEnumerateState state を DTXEnumerateState.Done にすること。(2012.2.9) + + DateTime now = DateTime.Now; + + try { + if (hard_reload) { + if (File.Exists($"{OpenTaiko.strEXEのあるフォルダ}songlist.db")) + File.Delete($"{OpenTaiko.strEXEのあるフォルダ}songlist.db"); + } + Deserialize(); + + #region [ 2) 曲データの検索 ] + //----------------------------- + // base.eフェーズID = CStage.Eフェーズ.起動2_曲を検索してリストを作成する; + + Trace.TraceInformation("enum2) 曲データを検索します。"); + Trace.Indent(); + + try { + if (!string.IsNullOrEmpty(OpenTaiko.ConfigIni.strSongsPath)) { + CSongDict.tClearSongNodes(); + string[] strArray = OpenTaiko.ConfigIni.strSongsPath.Split(new char[] { ';' }); + if (strArray.Length > 0) { + // 全パスについて… + foreach (string str in strArray) { + string path = str; + if (!Path.IsPathRooted(path)) { + path = OpenTaiko.strEXEのあるフォルダ + str; // 相対パスの場合、絶対パスに直す(2010.9.16) + } + + if (!string.IsNullOrEmpty(path)) { + Trace.TraceInformation("検索パス: " + path); + Trace.Indent(); + + try { + this.Songs管理.t曲を検索してリストを作成する(path, true); + } catch (Exception e) { + Trace.TraceError(e.ToString()); + Trace.TraceError("例外が発生しましたが処理を継続します。 (105fd674-e722-4a4e-bd9a-e6f82ac0b1d3)"); + } finally { + Trace.Unindent(); + } + } + } + } + } else { + Trace.TraceWarning("曲データの検索パス(TJAPath)の指定がありません。"); + } + } finally { + Trace.TraceInformation("曲データの検索を完了しました。[{0}曲{1}スコア]", this.Songs管理.n検索された曲ノード数, this.Songs管理.n検索されたスコア数); + Trace.Unindent(); + } + // lock ( this.list進行文字列 ) + // { + // this.list進行文字列.Add( string.Format( "{0} ... {1} scores ({2} songs)", "Enumerating songs", this..Songs管理_裏読.n検索されたスコア数, this.Songs管理_裏読.n検索された曲ノード数 ) ); + // } + //----------------------------- + #endregion + #region [ 4) songs.db になかった曲データをファイルから読み込んで反映 ] + //----------------------------- + // base.eフェーズID = CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する; + + /* + int num2 = this.Songs管理.n検索されたスコア数 - this.Songs管理.nスコアキャッシュから反映できたスコア数; + + Trace.TraceInformation( "{0}, {1}", this.Songs管理.n検索されたスコア数, this.Songs管理.nスコアキャッシュから反映できたスコア数 ); + Trace.TraceInformation( "enum4) songs.db になかった曲データ[{0}スコア]の情報をファイルから読み込んで反映します。", num2 ); + Trace.Indent(); + + try + { + this.Songs管理.tSongsDBになかった曲をファイルから読み込んで反映する(); + } + catch ( Exception e ) + { + Trace.TraceError( e.ToString() ); + Trace.TraceError( "例外が発生しましたが処理を継続します。 (276bb40f-6406-40c1-9f03-e2a9869dbc88)" ); + } + finally + { + Trace.TraceInformation( "曲データへの反映を完了しました。[{0}/{1}スコア]", this.Songs管理.nファイルから反映できたスコア数, num2 ); + Trace.Unindent(); + } + // lock ( this.list進行文字列 ) + // { + // this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from files", CDTXMania.Songs管理_裏読.nファイルから反映できたスコア数, CDTXMania.Songs管理_裏読.n検索されたスコア数 - cs.nスコアキャッシュから反映できたスコア数 ) ); + // } + */ + //----------------------------- + #endregion + #region [ 5) 曲リストへの後処理の適用 ] + //----------------------------- + // base.eフェーズID = CStage.Eフェーズ.起動5_曲リストへ後処理を適用する; + + Trace.TraceInformation("enum5) 曲リストへの後処理を適用します。"); + Trace.Indent(); + + try { + this.Songs管理.t曲リストへ後処理を適用する(); + } catch (Exception e) { + Trace.TraceError(e.ToString()); + Trace.TraceError("例外が発生しましたが処理を継続します。 (6480ffa0-1cc1-40d4-9cc9-aceeecd0264b)"); + } finally { + Trace.TraceInformation("曲リストへの後処理を完了しました。"); + Trace.Unindent(); + } + // lock ( this.list進行文字列 ) + // { + // this.list進行文字列.Add( string.Format( "{0} ... OK", "Building songlists" ) ); + // } + //----------------------------- + #endregion + + // if ( !bSucceededFastBoot ) // songs2.db読み込みに成功したなら、songs2.dbを新たに作らない + #region [ 7) songs2.db への保存 ] // #27060 2012.1.26 yyagi + Trace.TraceInformation("enum7) 曲データの情報を songlist.db へ出力します。"); + Trace.Indent(); + + SerializeSongList(); + Trace.TraceInformation("songlist.db への出力を完了しました。"); + Trace.Unindent(); + //----------------------------- + #endregion + // } + + } finally { + // base.eフェーズID = CStage.Eフェーズ.起動7_完了; + TimeSpan span = (TimeSpan)(DateTime.Now - now); + Trace.TraceInformation("曲探索所要時間: {0}", span.ToString()); + } + lock (this) { + // state = DTXEnumState.Done; // DoneにするのはCDTXMania.cs側にて。 + state = DTXEnumState.Enumeratad; + } + } + + +#pragma warning disable SYSLIB0011 + /// + /// 曲リストのserialize + /// + private void SerializeSongList() { + BinaryFormatter songlistdb_ = new BinaryFormatter(); + using Stream songlistdb = File.OpenWrite($"{OpenTaiko.strEXEのあるフォルダ}songlist.db"); + songlistdb_.Serialize(songlistdb, Songs管理.listSongsDB); + } + + /// + /// 曲リストのdeserialize + /// + /// + /// + public void Deserialize() { + try { + if (File.Exists($"{OpenTaiko.strEXEのあるフォルダ}songlist.db")) { + BinaryFormatter songlistdb_ = new BinaryFormatter(); + using Stream songlistdb = File.OpenRead($"{OpenTaiko.strEXEのあるフォルダ}songlist.db"); + this.Songs管理.listSongsDB = (Dictionary)songlistdb_.Deserialize(songlistdb); + } + } catch (Exception exception) { + this.Songs管理.listSongsDB = new(); + } finally { + } + } +#pragma warning restore SYSLIB0011 + } +} diff --git a/OpenTaiko/src/Stages/06.SongLoading/CStage曲読み込み.cs b/OpenTaiko/src/Stages/06.SongLoading/CStage曲読み込み.cs index 90205867..1eaa124a 100644 --- a/OpenTaiko/src/Stages/06.SongLoading/CStage曲読み込み.cs +++ b/OpenTaiko/src/Stages/06.SongLoading/CStage曲読み込み.cs @@ -2,20 +2,20 @@ using FDK; namespace OpenTaiko { - internal class CStage曲読み込み : CStage { - // コンストラクタ - + internal class CStage曲読み込み : CStage { + // コンストラクタ + public CStage曲読み込み() { base.eStageID = CStage.EStage.SongLoading; base.ePhaseID = CStage.EPhase.Common_NORMAL; - base.IsDeActivated = true; - //base.list子Activities.Add( this.actFI = new CActFIFOBlack() ); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略 - //base.list子Activities.Add( this.actFO = new CActFIFOBlack() ); - } - - - // CStage 実装 - + base.IsDeActivated = true; + //base.list子Activities.Add( this.actFI = new CActFIFOBlack() ); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略 + //base.list子Activities.Add( this.actFO = new CActFIFOBlack() ); + } + + + // CStage 実装 + public override void Activate() { Trace.TraceInformation("曲読み込みステージを活性化します。"); Trace.Indent(); @@ -33,41 +33,27 @@ namespace OpenTaiko { OpenTaiko.ConfigIni.bTokkunMode = false; } - if (OpenTaiko.bコンパクトモード) { - string strDTXファイルパス = OpenTaiko.strコンパクトモードファイル; + string strDTXファイルパス = OpenTaiko.stageSongSelect.r確定されたスコア.ファイル情報.ファイルの絶対パス; - CDTX cdtx = new CDTX(strDTXファイルパス, true, 1.0, 0, 0); + var strフォルダ名 = Path.GetDirectoryName(strDTXファイルパス) + Path.DirectorySeparatorChar; - if (File.Exists(cdtx.strフォルダ名 + @"set.def")) - cdtx = new CDTX(strDTXファイルパス, true, 1.0, 0, 1); + if (File.Exists(strフォルダ名 + @"set.def")) { + var cdtx = new CDTX(strDTXファイルパス, true, 1.0, 0, 1); this.str曲タイトル = cdtx.TITLE.GetString(""); this.strサブタイトル = cdtx.SUBTITLE.GetString(""); cdtx.DeActivate(); } else { - string strDTXファイルパス = OpenTaiko.stageSongSelect.r確定されたスコア.ファイル情報.ファイルの絶対パス; - - var strフォルダ名 = Path.GetDirectoryName(strDTXファイルパス) + Path.DirectorySeparatorChar; - - if (File.Exists(strフォルダ名 + @"set.def")) { - var cdtx = new CDTX(strDTXファイルパス, true, 1.0, 0, 1); - - this.str曲タイトル = cdtx.TITLE.GetString(""); - this.strサブタイトル = cdtx.SUBTITLE.GetString(""); - - cdtx.DeActivate(); - } else { - var 譜面情報 = OpenTaiko.stageSongSelect.r確定されたスコア.譜面情報; - this.str曲タイトル = 譜面情報.タイトル; - this.strサブタイトル = 譜面情報.strサブタイトル; - } - } - - // For the moment, detect that we are performing - // calibration via there being an actual single - // player and the special song title and subtitle - // of the .tja used to perform input calibration + var 譜面情報 = OpenTaiko.stageSongSelect.r確定されたスコア.譜面情報; + this.str曲タイトル = 譜面情報.タイトル; + this.strサブタイトル = 譜面情報.strサブタイトル; + } + + // For the moment, detect that we are performing + // calibration via there being an actual single + // player and the special song title and subtitle + // of the .tja used to perform input calibration OpenTaiko.IsPerformingCalibration = !OpenTaiko.ConfigIni.bAutoPlay[0] && OpenTaiko.ConfigIni.nPlayerCount == 1 && @@ -85,11 +71,11 @@ namespace OpenTaiko { this.ct待機 = new CCounter(0, wait, 5, OpenTaiko.Timer); this.ct曲名表示 = new CCounter(1, 30, 30, OpenTaiko.Timer); - try { - // When performing calibration, inform the player that - // calibration is about to begin, rather than - // displaying the song title and subtitle as usual. - + try { + // When performing calibration, inform the player that + // calibration is about to begin, rather than + // displaying the song title and subtitle as usual. + var タイトル = OpenTaiko.IsPerformingCalibration ? "Input calibration is about to begin." : this.str曲タイトル; @@ -98,11 +84,11 @@ namespace OpenTaiko { ? "Please play as accurately as possible." : this.strサブタイトル; - if (!string.IsNullOrEmpty(タイトル)) { - //this.txタイトル = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat ); - //this.txタイトル.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f ); - - + if (!string.IsNullOrEmpty(タイトル)) { + //this.txタイトル = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat ); + //this.txタイトル.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f ); + + using (var bmpSongTitle = this.pfTITLE.DrawText(タイトル, OpenTaiko.Skin.SongLoading_Title_ForeColor, OpenTaiko.Skin.SongLoading_Title_BackColor, null, 30)) { this.txタイトル = new CTexture(bmpSongTitle); txタイトル.vcScaleRatio.X = OpenTaiko.GetSongNameXScaling(ref txタイトル, OpenTaiko.Skin.SongLoading_Title_MaxSize); @@ -135,8 +121,8 @@ namespace OpenTaiko { Trace.TraceInformation("曲読み込みステージを非活性化します。"); Trace.Indent(); try { - OpenTaiko.tテクスチャの解放(ref this.txタイトル); - //CDTXMania.tテクスチャの解放( ref this.txSongnamePlate ); + OpenTaiko.tテクスチャの解放(ref this.txタイトル); + //CDTXMania.tテクスチャの解放( ref this.txSongnamePlate ); OpenTaiko.tテクスチャの解放(ref this.txサブタイトル); base.DeActivate(); } finally { @@ -150,8 +136,8 @@ namespace OpenTaiko { pfDanTitle = HPrivateFastFont.tInstantiateMainFont(OpenTaiko.Skin.Game_DanC_Title_Size); pfDanSubTitle = HPrivateFastFont.tInstantiateMainFont(OpenTaiko.Skin.Game_DanC_SubTitle_Size); - this.tx背景 = OpenTaiko.tテクスチャの生成(this.strSTAGEFILE, false); - //this.txSongnamePlate = CDTXMania.tテクスチャの生成( CSkin.Path( @$"Graphics{Path.DirectorySeparatorChar}6_SongnamePlate.png" ) ); + this.tx背景 = OpenTaiko.tテクスチャの生成(this.strSTAGEFILE, false); + //this.txSongnamePlate = CDTXMania.tテクスチャの生成( CSkin.Path( @$"Graphics{Path.DirectorySeparatorChar}6_SongnamePlate.png" ) ); base.CreateManagedResource(); } public override void ReleaseManagedResource() { @@ -168,10 +154,10 @@ namespace OpenTaiko { string str; if (base.IsDeActivated) - return 0; - + return 0; + #region [ 初めての進行描画 ] - //----------------------------- + //----------------------------- if (base.IsFirstDraw) { Cスコア cスコア1 = OpenTaiko.stageSongSelect.r確定されたスコア; if (this.sd読み込み音 != null) { @@ -185,17 +171,17 @@ namespace OpenTaiko { OpenTaiko.Skin.sound曲読込開始音.tPlay(); this.nBGM再生開始時刻 = SoundManager.PlayTimer.NowTime; this.nBGMの総再生時間ms = OpenTaiko.Skin.sound曲読込開始音.n長さ_現在のサウンド; - } - //this.actFI.tフェードイン開始(); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略 + } + //this.actFI.tフェードイン開始(); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略 base.ePhaseID = CStage.EPhase.Common_FADEIN; base.IsFirstDraw = false; nWAVcount = 1; - } - //----------------------------- + } + //----------------------------- #endregion - this.ct待機.Tick(); - + this.ct待機.Tick(); + #region [ Cancel loading with esc ] if (tキー入力()) { if (this.sd読み込み音 != null) { @@ -203,13 +189,13 @@ namespace OpenTaiko { this.sd読み込み音.tDispose(); } return (int)ESongLoadingScreenReturnValue.LoadCanceled; - } + } #endregion - + if (OpenTaiko.stageSongSelect.nChoosenSongDifficulty[0] != (int)Difficulty.Dan) { void drawPlate() { if (OpenTaiko.Tx.SongLoading_Plate != null) { - OpenTaiko.Tx.SongLoading_Plate.bスクリーン合成 = OpenTaiko.Skin.SongLoading_Plate_ScreenBlend; //あまりにも出番が無い + OpenTaiko.Tx.SongLoading_Plate.bスクリーン合成 = OpenTaiko.Skin.SongLoading_Plate_ScreenBlend; //あまりにも出番が無い OpenTaiko.Tx.SongLoading_Plate.Opacity = 255; if (OpenTaiko.Skin.SongLoading_Plate_ReferencePoint == CSkin.ReferencePoint.Left) { OpenTaiko.Tx.SongLoading_Plate.t2D描画(OpenTaiko.Skin.SongLoading_Plate_X, OpenTaiko.Skin.SongLoading_Plate_Y - (OpenTaiko.Tx.SongLoading_Plate.sz画像サイズ.Height / 2)); @@ -218,10 +204,10 @@ namespace OpenTaiko { } else { OpenTaiko.Tx.SongLoading_Plate.t2D描画(OpenTaiko.Skin.SongLoading_Plate_X - (OpenTaiko.Tx.SongLoading_Plate.sz画像サイズ.Width / 2), OpenTaiko.Skin.SongLoading_Plate_Y - (OpenTaiko.Tx.SongLoading_Plate.sz画像サイズ.Height / 2)); } - } - //CDTXMania.act文字コンソール.tPrint( 0, 16, C文字コンソール.Eフォント種別.灰, C変換.nParsentTo255( ( this.ct曲名表示.n現在の値 / 30.0 ) ).ToString() ); - - + } + //CDTXMania.act文字コンソール.tPrint( 0, 16, C文字コンソール.Eフォント種別.灰, C変換.nParsentTo255( ( this.ct曲名表示.n現在の値 / 30.0 ) ).ToString() ); + + int y = 720 - 45; if (this.txタイトル != null) { int nサブタイトル補正 = string.IsNullOrEmpty(OpenTaiko.stageSongSelect.r確定されたスコア.譜面情報.strサブタイトル) ? 15 : 0; @@ -249,7 +235,7 @@ namespace OpenTaiko { void drawPlate_AI() { if (OpenTaiko.Tx.SongLoading_Plate_AI != null) { - OpenTaiko.Tx.SongLoading_Plate_AI.bスクリーン合成 = OpenTaiko.Skin.SongLoading_Plate_ScreenBlend; //あまりにも出番が無い + OpenTaiko.Tx.SongLoading_Plate_AI.bスクリーン合成 = OpenTaiko.Skin.SongLoading_Plate_ScreenBlend; //あまりにも出番が無い OpenTaiko.Tx.SongLoading_Plate_AI.Opacity = 255; if (OpenTaiko.Skin.SongLoading_Plate_ReferencePoint == CSkin.ReferencePoint.Left) { OpenTaiko.Tx.SongLoading_Plate_AI.t2D描画(OpenTaiko.Skin.SongLoading_Plate_X_AI, OpenTaiko.Skin.SongLoading_Plate_Y_AI - (OpenTaiko.Tx.SongLoading_Plate_AI.sz画像サイズ.Height / 2)); @@ -258,10 +244,10 @@ namespace OpenTaiko { } else { OpenTaiko.Tx.SongLoading_Plate_AI.t2D描画(OpenTaiko.Skin.SongLoading_Plate_X_AI - (OpenTaiko.Tx.SongLoading_Plate_AI.sz画像サイズ.Width / 2), OpenTaiko.Skin.SongLoading_Plate_Y_AI - (OpenTaiko.Tx.SongLoading_Plate_AI.sz画像サイズ.Height / 2)); } - } - //CDTXMania.act文字コンソール.tPrint( 0, 16, C文字コンソール.Eフォント種別.灰, C変換.nParsentTo255( ( this.ct曲名表示.n現在の値 / 30.0 ) ).ToString() ); - - + } + //CDTXMania.act文字コンソール.tPrint( 0, 16, C文字コンソール.Eフォント種別.灰, C変換.nParsentTo255( ( this.ct曲名表示.n現在の値 / 30.0 ) ).ToString() ); + + int y = 720 - 45; if (this.txタイトル != null) { int nサブタイトル補正 = string.IsNullOrEmpty(OpenTaiko.stageSongSelect.r確定されたスコア.譜面情報.strサブタイトル) ? 15 : 0; @@ -285,15 +271,15 @@ namespace OpenTaiko { this.txサブタイトル.t2D描画((OpenTaiko.Skin.SongLoading_SubTitle_X_AI - ((this.txサブタイトル.sz画像サイズ.Width * txサブタイトル.vcScaleRatio.X) / 2)), OpenTaiko.Skin.SongLoading_SubTitle_Y_AI - (this.txサブタイトル.sz画像サイズ.Height / 2)); } } - } - + } + #region [ Loading screen (except dan) ] - //----------------------------- + //----------------------------- this.ct曲名表示.Tick(); - if (OpenTaiko.stageSongSelect.nChoosenSongDifficulty[0] == (int)Difficulty.Tower) { + if (OpenTaiko.stageSongSelect.nChoosenSongDifficulty[0] == (int)Difficulty.Tower) { #region [Tower loading screen] - + if (OpenTaiko.Skin.Game_Tower_Ptn_Result > 0) { int xFactor = 0; float yFactor = 1f; @@ -315,32 +301,32 @@ namespace OpenTaiko { if (currentTowerType < OpenTaiko.Tx.TowerResult_Tower.Length) OpenTaiko.Tx.TowerResult_Tower[currentTowerType]?.t2D描画(xFactor, -1 * yFactor * pos); - } - + } + #endregion drawPlate(); } else if (OpenTaiko.ConfigIni.bAIBattleMode) { OpenTaiko.ConfigIni.tInitializeAILevel(); OpenTaiko.Tx.SongLoading_Bg_AI_Wait.t2D描画(0, 0); drawPlate_AI(); - } else { + } else { #region [Ensou loading screen] - + if (OpenTaiko.Tx.SongLoading_BgWait != null) OpenTaiko.Tx.SongLoading_BgWait.t2D描画(0, 0); if (OpenTaiko.Tx.SongLoading_Chara != null) OpenTaiko.Tx.SongLoading_Chara.t2D描画(0, 0); - drawPlate(); - + drawPlate(); + #endregion - } - - //CDTXMania.act文字コンソール.tPrint( 0, 0, C文字コンソール.Eフォント種別.灰, this.ct曲名表示.n現在の値.ToString() ); - - //----------------------------- + } + + //CDTXMania.act文字コンソール.tPrint( 0, 0, C文字コンソール.Eフォント種別.灰, this.ct曲名表示.n現在の値.ToString() ); + + //----------------------------- #endregion - } else { + } else { #region [ Dan Loading screen ] - + OpenTaiko.Tx.SongLoading_Bg_Dan.t2D描画(0, 0 - (ct待機.CurrentValue <= 600 ? ct待機.CurrentValue / 10f : 60)); CTexture dp = (OpenTaiko.stage段位選択.段位リスト.stバー情報 != null) @@ -354,39 +340,35 @@ namespace OpenTaiko { if (OpenTaiko.Tx.Tile_Black != null) { OpenTaiko.Tx.Tile_Black.Opacity = (int)(ct待機.CurrentValue <= 51 ? (255 - ct待機.CurrentValue / 0.2f) : (this.ct待機.CurrentValue - 949) / 0.2); - for (int i = 0; i <= (SampleFramework.GameWindowSize.Width / OpenTaiko.Tx.Tile_Black.szTextureSize.Width); i++) // #23510 2010.10.31 yyagi: change "clientSize.Width" to "640" to fix FIFO drawing size + for (int i = 0; i <= (SampleFramework.GameWindowSize.Width / OpenTaiko.Tx.Tile_Black.szTextureSize.Width); i++) // #23510 2010.10.31 yyagi: change "clientSize.Width" to "640" to fix FIFO drawing size { - for (int j = 0; j <= (SampleFramework.GameWindowSize.Height / OpenTaiko.Tx.Tile_Black.szTextureSize.Height); j++) // #23510 2010.10.31 yyagi: change "clientSize.Height" to "480" to fix FIFO drawing size + for (int j = 0; j <= (SampleFramework.GameWindowSize.Height / OpenTaiko.Tx.Tile_Black.szTextureSize.Height); j++) // #23510 2010.10.31 yyagi: change "clientSize.Height" to "480" to fix FIFO drawing size { OpenTaiko.Tx.Tile_Black.t2D描画(i * OpenTaiko.Tx.Tile_Black.szTextureSize.Width, j * OpenTaiko.Tx.Tile_Black.szTextureSize.Height); } } - } - + } + #endregion } switch (base.ePhaseID) { - case CStage.EPhase.Common_FADEIN: - //if( this.actFI.On進行描画() != 0 ) // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略 - // 必ず一度「CStaeg.Eフェーズ.共通_フェードイン」フェーズを経由させること。 - // さもないと、曲読み込みが完了するまで、曲読み込み画面が描画されない。 + case CStage.EPhase.Common_FADEIN: + //if( this.actFI.On進行描画() != 0 ) // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略 + // 必ず一度「CStaeg.Eフェーズ.共通_フェードイン」フェーズを経由させること。 + // さもないと、曲読み込みが完了するまで、曲読み込み画面が描画されない。 base.ePhaseID = CStage.EPhase.SongLoading_LoadDTXFile; return (int)ESongLoadingScreenReturnValue.Continue; case CStage.EPhase.SongLoading_LoadDTXFile: { timeBeginLoad = DateTime.Now; TimeSpan span; - str = null; - if (!OpenTaiko.bコンパクトモード) - str = OpenTaiko.stageSongSelect.r確定されたスコア.ファイル情報.ファイルの絶対パス; - else - str = OpenTaiko.strコンパクトモードファイル; + str = OpenTaiko.stageSongSelect.r確定されたスコア.ファイル情報.ファイルの絶対パス; if ((OpenTaiko.DTX != null) && OpenTaiko.DTX.IsActivated) - OpenTaiko.DTX.DeActivate(); - - //if( CDTXMania.DTX == null ) + OpenTaiko.DTX.DeActivate(); + + //if( CDTXMania.DTX == null ) { OpenTaiko.DTX = new CDTX(str, false, 1.0, 0, 0, 0, true, OpenTaiko.stageSongSelect.nChoosenSongDifficulty[0]); if (OpenTaiko.ConfigIni.nPlayerCount >= 2) @@ -401,8 +383,8 @@ namespace OpenTaiko { if (OpenTaiko.DTX.listErrors.Count != 0) { string message = ""; foreach (var text in OpenTaiko.DTX.listErrors) { - OpenTaiko.VisualLogManager.PushCard(CVisualLogManager.ELogCardType.LogError, text); - //System.Windows.Forms.MessageBox.Show(text, "譜面にエラーが見つかりました"); + OpenTaiko.VisualLogManager.PushCard(CVisualLogManager.ELogCardType.LogError, text); + //System.Windows.Forms.MessageBox.Show(text, "譜面にエラーが見つかりました"); } } @@ -412,9 +394,9 @@ namespace OpenTaiko { Trace.TraceInformation("---------------------------"); span = (TimeSpan)(DateTime.Now - timeBeginLoad); - Trace.TraceInformation("Chart loading time: {0}", span.ToString()); - - // 段位認定モード用。 + Trace.TraceInformation("Chart loading time: {0}", span.ToString()); + + // 段位認定モード用。 #region [dan setup] if (OpenTaiko.stageSongSelect.nChoosenSongDifficulty[0] == (int)Difficulty.Dan && OpenTaiko.DTX.List_DanSongs != null) { @@ -439,7 +421,7 @@ namespace OpenTaiko { } } - } + } #endregion } @@ -456,9 +438,9 @@ namespace OpenTaiko { } case CStage.EPhase.SongLoading_LoadWAVFile: { - int looptime = (OpenTaiko.ConfigIni.bEnableVSync) ? 3 : 1; // VSyncWait=ON時は1frame(1/60s)あたり3つ読むようにする + int looptime = (OpenTaiko.ConfigIni.bEnableVSync) ? 3 : 1; // VSyncWait=ON時は1frame(1/60s)あたり3つ読むようにする for (int i = 0; i < looptime && nWAVcount <= OpenTaiko.DTX.listWAV.Count; i++) { - if (OpenTaiko.DTX.listWAV[nWAVcount].listこのWAVを使用するチャンネル番号の集合.Count > 0) // #28674 2012.5.8 yyagi + if (OpenTaiko.DTX.listWAV[nWAVcount].listこのWAVを使用するチャンネル番号の集合.Count > 0) // #28674 2012.5.8 yyagi { OpenTaiko.DTX.tWAVの読み込み(OpenTaiko.DTX.listWAV[nWAVcount]); } @@ -508,8 +490,8 @@ namespace OpenTaiko { } - OpenTaiko.Timer.Update(); - //CSound管理.rc演奏用タイマ.t更新(); + OpenTaiko.Timer.Update(); + //CSound管理.rc演奏用タイマ.t更新(); base.ePhaseID = CStage.EPhase.SongLoading_WaitForSoundSystemBGM; return (int)ESongLoadingScreenReturnValue.Continue; } @@ -517,10 +499,10 @@ namespace OpenTaiko { case CStage.EPhase.SongLoading_WaitForSoundSystemBGM: { long nCurrentTime = OpenTaiko.Timer.NowTime; if (nCurrentTime < this.nBGM再生開始時刻) - this.nBGM再生開始時刻 = nCurrentTime; - - // if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms - 1000 ) ) - if ((nCurrentTime - this.nBGM再生開始時刻) >= (this.nBGMの総再生時間ms)) // #27787 2012.3.10 yyagi 1000ms == フェードイン分の時間 + this.nBGM再生開始時刻 = nCurrentTime; + + // if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms - 1000 ) ) + if ((nCurrentTime - this.nBGM再生開始時刻) >= (this.nBGMの総再生時間ms)) // #27787 2012.3.10 yyagi 1000ms == フェードイン分の時間 { base.ePhaseID = CStage.EPhase.Common_FADEOUT; } @@ -528,7 +510,7 @@ namespace OpenTaiko { } case CStage.EPhase.Common_FADEOUT: - if (this.ct待機.IsUnEnded) // DTXVモード時は、フェードアウト省略 + if (this.ct待機.IsUnEnded) // DTXVモード時は、フェードアウト省略 return (int)ESongLoadingScreenReturnValue.Continue; if (this.sd読み込み音 != null) { @@ -537,27 +519,27 @@ namespace OpenTaiko { return (int)ESongLoadingScreenReturnValue.LoadComplete; } return (int)ESongLoadingScreenReturnValue.Continue; - } - + } + /// /// ESC押下時、trueを返す /// /// protected bool tキー入力() { IInputDevice keyboard = OpenTaiko.InputManager.Keyboard; - if (keyboard.KeyPressed((int)SlimDXKeys.Key.Escape)) // escape (exit) + if (keyboard.KeyPressed((int)SlimDXKeys.Key.Escape)) // escape (exit) { return true; } return false; - } - - // その他 - + } + + // その他 + #region [ private ] - //----------------- - //private CActFIFOBlack actFI; - //private CActFIFOBlack actFO; + //----------------- + //private CActFIFOBlack actFI; + //private CActFIFOBlack actFO; private long nBGMの総再生時間ms; private long nBGM再生開始時刻; private CSound sd読み込み音; @@ -566,8 +548,8 @@ namespace OpenTaiko { private string strサブタイトル; private CTexture txタイトル; private CTexture txサブタイトル; - private CTexture tx背景; - //private CTexture txSongnamePlate; + private CTexture tx背景; + //private CTexture txSongnamePlate; private DateTime timeBeginLoad; private DateTime timeBeginLoadWAV; private int nWAVcount; @@ -578,8 +560,8 @@ namespace OpenTaiko { private CCachedFontRenderer pfSUBTITLE; private CCachedFontRenderer pfDanTitle = null; - private CCachedFontRenderer pfDanSubTitle = null; - //----------------- + private CCachedFontRenderer pfDanSubTitle = null; + //----------------- #endregion } }