2021-09-21 00:16:38 +02:00
using System ;
using System.Collections.Generic ;
using System.Globalization ;
using System.Text ;
using System.Windows.Forms ;
using System.Drawing ;
using System.Diagnostics ;
using System.IO ;
using System.Threading ;
using System.Net.NetworkInformation ;
using System.Runtime.Serialization.Formatters.Binary ;
2022-02-08 16:23:41 +01:00
using SharpDX ;
using SharpDX.Direct3D9 ;
2021-09-21 00:16:38 +02:00
using FDK ;
using SampleFramework ;
using System.Reflection ;
using System.Threading.Tasks ;
using System.Linq ;
2022-02-08 16:23:41 +01:00
using Rectangle = System . Drawing . Rectangle ;
using Point = System . Drawing . Point ;
using Color = System . Drawing . Color ;
2021-09-21 00:16:38 +02:00
namespace TJAPlayer3
{
internal class TJAPlayer3 : Game
{
// プロパティ
#region [ properties ]
public static readonly string VERSION = Assembly . GetExecutingAssembly ( ) . GetName ( ) . Version . ToString ( ) . Substring ( 0 , Assembly . GetExecutingAssembly ( ) . GetName ( ) . Version . ToString ( ) . Length - 2 ) ;
public static readonly string AppDisplayThreePartVersion = GetAppDisplayThreePartVersion ( ) ;
public static readonly string AppNumericThreePartVersion = GetAppNumericThreePartVersion ( ) ;
private static string GetAppDisplayThreePartVersion ( )
{
return $"v{GetAppNumericThreePartVersion()}" ;
}
private static string GetAppNumericThreePartVersion ( )
{
var version = Assembly . GetExecutingAssembly ( ) . GetName ( ) . Version ;
return $"{version.Major}.{version.Minor}.{version.Build}" ;
}
public static readonly string AppInformationalVersion =
Assembly
. GetExecutingAssembly ( )
. GetCustomAttributes ( typeof ( AssemblyInformationalVersionAttribute ) , false )
. Cast < AssemblyInformationalVersionAttribute > ( )
. FirstOrDefault ( )
? . 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_42.dll"; // February 2010
//public static readonly string D3DXDLL = "d3dx9_41.dll"; // March 2009
2022-01-06 08:30:21 +01:00
public static CStage latestSongSelect
{
get ;
private set ;
}
2021-09-21 00:16:38 +02:00
public static TJAPlayer3 app
{
get ;
private set ;
}
public static C文字コンソール act文字コンソール
{
get ;
private set ;
}
public static bool bコンパクトモード
{
get ;
private set ;
}
public static CConfigIni ConfigIni
{
get ;
private set ;
}
public static CDTX DTX
{
get
{
return dtx [ 0 ] ;
}
set
{
if ( ( dtx [ 0 ] ! = null ) & & ( app ! = null ) )
{
dtx [ 0 ] . On非活性化 ( ) ;
app . listトップレベルActivities . Remove ( dtx [ 0 ] ) ;
}
dtx [ 0 ] = value ;
if ( ( dtx [ 0 ] ! = null ) & & ( app ! = null ) )
{
app . listトップレベルActivities . Add ( dtx [ 0 ] ) ;
}
}
}
public static CDTX DTX_2P
{
get
{
return dtx [ 1 ] ;
}
set
{
if ( ( dtx [ 1 ] ! = null ) & & ( app ! = null ) )
{
dtx [ 1 ] . On非活性化 ( ) ;
app . listトップレベルActivities . Remove ( dtx [ 1 ] ) ;
}
dtx [ 1 ] = value ;
if ( ( dtx [ 1 ] ! = null ) & & ( app ! = null ) )
{
app . listトップレベルActivities . Add ( dtx [ 1 ] ) ;
}
}
}
public static bool IsPerformingCalibration ;
public static CFPS FPS
{
get ;
private set ;
}
public static CInput管理 Input管理
{
get ;
private set ;
}
#region [ 入 力 範 囲 ms ]
public static int nPerfect範囲ms
{
get
{
if ( stage選曲 . r確定された曲 ! = null )
{
C曲リストノ ード c曲リストノ ード = stage選曲 . r確定された曲 . r親ノ ード ;
if ( ( ( c曲リストノ ード ! = null ) & & ( c曲リストノ ード . eノ ード種別 = = C曲リストノ ード . Eノ ード種別 . BOX ) ) & & ( c曲リストノ ード . nPerfect範囲ms > = 0 ) )
{
return c曲リストノ ード . nPerfect範囲ms ;
}
}
return ConfigIni . nヒット範囲ms . Perfect ;
}
}
public static int nGreat範囲ms
{
get
{
if ( stage選曲 . r確定された曲 ! = null )
{
C曲リストノ ード c曲リストノ ード = stage選曲 . r確定された曲 . r親ノ ード ;
if ( ( ( c曲リストノ ード ! = null ) & & ( c曲リストノ ード . eノ ード種別 = = C曲リストノ ード . Eノ ード種別 . BOX ) ) & & ( c曲リストノ ード . nGreat範囲ms > = 0 ) )
{
return c曲リストノ ード . nGreat範囲ms ;
}
}
return ConfigIni . nヒット範囲ms . Great ;
}
}
public static int nGood範囲ms
{
get
{
if ( stage選曲 . r確定された曲 ! = null )
{
C曲リストノ ード c曲リストノ ード = stage選曲 . r確定された曲 . r親ノ ード ;
if ( ( ( c曲リストノ ード ! = null ) & & ( c曲リストノ ード . eノ ード種別 = = C曲リストノ ード . Eノ ード種別 . BOX ) ) & & ( c曲リストノ ード . nGood範囲ms > = 0 ) )
{
return c曲リストノ ード . nGood範囲ms ;
}
}
return ConfigIni . nヒット範囲ms . Good ;
}
}
public static int nPoor範囲ms
{
get
{
if ( stage選曲 . r確定された曲 ! = null )
{
C曲リストノ ード c曲リストノ ード = stage選曲 . r確定された曲 . r親ノ ード ;
if ( ( ( c曲リストノ ード ! = null ) & & ( c曲リストノ ード . eノ ード種別 = = C曲リストノ ード . Eノ ード種別 . BOX ) ) & & ( c曲リストノ ード . nPoor範囲ms > = 0 ) )
{
return c曲リストノ ード . nPoor範囲ms ;
}
}
return ConfigIni . nヒット範囲ms . Poor ;
}
}
#endregion
public static CPad Pad
{
get ;
private set ;
}
public static Random Random
{
get ;
private set ;
}
public static CSkin Skin
{
get ;
private set ;
}
public static CSongs管理 Songs管理
{
get ;
set ; // 2012.1.26 yyagi private解除 CStage起動でのdesirialize読み込みのため
}
public static CEnumSongs EnumSongs
{
get ;
private set ;
}
public static CActEnumSongs actEnumSongs
{
get ;
private set ;
}
public static CActScanningLoudness actScanningLoudness
{
get ;
private set ;
}
public static CActFlushGPU actFlushGPU
{
get ;
private set ;
}
public static CSound管理 Sound管理
{
get ;
private set ;
}
public static SongGainController SongGainController
{
get ;
private set ;
}
public static SoundGroupLevelController SoundGroupLevelController
{
get ;
private set ;
}
public static CNamePlate NamePlate
{
get ;
private set ;
}
public static NamePlateConfig NamePlateConfig
{
get ;
private set ;
}
2022-03-02 08:00:37 +01:00
public static Favorites Favorites
{
get ;
private set ;
}
2022-03-14 23:47:03 +01:00
public static RecentlyPlayedSongs RecentlyPlayedSongs
{
get ;
private set ;
}
2022-02-05 16:25:58 +01:00
public static Databases Databases
{
get ;
private set ;
}
2021-09-21 00:16:38 +02:00
public static CStage起動 stage起動
{
get ;
private set ;
}
public static CStageタイトル stageタイトル
{
get ;
private set ;
}
// public static CStageオプション stageオプション
// {
// get;
// private set;
// }
public static CStageコンフィグ stageコンフィグ
{
get ;
private set ;
}
public static CStage選曲 stage選曲
{
get ;
private set ;
}
public static CStage段位選択 stage段位選択
{
get ;
private set ;
}
2021-11-12 18:32:04 +01:00
public static CStageHeya stageHeya
{
get ;
private set ;
}
2021-09-21 00:16:38 +02:00
public static CStage曲読み込み stage曲読み込み
{
get ;
private set ;
}
public static CStage演奏ドラム画面 stage演奏ドラム画面
{
get ;
private set ;
}
public static CStage結果 stage結果
{
get ;
private set ;
}
public static CStageChangeSkin stageChangeSkin
{
get ;
private set ;
}
public static CStage終了 stage終了
{
get ;
private set ;
}
public static CStage r現在のステージ = null ;
public static CStage r直前のステージ = null ;
public static string strEXEのあるフォルダ
{
get ;
private set ;
}
public static string strコンパクトモードファイル
{
get ;
private set ;
}
public static CTimer Timer
{
get ;
private set ;
}
public static Format TextureFormat = Format . A8R8G8B8 ;
internal static IPluginActivity act現在入力を占有中のプラグイン = null ;
public bool bApplicationActive
{
get ;
private set ;
}
public bool b次のタイミングで垂直帰線同期切り替えを行う
{
get ;
set ;
}
public bool b次のタイミングで全画面_ウィンドウ切り替えを行う
{
get ;
set ;
}
2022-02-08 16:23:41 +01:00
public Device Device
2021-09-21 00:16:38 +02:00
{
get { return base . GraphicsDeviceManager . Direct3D9 . Device ; }
}
public CPluginHost PluginHost
{
get ;
private set ;
}
public List < STPlugin > listプラグイン = new List < STPlugin > ( ) ;
public struct STPlugin
{
public IPluginActivity plugin ;
public string strプラグインフォルダ ;
public string strアセンブリ簡易名 ;
public Version Version ;
}
private static Size currentClientSize // #23510 2010.10.27 add yyagi to keep current window size
{
get ;
set ;
}
// public static CTimer ct;
public IntPtr WindowHandle // 2012.10.24 yyagi; to add ASIO support
{
get { return base . Window . Handle ; }
}
public static CDTXVmode DTXVmode // #28821 2014.1.23 yyagi
{
get ;
set ;
}
2021-12-09 07:08:32 +01:00
// 0 : 1P, 1 : 2P
public static int SaveFile = 0 ;
// 0 : Hidari, 1 : Migi (1P only)
public static int PlayerSide = 0 ;
2021-12-10 02:08:35 +01:00
public static int GetActualPlayer ( int player )
{
if ( SaveFile = = 0 )
return player ;
if ( player = = 0 )
return 1 ;
return 0 ;
}
2021-12-14 06:45:13 +01:00
public static bool P1IsBlue ( )
{
return ( TJAPlayer3 . PlayerSide = = 1 & & TJAPlayer3 . ConfigIni . nPlayerCount = = 1 ) ;
}
2021-09-21 00:16:38 +02:00
#endregion
// コンストラクタ
public TJAPlayer3 ( )
{
TJAPlayer3 . app = this ;
this . t起動処理 ( ) ;
}
2021-11-23 01:29:44 +01:00
public static string sEncType = "Shift_JIS" ;
2021-09-21 00:16:38 +02:00
// メソッド
public void t全画面_ウィンドウモード切り替え ( )
{
#if WindowedFullscreen
if ( ConfigIni ! = null )
#else
DeviceSettings settings = base . GraphicsDeviceManager . CurrentSettings . Clone ( ) ;
if ( ( ConfigIni ! = null ) & & ( ConfigIni . bウィンドウモード ! = settings . Windowed ) )
#endif
{
#if ! WindowedFullscreen
settings . Windowed = ConfigIni . bウィンドウモード ;
#endif
if ( ConfigIni . bウィンドウモード = = false ) // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode
{
currentClientSize = this . Window . ClientSize ;
ConfigIni . nウインドウwidth = this . Window . ClientSize . Width ;
ConfigIni . nウインドウheight = this . Window . ClientSize . Height ;
// FDK.CTaskBar.ShowTaskBar( false );
}
#if ! WindowedFullscreen
base . GraphicsDeviceManager . ChangeDevice ( settings ) ;
#endif
if ( ConfigIni . bウィンドウモード = = true ) // #23510 2010.10.27 yyagi: to resume window size from backuped value
{
#if WindowedFullscreen
// #30666 2013.2.2 yyagi Don't use Fullscreen mode becasue NVIDIA GeForce is
// tend to delay drawing on Fullscreen mode. So DTXMania uses Maximized window
// in spite of using fullscreen mode.
app . Window . WindowState = FormWindowState . Normal ;
app . Window . FormBorderStyle = FormBorderStyle . Sizable ;
app . Window . WindowState = FormWindowState . Normal ;
#endif
base . Window . ClientSize =
new Size ( currentClientSize . Width , currentClientSize . Height ) ;
base . Window . Icon = Properties . Resources . tjap3 ;
// FDK.CTaskBar.ShowTaskBar( true );
}
#if WindowedFullscreen
else
{
app . Window . WindowState = FormWindowState . Normal ;
app . Window . FormBorderStyle = FormBorderStyle . None ;
app . Window . WindowState = FormWindowState . Maximized ;
}
if ( ConfigIni . bウィンドウモード )
{
if ( ! this . bマウスカーソル表示中 )
{
Cursor . Show ( ) ;
this . bマウスカーソル表示中 = true ;
}
}
else if ( this . bマウスカーソル表示中 )
{
Cursor . Hide ( ) ;
this . bマウスカーソル表示中 = false ;
}
#endif
}
}
#region [ # 24609 リ ザ ル ト 画 像 を pngで保存する ] // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.
/// <summary>
/// リザルト画像のキャプチャと保存。
/// </summary>
/// <param name="strFilename">保存するファイル名(フルパス)</param>
public bool SaveResultScreen ( string strFullPath )
{
string strSavePath = Path . GetDirectoryName ( strFullPath ) ;
if ( ! Directory . Exists ( strSavePath ) )
{
try
{
Directory . CreateDirectory ( strSavePath ) ;
}
catch
{
Trace . TraceError ( ToString ( ) ) ;
Trace . TraceError ( "例外が発生しましたが処理を継続します。 (0bfe6bff-2a56-4df4-9333-2df26d9b765b)" ) ;
return false ;
}
}
// http://www.gamedev.net/topic/594369-dx9slimdxati-incorrect-saving-surface-to-file/
using ( Surface pSurface = TJAPlayer3 . app . Device . GetRenderTarget ( 0 ) )
{
Surface . ToFile ( pSurface , strFullPath , ImageFileFormat . Png ) ;
}
return true ;
}
#endregion
// Game 実装
protected override void Initialize ( )
{
2021-11-29 09:03:36 +01:00
2021-09-21 00:16:38 +02:00
if ( this . listトップレベルActivities ! = null )
{
foreach ( CActivity activity in this . listトップレベルActivities )
activity . OnManagedリソースの作成 ( ) ;
}
foreach ( STPlugin st in this . listプラグイン )
{
Directory . SetCurrentDirectory ( st . strプラグインフォルダ ) ;
st . plugin . OnManagedリソースの作成 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
#if GPUFlushAfterPresent
FrameEnd + = dtxmania_FrameEnd ;
#endif
}
#if GPUFlushAfterPresent
void dtxmania_FrameEnd ( object sender , EventArgs e ) // GraphicsDeviceManager.game_FrameEnd()後に実行される
{ // → Present()直後にGPUをFlushする
// → 画面のカクツキが頻発したため、ここでのFlushは行わない
actFlushGPU . On進行描画 ( ) ; // Flush GPU
}
#endif
protected override void LoadContent ( )
{
if ( ConfigIni . bウィンドウモード )
{
if ( ! this . bマウスカーソル表示中 )
{
Cursor . Show ( ) ;
this . bマウスカーソル表示中 = true ;
}
}
else if ( this . bマウスカーソル表示中 )
{
Cursor . Hide ( ) ;
this . bマウスカーソル表示中 = false ;
}
this . Device . SetTransform ( TransformState . View , Matrix . LookAtLH ( new Vector3 ( 0f , 0f , ( float ) ( - SampleFramework . GameWindowSize . Height / 2 * Math . Sqrt ( 3.0 ) ) ) , new Vector3 ( 0f , 0f , 0f ) , new Vector3 ( 0f , 1f , 0f ) ) ) ;
this . Device . SetTransform ( TransformState . Projection , Matrix . PerspectiveFovLH ( C変換 . DegreeToRadian ( ( float ) 60f ) , ( ( float ) this . Device . Viewport . Width ) / ( ( float ) this . Device . Viewport . Height ) , - 100f , 100f ) ) ;
this . Device . SetRenderState ( RenderState . Lighting , false ) ;
this . Device . SetRenderState ( RenderState . ZEnable , false ) ;
this . Device . SetRenderState ( RenderState . AntialiasedLineEnable , false ) ;
this . Device . SetRenderState ( RenderState . AlphaTestEnable , true ) ;
this . Device . SetRenderState ( RenderState . AlphaRef , 10 ) ;
this . Device . SetRenderState ( RenderState . MultisampleAntialias , true ) ;
this . Device . SetSamplerState ( 0 , SamplerState . MinFilter , TextureFilter . Linear ) ;
this . Device . SetSamplerState ( 0 , SamplerState . MagFilter , TextureFilter . Linear ) ;
this . Device . SetRenderState < Compare > ( RenderState . AlphaFunc , Compare . Greater ) ;
this . Device . SetRenderState ( RenderState . AlphaBlendEnable , true ) ;
this . Device . SetRenderState < Blend > ( RenderState . SourceBlend , Blend . SourceAlpha ) ;
this . Device . SetRenderState < Blend > ( RenderState . DestinationBlend , Blend . InverseSourceAlpha ) ;
this . Device . SetTextureStageState ( 0 , TextureStage . AlphaOperation , TextureOperation . Modulate ) ;
this . Device . SetTextureStageState ( 0 , TextureStage . AlphaArg1 , 2 ) ;
this . Device . SetTextureStageState ( 0 , TextureStage . AlphaArg2 , 1 ) ;
if ( this . listトップレベルActivities ! = null )
{
foreach ( CActivity activity in this . listトップレベルActivities )
activity . OnUnmanagedリソースの作成 ( ) ;
}
foreach ( STPlugin st in this . listプラグイン )
{
Directory . SetCurrentDirectory ( st . strプラグインフォルダ ) ;
st . plugin . OnUnmanagedリソースの作成 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
}
protected override void UnloadContent ( )
{
if ( this . listトップレベルActivities ! = null )
{
foreach ( CActivity activity in this . listトップレベルActivities )
activity . OnUnmanagedリソースの解放 ( ) ;
}
foreach ( STPlugin st in this . listプラグイン )
{
Directory . SetCurrentDirectory ( st . strプラグインフォルダ ) ;
st . plugin . OnUnmanagedリソースの解放 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
}
protected override void OnExiting ( EventArgs e )
{
CPowerManagement . tEnableMonitorSuspend ( ) ; // スリープ抑止状態を解除
this . t終了処理 ( ) ;
base . OnExiting ( e ) ;
}
protected override void Update ( GameTime gameTime )
{
}
protected override void Draw ( GameTime gameTime )
{
2021-11-29 09:03:36 +01:00
// Sound管理?.t再生中の処理をする();
2021-09-21 00:16:38 +02:00
Timer ? . t更新 ( ) ;
CSound管理 . rc演奏用タイマ ? . t更新 ( ) ;
Input管理 ? . tポーリング ( this . bApplicationActive , TJAPlayer3 . ConfigIni . bバッファ入力を行う ) ;
FPS ? . tカウンタ更新 ( ) ;
if ( this . Device = = null )
return ;
if ( this . bApplicationActive ) // DTXMania本体起動中の本体/モニタの省電力モード移行を抑止
CPowerManagement . tDisableMonitorSuspend ( ) ;
// #xxxxx 2013.4.8 yyagi; sleepの挿入位置を、EndScnene~ Present間から、BeginScene前に移動。描画遅延を小さくするため。
#region [ ス リ ー プ ]
if ( ConfigIni . nフレーム毎スリープms > = 0 ) // #xxxxx 2011.11.27 yyagi
{
Thread . Sleep ( ConfigIni . nフレーム毎スリープms ) ;
}
#endregion
#region [ DTXCreatorからの指示 ]
if ( this . Window . IsReceivedMessage ) // ウインドウメッセージで、
{
string strMes = this . Window . strMessage ;
this . Window . IsReceivedMessage = false ;
if ( strMes ! = null )
{
DTXVmode . ParseArguments ( strMes ) ;
if ( DTXVmode . Enabled )
{
bコンパクトモード = true ;
strコンパクトモードファイル = DTXVmode . filename ;
if ( DTXVmode . Command = = CDTXVmode . ECommand . Preview )
{
// preview soundの再生
string strPreviewFilename = DTXVmode . previewFilename ;
//Trace.TraceInformation( "Preview Filename=" + DTXVmode.previewFilename );
try
{
if ( this . previewSound ! = null )
{
this . previewSound . tサウンドを停止する ( ) ;
this . previewSound . Dispose ( ) ;
this . previewSound = null ;
}
2022-01-16 08:23:51 +01:00
this . previewSound = TJAPlayer3 . Sound管理 . tサウンドを生成する ( strPreviewFilename , ESoundGroup . SongPreview ) ;
2021-09-21 00:16:38 +02:00
// 2018-08-23 twopointzero: DTXVmode previewVolume will always set
// Gain since in this mode it should override the application of
// SONGVOL or any other Gain source regardless of configuration.
this . previewSound . SetGain ( DTXVmode . previewVolume ) ;
this . previewSound . n位置 = DTXVmode . previewPan ;
this . previewSound . t再生を開始する ( ) ;
Trace . TraceInformation ( "DTXCからの指示で、サウンドを生成しました。({0})" , strPreviewFilename ) ;
}
catch
{
Trace . TraceError ( ToString ( ) ) ;
Trace . TraceError ( "DTXCからの指示での、サウンドの生成に失敗しました。({0})" , strPreviewFilename ) ;
if ( this . previewSound ! = null )
{
this . previewSound . Dispose ( ) ;
}
this . previewSound = null ;
}
}
}
}
}
#endregion
this . Device . BeginScene ( ) ;
2022-02-08 16:23:41 +01:00
this . Device . Clear ( ClearFlags . ZBuffer | ClearFlags . Target , SharpDX . Color . Black , 1f , 0 ) ;
2021-09-21 00:16:38 +02:00
if ( r現在のステージ ! = null )
{
this . n進行描画の戻り値 = ( r現在のステージ ! = null ) ? r現在のステージ . On進行描画 ( ) : 0 ;
#region [ プ ラ グ イ ン の 進 行 描 画 ]
//---------------------
foreach ( STPlugin sp in this . listプラグイン )
{
Directory . SetCurrentDirectory ( sp . strプラグインフォルダ ) ;
if ( TJAPlayer3 . act現在入力を占有中のプラグイン = = null | | TJAPlayer3 . act現在入力を占有中のプラグイン = = sp . plugin )
sp . plugin . On進行描画 ( TJAPlayer3 . Pad , TJAPlayer3 . Input管理 . Keyboard ) ;
else
sp . plugin . On進行描画 ( null , null ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//---------------------
#endregion
CScoreIni scoreIni = null ;
if ( Control . IsKeyLocked ( Keys . CapsLock ) ) // #30925 2013.3.11 yyagi; capslock=ON時は、EnumSongsしないようにして、起動負荷とASIOの音切れの関係を確認する
{ // → songs.db等の書き込み時だと音切れするっぽい
actEnumSongs . On非活性化 ( ) ;
EnumSongs . SongListEnumCompletelyDone ( ) ;
TJAPlayer3 . stage選曲 . bIsEnumeratingSongs = false ;
}
#region [ 曲 検 索 ス レ ッ ド の 起 動 / 終 了 ] // ここに"Enumerating Songs..."表示を集約
if ( ! TJAPlayer3 . bコンパクトモード )
{
actEnumSongs . On進行描画 ( ) ; // "Enumerating Songs..."アイコンの描画
}
switch ( r現在のステージ . eステージID )
{
case CStage . Eステージ . タ イ ト ル :
case CStage . Eステージ . コ ン フ ィ グ :
case CStage . Eステージ . 選 曲 :
case CStage . Eステージ . 曲 読 み 込 み :
if ( EnumSongs ! = null )
{
#region [ ( 特 定 条 件 時 ) 曲 検 索 ス レ ッ ド の 起 動 _開始 ]
if ( r現在のステージ . eステージID = = CStage . Eステージ . タ イ ト ル & &
r直前のステージ . eステージID = = CStage . Eステージ . 起 動 & &
this . n進行描画の戻り値 = = ( int ) CStageタイトル . E戻り値 . 継 続 & &
! EnumSongs . IsSongListEnumStarted )
{
actEnumSongs . On活性化 ( ) ;
TJAPlayer3 . stage選曲 . bIsEnumeratingSongs = true ;
EnumSongs . Init ( ) ; // 取得した曲数を、新インスタンスにも与える
EnumSongs . StartEnumFromDisk ( ) ; // 曲検索スレッドの起動_開始
}
#endregion
#region [ 曲 検 索 の 中 断 と 再 開 ]
if ( r現在のステージ . eステージID = = CStage . Eステージ . 選 曲 & & ! EnumSongs . IsSongListEnumCompletelyDone )
{
switch ( this . n進行描画の戻り値 )
{
case 0 : // 何もない
//if ( CDTXMania.stage選曲.bIsEnumeratingSongs )
if ( ! TJAPlayer3 . stage選曲 . bIsPlayingPremovie )
{
EnumSongs . Resume ( ) ; // #27060 2012.2.6 yyagi 中止していたバックグランド曲検索を再開
EnumSongs . IsSlowdown = false ;
}
else
{
// EnumSongs.Suspend(); // #27060 2012.3.2 yyagi #PREMOVIE再生中は曲検索を低速化
EnumSongs . IsSlowdown = true ;
}
actEnumSongs . On活性化 ( ) ;
break ;
case 2 : // 曲決定
EnumSongs . Suspend ( ) ; // #27060 バックグラウンドの曲検索を一時停止
actEnumSongs . On非活性化 ( ) ;
break ;
}
}
#endregion
#region [ 曲 探 索 中 断 待 ち 待 機 ]
if ( r現在のステージ . eステージID = = CStage . Eステージ . 曲 読 み 込 み & & ! EnumSongs . IsSongListEnumCompletelyDone & &
EnumSongs . thDTXFileEnumerate ! = null ) // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist.
{
EnumSongs . WaitUntilSuspended ( ) ; // 念のため、曲検索が一時中断されるまで待機
}
#endregion
#region [ 曲 検 索 が 完 了 し た ら 、 実 際 の 曲 リ ス ト に 反 映 す る ]
// CStage選曲.On活性化() に回した方がいいかな?
if ( EnumSongs . IsSongListEnumerated )
{
actEnumSongs . On非活性化 ( ) ;
TJAPlayer3 . stage選曲 . bIsEnumeratingSongs = false ;
bool bRemakeSongTitleBar = ( r現在のステージ . eステージID = = CStage . Eステージ . 選 曲 ) ? true : false ;
TJAPlayer3 . stage選曲 . Refresh ( EnumSongs . Songs管理 , bRemakeSongTitleBar ) ;
EnumSongs . SongListEnumCompletelyDone ( ) ;
}
#endregion
}
break ;
}
#endregion
switch ( r現在のステージ . eステージID )
{
case CStage . Eステージ . 何 も し な い :
break ;
case CStage . Eステージ . 起 動 :
#region [ * * * ]
//-----------------------------
if ( this . n進行描画の戻り値 ! = 0 )
{
if ( ! bコンパクトモード )
{
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ タイトル" ) ;
stageタイトル . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stageタイトル ;
}
else
{
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 ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
}
//-----------------------------
#endregion
break ;
case CStage . Eステージ . タ イ ト ル :
#region [ * * * ]
//-----------------------------
switch ( this . n進行描画の戻り値 )
{
case ( int ) CStageタイトル . E戻り値 . GAMESTART :
#region [ 選 曲 処 理 へ ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 選曲" ) ;
stage選曲 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage選曲 ;
2022-01-06 08:30:21 +01:00
TJAPlayer3 . latestSongSelect = stage選曲 ;
//-----------------------------
2021-09-21 00:16:38 +02:00
#endregion
break ;
case ( int ) CStageタイトル . E戻り値 . DANGAMESTART :
#region [ 段 位 選 択 処 理 へ ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 段位選択" ) ;
2022-01-06 08:30:21 +01:00
stage段位選択 . On活性化 ( ) ;
2021-09-21 00:16:38 +02:00
r直前のステージ = r現在のステージ ;
r現在のステージ = stage段位選択 ;
2022-01-06 08:30:21 +01:00
TJAPlayer3 . latestSongSelect = stage段位選択 ;
//-----------------------------
2021-09-21 00:16:38 +02:00
#endregion
break ;
2021-11-12 18:32:04 +01:00
case ( int ) CStageタイトル . E戻り値 . HEYA :
#region [ Heya menu ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ Taiko Heya" ) ;
stageHeya . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stageHeya ;
//-----------------------------
#endregion
break ;
2021-09-21 00:16:38 +02:00
#region [ OPTION : 廃 止 済 ]
2021-11-12 18:32:04 +01:00
// case 2: // #24525 OPTIONとCONFIGの統合に伴い、OPTIONは廃止
// #region [ *** ]
// //-----------------------------
// r現在のステージ.On非活性化();
// Trace.TraceInformation( "----------------------" );
// Trace.TraceInformation( "■ オプション" );
// stageオプション.On活性化();
// r直前のステージ = r現在のステージ;
// r現在のステージ = stageオプション;
// //-----------------------------
// #endregion
// break;
2021-09-21 00:16:38 +02:00
#endregion
2021-11-12 18:32:04 +01:00
2021-09-21 00:16:38 +02:00
case ( int ) CStageタイトル . E戻り値 . CONFIG :
#region [ * * * ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ コンフィグ" ) ;
stageコンフィグ . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stageコンフィグ ;
//-----------------------------
#endregion
break ;
case ( int ) CStageタイトル . E戻り値 . EXIT :
#region [ * * * ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 終了" ) ;
stage終了 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage終了 ;
//-----------------------------
#endregion
break ;
}
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//this.tガベージコレクションを実行する(); // #31980 2013.9.3 yyagi タイトル画面でだけ、毎フレームGCを実行して重くなっていた問題の修正
//-----------------------------
#endregion
break ;
case CStage . Eステージ . コ ン フ ィ グ :
#region [ * * * ]
//-----------------------------
if ( this . n進行描画の戻り値 ! = 0 )
{
switch ( r直前のステージ . eステージID )
{
case 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 ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
case 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 ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
}
}
//-----------------------------
#endregion
break ;
case CStage . Eステージ . 選 曲 :
#region [ * * * ]
//-----------------------------
switch ( this . n進行描画の戻り値 )
{
case ( int ) CStage選曲 . E戻り値 . タ イ ト ル に 戻 る :
#region [ * * * ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ タイトル" ) ;
stageタイトル . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stageタイトル ;
2021-10-13 04:18:11 +02:00
/ *
2021-09-21 00:16:38 +02:00
Skin . bgm選曲画面イン . t停止する ( ) ;
Skin . bgm選曲画面 . t停止する ( ) ;
2021-10-13 04:18:11 +02:00
* /
CSongSelectSongManager . stopSong ( ) ;
CSongSelectSongManager . enable ( ) ;
2021-09-21 00:16:38 +02:00
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
case ( int ) CStage選曲 . E戻り値 . 選 曲 し た :
#region [ * * * ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 曲読み込み" ) ;
stage曲読み込み . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
2021-10-13 04:18:11 +02:00
r現在のステージ = stage曲読み込み ;
/ *
2021-09-21 00:16:38 +02:00
Skin . bgm選曲画面イン . t停止する ( ) ;
Skin . bgm選曲画面 . t停止する ( ) ;
2021-10-13 04:18:11 +02:00
* /
CSongSelectSongManager . stopSong ( ) ;
CSongSelectSongManager . enable ( ) ;
2021-09-21 00:16:38 +02:00
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
// 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;
// //-----------------------------
#endregion
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 ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
case ( int ) CStage選曲 . E戻り値 . ス キ ン 変 更 :
#region [ * * * ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ スキン切り替え" ) ;
stageChangeSkin . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stageChangeSkin ;
break ;
//-----------------------------
#endregion
}
//-----------------------------
#endregion
break ;
case CStage . Eステージ . 段 位 選 択 :
#region [ * * * ]
switch ( this . n進行描画の戻り値 )
{
case ( int ) CStage選曲 . E戻り値 . タ イ ト ル に 戻 る :
#region [ * * * ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ タイトル" ) ;
stageタイトル . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
2021-10-13 04:18:11 +02:00
r現在のステージ = stageタイトル ;
/ *
2021-09-21 00:16:38 +02:00
Skin . bgm選曲画面イン . t停止する ( ) ;
Skin . bgm選曲画面 . t停止する ( ) ;
2021-10-13 04:18:11 +02:00
* /
CSongSelectSongManager . stopSong ( ) ;
CSongSelectSongManager . enable ( ) ;
2021-09-21 00:16:38 +02:00
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
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 ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
}
#endregion
break ;
2021-11-12 18:32:04 +01:00
case CStage . Eステージ . Heya :
#region [ * * * ]
switch ( this . n進行描画の戻り値 )
{
case ( int ) CStage選曲 . E戻り値 . タ イ ト ル に 戻 る :
#region [ * * * ]
//-----------------------------
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ タイトル" ) ;
stageタイトル . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stageタイトル ;
CSongSelectSongManager . stopSong ( ) ;
CSongSelectSongManager . enable ( ) ;
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
}
#endregion
break ;
case CStage . Eステージ . 曲 読 み 込 み :
2021-09-21 00:16:38 +02:00
#region [ * * * ]
//-----------------------------
DTXVmode . Refreshed = false ; // 曲のリロード中に発生した再リロードは、無視する。
if ( this . n進行描画の戻り値 ! = 0 )
{
TJAPlayer3 . Pad . st検知したデバイス . Clear ( ) ; // 入力デバイスフラグクリア(2010.9.11)
r現在のステージ . On非活性化 ( ) ;
#region [ ESC押下時は 、 曲 の 読 み 込 み を 中 止 し て 選 曲 画 面 に 戻 る ]
if ( this . n進行描画の戻り値 = = ( int ) E曲読込画面の戻り値 . 読 込 中 止 )
{
//DTX.t全チップの再生停止();
if ( DTX ! = null )
2022-01-06 08:30:21 +01:00
DTX . On非活性化 ( ) ;
// ???
/ *
2021-09-21 00:16:38 +02:00
if ( stage選曲 . n確定された曲の難易度 [ 0 ] = = ( int ) Difficulty . Dan )
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 段位選択" ) ;
stage段位選択 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage段位選択 ;
}
else
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 選曲" ) ;
stage選曲 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage選曲 ;
}
2022-01-06 08:30:21 +01:00
* /
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ Return to song select menu" ) ;
TJAPlayer3 . latestSongSelect . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
// Seek latest registered song select screen
r現在のステージ = TJAPlayer3 . latestSongSelect ;
2021-09-21 00:16:38 +02:00
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
2022-01-06 08:30:21 +01:00
2021-09-21 00:16:38 +02:00
break ;
}
#endregion
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 演奏(ドラム画面)" ) ;
#if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
for ( int i = 0 ; i < 5 ; i + + )
{
for ( int j = 0 ; j < 2 ; j + + )
{
stage演奏ドラム画面 . fDamageGaugeDelta [ i , j ] = ConfigIni . fGaugeFactor [ i , j ] ;
}
}
for ( int i = 0 ; i < 3 ; i + + ) {
stage演奏ドラム画面 . fDamageLevelFactor [ i ] = ConfigIni . fDamageLevelFactor [ i ] ;
}
#endif
r直前のステージ = r現在のステージ ;
r現在のステージ = stage演奏ドラム画面 ;
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
}
//-----------------------------
#endregion
break ;
case CStage . Eステージ . 演 奏 :
#region [ * * * ]
#region [ DTXVモード中にDTXCreatorから指示を受けた場合の処理 ]
if ( DTXVmode . Enabled & & DTXVmode . Refreshed )
{
DTXVmode . Refreshed = false ;
if ( DTXVmode . Command = = CDTXVmode . ECommand . Stop )
{
TJAPlayer3 . stage演奏ドラム画面 . t停止 ( ) ;
if ( previewSound ! = null )
{
this . previewSound . tサウンドを停止する ( ) ;
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();
//}
}
else if ( DTXVmode . Command = = CDTXVmode . ECommand . Play )
{
if ( DTXVmode . NeedReload )
{
TJAPlayer3 . stage演奏ドラム画面 . t再読込 ( ) ;
TJAPlayer3 . ConfigIni . bTimeStretch = DTXVmode . TimeStretch ;
CSound管理 . bIsTimeStretch = DTXVmode . TimeStretch ;
if ( TJAPlayer3 . ConfigIni . b垂直帰線待ちを行う ! = DTXVmode . VSyncWait )
{
TJAPlayer3 . ConfigIni . b垂直帰線待ちを行う = DTXVmode . VSyncWait ;
TJAPlayer3 . app . b次のタイミングで垂直帰線同期切り替えを行う = true ;
}
}
else
{
TJAPlayer3 . stage演奏ドラム画面 . t演奏位置の変更 ( TJAPlayer3 . DTXVmode . nStartBar , 0 ) ;
}
}
}
#endregion
switch ( this . n進行描画の戻り値 )
{
case ( int ) E演奏画面の戻り値 . 再 読 込 _再演奏 :
#region [ DTXファイルを再読み込みして 、 再 演 奏 ]
DTX . t全チップの再生停止 ( ) ;
DTX . On非活性化 ( ) ;
r現在のステージ . On非活性化 ( ) ;
stage曲読み込み . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage曲読み込み ;
this . tガベージコレクションを実行する ( ) ;
break ;
#endregion
//case (int) E演奏画面の戻り値.再演奏:
#region [ 再 読 み 込 み 無 し で 、 再 演 奏 ]
#endregion
// break;
case ( int ) E演奏画面の戻り値 . 継 続 :
break ;
case ( int ) E演奏画面の戻り値 . 演 奏 中 断 :
#region [ 演 奏 キ ャ ン セ ル ]
//-----------------------------
scoreIni = this . tScoreIniへBGMAdjustとHistoryとPlayCountを更新 ( "Play canceled" ) ;
#region [ プ ラ グ イ ン On演奏キャンセル ( ) の 呼 び 出 し ]
//---------------------
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . On演奏キャンセル ( scoreIni ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//---------------------
#endregion
DTX . t全チップの再生停止 ( ) ;
DTX . On非活性化 ( ) ;
r現在のステージ . On非活性化 ( ) ;
if ( bコンパクトモード )
{
base . Window . Close ( ) ;
}
else
{
2022-01-06 08:30:21 +01:00
// Play cancelled return screen
/ *
2021-09-21 00:16:38 +02:00
if ( stage選曲 . n確定された曲の難易度 [ 0 ] = = ( int ) Difficulty . Dan )
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 段位選択" ) ;
stage段位選択 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage段位選択 ;
}
else
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 選曲" ) ;
stage選曲 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage選曲 ;
}
2022-01-06 08:30:21 +01:00
* /
2021-09-21 00:16:38 +02:00
2022-01-06 08:30:21 +01:00
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ Return to song select menu" ) ;
TJAPlayer3 . latestSongSelect . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
// Seek latest registered song select screen
r現在のステージ = TJAPlayer3 . latestSongSelect ;
2021-09-21 00:16:38 +02:00
#region [ プ ラ グ イ ン Onステージ変更 ( ) の 呼 び 出 し ]
2022-01-06 08:30:21 +01:00
//---------------------
2021-09-21 00:16:38 +02:00
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//---------------------
#endregion
this . tガベージコレクションを実行する ( ) ;
}
this . tガベージコレクションを実行する ( ) ;
break ;
//-----------------------------
#endregion
case ( int ) E演奏画面の戻り値 . ス テ ー ジ 失 敗 :
#region [ 演 奏 失 敗 ( StageFailed ) ]
//-----------------------------
scoreIni = this . tScoreIniへBGMAdjustとHistoryとPlayCountを更新 ( "Stage failed" ) ;
#region [ プ ラ グ イ ン On演奏失敗 ( ) の 呼 び 出 し ]
//---------------------
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . On演奏失敗 ( scoreIni ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//---------------------
#endregion
DTX . t全チップの再生停止 ( ) ;
DTX . On非活性化 ( ) ;
r現在のステージ . On非活性化 ( ) ;
if ( bコンパクトモード )
{
base . Window . Close ( ) ;
}
else
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 選曲" ) ;
stage選曲 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage選曲 ;
#region [ プ ラ グ イ ン Onステージ変更 ( ) の 呼 び 出 し ]
//---------------------
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//---------------------
#endregion
this . tガベージコレクションを実行する ( ) ;
}
break ;
//-----------------------------
#endregion
case ( int ) E演奏画面の戻り値 . ス テ ー ジ ク リ ア :
#region [ 演 奏 ク リ ア ]
//-----------------------------
CScoreIni . C演奏記録 c演奏記録_Drums ;
stage演奏ドラム画面 . t演奏結果を格納する ( out c演奏記録_Drums ) ;
double ps = 0.0 , gs = 0.0 ;
if ( ! c演奏記録_Drums . b全AUTOである & & c演奏記録_Drums . n全チップ数 > 0 ) {
ps = c演奏記録_Drums . db演奏型スキル値 ;
gs = c演奏記録_Drums . dbゲーム型スキル値 ;
}
string str = "Cleared" ;
switch ( CScoreIni . t総合ランク値を計算して返す ( c演奏記録_Drums , null , null ) )
{
case ( int ) CScoreIni . ERANK . SS :
str = string . Format ( "Cleared (SS: {0:F2})" , ps ) ;
break ;
case ( int ) CScoreIni . ERANK . S :
str = string . Format ( "Cleared (S: {0:F2})" , ps ) ;
break ;
case ( int ) CScoreIni . ERANK . A :
str = string . Format ( "Cleared (A: {0:F2})" , ps ) ;
break ;
case ( int ) CScoreIni . ERANK . B :
str = string . Format ( "Cleared (B: {0:F2})" , ps ) ;
break ;
case ( int ) CScoreIni . ERANK . C :
str = string . Format ( "Cleared (C: {0:F2})" , ps ) ;
break ;
case ( int ) CScoreIni . ERANK . D :
str = string . Format ( "Cleared (D: {0:F2})" , ps ) ;
break ;
case ( int ) CScoreIni . ERANK . E :
str = string . Format ( "Cleared (E: {0:F2})" , ps ) ;
break ;
case ( int ) CScoreIni . ERANK . UNKNOWN : // #23534 2010.10.28 yyagi add: 演奏チップが0個のとき
str = "Cleared (No chips)" ;
break ;
}
scoreIni = this . tScoreIniへBGMAdjustとHistoryとPlayCountを更新 ( str ) ;
#region [ プ ラ グ イ ン On演奏クリア ( ) の 呼 び 出 し ]
//---------------------
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . On演奏クリア ( scoreIni ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//---------------------
#endregion
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 結果" ) ;
stage結果 . st演奏記録 . Drums = c演奏記録_Drums ;
stage結果 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage結果 ;
#region [ プ ラ グ イ ン Onステージ変更 ( ) の 呼 び 出 し ]
//---------------------
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
//---------------------
#endregion
break ;
//-----------------------------
#endregion
}
//-----------------------------
#endregion
break ;
case CStage . Eステージ . 結 果 :
#region [ * * * ]
//-----------------------------
if ( this . n進行描画の戻り値 ! = 0 )
{
//DTX.t全チップの再生一時停止();
DTX . t全チップの再生停止とミキサーからの削除 ( ) ;
DTX . On非活性化 ( ) ;
r現在のステージ . On非活性化 ( ) ;
this . tガベージコレクションを実行する ( ) ;
if ( ! bコンパクトモード )
2022-01-06 08:30:21 +01:00
{
// After result screen
/ *
2021-09-21 00:16:38 +02:00
if ( stage選曲 . n確定された曲の難易度 [ 0 ] = = ( int ) Difficulty . Dan )
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 段位選択" ) ;
stage段位選択 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage段位選択 ;
}
else
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 選曲" ) ;
stage選曲 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage選曲 ;
}
2022-01-06 08:30:21 +01:00
* /
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ Return to song select menu" ) ;
TJAPlayer3 . latestSongSelect . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
// Seek latest registered song select screen
r現在のステージ = TJAPlayer3 . latestSongSelect ;
2021-09-21 00:16:38 +02:00
stage選曲 . NowSong + + ;
foreach ( STPlugin pg in this . listプラグイン )
{
Directory . SetCurrentDirectory ( pg . strプラグインフォルダ ) ;
pg . plugin . Onステージ変更 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
this . tガベージコレクションを実行する ( ) ;
}
else
{
base . Window . Close ( ) ;
}
}
//-----------------------------
#endregion
break ;
case CStage . Eステージ . ChangeSkin :
#region [ * * * ]
//-----------------------------
if ( this . n進行描画の戻り値 ! = 0 )
{
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 選曲" ) ;
stage選曲 . On活性化 ( ) ;
r直前のステージ = r現在のステージ ;
r現在のステージ = stage選曲 ;
this . tガベージコレクションを実行する ( ) ;
}
//-----------------------------
#endregion
break ;
case CStage . Eステージ . 終 了 :
#region [ * * * ]
//-----------------------------
if ( this . n進行描画の戻り値 ! = 0 )
{
base . Exit ( ) ;
}
//-----------------------------
#endregion
break ;
}
actScanningLoudness . On進行描画 ( ) ;
if ( r現在のステージ ! = null & & r現在のステージ . eステージID ! = CStage . Eステージ . 起 動 & & TJAPlayer3 . Tx . Network_Connection ! = null )
{
if ( Math . Abs ( CSound管理 . rc演奏用タイマ . nシステム時刻ms - this . 前 回 の シ ス テ ム 時 刻 ms ) > 10000 )
{
this . 前 回 の シ ス テ ム 時 刻 ms = CSound管理 . rc演奏用タイマ . nシステム時刻ms ;
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 ;
} ) ;
}
TJAPlayer3 . Tx . Network_Connection . t2D描画 ( app . Device , GameWindowSize . Width - ( TJAPlayer3 . Tx . Network_Connection . szテクスチャサイズ . Width / 2 ) , GameWindowSize . Height - TJAPlayer3 . Tx . Network_Connection . szテクスチャサイズ . Height , new Rectangle ( ( TJAPlayer3 . Tx . Network_Connection . szテクスチャサイズ . Width / 2 ) * ( this . bネットワークに接続中 ? 0 : 1 ) , 0 , TJAPlayer3 . Tx . Network_Connection . szテクスチャサイズ . Width / 2 , TJAPlayer3 . Tx . Network_Connection . szテクスチャサイズ . Height ) ) ;
}
// オーバレイを描画する(テクスチャの生成されていない起動ステージは例外
if ( r現在のステージ ! = null & & r現在のステージ . eステージID ! = CStage . Eステージ . 起 動 & & TJAPlayer3 . Tx . Overlay ! = null )
{
TJAPlayer3 . Tx . Overlay . t2D描画 ( app . Device , 0 , 0 ) ;
}
}
this . Device . EndScene ( ) ; // Present()は game.csのOnFrameEnd()に登録された、GraphicsDeviceManager.game_FrameEnd() 内で実行されるので不要
// (つまり、Present()は、Draw()完了後に実行される)
#if ! GPUFlushAfterPresent
actFlushGPU ? . On進行描画 ( ) ; // Flush GPU // EndScene()~ Present()間 (つまりVSync前) でFlush実行
#endif
2021-11-29 09:03:36 +01:00
/ *
2021-09-21 00:16:38 +02:00
if ( Sound管理 ? . GetCurrentSoundDeviceType ( ) ! = "DirectSound" )
{
Sound管理 ? . t再生中の処理をする ( ) ; // サウンドバッファの更新; 画面描画と同期させることで、スクロールをスムーズにする
}
2021-11-29 09:03:36 +01:00
* /
2021-09-21 00:16:38 +02:00
#region [ 全 画 面 _ウインドウ切り替え ]
if ( this . b次のタイミングで全画面_ウィンドウ切り替えを行う )
{
ConfigIni . b全画面モード = ! ConfigIni . b全画面モード ;
app . t全画面_ウィンドウモード切り替え ( ) ;
this . b次のタイミングで全画面_ウィンドウ切り替えを行う = false ;
}
#endregion
#region [ 垂 直 基 線 同 期 切 り 替 え ]
if ( this . b次のタイミングで垂直帰線同期切り替えを行う )
{
bool bIsMaximized = this . Window . IsMaximized ; // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait
currentClientSize = this . Window . ClientSize ; // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait
DeviceSettings currentSettings = app . GraphicsDeviceManager . CurrentSettings ;
currentSettings . EnableVSync = ConfigIni . b垂直帰線待ちを行う ;
app . GraphicsDeviceManager . ChangeDevice ( currentSettings ) ;
this . b次のタイミングで垂直帰線同期切り替えを行う = false ;
base . Window . ClientSize = new Size ( currentClientSize . Width , currentClientSize . Height ) ; // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait
if ( bIsMaximized )
{
this . Window . WindowState = FormWindowState . Maximized ; // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait
}
}
#endregion
}
// その他
#region [ 汎 用 ヘ ル パ ー ]
//-----------------
public static CTexture tテクスチャの生成 ( string fileName )
{
return tテクスチャの生成 ( fileName , false ) ;
}
public static CTexture tテクスチャの生成 ( string fileName , bool b黒を透過する )
{
if ( app = = null )
{
return null ;
}
try
{
return new CTexture ( app . Device , fileName , TextureFormat , b黒を透過する ) ;
}
catch ( CTextureCreateFailedException e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "テクスチャの生成に失敗しました。({0})" , fileName ) ;
return null ;
}
catch ( FileNotFoundException )
{
Trace . TraceWarning ( "テクスチャファイルが見つかりませんでした。({0})" , fileName ) ;
return null ;
}
}
public static void tテクスチャの解放 ( ref CTexture tx )
{
TJAPlayer3 . t安全にDisposeする ( ref tx ) ;
}
public static void tテクスチャの解放 ( ref CTextureAf tx )
{
TJAPlayer3 . t安全にDisposeする ( ref tx ) ;
}
public static CTexture tテクスチャの生成 ( byte [ ] txData )
{
return tテクスチャの生成 ( txData , false ) ;
}
public static CTexture tテクスチャの生成 ( byte [ ] txData , bool b黒を透過する )
{
if ( app = = null )
{
return null ;
}
try
{
return new CTexture ( app . Device , txData , TextureFormat , b黒を透過する ) ;
}
catch ( CTextureCreateFailedException e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "テクスチャの生成に失敗しました。(txData)" ) ;
return null ;
}
}
public static CTexture tテクスチャの生成 ( Bitmap bitmap )
{
return tテクスチャの生成 ( bitmap , false ) ;
}
public static CTexture tテクスチャの生成 ( Bitmap bitmap , bool b黒を透過する )
{
if ( app = = null )
{
return null ;
}
if ( bitmap = = null )
{
Trace . TraceError ( "テクスチャの生成に失敗しました。(bitmap==null)" ) ;
return null ;
}
try
{
return new CTexture ( app . Device , bitmap , TextureFormat , b黒を透過する ) ;
}
catch ( CTextureCreateFailedException e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "テクスチャの生成に失敗しました。(txData)" ) ;
return null ;
}
}
public static CTextureAf tテクスチャの生成Af ( string fileName )
{
return tテクスチャの生成Af ( fileName , false ) ;
}
public static CTextureAf tテクスチャの生成Af ( string fileName , bool b黒を透過する )
{
if ( app = = null )
{
return null ;
}
try
{
return new CTextureAf ( app . Device , fileName , TextureFormat , b黒を透過する ) ;
}
catch ( CTextureCreateFailedException e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "テクスチャの生成に失敗しました。({0})" , fileName ) ;
return null ;
}
catch ( FileNotFoundException e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "テクスチャファイルが見つかりませんでした。({0})" , fileName ) ;
return null ;
}
}
public static CDirectShow t失敗してもスキップ可能なDirectShowを生成する ( string fileName , IntPtr hWnd , bool bオーディオレンダラなし )
{
CDirectShow ds = null ;
if ( File . Exists ( fileName ) )
{
try
{
ds = new CDirectShow ( fileName , hWnd , bオーディオレンダラなし ) ;
}
catch ( FileNotFoundException e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "動画ファイルが見つかりませんでした。({0})" , fileName ) ;
ds = null ; // Dispose はコンストラクタ内で実施済み
}
catch ( Exception e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "DirectShow の生成に失敗しました。[{0}]" , fileName ) ;
ds = null ; // Dispose はコンストラクタ内で実施済み
}
}
else
{
Trace . TraceError ( "動画ファイルが見つかりませんでした。({0})" , fileName ) ;
return null ;
}
return ds ;
}
/// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>
public static void t安全にDisposeする < T > ( ref T obj )
{
if ( obj = = null )
return ;
var d = obj as IDisposable ;
if ( d ! = null )
d . Dispose ( ) ;
obj = default ( T ) ;
}
public static void t安全にDisposeする < T > ( ref T [ ] array ) where T : class , IDisposable //2020.08.01 Mr-Ojii twopointzero氏のソースコードをもとに追加
{
if ( array = = null )
{
return ;
}
for ( var i = 0 ; i < array . Length ; i + + )
{
array [ i ] ? . Dispose ( ) ;
array [ i ] = null ;
}
}
/// <summary>
/// そのフォルダの連番画像の最大値を返す。
/// </summary>
public static int t連番画像の枚数を数える ( string デ ィ レ ク ト リ 名 , string プ レ フ ィ ッ ク ス = "" , string 拡 張 子 = ".png" )
{
int num = 0 ;
while ( File . Exists ( デ ィ レ ク ト リ 名 + プ レ フ ィ ッ ク ス + num + 拡 張 子 ) )
{
num + + ;
}
return num ;
}
/// <summary>
/// 曲名テクスチャの縮小倍率を返す。
/// </summary>
/// <param name="cTexture">曲名テクスチャ。</param>
/// <param name="samePixel">等倍で表示するピクセル数の最大値(デフォルト値:645)</param>
/// <returns>曲名テクスチャの縮小倍率。そのテクスチャがnullならば一倍(1f)を返す。</returns>
public static float GetSongNameXScaling ( ref CTexture cTexture , int samePixel = 660 )
{
if ( cTexture = = null ) return 1f ;
float scalingRate = ( float ) samePixel / ( float ) cTexture . szテクスチャサイズ . Width ;
if ( cTexture . szテクスチャサイズ . Width < = samePixel )
scalingRate = 1.0f ;
return scalingRate ;
}
/// <summary>
/// 難易度を表す数字を列挙体に変換します。
/// </summary>
/// <param name="number">難易度を表す数字。</param>
/// <returns>Difficulty 列挙体</returns>
public static Difficulty DifficultyNumberToEnum ( int number )
{
switch ( number )
{
case 0 :
return Difficulty . Easy ;
case 1 :
return Difficulty . Normal ;
case 2 :
return Difficulty . Hard ;
case 3 :
return Difficulty . Oni ;
case 4 :
return Difficulty . Edit ;
case 5 :
return Difficulty . Tower ;
case 6 :
return Difficulty . Dan ;
default :
throw new IndexOutOfRangeException ( ) ;
}
}
//-----------------
#endregion
#region [ private ]
//-----------------
private bool bマウスカーソル表示中 = true ;
private bool b終了処理完了済み ;
private bool bネットワークに接続中 = false ;
private long 前 回 の シ ス テ ム 時 刻 ms = long . MinValue ;
private static CDTX [ ] dtx = new CDTX [ 4 ] ;
public static TextureLoader Tx = new TextureLoader ( ) ;
private List < CActivity > listトップレベルActivities ;
private int n進行描画の戻り値 ;
private MouseButtons mb = System . Windows . Forms . MouseButtons . Left ;
private string strWindowTitle
{
get
{
if ( DTXVmode . Enabled )
{
return "DTXViewer release " + VERSION ;
}
else
{
return "TJAPlayer3 feat.DTXMania" ;
}
}
}
private CSound previewSound ;
public static long StartupTime
{
get ;
private set ;
}
private void t起動処理 ( )
{
#region [ strEXEのあるフォルダを決定する ]
//-----------------
// BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)
#if DEBUG
strEXEのあるフォルダ = Environment . CurrentDirectory + @"\" ;
#else
strEXEのあるフォルダ = Path . GetDirectoryName ( Application . ExecutablePath ) + @"\" ; // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.
#endif
// END #23629 2010.11.13 from
//-----------------
#endregion
2022-03-02 08:00:37 +01:00
#region [ Read Config . ini and Database files ]
2021-09-21 00:16:38 +02:00
//---------------------
NamePlateConfig = new NamePlateConfig ( ) ;
NamePlateConfig . tNamePlateConfig ( ) ;
2022-02-05 16:25:58 +01:00
2022-03-02 08:00:37 +01:00
Favorites = new Favorites ( ) ;
Favorites . tFavorites ( ) ;
2022-03-14 23:47:03 +01:00
RecentlyPlayedSongs = new RecentlyPlayedSongs ( ) ;
RecentlyPlayedSongs . tRecentlyPlayedSongs ( ) ;
2022-02-05 16:25:58 +01:00
Databases = new Databases ( ) ;
Databases . tDatabases ( ) ;
2021-09-21 00:16:38 +02:00
ConfigIni = new CConfigIni ( ) ;
string path = strEXEのあるフォルダ + "Config.ini" ;
if ( File . Exists ( path ) )
{
try
{
2021-11-22 01:07:50 +01:00
// Load config info
2021-09-21 00:16:38 +02:00
ConfigIni . tファイルから読み込み ( path ) ;
}
catch ( Exception e )
{
//ConfigIni = new CConfigIni(); // 存在してなければ新規生成
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "例外が発生しましたが処理を継続します。 (b8d93255-bbe4-4ca3-8264-7ee5175b19f3)" ) ;
}
}
this . Window . EnableSystemMenu = TJAPlayer3 . ConfigIni . bIsEnabledSystemMenu ; // #28200 2011.5.1 yyagi
// 2012.8.22 Config.iniが無いときに初期値が適用されるよう、この設定行をifブロック外に移動
2022-03-07 16:05:35 +01:00
// Init Modal fonts once config.ini parsing is done
Modal . tInitModalFonts ( ) ;
2021-09-21 00:16:38 +02:00
//---------------------
#endregion
#region [ ロ グ 出 力 開 始 ]
//---------------------
Trace . AutoFlush = true ;
if ( ConfigIni . bログ出力 )
{
try
{
2021-11-23 01:29:44 +01:00
Trace . Listeners . Add ( new CTraceLogListener ( new StreamWriter ( System . IO . Path . Combine ( strEXEのあるフォルダ , "TJAPlayer3.log" ) , false , Encoding . GetEncoding ( TJAPlayer3 . sEncType ) ) ) ) ;
2021-09-21 00:16:38 +02:00
}
catch ( System . UnauthorizedAccessException ) // #24481 2011.2.20 yyagi
{
int c = ( CultureInfo . CurrentUICulture . TwoLetterISOLanguageName = = "ja" ) ? 0 : 1 ;
string [ ] mes_writeErr = {
"DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。" ,
"Failed to write DTXManiaLog.txt. Please set it writable and try again."
} ;
MessageBox . Show ( mes_writeErr [ c ] , "DTXMania boot error" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
Environment . Exit ( 1 ) ;
}
}
Trace . WriteLine ( "" ) ;
Trace . WriteLine ( "DTXMania powered by YAMAHA Silent Session Drums" ) ;
Trace . WriteLine ( string . Format ( "Release: {0}" , VERSION ) ) ;
Trace . WriteLine ( "" ) ;
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ アプリケーションの初期化" ) ;
Trace . TraceInformation ( "OS Version: " + Environment . OSVersion ) ;
Trace . TraceInformation ( "ProcessorCount: " + Environment . ProcessorCount . ToString ( ) ) ;
Trace . TraceInformation ( "CLR Version: " + Environment . Version . ToString ( ) ) ;
//---------------------
#endregion
#region [ DTXVmodeクラス の 初 期 化 ]
//---------------------
//Trace.TraceInformation( "DTXVモードの初期化を行います。" );
//Trace.Indent();
try
{
DTXVmode = new CDTXVmode ( ) ;
DTXVmode . Enabled = false ;
//Trace.TraceInformation( "DTXVモードの初期化を完了しました。" );
}
finally
{
//Trace.Unindent();
}
//---------------------
#endregion
#region [ ウ ィ ン ド ウ 初 期 化 ]
//---------------------
base . Window . StartPosition = FormStartPosition . Manual ; // #30675 2013.02.04 ikanick add
base . Window . Location = new Point ( ConfigIni . n初期ウィンドウ開始位置X , ConfigIni . n初期ウィンドウ開始位置Y ) ; // #30675 2013.02.04 ikanick add
base . Window . Text = "" ;
base . Window . StartPosition = FormStartPosition . Manual ; // #30675 2013.02.04 ikanick add
base . Window . Location = new Point ( ConfigIni . n初期ウィンドウ開始位置X , ConfigIni . n初期ウィンドウ開始位置Y ) ; // #30675 2013.02.04 ikanick add
base . Window . ClientSize = new Size ( ConfigIni . nウインドウwidth , ConfigIni . nウインドウheight ) ; // #34510 yyagi 2010.10.31 to change window size got from Config.ini
#if ! WindowedFullscreen
if ( ! ConfigIni . bウィンドウモード ) // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode
{ // #30666 2013.02.02 yyagi: currentClientSize should be always made
#endif
currentClientSize = new Size ( ConfigIni . nウインドウwidth , ConfigIni . nウインドウheight ) ;
#if ! WindowedFullscreen
}
#endif
base . Window . MaximizeBox = true ; // #23510 2010.11.04 yyagi: to support maximizing window
base . Window . FormBorderStyle = FormBorderStyle . Sizable ; // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize
// #30666 2013.02.02 yyagi: moved the code to t全画面_ウインドウモード切り替え()
base . Window . ShowIcon = true ;
base . Window . Icon = global :: TJAPlayer3 . Properties . Resources . tjap3 ;
base . Window . KeyDown + = new KeyEventHandler ( this . Window_KeyDown ) ;
base . Window . MouseUp + = new MouseEventHandler ( this . Window_MouseUp ) ;
base . Window . MouseDoubleClick + = new MouseEventHandler ( this . Window_MouseDoubleClick ) ; // #23510 2010.11.13 yyagi: to go fullscreen mode
base . Window . ResizeEnd + = new EventHandler ( this . Window_ResizeEnd ) ; // #23510 2010.11.20 yyagi: to set resized window size in Config.ini
base . Window . ApplicationActivated + = new EventHandler ( this . Window_ApplicationActivated ) ;
base . Window . ApplicationDeactivated + = new EventHandler ( this . Window_ApplicationDeactivated ) ;
//---------------------
#endregion
#region [ Direct3D9Exを使うかどうか判定 ]
#endregion
#region [ Direct3D9 デ バ イ ス の 生 成 ]
//---------------------
DeviceSettings settings = new DeviceSettings ( ) ;
#if WindowedFullscreen
settings . Windowed = true ; // #30666 2013.2.2 yyagi: Fullscreenmode is "Maximized window" mode
#else
settings . Windowed = ConfigIni . bウィンドウモード ;
#endif
settings . BackBufferWidth = SampleFramework . GameWindowSize . Width ;
settings . BackBufferHeight = SampleFramework . GameWindowSize . Height ;
// settings.BackBufferCount = 3;
settings . EnableVSync = ConfigIni . b垂直帰線待ちを行う ;
// settings.BackBufferFormat = Format.A8R8G8B8;
// settings.MultisampleType = MultisampleType.FourSamples;
// settings.MultisampleQuality = 4;
// settings.MultisampleType = MultisampleType.None;
// settings.MultisampleQuality = 0;
try
{
base . GraphicsDeviceManager . ChangeDevice ( settings ) ;
}
catch ( DeviceCreationException e )
{
Trace . TraceError ( e . ToString ( ) ) ;
MessageBox . Show ( e . ToString ( ) , "DTXMania failed to boot: DirectX9 Initialize Error" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
Environment . Exit ( - 1 ) ;
}
base . IsFixedTimeStep = false ;
// base.TargetElapsedTime = TimeSpan.FromTicks( 10000000 / 75 );
base . Window . ClientSize = new Size ( ConfigIni . nウインドウwidth , ConfigIni . nウインドウheight ) ; // #23510 2010.10.31 yyagi: to recover window size. width and height are able to get from Config.ini.
base . InactiveSleepTime = TimeSpan . FromMilliseconds ( ( float ) ( ConfigIni . n非フォーカス時スリープms ) ) ; // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive
// #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )
#if WindowedFullscreen
this . t全画面_ウィンドウモード切り替え ( ) ; // #30666 2013.2.2 yyagi: finalize settings for "Maximized window mode"
#endif
actFlushGPU = new CActFlushGPU ( ) ;
//---------------------
#endregion
DTX = null ;
#region [ Skin の 初 期 化 ]
//---------------------
Trace . TraceInformation ( "スキンの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
Skin = new CSkin ( TJAPlayer3 . ConfigIni . strSystemSkinSubfolderFullName , false ) ;
TJAPlayer3 . ConfigIni . strSystemSkinSubfolderFullName = TJAPlayer3 . Skin . GetCurrentSkinSubfolderFullName ( true ) ; // 旧指定のSkinフォルダが消滅していた場合に備える
Trace . TraceInformation ( "スキンの初期化を完了しました。" ) ;
}
catch ( Exception e )
{
Trace . TraceInformation ( "スキンの初期化に失敗しました。" ) ;
throw ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
//-----------
#region [ Timer の 初 期 化 ]
//---------------------
Trace . TraceInformation ( "タイマの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
Timer = new CTimer ( CTimer . E種別 . MultiMedia ) ;
Trace . TraceInformation ( "タイマの初期化を完了しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
//-----------
#region [ FPS カ ウ ン タ の 初 期 化 ]
//---------------------
Trace . TraceInformation ( "FPSカウンタの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
FPS = new CFPS ( ) ;
Trace . TraceInformation ( "FPSカウンタを生成しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ act文字コンソールの初期化 ]
//---------------------
Trace . TraceInformation ( "文字コンソールの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
act文字コンソール = new C文字コンソール ( ) ;
Trace . TraceInformation ( "文字コンソールを生成しました。" ) ;
act文字コンソール . On活性化 ( ) ;
Trace . TraceInformation ( "文字コンソールを活性化しました。" ) ;
Trace . TraceInformation ( "文字コンソールの初期化を完了しました。" ) ;
}
catch ( Exception exception )
{
Trace . TraceError ( exception . ToString ( ) ) ;
Trace . TraceError ( "文字コンソールの初期化に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ Input管理 の 初 期 化 ]
//---------------------
Trace . TraceInformation ( "DirectInput, MIDI入力の初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
bool bUseMIDIIn = ! DTXVmode . Enabled ;
Input管理 = new CInput管理 ( base . Window . Handle , bUseMIDIIn ) ;
foreach ( IInputDevice device in Input管理 . list入力デバイス )
{
if ( ( device . e入力デバイス種別 = = E入力デバイス種別 . Joystick ) & & ! ConfigIni . dicJoystick . ContainsValue ( device . GUID ) )
{
int key = 0 ;
while ( ConfigIni . dicJoystick . ContainsKey ( key ) )
{
key + + ;
}
ConfigIni . dicJoystick . Add ( key , device . GUID ) ;
}
}
foreach ( IInputDevice device2 in Input管理 . list入力デバイス )
{
if ( device2 . e入力デバイス種別 = = E入力デバイス種別 . Joystick )
{
foreach ( KeyValuePair < int , string > pair in ConfigIni . dicJoystick )
{
if ( device2 . GUID . Equals ( pair . Value ) )
{
( ( CInputJoystick ) device2 ) . SetID ( pair . Key ) ;
break ;
}
}
continue ;
}
}
Trace . TraceInformation ( "DirectInput の初期化を完了しました。" ) ;
}
catch ( Exception exception2 )
{
Trace . TraceError ( "DirectInput, MIDI入力の初期化に失敗しました。" ) ;
throw ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ Pad の 初 期 化 ]
//---------------------
Trace . TraceInformation ( "パッドの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
Pad = new CPad ( ConfigIni , Input管理 ) ;
Trace . TraceInformation ( "パッドの初期化を完了しました。" ) ;
}
catch ( Exception exception3 )
{
Trace . TraceError ( exception3 . ToString ( ) ) ;
Trace . TraceError ( "パッドの初期化に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ Sound管理 の 初 期 化 ]
//---------------------
Trace . TraceInformation ( "サウンドデバイスの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
ESoundDeviceType soundDeviceType ;
switch ( TJAPlayer3 . ConfigIni . nSoundDeviceType )
{
case 0 :
soundDeviceType = ESoundDeviceType . DirectSound ;
break ;
case 1 :
soundDeviceType = ESoundDeviceType . ASIO ;
break ;
case 2 :
soundDeviceType = ESoundDeviceType . ExclusiveWASAPI ;
break ;
default :
soundDeviceType = ESoundDeviceType . Unknown ;
break ;
}
Sound管理 = new CSound管理 ( base . Window . Handle ,
soundDeviceType ,
TJAPlayer3 . ConfigIni . nWASAPIBufferSizeMs ,
// CDTXMania.ConfigIni.nASIOBufferSizeMs,
0 ,
TJAPlayer3 . ConfigIni . nASIODevice ,
TJAPlayer3 . ConfigIni . bUseOSTimer
) ;
//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
{
actScanningLoudness = new CActScanningLoudness ( ) ;
actScanningLoudness . On活性化 ( ) ;
LoudnessMetadataScanner . ScanningStateChanged + =
( _ , args ) = > actScanningLoudness . bIsActivelyScanning = args . IsActivelyScanning ;
LoudnessMetadataScanner . StartBackgroundScanning ( ) ;
SongGainController = new SongGainController ( ) ;
ConfigIniToSongGainControllerBinder . Bind ( ConfigIni , SongGainController ) ;
SoundGroupLevelController = new SoundGroupLevelController ( CSound . listインスタンス ) ;
ConfigIniToSoundGroupLevelControllerBinder . Bind ( ConfigIni , SoundGroupLevelController ) ;
}
finally
{
Trace . Unindent ( ) ;
Trace . TraceInformation ( "Initialized loudness scanning, song gain control, and sound group level control." ) ;
}
ShowWindowTitleWithSoundType ( ) ;
FDK . CSound管理 . bIsTimeStretch = TJAPlayer3 . ConfigIni . bTimeStretch ;
Sound管理 . nMasterVolume = TJAPlayer3 . ConfigIni . nMasterVolume ;
//FDK.CSound管理.bIsMP3DecodeByWindowsCodec = CDTXMania.ConfigIni.bNoMP3Streaming;
Trace . TraceInformation ( "サウンドデバイスの初期化を完了しました。" ) ;
}
catch ( Exception e )
{
throw new NullReferenceException ( "サウンドデバイスがひとつも有効になっていないため、サウンドデバイスの初期化ができませんでした。" , e ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ Songs管理 の 初 期 化 ]
//---------------------
Trace . TraceInformation ( "曲リストの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
Songs管理 = new CSongs管理 ( ) ;
// Songs管理_裏読 = new CSongs管理();
EnumSongs = new CEnumSongs ( ) ;
actEnumSongs = new CActEnumSongs ( ) ;
Trace . TraceInformation ( "曲リストの初期化を完了しました。" ) ;
}
catch ( Exception e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "曲リストの初期化に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ CAvi の 初 期 化 ]
//---------------------
CAvi . t初期化 ( ) ;
//---------------------
#endregion
#region [ Random の 初 期 化 ]
//---------------------
Random = new Random ( ( int ) Timer . nシステム時刻 ) ;
//---------------------
#endregion
#region [ ス テ ー ジ の 初 期 化 ]
//---------------------
r現在のステージ = null ;
r直前のステージ = null ;
stage起動 = new CStage起動 ( ) ;
stageタイトル = new CStageタイトル ( ) ;
// stageオプション = new CStageオプション();
stageコンフィグ = new CStageコンフィグ ( ) ;
stage選曲 = new CStage選曲 ( ) ;
stage段位選択 = new CStage段位選択 ( ) ;
2021-11-12 18:32:04 +01:00
stageHeya = new CStageHeya ( ) ;
2021-09-21 00:16:38 +02:00
stage曲読み込み = new CStage曲読み込み ( ) ;
stage演奏ドラム画面 = new CStage演奏ドラム画面 ( ) ;
stage結果 = new CStage結果 ( ) ;
stageChangeSkin = new CStageChangeSkin ( ) ;
stage終了 = new CStage終了 ( ) ;
NamePlate = new CNamePlate ( ) ;
2021-12-09 07:08:32 +01:00
SaveFile = 0 ;
2021-09-21 00:16:38 +02:00
this . listトップレベルActivities = new List < CActivity > ( ) ;
this . listトップレベルActivities . Add ( actEnumSongs ) ;
this . listトップレベルActivities . Add ( act文字コンソール ) ;
this . listトップレベルActivities . Add ( stage起動 ) ;
this . listトップレベルActivities . Add ( stageタイトル ) ;
// this.listトップレベルActivities.Add( stageオプション );
this . listトップレベルActivities . Add ( stageコンフィグ ) ;
this . listトップレベルActivities . Add ( stage選曲 ) ;
this . listトップレベルActivities . Add ( stage段位選択 ) ;
2021-11-12 18:32:04 +01:00
this . listトップレベルActivities . Add ( stageHeya ) ;
2021-09-21 00:16:38 +02:00
this . listトップレベルActivities . Add ( stage曲読み込み ) ;
this . listトップレベルActivities . Add ( stage演奏ドラム画面 ) ;
this . listトップレベルActivities . Add ( stage結果 ) ;
this . listトップレベルActivities . Add ( stageChangeSkin ) ;
this . listトップレベルActivities . Add ( stage終了 ) ;
this . listトップレベルActivities . Add ( actFlushGPU ) ;
//---------------------
#endregion
#region [ プ ラ グ イ ン の 検 索 と 生 成 ]
//---------------------
PluginHost = new CPluginHost ( ) ;
Trace . TraceInformation ( "プラグインの検索と生成を行います。" ) ;
Trace . Indent ( ) ;
try
{
this . tプラグイン検索と生成 ( ) ;
Trace . TraceInformation ( "プラグインの検索と生成を完了しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ プ ラ グ イ ン の 初 期 化 ]
//---------------------
if ( this . listプラグイン ! = null & & this . listプラグイン . Count > 0 )
{
Trace . TraceInformation ( "プラグインの初期化を行います。" ) ;
Trace . Indent ( ) ;
try
{
foreach ( STPlugin st in this . listプラグイン )
{
Directory . SetCurrentDirectory ( st . strプラグインフォルダ ) ;
st . plugin . On初期化 ( this . PluginHost ) ;
st . plugin . OnManagedリソースの作成 ( ) ;
st . plugin . OnUnmanagedリソースの作成 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
Trace . TraceInformation ( "すべてのプラグインの初期化を完了しました。" ) ;
}
catch
{
Trace . TraceError ( "プラグインのどれかの初期化に失敗しました。" ) ;
throw ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region Discordの処理
2022-02-05 04:42:33 +01:00
Discord . Initialize ( "939341030141096007" ) ;
2021-09-21 00:16:38 +02:00
StartupTime = Discord . GetUnixTime ( ) ;
Discord . UpdatePresence ( "" , Properties . Discord . Stage_StartUp , StartupTime ) ;
#endregion
Trace . TraceInformation ( "アプリケーションの初期化を完了しました。" ) ;
#region [ 最 初 の ス テ ー ジ の 起 動 ]
//---------------------
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ 起動" ) ;
if ( TJAPlayer3 . bコンパクトモード )
{
r現在のステージ = stage曲読み込み ;
}
else
{
r現在のステージ = stage起動 ;
}
r現在のステージ . On活性化 ( ) ;
//---------------------
#endregion
}
public void ShowWindowTitleWithSoundType ( )
{
string delay = "" ;
if ( Sound管理 . GetCurrentSoundDeviceType ( ) ! = "DirectSound" )
{
delay = "(" + Sound管理 . GetSoundDelay ( ) + "ms)" ;
}
AssemblyName asmApp = Assembly . GetExecutingAssembly ( ) . GetName ( ) ;
base . Window . Text = asmApp . Name + " Ver." + VERSION + " (" + Sound管理 . GetCurrentSoundDeviceType ( ) + delay + ")" ;
}
private void t終了処理 ( )
{
if ( ! this . b終了処理完了済み )
{
Trace . TraceInformation ( "----------------------" ) ;
Trace . TraceInformation ( "■ アプリケーションの終了" ) ;
#region [ 曲 検 索 の 終 了 処 理 ]
//---------------------
if ( actEnumSongs ! = null )
{
Trace . TraceInformation ( "曲検索actの終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
actEnumSongs . On非活性化 ( ) ;
actEnumSongs = null ;
Trace . TraceInformation ( "曲検索actの終了処理を完了しました。" ) ;
}
catch ( Exception e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "曲検索actの終了処理に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region [ 現 在 の ス テ ー ジ の 終 了 処 理 ]
//---------------------
if ( TJAPlayer3 . r現在のステージ ! = null & & TJAPlayer3 . r現在のステージ . b活性化してる ) // #25398 2011.06.07 MODIFY FROM
{
Trace . TraceInformation ( "現在のステージを終了します。" ) ;
Trace . Indent ( ) ;
try
{
r現在のステージ . On非活性化 ( ) ;
Trace . TraceInformation ( "現在のステージの終了処理を完了しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region [ プ ラ グ イ ン の 終 了 処 理 ]
//---------------------
if ( this . listプラグイン ! = null & & this . listプラグイン . Count > 0 )
{
Trace . TraceInformation ( "すべてのプラグインを終了します。" ) ;
Trace . Indent ( ) ;
try
{
foreach ( STPlugin st in this . listプラグイン )
{
Directory . SetCurrentDirectory ( st . strプラグインフォルダ ) ;
st . plugin . OnUnmanagedリソースの解放 ( ) ;
st . plugin . OnManagedリソースの解放 ( ) ;
st . plugin . On終了 ( ) ;
Directory . SetCurrentDirectory ( TJAPlayer3 . strEXEのあるフォルダ ) ;
}
PluginHost = null ;
Trace . TraceInformation ( "すべてのプラグインの終了処理を完了しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region Discordの処理
Discord . Shutdown ( ) ;
#endregion
#region [ 曲 リ ス ト の 終 了 処 理 ]
//---------------------
if ( Songs管理 ! = null )
{
Trace . TraceInformation ( "曲リストの終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
Songs管理 = null ;
Trace . TraceInformation ( "曲リストの終了処理を完了しました。" ) ;
}
catch ( Exception exception )
{
Trace . TraceError ( exception . ToString ( ) ) ;
Trace . TraceError ( "曲リストの終了処理に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
CAvi . t終了 ( ) ;
//---------------------
#endregion
#region TextureLoaderの処理
Tx . DisposeTexture ( ) ;
#endregion
#region [ ス キ ン の 終 了 処 理 ]
//---------------------
if ( Skin ! = null )
{
Trace . TraceInformation ( "スキンの終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
Skin . Dispose ( ) ;
Skin = null ;
Trace . TraceInformation ( "スキンの終了処理を完了しました。" ) ;
}
catch ( Exception exception2 )
{
Trace . TraceError ( exception2 . ToString ( ) ) ;
Trace . TraceError ( "スキンの終了処理に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region [ DirectSoundの終了処理 ]
//---------------------
if ( Sound管理 ! = null )
{
Trace . TraceInformation ( "DirectSound の終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
Sound管理 . Dispose ( ) ;
Sound管理 = null ;
Trace . TraceInformation ( "DirectSound の終了処理を完了しました。" ) ;
}
catch ( Exception exception3 )
{
Trace . TraceError ( exception3 . ToString ( ) ) ;
Trace . TraceError ( "DirectSound の終了処理に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region [ パ ッ ド の 終 了 処 理 ]
//---------------------
if ( Pad ! = null )
{
Trace . TraceInformation ( "パッドの終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
Pad = null ;
Trace . TraceInformation ( "パッドの終了処理を完了しました。" ) ;
}
catch ( Exception exception4 )
{
Trace . TraceError ( exception4 . ToString ( ) ) ;
Trace . TraceError ( "パッドの終了処理に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region [ DirectInput , MIDI入力の終了処理 ]
//---------------------
if ( Input管理 ! = null )
{
Trace . TraceInformation ( "DirectInput, MIDI入力の終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
Input管理 . Dispose ( ) ;
Input管理 = null ;
Trace . TraceInformation ( "DirectInput, MIDI入力の終了処理を完了しました。" ) ;
}
catch ( Exception exception5 )
{
Trace . TraceError ( exception5 . ToString ( ) ) ;
Trace . TraceError ( "DirectInput, MIDI入力の終了処理に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region [ 文 字 コ ン ソ ー ル の 終 了 処 理 ]
//---------------------
if ( act文字コンソール ! = null )
{
Trace . TraceInformation ( "文字コンソールの終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
act文字コンソール . On非活性化 ( ) ;
act文字コンソール = null ;
Trace . TraceInformation ( "文字コンソールの終了処理を完了しました。" ) ;
}
catch ( Exception exception6 )
{
Trace . TraceError ( exception6 . ToString ( ) ) ;
Trace . TraceError ( "文字コンソールの終了処理に失敗しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
}
//---------------------
#endregion
#region [ FPSカウンタの終了処理 ]
//---------------------
Trace . TraceInformation ( "FPSカウンタの終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
if ( FPS ! = null )
{
FPS = null ;
}
Trace . TraceInformation ( "FPSカウンタの終了処理を完了しました。" ) ;
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ タ イ マ の 終 了 処 理 ]
//---------------------
Trace . TraceInformation ( "タイマの終了処理を行います。" ) ;
Trace . Indent ( ) ;
try
{
if ( Timer ! = null )
{
Timer . Dispose ( ) ;
Timer = null ;
Trace . TraceInformation ( "タイマの終了処理を完了しました。" ) ;
}
else
{
Trace . TraceInformation ( "タイマは使用されていません。" ) ;
}
}
finally
{
Trace . Unindent ( ) ;
}
//---------------------
#endregion
#region [ Config . iniの出力 ]
//---------------------
Trace . TraceInformation ( "Config.ini を出力します。" ) ;
// if ( ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi ギターベースがスワップしているときは元に戻す
string str = strEXEのあるフォルダ + "Config.ini" ;
Trace . Indent ( ) ;
try
{
if ( DTXVmode . Enabled )
{
DTXVmode . tUpdateConfigIni ( ) ;
Trace . TraceInformation ( "DTXVモードの設定情報を、Config.iniに保存しました。" ) ;
}
else
{
ConfigIni . t書き出し ( str ) ;
Trace . TraceInformation ( "保存しました。({0})" , str ) ;
}
}
catch ( Exception e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceError ( "Config.ini の出力に失敗しました。({0})" , str ) ;
}
finally
{
Trace . Unindent ( ) ;
}
Trace . TraceInformation ( "Deinitializing loudness scanning, song gain control, and sound group level control..." ) ;
Trace . Indent ( ) ;
try
{
SoundGroupLevelController = null ;
SongGainController = null ;
LoudnessMetadataScanner . StopBackgroundScanning ( joinImmediately : true ) ;
actScanningLoudness . On非活性化 ( ) ;
actScanningLoudness = null ;
}
finally
{
Trace . Unindent ( ) ;
Trace . TraceInformation ( "Deinitialized loudness scanning, song gain control, and sound group level control." ) ;
}
ConfigIni = null ;
//---------------------
#endregion
#region [ DTXVmodeの終了処理 ]
//---------------------
//Trace.TraceInformation( "DTXVモードの終了処理を行います。" );
//Trace.Indent();
try
{
if ( DTXVmode ! = null )
{
DTXVmode = null ;
//Trace.TraceInformation( "DTXVモードの終了処理を完了しました。" );
}
else
{
//Trace.TraceInformation( "DTXVモードは使用されていません。" );
}
}
finally
{
//Trace.Unindent();
}
//---------------------
#endregion
#region [ DirectXの終了処理 ]
base . GraphicsDeviceManager . Dispose ( ) ;
#endregion
Trace . TraceInformation ( "アプリケーションの終了処理を完了しました。" ) ;
this . b終了処理完了済み = true ;
}
}
private CScoreIni tScoreIniへBGMAdjustとHistoryとPlayCountを更新 ( string str新ヒストリ行 )
{
bool bIsUpdatedDrums , bIsUpdatedGuitar , bIsUpdatedBass ;
string strFilename = DTX . strファイル名の絶対パス + ".score.ini" ;
CScoreIni ini = new CScoreIni ( strFilename ) ;
if ( ! File . Exists ( strFilename ) )
{
ini . stファイル . Title = DTX . TITLE ;
ini . stファイル . Name = DTX . strファイル名 ;
ini . stファイル . Hash = CScoreIni . tファイルのMD5を求めて返す ( DTX . strファイル名の絶対パス ) ;
for ( int i = 0 ; i < 6 ; i + + )
{
ini . stセクション [ i ] . nPerfectになる範囲ms = nPerfect範囲ms ;
ini . stセクション [ i ] . nGreatになる範囲ms = nGreat範囲ms ;
ini . stセクション [ i ] . nGoodになる範囲ms = nGood範囲ms ;
ini . stセクション [ i ] . nPoorになる範囲ms = nPoor範囲ms ;
}
}
ini . stファイル . BGMAdjust = DTX . nBGMAdjust ;
CScoreIni . t更新条件を取得する ( out bIsUpdatedDrums , out bIsUpdatedGuitar , out bIsUpdatedBass ) ;
if ( bIsUpdatedDrums | | bIsUpdatedGuitar | | bIsUpdatedBass )
{
if ( bIsUpdatedDrums )
{
ini . stファイル . PlayCountDrums + + ;
}
if ( bIsUpdatedGuitar )
{
ini . stファイル . PlayCountGuitar + + ;
}
if ( bIsUpdatedBass )
{
ini . stファイル . PlayCountBass + + ;
}
ini . tヒストリを追加する ( str新ヒストリ行 ) ;
if ( ! bコンパクトモード )
{
stage選曲 . r確定されたスコア . 譜 面 情 報 . 演 奏 回 数 . Drums = ini . stファイル . PlayCountDrums ;
stage選曲 . r確定されたスコア . 譜 面 情 報 . 演 奏 回 数 . Guitar = ini . stファイル . PlayCountGuitar ;
stage選曲 . r確定されたスコア . 譜 面 情 報 . 演 奏 回 数 . Bass = ini . stファイル . PlayCountBass ;
for ( int j = 0 ; j < ini . stファイル . History . Length ; j + + )
{
stage選曲 . r確定されたスコア . 譜 面 情 報 . 演 奏 履 歴 [ j ] = ini . stファイル . History [ j ] ;
}
}
}
if ( ConfigIni . bScoreIniを出力する )
{
ini . t書き出し ( strFilename ) ;
}
return ini ;
}
private void tガベージコレクションを実行する ( )
{
GC . Collect ( GC . MaxGeneration ) ;
GC . WaitForPendingFinalizers ( ) ;
GC . Collect ( GC . MaxGeneration ) ;
}
private void tプラグイン検索と生成 ( )
{
this . listプラグイン = new List < STPlugin > ( ) ;
string strIPluginActivityの名前 = typeof ( IPluginActivity ) . FullName ;
string strプラグインフォルダパス = strEXEのあるフォルダ + "Plugins\\" ;
this . t指定フォルダ内でのプラグイン検索と生成 ( strプラグインフォルダパス , strIPluginActivityの名前 ) ;
if ( this . listプラグイン . Count > 0 )
Trace . TraceInformation ( this . listプラグイン . Count + " 個のプラグインを読み込みました。" ) ;
}
public void RefleshSkin ( )
{
Trace . TraceInformation ( "スキン変更:" + TJAPlayer3 . Skin . GetCurrentSkinSubfolderFullName ( false ) ) ;
TJAPlayer3 . act文字コンソール . On非活性化 ( ) ;
TJAPlayer3 . Skin . Dispose ( ) ;
TJAPlayer3 . Skin = null ;
TJAPlayer3 . Skin = new CSkin ( TJAPlayer3 . ConfigIni . strSystemSkinSubfolderFullName , false ) ;
TJAPlayer3 . Tx . DisposeTexture ( ) ;
TJAPlayer3 . Tx . LoadTexture ( ) ;
TJAPlayer3 . act文字コンソール . On活性化 ( ) ;
}
#region [ Windowイベント処理 ]
private void t指定フォルダ内でのプラグイン検索と生成 ( string strプラグインフォルダパス , string strプラグイン型名 )
{
// 指定されたパスが存在しないとエラー
if ( ! Directory . Exists ( strプラグインフォルダパス ) )
{
Trace . TraceWarning ( "プラグインフォルダが存在しません。(" + strプラグインフォルダパス + ")" ) ;
return ;
}
// (1) すべての *.dll について…
string [ ] strDLLs = System . IO . Directory . GetFiles ( strプラグインフォルダパス , "*.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 ( strプラグイン型名 ) ! = null )
{
// (1-4) クラス名からインスタンスを作成する
var st = new STPlugin ( ) {
plugin = ( IPluginActivity ) asm . CreateInstance ( t . FullName ) ,
strプラグインフォルダ = Path . GetDirectoryName ( dllName ) ,
strアセンブリ簡易名 = asm . GetName ( ) . Name ,
Version = asm . GetName ( ) . Version ,
} ;
// (1-5) プラグインリストへ登録
this . listプラグイン . Add ( st ) ;
Trace . TraceInformation ( "プラグイン {0} ({1}, {2}, {3}) を読み込みました。" , t . FullName , Path . GetFileName ( dllName ) , st . strアセンブリ簡易名 , st . Version . ToString ( ) ) ;
}
}
}
catch ( Exception e )
{
Trace . TraceError ( e . ToString ( ) ) ;
Trace . TraceInformation ( dllName + " からプラグインを生成することに失敗しました。スキップします。" ) ;
}
}
// (2) サブフォルダがあれば再帰する
string [ ] strDirs = Directory . GetDirectories ( strプラグインフォルダパス , "*" ) ;
foreach ( string dir in strDirs )
this . t指定フォルダ内でのプラグイン検索と生成 ( dir + "\\" , strプラグイン型名 ) ;
}
//-----------------
private void Window_ApplicationActivated ( object sender , EventArgs e )
{
this . bApplicationActive = true ;
}
private void Window_ApplicationDeactivated ( object sender , EventArgs e )
{
this . bApplicationActive = false ;
}
private void Window_KeyDown ( object sender , KeyEventArgs e )
{
if ( e . KeyCode = = Keys . Menu )
{
e . Handled = true ;
e . SuppressKeyPress = true ;
}
else if ( ( e . KeyCode = = Keys . Return ) & & e . Alt )
{
if ( ConfigIni ! = null )
{
ConfigIni . bウィンドウモード = ! ConfigIni . bウィンドウモード ;
this . t全画面_ウィンドウモード切り替え ( ) ;
}
e . Handled = true ;
e . SuppressKeyPress = true ;
}
else
{
for ( int i = 0 ; i < 0x10 ; i + + )
{
if ( ConfigIni . KeyAssign . System . Capture [ i ] . コ ー ド > 0 & &
e . KeyCode = = DeviceConstantConverter . KeyToKeyCode ( ( SlimDXKeys . Key ) ConfigIni . KeyAssign . System . Capture [ i ] . コ ー ド ) )
{
// Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );
string strFullPath =
Path . Combine ( TJAPlayer3 . strEXEのあるフォルダ , "Capture_img" ) ;
strFullPath = Path . Combine ( strFullPath , DateTime . Now . ToString ( "yyyyMMddHHmmss" ) + ".png" ) ;
SaveResultScreen ( strFullPath ) ;
}
}
}
}
private void Window_MouseUp ( object sender , MouseEventArgs e )
{
mb = e . Button ;
}
private void Window_MouseDoubleClick ( object sender , MouseEventArgs e ) // #23510 2010.11.13 yyagi: to go full screen mode
{
if ( mb . Equals ( MouseButtons . Left ) & & ConfigIni . bIsAllowedDoubleClickFullscreen ) // #26752 2011.11.27 yyagi
{
ConfigIni . bウィンドウモード = false ;
this . t全画面_ウィンドウモード切り替え ( ) ;
}
}
private void Window_ResizeEnd ( object sender , EventArgs e ) // #23510 2010.11.20 yyagi: to get resized window size
{
if ( ConfigIni . bウィンドウモード )
{
ConfigIni . n初期ウィンドウ開始位置X = base . Window . Location . X ; // #30675 2013.02.04 ikanick add
ConfigIni . n初期ウィンドウ開始位置Y = base . Window . Location . Y ; //
}
ConfigIni . nウインドウwidth = ( ConfigIni . bウィンドウモード ) ? base . Window . ClientSize . Width : currentClientSize . Width ; // #23510 2010.10.31 yyagi add
ConfigIni . nウインドウheight = ( ConfigIni . bウィンドウモード ) ? base . Window . ClientSize . Height : currentClientSize . Height ;
}
#endregion
#endregion
}
}