1
0
mirror of synced 2024-12-01 02:27:21 +01:00
OpenTaiko/TJAPlayer3/Common/TJAPlayer3.cs

3053 lines
104 KiB
C#
Raw Normal View History

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;
using SlimDX;
using SlimDX.Direct3D9;
using FDK;
using SampleFramework;
using System.Reflection;
using System.Threading.Tasks;
using System.Linq;
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
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;
}
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;
}
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;
}
public DeviceCache Device
{
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;
}
// 0 : 1P, 1 : 2P
public static int SaveFile = 0;
// 0 : Hidari, 1 : Migi (1P only)
public static int PlayerSide = 0;
2021-09-21 00:16:38 +02:00
#endregion
// コンストラクタ
public TJAPlayer3()
{
TJAPlayer3.app = this;
this.t起動処理();
}
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の挿入位置を、EndScnenePresent間から、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;
}
this.previewSound = TJAPlayer3.Sound管理.tサウンドを生成する( strPreviewFilename, ESoundGroup.SongPlayback );
// 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();
this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );
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選曲;
//-----------------------------
#endregion
break;
case (int)CStageタイトル.E戻り値.DANGAMESTART:
#region [ ]
//-----------------------------
r現在のステージ.On非活性化();
Trace.TraceInformation( "----------------------" );
Trace.TraceInformation( "■ 段位選択" );
stage段位選択.On活性化();
r直前のステージ = r現在のステージ;
r現在のステージ = stage段位選択;
//-----------------------------
#endregion
break;
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: ]
// 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-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-09-21 00:16:38 +02:00
Skin.bgm選曲画面イン.t停止する();
Skin.bgm選曲画面.t停止する();
*/
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曲読み込み;
/*
2021-09-21 00:16:38 +02:00
Skin.bgm選曲画面イン.t停止する();
Skin.bgm選曲画面.t停止する();
*/
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現在のステージ;
r現在のステージ = stageタイトル;
/*
2021-09-21 00:16:38 +02:00
Skin.bgm選曲画面イン.t停止する();
Skin.bgm選曲画面.t停止する();
*/
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;
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 )
DTX.On非活性化();
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選曲;
}
foreach ( STPlugin pg in this.listプラグイン )
{
Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
pg.plugin.Onステージ変更();
Directory.SetCurrentDirectory( TJAPlayer3.strEXEのあるフォルダ );
}
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
{
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選曲;
}
#region [ Onステージ変更() ]
//---------------------
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コンパクトモード )
{
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選曲;
}
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
#region [ Config.ini ]
//---------------------
NamePlateConfig = new NamePlateConfig();
NamePlateConfig.tNamePlateConfig();
ConfigIni = new CConfigIni();
string path = strEXEのあるフォルダ + "Config.ini";
if( File.Exists( path ) )
{
try
{
// 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ブロック外に移動
//---------------------
#endregion
#region [ ]
//---------------------
Trace.AutoFlush = true;
if( ConfigIni.bログ出力 )
{
try
{
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段位選択();
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();
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段位選択 );
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の処理
Discord.Initialize("784989629728161813");
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
}
}