mirror of
https://github.com/oldmud0/LilithPort.git
synced 2024-12-22 14:35:39 +01:00
Shift-JIS -> UTF-8
This commit is contained in:
parent
8363637872
commit
b744ceaa3a
13 changed files with 897 additions and 897 deletions
|
@ -1,4 +1,4 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
using namespace System;
|
using namespace System;
|
||||||
using namespace System::Reflection;
|
using namespace System::Reflection;
|
||||||
|
@ -7,9 +7,9 @@ using namespace System::Runtime::InteropServices;
|
||||||
using namespace System::Security::Permissions;
|
using namespace System::Security::Permissions;
|
||||||
|
|
||||||
//
|
//
|
||||||
// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
|
// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
|
||||||
// アセンブリに関連付けられている情報を変更するには、
|
// アセンブリに関連付けられている情報を変更するには、
|
||||||
// これらの属性値を変更してください。
|
// これらの属性値を変更してください。
|
||||||
//
|
//
|
||||||
[assembly:AssemblyTitleAttribute("LilithPort")];
|
[assembly:AssemblyTitleAttribute("LilithPort")];
|
||||||
[assembly:AssemblyDescriptionAttribute("")];
|
[assembly:AssemblyDescriptionAttribute("")];
|
||||||
|
@ -21,15 +21,15 @@ using namespace System::Security::Permissions;
|
||||||
[assembly:AssemblyCultureAttribute("")];
|
[assembly:AssemblyCultureAttribute("")];
|
||||||
|
|
||||||
//
|
//
|
||||||
// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
|
// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
|
||||||
//
|
//
|
||||||
// Major Version
|
// Major Version
|
||||||
// Minor Version
|
// Minor Version
|
||||||
// Build Number
|
// Build Number
|
||||||
// Revision
|
// Revision
|
||||||
//
|
//
|
||||||
// すべての値を指定するか、下のように '*' を使ってリビジョンおよびビルド番号を
|
// すべての値を指定するか、下のように '*' を使ってリビジョンおよびビルド番号を
|
||||||
// 既定値にすることができます:
|
// 既定値にすることができます:
|
||||||
|
|
||||||
[assembly:AssemblyVersionAttribute("1.0.0.0")];
|
[assembly:AssemblyVersionAttribute("1.0.0.0")];
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// LilithPort.cpp : メイン プロジェクト ファイルです。
|
// LilithPort.cpp : メイン プロジェクト ファイルです。
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "MainForm.h"
|
#include "MainForm.h"
|
||||||
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
using namespace LilithPort;
|
using namespace LilithPort;
|
||||||
|
|
||||||
// グローバル
|
// グローバル
|
||||||
MT_SP_INFORMATION MTINFO;
|
MT_SP_INFORMATION MTINFO;
|
||||||
MT_SP_OPTION MTOPTION;
|
MT_SP_OPTION MTOPTION;
|
||||||
MT_SP_WINDOW_STATE MTWS;
|
MT_SP_WINDOW_STATE MTWS;
|
||||||
|
@ -17,18 +17,18 @@ CRITICAL_SECTION CS_CAPTION;
|
||||||
[STAThreadAttribute]
|
[STAThreadAttribute]
|
||||||
int main(array<System::String ^> ^args)
|
int main(array<System::String ^> ^args)
|
||||||
{
|
{
|
||||||
// コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
|
// コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
|
||||||
Application::EnableVisualStyles();
|
Application::EnableVisualStyles();
|
||||||
Application::SetCompatibleTextRenderingDefault(true);
|
Application::SetCompatibleTextRenderingDefault(true);
|
||||||
|
|
||||||
// 自プログラムのパス
|
// 自プログラムのパス
|
||||||
TCHAR drive[_MAX_DRIVE], dir[_MAX_DIR];
|
TCHAR drive[_MAX_DRIVE], dir[_MAX_DIR];
|
||||||
|
|
||||||
GetModuleFileName(NULL, MTOPTION.PATH, _MAX_PATH);
|
GetModuleFileName(NULL, MTOPTION.PATH, _MAX_PATH);
|
||||||
_tsplitpath_s(MTOPTION.PATH, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL, 0, NULL, 0);
|
_tsplitpath_s(MTOPTION.PATH, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL, 0, NULL, 0);
|
||||||
_stprintf_s(MTOPTION.PATH, _T("%s%s"), drive, dir);
|
_stprintf_s(MTOPTION.PATH, _T("%s%s"), drive, dir);
|
||||||
|
|
||||||
// コマンドライン引数
|
// コマンドライン引数
|
||||||
if(args->Length > 0){
|
if(args->Length > 0){
|
||||||
if(args[0] == "-s"){
|
if(args[0] == "-s"){
|
||||||
MTINFO.SERVER_MODE = true;
|
MTINFO.SERVER_MODE = true;
|
||||||
|
@ -53,28 +53,28 @@ int main(array<System::String ^> ^args)
|
||||||
LoadMTOption();
|
LoadMTOption();
|
||||||
CheckMTOption();
|
CheckMTOption();
|
||||||
|
|
||||||
// 乱数の初期化&まぜまぜ
|
// 乱数の初期化&まぜまぜ
|
||||||
XorShift((UINT)DateTime::Now.Ticks);
|
XorShift((UINT)DateTime::Now.Ticks);
|
||||||
XorShift();
|
XorShift();
|
||||||
XorShift();
|
XorShift();
|
||||||
XorShift();
|
XorShift();
|
||||||
|
|
||||||
// 音量(dB)をあらかじめ計算しておく
|
// 音量(dB)をあらかじめ計算しておく
|
||||||
MTINFO.VOLUME[0] = -10000;
|
MTINFO.VOLUME[0] = -10000;
|
||||||
|
|
||||||
for(int i = 1; i < 21; i++){
|
for(int i = 1; i < 21; i++){
|
||||||
// -6dBで音量半減、DirectSound的には-600
|
// -6dBで音量半減、DirectSound的には-600
|
||||||
// 19.931568f = -6.0f / log10(0.5f);
|
// 19.931568f = -6.0f / log10(0.5f);
|
||||||
MTINFO.VOLUME[i] = (INT32)(19.931568f*log10((float)(i*5)/100.0f)*100.0f);
|
MTINFO.VOLUME[i] = (INT32)(19.931568f*log10((float)(i*5)/100.0f)*100.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
InitializeCriticalSection(&CS_CAPTION);
|
InitializeCriticalSection(&CS_CAPTION);
|
||||||
|
|
||||||
// 未処理の例外をキャッチ
|
// 未処理の例外をキャッチ
|
||||||
Application::ThreadException += gcnew ThreadExceptionEventHandler(ApplicationThreadException);
|
Application::ThreadException += gcnew ThreadExceptionEventHandler(ApplicationThreadException);
|
||||||
Threading::Thread::GetDomain()->UnhandledException += gcnew UnhandledExceptionEventHandler(ApplicationUnhandledException);
|
Threading::Thread::GetDomain()->UnhandledException += gcnew UnhandledExceptionEventHandler(ApplicationUnhandledException);
|
||||||
|
|
||||||
// メイン ウィンドウを作成して、実行します
|
// メイン ウィンドウを作成して、実行します
|
||||||
Application::Run(gcnew MainForm());
|
Application::Run(gcnew MainForm());
|
||||||
|
|
||||||
DeleteCriticalSection(&CS_CAPTION);
|
DeleteCriticalSection(&CS_CAPTION);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
<?xml version="1.0" encoding="shift_jis"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="9.00"
|
Version="9.00"
|
||||||
|
@ -193,7 +193,7 @@
|
||||||
</References>
|
</References>
|
||||||
<Files>
|
<Files>
|
||||||
<Filter
|
<Filter
|
||||||
Name="ソース ファイル"
|
Name="ソース ファイル"
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
>
|
>
|
||||||
|
@ -235,7 +235,7 @@
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="ヘッダー ファイル"
|
Name="ヘッダー ファイル"
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
>
|
>
|
||||||
|
@ -274,7 +274,7 @@
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="リソース ファイル"
|
Name="リソース ファイル"
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||||
>
|
>
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "OptionForm.h"
|
#include "OptionForm.h"
|
||||||
#include "MainForm.h"
|
#include "MainForm.h"
|
||||||
|
|
||||||
|
@ -10,16 +10,16 @@ void OptionForm::SaveOption(bool apply){
|
||||||
try{
|
try{
|
||||||
FileVersionInfo^ info = FileVersionInfo::GetVersionInfo(textBoxGameExe->Text);
|
FileVersionInfo^ info = FileVersionInfo::GetVersionInfo(textBoxGameExe->Text);
|
||||||
|
|
||||||
if(info->FileDescription != "2D格闘ツクール2nd." && info->FileDescription != "2D格闘ツクール95"){
|
if(info->FileDescription != "2D格闘ツクール2nd." && info->FileDescription != "2D格闘ツクール95"){
|
||||||
throw gcnew Exception;
|
throw gcnew Exception;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(Exception^){
|
catch(Exception^){
|
||||||
textBoxGameExe->Text = gcnew String("格闘ツクールの実行ファイルではありません");
|
textBoxGameExe->Text = gcnew String("格闘ツクールの実行ファイルではありません");
|
||||||
}
|
}
|
||||||
|
|
||||||
IntPtr mp;
|
IntPtr mp;
|
||||||
// パス
|
// パス
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxGameExe->Text);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxGameExe->Text);
|
||||||
_tcscpy_s(MTOPTION.GAME_EXE, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(MTOPTION.GAME_EXE, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
|
@ -73,7 +73,7 @@ void OptionForm::SaveOption(bool apply){
|
||||||
MTOPTION.SHOW_GAME_OPTION = checkBoxShowGameOption->Checked;
|
MTOPTION.SHOW_GAME_OPTION = checkBoxShowGameOption->Checked;
|
||||||
MTOPTION.SHOW_RESULT = checkBoxShowResult->Checked;
|
MTOPTION.SHOW_RESULT = checkBoxShowResult->Checked;
|
||||||
|
|
||||||
// コメント
|
// コメント
|
||||||
if(textBoxComment->Text != gcnew String(MTOPTION.COMMENT)){
|
if(textBoxComment->Text != gcnew String(MTOPTION.COMMENT)){
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxComment->Text);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxComment->Text);
|
||||||
_tcscpy_s(MTOPTION.COMMENT, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(MTOPTION.COMMENT, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
|
@ -82,7 +82,7 @@ void OptionForm::SaveOption(bool apply){
|
||||||
parent->ChangeComment(textBoxComment->Text);
|
parent->ChangeComment(textBoxComment->Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ゲーム
|
// ゲーム
|
||||||
MTOPTION.MAX_STAGE = (UINT)numericUpDownMaxStage->Value;
|
MTOPTION.MAX_STAGE = (UINT)numericUpDownMaxStage->Value;
|
||||||
MTOPTION.STAGE_SELECT = (UINT)numericUpDownStageSelect->Value;
|
MTOPTION.STAGE_SELECT = (UINT)numericUpDownStageSelect->Value;
|
||||||
MTOPTION.ROUND = (UINT)numericUpDownRound->Value;
|
MTOPTION.ROUND = (UINT)numericUpDownRound->Value;
|
||||||
|
@ -109,11 +109,11 @@ void OptionForm::SaveOption(bool apply){
|
||||||
MTOPTION.REPLAY_VERSION = 1;
|
MTOPTION.REPLAY_VERSION = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 当たり判定
|
// 当たり判定
|
||||||
if(MTOPTION.HIT_JUDGE != checkBoxHitJudge->Checked){
|
if(MTOPTION.HIT_JUDGE != checkBoxHitJudge->Checked){
|
||||||
MTOPTION.HIT_JUDGE = checkBoxHitJudge->Checked;
|
MTOPTION.HIT_JUDGE = checkBoxHitJudge->Checked;
|
||||||
|
|
||||||
// ゲーム起動中なら即時変更
|
// ゲーム起動中なら即時変更
|
||||||
if(MTINFO.INITIALIZED && MTINFO.PROCESS != NULL){
|
if(MTINFO.INITIALIZED && MTINFO.PROCESS != NULL){
|
||||||
DWORD b = MTOPTION.HIT_JUDGE;
|
DWORD b = MTOPTION.HIT_JUDGE;
|
||||||
|
|
||||||
|
@ -126,13 +126,13 @@ void OptionForm::SaveOption(bool apply){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 詳細設定
|
// 詳細設定
|
||||||
// 発言でウィンドウを点滅
|
// 発言でウィンドウを点滅
|
||||||
MTOPTION.TALK_FLASH = checkBoxTalkFlash->Checked;
|
MTOPTION.TALK_FLASH = checkBoxTalkFlash->Checked;
|
||||||
// 名前が呼ばれたらウィンドウを点滅
|
// 名前が呼ばれたらウィンドウを点滅
|
||||||
MTOPTION.NAME_FLASH = checkBoxNameFlash->Checked;
|
MTOPTION.NAME_FLASH = checkBoxNameFlash->Checked;
|
||||||
|
|
||||||
// 色
|
// 色
|
||||||
MTCOLOR.SERVER_NAME = buttonServerName->ForeColor.ToArgb();
|
MTCOLOR.SERVER_NAME = buttonServerName->ForeColor.ToArgb();
|
||||||
MTCOLOR.HOST_NAME = buttonHostName->ForeColor.ToArgb();
|
MTCOLOR.HOST_NAME = buttonHostName->ForeColor.ToArgb();
|
||||||
MTCOLOR.CLIENT_NAME = buttonClientName->ForeColor.ToArgb();
|
MTCOLOR.CLIENT_NAME = buttonClientName->ForeColor.ToArgb();
|
||||||
|
@ -148,10 +148,10 @@ void OptionForm::SaveOption(bool apply){
|
||||||
MTCOLOR.COMMENT_BACK = buttonCommentBack->BackColor.ToArgb();
|
MTCOLOR.COMMENT_BACK = buttonCommentBack->BackColor.ToArgb();
|
||||||
MTCOLOR.SECRET = buttonSecret->ForeColor.ToArgb();
|
MTCOLOR.SECRET = buttonSecret->ForeColor.ToArgb();
|
||||||
|
|
||||||
// 色を反映させる
|
// 色を反映させる
|
||||||
parent->ResetColor();
|
parent->ResetColor();
|
||||||
|
|
||||||
// 値のチェック
|
// 値のチェック
|
||||||
CheckMTOption();
|
CheckMTOption();
|
||||||
|
|
||||||
if(apply){
|
if(apply){
|
||||||
|
@ -173,35 +173,35 @@ void OptionForm::CloseOption(){
|
||||||
parent->ChangeProfileEnabled();
|
parent->ChangeProfileEnabled();
|
||||||
}
|
}
|
||||||
bool OptionForm::CheckTextProfileName(String^ buf){
|
bool OptionForm::CheckTextProfileName(String^ buf){
|
||||||
// プロファイル名バリデーション
|
// プロファイル名バリデーション
|
||||||
String^ mes;
|
String^ mes;
|
||||||
if(buf == gcnew String(MTOPTION.PROFILE)){
|
if(buf == gcnew String(MTOPTION.PROFILE)){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(buf->Length == 0){
|
if(buf->Length == 0){
|
||||||
mes = "プロファイル名が空欄です。";
|
mes = "プロファイル名が空欄です。";
|
||||||
}
|
}
|
||||||
if(buf->Contains(",") || buf->Contains("[") || buf->Contains("]")){
|
if(buf->Contains(",") || buf->Contains("[") || buf->Contains("]")){
|
||||||
mes = "プロファイル名に使用できない文字(, [ ])が含まれています。";
|
mes = "プロファイル名に使用できない文字(, [ ])が含まれています。";
|
||||||
}
|
}
|
||||||
for(int i=0; i < Profile::SystemSection->Length; i++){
|
for(int i=0; i < Profile::SystemSection->Length; i++){
|
||||||
if(buf == Profile::SystemSection[i]){
|
if(buf == Profile::SystemSection[i]){
|
||||||
mes = "そのプロファイル名は使用できません。";
|
mes = "そのプロファイル名は使用できません。";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(int i=0; i < Profile::ProfileList->Count; i++){
|
for(int i=0; i < Profile::ProfileList->Count; i++){
|
||||||
if(buf == Profile::ProfileList[i]){
|
if(buf == Profile::ProfileList[i]){
|
||||||
mes = "そのプロファイル名は既に存在します。";
|
mes = "そのプロファイル名は既に存在します。";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(mes != nullptr){
|
if(mes != nullptr){
|
||||||
MessageBox::Show(mes, "プロファイル保存", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
MessageBox::Show(mes, "プロファイル保存", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
void OptionForm::DeleteProfile(String^ buf){
|
void OptionForm::DeleteProfile(String^ buf){
|
||||||
// プロファイル削除
|
// プロファイル削除
|
||||||
TCHAR bufProfile[MAX_ARRAY];
|
TCHAR bufProfile[MAX_ARRAY];
|
||||||
IntPtr mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(buf);
|
IntPtr mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(buf);
|
||||||
_tcscpy_s(bufProfile, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(bufProfile, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
|
@ -211,7 +211,7 @@ void OptionForm::DeleteProfile(String^ buf){
|
||||||
SaveProfileOption();
|
SaveProfileOption();
|
||||||
}
|
}
|
||||||
void OptionForm::OverWriteProfile(String^ buf){
|
void OptionForm::OverWriteProfile(String^ buf){
|
||||||
// 上書き保存
|
// 上書き保存
|
||||||
DeleteSection(MTOPTION.PROFILE);
|
DeleteSection(MTOPTION.PROFILE);
|
||||||
|
|
||||||
IntPtr mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(buf);
|
IntPtr mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(buf);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<root>
|
<root>
|
||||||
<!--
|
<!--
|
||||||
Microsoft ResX Schema
|
Microsoft ResX Schema
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
@ -13,13 +13,13 @@ using namespace System::Drawing;
|
||||||
namespace LilithPort {
|
namespace LilithPort {
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// StartupForm の概要
|
/// StartupForm の概要
|
||||||
///
|
///
|
||||||
/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
|
/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
|
||||||
/// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
|
/// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
|
||||||
/// 変更する必要があります。この変更を行わないと、
|
/// 変更する必要があります。この変更を行わないと、
|
||||||
/// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
|
/// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
|
||||||
/// 正しく相互に利用できなくなります。
|
/// 正しく相互に利用できなくなります。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ref class StartupForm : public System::Windows::Forms::Form
|
public ref class StartupForm : public System::Windows::Forms::Form
|
||||||
{
|
{
|
||||||
|
@ -28,13 +28,13 @@ namespace LilithPort {
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
//
|
//
|
||||||
//TODO: ここにコンストラクタ コードを追加します
|
//TODO: ここにコンストラクタ コードを追加します
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 使用中のリソースをすべてクリーンアップします。
|
/// 使用中のリソースをすべてクリーンアップします。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
~StartupForm()
|
~StartupForm()
|
||||||
{
|
{
|
||||||
|
@ -69,14 +69,14 @@ namespace LilithPort {
|
||||||
private: System::Windows::Forms::RichTextBox^ textBoxWelcome;
|
private: System::Windows::Forms::RichTextBox^ textBoxWelcome;
|
||||||
private:
|
private:
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 必要なデザイナ変数です。
|
/// 必要なデザイナ変数です。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
System::ComponentModel::Container ^components;
|
System::ComponentModel::Container ^components;
|
||||||
|
|
||||||
#pragma region Windows Form Designer generated code
|
#pragma region Windows Form Designer generated code
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
|
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
|
||||||
/// コード エディタで変更しないでください。
|
/// コード エディタで変更しないでください。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void InitializeComponent(void)
|
void InitializeComponent(void)
|
||||||
{
|
{
|
||||||
|
@ -154,7 +154,7 @@ namespace LilithPort {
|
||||||
this->labelServerName->Name = L"labelServerName";
|
this->labelServerName->Name = L"labelServerName";
|
||||||
this->labelServerName->Size = System::Drawing::Size(49, 12);
|
this->labelServerName->Size = System::Drawing::Size(49, 12);
|
||||||
this->labelServerName->TabIndex = 0;
|
this->labelServerName->TabIndex = 0;
|
||||||
this->labelServerName->Text = L"サーバ名:";
|
this->labelServerName->Text = L"サーバ名:";
|
||||||
//
|
//
|
||||||
// textBoxIP
|
// textBoxIP
|
||||||
//
|
//
|
||||||
|
@ -170,7 +170,7 @@ namespace LilithPort {
|
||||||
this->labelOpenPort->Name = L"labelOpenPort";
|
this->labelOpenPort->Name = L"labelOpenPort";
|
||||||
this->labelOpenPort->Size = System::Drawing::Size(59, 12);
|
this->labelOpenPort->Size = System::Drawing::Size(59, 12);
|
||||||
this->labelOpenPort->TabIndex = 0;
|
this->labelOpenPort->TabIndex = 0;
|
||||||
this->labelOpenPort->Text = L"待受ポート:";
|
this->labelOpenPort->Text = L"待受ポート:";
|
||||||
//
|
//
|
||||||
// numericUpDownOpenPort
|
// numericUpDownOpenPort
|
||||||
//
|
//
|
||||||
|
@ -188,7 +188,7 @@ namespace LilithPort {
|
||||||
this->buttonOK->Name = L"buttonOK";
|
this->buttonOK->Name = L"buttonOK";
|
||||||
this->buttonOK->Size = System::Drawing::Size(58, 24);
|
this->buttonOK->Size = System::Drawing::Size(58, 24);
|
||||||
this->buttonOK->TabIndex = 6;
|
this->buttonOK->TabIndex = 6;
|
||||||
this->buttonOK->Text = L"起動";
|
this->buttonOK->Text = L"起動";
|
||||||
this->buttonOK->UseVisualStyleBackColor = true;
|
this->buttonOK->UseVisualStyleBackColor = true;
|
||||||
this->buttonOK->Click += gcnew System::EventHandler(this, &StartupForm::buttonOK_Click);
|
this->buttonOK->Click += gcnew System::EventHandler(this, &StartupForm::buttonOK_Click);
|
||||||
//
|
//
|
||||||
|
@ -199,7 +199,7 @@ namespace LilithPort {
|
||||||
this->buttonCancel->Name = L"buttonCancel";
|
this->buttonCancel->Name = L"buttonCancel";
|
||||||
this->buttonCancel->Size = System::Drawing::Size(57, 24);
|
this->buttonCancel->Size = System::Drawing::Size(57, 24);
|
||||||
this->buttonCancel->TabIndex = 7;
|
this->buttonCancel->TabIndex = 7;
|
||||||
this->buttonCancel->Text = L"閉じる";
|
this->buttonCancel->Text = L"閉じる";
|
||||||
this->buttonCancel->UseVisualStyleBackColor = true;
|
this->buttonCancel->UseVisualStyleBackColor = true;
|
||||||
this->buttonCancel->Click += gcnew System::EventHandler(this, &StartupForm::buttonCancel_Click);
|
this->buttonCancel->Click += gcnew System::EventHandler(this, &StartupForm::buttonCancel_Click);
|
||||||
//
|
//
|
||||||
|
@ -217,7 +217,7 @@ namespace LilithPort {
|
||||||
this->labelComment->Name = L"labelComment";
|
this->labelComment->Name = L"labelComment";
|
||||||
this->labelComment->Size = System::Drawing::Size(40, 12);
|
this->labelComment->Size = System::Drawing::Size(40, 12);
|
||||||
this->labelComment->TabIndex = 4;
|
this->labelComment->TabIndex = 4;
|
||||||
this->labelComment->Text = L"コメント:";
|
this->labelComment->Text = L"コメント:";
|
||||||
//
|
//
|
||||||
// textBoxName
|
// textBoxName
|
||||||
//
|
//
|
||||||
|
@ -233,7 +233,7 @@ namespace LilithPort {
|
||||||
this->labelName->Name = L"labelName";
|
this->labelName->Name = L"labelName";
|
||||||
this->labelName->Size = System::Drawing::Size(61, 12);
|
this->labelName->Size = System::Drawing::Size(61, 12);
|
||||||
this->labelName->TabIndex = 0;
|
this->labelName->TabIndex = 0;
|
||||||
this->labelName->Text = L"ニックネーム:";
|
this->labelName->Text = L"ニックネーム:";
|
||||||
//
|
//
|
||||||
// numericUpDownPort
|
// numericUpDownPort
|
||||||
//
|
//
|
||||||
|
@ -261,7 +261,7 @@ namespace LilithPort {
|
||||||
this->labelMaxConnection->Name = L"labelMaxConnection";
|
this->labelMaxConnection->Name = L"labelMaxConnection";
|
||||||
this->labelMaxConnection->Size = System::Drawing::Size(79, 12);
|
this->labelMaxConnection->Size = System::Drawing::Size(79, 12);
|
||||||
this->labelMaxConnection->TabIndex = 0;
|
this->labelMaxConnection->TabIndex = 0;
|
||||||
this->labelMaxConnection->Text = L"最大接続者数:";
|
this->labelMaxConnection->Text = L"最大接続者数:";
|
||||||
//
|
//
|
||||||
// groupBoxStartMode
|
// groupBoxStartMode
|
||||||
//
|
//
|
||||||
|
@ -279,7 +279,7 @@ namespace LilithPort {
|
||||||
this->groupBoxStartMode->Size = System::Drawing::Size(194, 115);
|
this->groupBoxStartMode->Size = System::Drawing::Size(194, 115);
|
||||||
this->groupBoxStartMode->TabIndex = 8;
|
this->groupBoxStartMode->TabIndex = 8;
|
||||||
this->groupBoxStartMode->TabStop = false;
|
this->groupBoxStartMode->TabStop = false;
|
||||||
this->groupBoxStartMode->Text = L"起動モード";
|
this->groupBoxStartMode->Text = L"起動モード";
|
||||||
//
|
//
|
||||||
// textBoxServerName
|
// textBoxServerName
|
||||||
//
|
//
|
||||||
|
@ -299,7 +299,7 @@ namespace LilithPort {
|
||||||
this->groupBoxConnection->Size = System::Drawing::Size(194, 66);
|
this->groupBoxConnection->Size = System::Drawing::Size(194, 66);
|
||||||
this->groupBoxConnection->TabIndex = 9;
|
this->groupBoxConnection->TabIndex = 9;
|
||||||
this->groupBoxConnection->TabStop = false;
|
this->groupBoxConnection->TabStop = false;
|
||||||
this->groupBoxConnection->Text = L"接続先";
|
this->groupBoxConnection->Text = L"接続先";
|
||||||
//
|
//
|
||||||
// labelAccessPort
|
// labelAccessPort
|
||||||
//
|
//
|
||||||
|
@ -308,7 +308,7 @@ namespace LilithPort {
|
||||||
this->labelAccessPort->Name = L"labelAccessPort";
|
this->labelAccessPort->Name = L"labelAccessPort";
|
||||||
this->labelAccessPort->Size = System::Drawing::Size(71, 12);
|
this->labelAccessPort->Size = System::Drawing::Size(71, 12);
|
||||||
this->labelAccessPort->TabIndex = 5;
|
this->labelAccessPort->TabIndex = 5;
|
||||||
this->labelAccessPort->Text = L"接続先ポート:";
|
this->labelAccessPort->Text = L"接続先ポート:";
|
||||||
//
|
//
|
||||||
// labelIP
|
// labelIP
|
||||||
//
|
//
|
||||||
|
@ -317,7 +317,7 @@ namespace LilithPort {
|
||||||
this->labelIP->Name = L"labelIP";
|
this->labelIP->Name = L"labelIP";
|
||||||
this->labelIP->Size = System::Drawing::Size(43, 12);
|
this->labelIP->Size = System::Drawing::Size(43, 12);
|
||||||
this->labelIP->TabIndex = 3;
|
this->labelIP->TabIndex = 3;
|
||||||
this->labelIP->Text = L"アドレス:";
|
this->labelIP->Text = L"アドレス:";
|
||||||
//
|
//
|
||||||
// groupBoxProfile
|
// groupBoxProfile
|
||||||
//
|
//
|
||||||
|
@ -330,7 +330,7 @@ namespace LilithPort {
|
||||||
this->groupBoxProfile->Size = System::Drawing::Size(183, 67);
|
this->groupBoxProfile->Size = System::Drawing::Size(183, 67);
|
||||||
this->groupBoxProfile->TabIndex = 10;
|
this->groupBoxProfile->TabIndex = 10;
|
||||||
this->groupBoxProfile->TabStop = false;
|
this->groupBoxProfile->TabStop = false;
|
||||||
this->groupBoxProfile->Text = L"プロフィール";
|
this->groupBoxProfile->Text = L"プロフィール";
|
||||||
//
|
//
|
||||||
// groupBoxWelcome
|
// groupBoxWelcome
|
||||||
//
|
//
|
||||||
|
@ -340,7 +340,7 @@ namespace LilithPort {
|
||||||
this->groupBoxWelcome->Size = System::Drawing::Size(183, 113);
|
this->groupBoxWelcome->Size = System::Drawing::Size(183, 113);
|
||||||
this->groupBoxWelcome->TabIndex = 11;
|
this->groupBoxWelcome->TabIndex = 11;
|
||||||
this->groupBoxWelcome->TabStop = false;
|
this->groupBoxWelcome->TabStop = false;
|
||||||
this->groupBoxWelcome->Text = L"サーバメッセージ";
|
this->groupBoxWelcome->Text = L"サーバメッセージ";
|
||||||
//
|
//
|
||||||
// textBoxWelcome
|
// textBoxWelcome
|
||||||
//
|
//
|
||||||
|
@ -371,7 +371,7 @@ namespace LilithPort {
|
||||||
this->Name = L"StartupForm";
|
this->Name = L"StartupForm";
|
||||||
this->ShowInTaskbar = false;
|
this->ShowInTaskbar = false;
|
||||||
this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent;
|
this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent;
|
||||||
this->Text = L"スタートアップ";
|
this->Text = L"スタートアップ";
|
||||||
this->Load += gcnew System::EventHandler(this, &StartupForm::StartupForm_Load);
|
this->Load += gcnew System::EventHandler(this, &StartupForm::StartupForm_Load);
|
||||||
this->Shown += gcnew System::EventHandler(this, &StartupForm::StartupForm_Shown);
|
this->Shown += gcnew System::EventHandler(this, &StartupForm::StartupForm_Shown);
|
||||||
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDownOpenPort))->EndInit();
|
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->numericUpDownOpenPort))->EndInit();
|
||||||
|
@ -439,9 +439,9 @@ namespace LilithPort {
|
||||||
if(radioButtonServer->Checked){
|
if(radioButtonServer->Checked){
|
||||||
MTOPTION.CONNECTION_TYPE = CT_SERVER;
|
MTOPTION.CONNECTION_TYPE = CT_SERVER;
|
||||||
|
|
||||||
// サーバ名チェック
|
// サーバ名チェック
|
||||||
if(textBoxServerName->Text->Length == 0){
|
if(textBoxServerName->Text->Length == 0){
|
||||||
MessageBox::Show("サーバ名を入力してください。\n\nSERVERモードで起動するには、\nサーバ名を入力する必要があります。", "SERVERモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
MessageBox::Show("サーバ名を入力してください。\n\nSERVERモードで起動するには、\nサーバ名を入力する必要があります。", "SERVERモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxServerName->Text);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxServerName->Text);
|
||||||
|
@ -449,7 +449,7 @@ namespace LilithPort {
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
p2 = _tcschr(p1, _T(','));
|
p2 = _tcschr(p1, _T(','));
|
||||||
if (p2 != NULL){
|
if (p2 != NULL){
|
||||||
MessageBox::Show("サーバ名に使用できない文字(,)があります。\nサーバ名を確認してください。", "SERVERモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
MessageBox::Show("サーバ名に使用できない文字(,)があります。\nサーバ名を確認してください。", "SERVERモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -464,22 +464,22 @@ namespace LilithPort {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// サーバ名
|
// サーバ名
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxServerName->Text);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxServerName->Text);
|
||||||
_tcscpy_s(MTOPTION.SERVER_NAME, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(MTOPTION.SERVER_NAME, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
|
|
||||||
// IPチェック
|
// IPチェック
|
||||||
if(MTOPTION.CONNECTION_TYPE == CT_HOST || MTOPTION.CONNECTION_TYPE == CT_CLIENT) {
|
if(MTOPTION.CONNECTION_TYPE == CT_HOST || MTOPTION.CONNECTION_TYPE == CT_CLIENT) {
|
||||||
if(textBoxIP->Text->Length == 0){
|
if(textBoxIP->Text->Length == 0){
|
||||||
MessageBox::Show("接続先アドレスを入力してください。\n\nHOST, CLIENTモードで起動するには、\n接続先のアドレスを入力する必要があります。", "HOST, CLIENTモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
MessageBox::Show("接続先アドレスを入力してください。\n\nHOST, CLIENTモードで起動するには、\n接続先のアドレスを入力する必要があります。", "HOST, CLIENTモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxIP->Text);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(textBoxIP->Text);
|
||||||
_tcscpy_s(p1, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(p1, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
p2 = _tcschr(p1, _T(','));
|
p2 = _tcschr(p1, _T(','));
|
||||||
if (p2 != NULL){
|
if (p2 != NULL){
|
||||||
MessageBox::Show("接続先アドレスに使用できない文字(,)があります。\n接続先アドレスを確認してください。", "HOST, CLIENTモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
MessageBox::Show("接続先アドレスに使用できない文字(,)があります。\n接続先アドレスを確認してください。", "HOST, CLIENTモードエラー", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -488,12 +488,12 @@ namespace LilithPort {
|
||||||
_tcscpy_s(MTOPTION.CONNECTION_IP, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(MTOPTION.CONNECTION_IP, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
|
|
||||||
// 名前チェック
|
// 名前チェック
|
||||||
if(textBoxName->Text->Length == 0){
|
if(textBoxName->Text->Length == 0){
|
||||||
textBoxName->Text = gcnew String(MTOPTION.NAME);
|
textBoxName->Text = gcnew String(MTOPTION.NAME);
|
||||||
|
|
||||||
if(textBoxName->Text->Length == 0){
|
if(textBoxName->Text->Length == 0){
|
||||||
textBoxName->Text = gcnew String("名無しさん");
|
textBoxName->Text = gcnew String("名無しさん");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<root>
|
<root>
|
||||||
<!--
|
<!--
|
||||||
Microsoft ResX Schema
|
Microsoft ResX Schema
|
||||||
|
|
Binary file not shown.
|
@ -1,13 +1,13 @@
|
||||||
// stdafx.cpp : 標準インクルード LilithPort.pch のみを
|
// stdafx.cpp : 標準インクルード LilithPort.pch のみを
|
||||||
// 含むソース ファイルは、プリコンパイル済みヘッダーになります。
|
// 含むソース ファイルは、プリコンパイル済みヘッダーになります。
|
||||||
// stdafx.obj にはプリコンパイル済み型情報が含まれます。
|
// stdafx.obj にはプリコンパイル済み型情報が含まれます。
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
extern CRITICAL_SECTION CS_CAPTION;
|
extern CRITICAL_SECTION CS_CAPTION;
|
||||||
using namespace System::Collections;
|
using namespace System::Collections;
|
||||||
|
|
||||||
// 落ちる前にエラー内容をロギング
|
// 落ちる前にエラー内容をロギング
|
||||||
void WriteErrorLog(String^ text, String^ caption)
|
void WriteErrorLog(String^ text, String^ caption)
|
||||||
{
|
{
|
||||||
IO::StreamWriter^ sw = gcnew IO::StreamWriter(gcnew String(MTOPTION.PATH) + "error.log", true, Encoding::Default);
|
IO::StreamWriter^ sw = gcnew IO::StreamWriter(gcnew String(MTOPTION.PATH) + "error.log", true, Encoding::Default);
|
||||||
|
@ -28,33 +28,33 @@ void WriteErrorLog(String^ text, String^ caption)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 例外調査
|
// 例外調査
|
||||||
void ApplicationThreadException(Object^ sender, Threading::ThreadExceptionEventArgs^ e)
|
void ApplicationThreadException(Object^ sender, Threading::ThreadExceptionEventArgs^ e)
|
||||||
{
|
{
|
||||||
WriteErrorLog(e->Exception->ToString(), "ThreadException");
|
WriteErrorLog(e->Exception->ToString(), "ThreadException");
|
||||||
MTINFO.ERRORED = true;
|
MTINFO.ERRORED = true;
|
||||||
|
|
||||||
if(!MTINFO.SERVER_MODE){
|
if(!MTINFO.SERVER_MODE){
|
||||||
MessageBox::Show("突然ですがLilithPort終了のお知らせです。", "緊急事態発生");
|
MessageBox::Show("突然ですがLilithPort終了のお知らせです。", "緊急事態発生");
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::Exit();
|
Application::Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 主にコンソールアプリの例外
|
// 主にコンソールアプリの例外
|
||||||
void ApplicationUnhandledException(Object^ sender, UnhandledExceptionEventArgs^ e)
|
void ApplicationUnhandledException(Object^ sender, UnhandledExceptionEventArgs^ e)
|
||||||
{
|
{
|
||||||
WriteErrorLog(safe_cast<Exception^>(e->ExceptionObject)->ToString(), "UnhandledException");
|
WriteErrorLog(safe_cast<Exception^>(e->ExceptionObject)->ToString(), "UnhandledException");
|
||||||
MTINFO.ERRORED = true;
|
MTINFO.ERRORED = true;
|
||||||
|
|
||||||
if(!MTINFO.SERVER_MODE){
|
if(!MTINFO.SERVER_MODE){
|
||||||
MessageBox::Show("突然ですがLilithPort終了のお知らせです。", "例外が飛んできました");
|
MessageBox::Show("突然ですがLilithPort終了のお知らせです。", "例外が飛んできました");
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::Exit();
|
Application::Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// iniの読み込み
|
// iniの読み込み
|
||||||
void LoadMTOption()
|
void LoadMTOption()
|
||||||
{
|
{
|
||||||
IntPtr mp;
|
IntPtr mp;
|
||||||
|
@ -63,7 +63,7 @@ void LoadMTOption()
|
||||||
TCHAR* iniSection = _T("LilithPort");
|
TCHAR* iniSection = _T("LilithPort");
|
||||||
UINT iniVersion;
|
UINT iniVersion;
|
||||||
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
||||||
// stdafx.hに記述
|
// stdafx.hに記述
|
||||||
TCHAR iniSystem[MAX_NAME], iniState[MAX_NAME], iniColor[MAX_NAME];
|
TCHAR iniSystem[MAX_NAME], iniState[MAX_NAME], iniColor[MAX_NAME];
|
||||||
|
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(Profile::SystemSection[0]);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(Profile::SystemSection[0]);
|
||||||
|
@ -74,8 +74,8 @@ void LoadMTOption()
|
||||||
_tcscpy_s(iniColor, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(iniColor, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
|
|
||||||
// グローバルセクション読み込み
|
// グローバルセクション読み込み
|
||||||
// 1.04以下互換用
|
// 1.04以下互換用
|
||||||
iniVersion = GetPrivateProfileInt(iniSystem, _T("iniVersion"), 0, ini);
|
iniVersion = GetPrivateProfileInt(iniSystem, _T("iniVersion"), 0, ini);
|
||||||
if(iniVersion == 0){
|
if(iniVersion == 0){
|
||||||
_tcscpy_s(iniSystem, iniSection);
|
_tcscpy_s(iniSystem, iniSection);
|
||||||
|
@ -96,7 +96,7 @@ void LoadMTOption()
|
||||||
GetPrivateProfileString(iniSystem, _T("SeekSound"), _T("seek.wav"), MTOPTION.SEEK_SOUND, _MAX_PATH, ini);
|
GetPrivateProfileString(iniSystem, _T("SeekSound"), _T("seek.wav"), MTOPTION.SEEK_SOUND, _MAX_PATH, ini);
|
||||||
GetPrivateProfileString(iniSystem, _T("KeywordSound"), _T("name.wav"), MTOPTION.KEYWORD_SOUND, _MAX_PATH, ini);
|
GetPrivateProfileString(iniSystem, _T("KeywordSound"), _T("name.wav"), MTOPTION.KEYWORD_SOUND, _MAX_PATH, ini);
|
||||||
GetPrivateProfileString(iniSystem, _T("Keyword"), _T(""), MTOPTION.KEYWORD, MAX_KEYWORD, ini);
|
GetPrivateProfileString(iniSystem, _T("Keyword"), _T(""), MTOPTION.KEYWORD, MAX_KEYWORD, ini);
|
||||||
GetPrivateProfileString(iniSystem, _T("Name"), _T("名無しさん"), MTOPTION.NAME, MAX_NAME, ini);
|
GetPrivateProfileString(iniSystem, _T("Name"), _T("名無しさん"), MTOPTION.NAME, MAX_NAME, ini);
|
||||||
GetPrivateProfileString(iniSystem, _T("Comment"), _T(""), MTOPTION.COMMENT, MAX_NAME, ini);
|
GetPrivateProfileString(iniSystem, _T("Comment"), _T(""), MTOPTION.COMMENT, MAX_NAME, ini);
|
||||||
MTOPTION.CONNECTION_TYPE = GetPrivateProfileInt(iniSystem, _T("ConnectType"), 0, ini);
|
MTOPTION.CONNECTION_TYPE = GetPrivateProfileInt(iniSystem, _T("ConnectType"), 0, ini);
|
||||||
MTOPTION.PORT = GetPrivateProfileInt(iniSystem, _T("Port"), 7500, ini);
|
MTOPTION.PORT = GetPrivateProfileInt(iniSystem, _T("Port"), 7500, ini);
|
||||||
|
@ -125,7 +125,7 @@ void LoadMTOption()
|
||||||
MTOPTION.SHOW_GAME_OPTION = GetPrivateProfileInt(iniSystem, _T("ShowGameOption"), 1, ini) == 1 ? true : false;
|
MTOPTION.SHOW_GAME_OPTION = GetPrivateProfileInt(iniSystem, _T("ShowGameOption"), 1, ini) == 1 ? true : false;
|
||||||
MTOPTION.SHOW_RESULT = GetPrivateProfileInt(iniSystem, _T("ShowResult"), 1, ini) == 1 ? true : false;
|
MTOPTION.SHOW_RESULT = GetPrivateProfileInt(iniSystem, _T("ShowResult"), 1, ini) == 1 ? true : false;
|
||||||
|
|
||||||
// ブックマーク読み込み
|
// ブックマーク読み込み
|
||||||
MTOPTION.BOOKMARK_COUNT = 0;
|
MTOPTION.BOOKMARK_COUNT = 0;
|
||||||
GetPrivateProfileString(iniSystem, _T("BookMarkServerName"), _T(""), tmpName, MAX_TITLE, ini);
|
GetPrivateProfileString(iniSystem, _T("BookMarkServerName"), _T(""), tmpName, MAX_TITLE, ini);
|
||||||
GetPrivateProfileString(iniSystem, _T("BookMarkConnectIP"), _T(""), tmpIP, MAX_TITLE, ini);
|
GetPrivateProfileString(iniSystem, _T("BookMarkConnectIP"), _T(""), tmpIP, MAX_TITLE, ini);
|
||||||
|
@ -156,7 +156,7 @@ void LoadMTOption()
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(BookMarkIPList[i]);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(BookMarkIPList[i]);
|
||||||
_tcscpy_s(MTOPTION.BOOKMARK_CONNECTION_IP[i], static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(MTOPTION.BOOKMARK_CONNECTION_IP[i], static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
// 1.04以下互換用
|
// 1.04以下互換用
|
||||||
if(BookMarkTypeList != nullptr && BookMarkPortList != nullptr){
|
if(BookMarkTypeList != nullptr && BookMarkPortList != nullptr){
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(BookMarkTypeList[i]);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(BookMarkTypeList[i]);
|
||||||
_tcscpy_s(MTOPTION.BOOKMARK_CONNECTION_TYPE[i], static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(MTOPTION.BOOKMARK_CONNECTION_TYPE[i], static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
|
@ -164,7 +164,7 @@ void LoadMTOption()
|
||||||
_tcscpy_s(MTOPTION.BOOKMARK_PORT[i], static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(MTOPTION.BOOKMARK_PORT[i], static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
}else{
|
}else{
|
||||||
// 手動初期化
|
// 手動初期化
|
||||||
_tcscpy_s(MTOPTION.BOOKMARK_CONNECTION_TYPE[i], _T("2"));
|
_tcscpy_s(MTOPTION.BOOKMARK_CONNECTION_TYPE[i], _T("2"));
|
||||||
_tcscpy_s(MTOPTION.BOOKMARK_PORT[i], _T("7500"));
|
_tcscpy_s(MTOPTION.BOOKMARK_PORT[i], _T("7500"));
|
||||||
}
|
}
|
||||||
|
@ -172,17 +172,17 @@ void LoadMTOption()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(Exception^){
|
catch(Exception^){
|
||||||
MessageBox::Show("ブックマーク情報の読み込みに失敗しました。\n", "ブックマーク読み込み", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
MessageBox::Show("ブックマーク情報の読み込みに失敗しました。\n", "ブックマーク読み込み", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
|
||||||
}
|
}
|
||||||
|
|
||||||
// プロファイルリスト読み込み
|
// プロファイルリスト読み込み
|
||||||
Profile::ProfileList->Clear();
|
Profile::ProfileList->Clear();
|
||||||
if(_tcslen(MTOPTION.PROFILE_LIST) > 0){
|
if(_tcslen(MTOPTION.PROFILE_LIST) > 0){
|
||||||
String^ tmpList = gcnew String(MTOPTION.PROFILE_LIST);
|
String^ tmpList = gcnew String(MTOPTION.PROFILE_LIST);
|
||||||
array<String^>^ tmpProfile = tmpList->Split(',');
|
array<String^>^ tmpProfile = tmpList->Split(',');
|
||||||
for(int i=0; i < tmpProfile->Length; i++){
|
for(int i=0; i < tmpProfile->Length; i++){
|
||||||
Profile::ProfileList->Add(tmpProfile[i]);
|
Profile::ProfileList->Add(tmpProfile[i]);
|
||||||
// デフォルトプロファイル
|
// デフォルトプロファイル
|
||||||
if(tmpProfile[i] == gcnew String(MTOPTION.PROFILE)){
|
if(tmpProfile[i] == gcnew String(MTOPTION.PROFILE)){
|
||||||
MTOPTION.PROFILE_INDEX = i;
|
MTOPTION.PROFILE_INDEX = i;
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(tmpProfile[i]);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(tmpProfile[i]);
|
||||||
|
@ -192,13 +192,13 @@ void LoadMTOption()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
// 初期化
|
// 初期化
|
||||||
_tcsncpy_s(MTOPTION.PROFILE_LIST, _countof(MTOPTION.PROFILE_LIST), iniSection, MAX_PROFILE);
|
_tcsncpy_s(MTOPTION.PROFILE_LIST, _countof(MTOPTION.PROFILE_LIST), iniSection, MAX_PROFILE);
|
||||||
Profile::ProfileList->Add(gcnew String(iniSection));
|
Profile::ProfileList->Add(gcnew String(iniSection));
|
||||||
MTOPTION.PROFILE_INDEX = 0;
|
MTOPTION.PROFILE_INDEX = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// プロファイルセクション読み込み
|
// プロファイルセクション読み込み
|
||||||
GetPrivateProfileString(iniSection, _T("GameExe"), _T("game.exe"), MTOPTION.GAME_EXE, _MAX_PATH, ini);
|
GetPrivateProfileString(iniSection, _T("GameExe"), _T("game.exe"), MTOPTION.GAME_EXE, _MAX_PATH, ini);
|
||||||
GetPrivateProfileString(iniSection, _T("ReplayFolder"), _T("Replay"), MTOPTION.REPLAY_FOLDER, _MAX_PATH, ini);
|
GetPrivateProfileString(iniSection, _T("ReplayFolder"), _T("Replay"), MTOPTION.REPLAY_FOLDER, _MAX_PATH, ini);
|
||||||
MTOPTION.MAX_STAGE = GetPrivateProfileInt(iniSection, _T("MaxStage"), 1, ini);
|
MTOPTION.MAX_STAGE = GetPrivateProfileInt(iniSection, _T("MaxStage"), 1, ini);
|
||||||
|
@ -219,7 +219,7 @@ void LoadMTOption()
|
||||||
MTOPTION.INTERVAL = GetPrivateProfileInt(iniSection, _T("Interval"), 1, ini);
|
MTOPTION.INTERVAL = GetPrivateProfileInt(iniSection, _T("Interval"), 1, ini);
|
||||||
MTOPTION.REPLAY_VERSION = GetPrivateProfileInt(iniSection, _T("ReplayVersion"), 2, ini);
|
MTOPTION.REPLAY_VERSION = GetPrivateProfileInt(iniSection, _T("ReplayVersion"), 2, ini);
|
||||||
|
|
||||||
// ウィンドウ位置読み込み
|
// ウィンドウ位置読み込み
|
||||||
MTWS.LEFT = GetPrivateProfileInt(iniState, _T("Left"), 0, ini);
|
MTWS.LEFT = GetPrivateProfileInt(iniState, _T("Left"), 0, ini);
|
||||||
MTWS.TOP = GetPrivateProfileInt(iniState, _T("Top"), 0, ini);
|
MTWS.TOP = GetPrivateProfileInt(iniState, _T("Top"), 0, ini);
|
||||||
MTWS.WIDTH = GetPrivateProfileInt(iniState, _T("Width"), 0, ini);
|
MTWS.WIDTH = GetPrivateProfileInt(iniState, _T("Width"), 0, ini);
|
||||||
|
@ -228,7 +228,7 @@ void LoadMTOption()
|
||||||
MTWS.DIALOG_LEFT = GetPrivateProfileInt(iniState, _T("DialogLeft"), 0, ini);
|
MTWS.DIALOG_LEFT = GetPrivateProfileInt(iniState, _T("DialogLeft"), 0, ini);
|
||||||
MTWS.DIALOG_TOP = GetPrivateProfileInt(iniState, _T("DialogTop"), 0, ini);
|
MTWS.DIALOG_TOP = GetPrivateProfileInt(iniState, _T("DialogTop"), 0, ini);
|
||||||
|
|
||||||
// 色読み込み
|
// 色読み込み
|
||||||
MTCOLOR.SERVER_NAME = GetPrivateProfileInt(iniColor, _T("ServerName"), Color::ForestGreen.ToArgb(), ini);
|
MTCOLOR.SERVER_NAME = GetPrivateProfileInt(iniColor, _T("ServerName"), Color::ForestGreen.ToArgb(), ini);
|
||||||
MTCOLOR.HOST_NAME = GetPrivateProfileInt(iniColor, _T("HostName"), Color::MediumBlue.ToArgb(), ini);
|
MTCOLOR.HOST_NAME = GetPrivateProfileInt(iniColor, _T("HostName"), Color::MediumBlue.ToArgb(), ini);
|
||||||
MTCOLOR.CLIENT_NAME = GetPrivateProfileInt(iniColor, _T("ClientName"), Color::Black.ToArgb(), ini);
|
MTCOLOR.CLIENT_NAME = GetPrivateProfileInt(iniColor, _T("ClientName"), Color::Black.ToArgb(), ini);
|
||||||
|
@ -243,7 +243,7 @@ void LoadMTOption()
|
||||||
MTCOLOR.COMMENT_BACK = GetPrivateProfileInt(iniColor, _T("CommentBack"), Color::MistyRose.ToArgb(), ini);
|
MTCOLOR.COMMENT_BACK = GetPrivateProfileInt(iniColor, _T("CommentBack"), Color::MistyRose.ToArgb(), ini);
|
||||||
MTCOLOR.SECRET = GetPrivateProfileInt(iniColor, _T("Secret"), Color::HotPink.ToArgb(), ini);
|
MTCOLOR.SECRET = GetPrivateProfileInt(iniColor, _T("Secret"), Color::HotPink.ToArgb(), ini);
|
||||||
|
|
||||||
// Welcomeのタブを改行に
|
// Welcomeのタブを改行に
|
||||||
int len = _tcslen(MTOPTION.WELCOME);
|
int len = _tcslen(MTOPTION.WELCOME);
|
||||||
for(int i = 0; i < len; i++){
|
for(int i = 0; i < len; i++){
|
||||||
if(MTOPTION.WELCOME[i] == _T('\t')){
|
if(MTOPTION.WELCOME[i] == _T('\t')){
|
||||||
|
@ -251,17 +251,17 @@ void LoadMTOption()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1.04以下互換用
|
// 1.04以下互換用
|
||||||
if(iniVersion == 0){
|
if(iniVersion == 0){
|
||||||
DeleteSection(iniSection);
|
DeleteSection(iniSection);
|
||||||
SaveMTOption();
|
SaveMTOption();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// iniに書き出し
|
// iniに書き出し
|
||||||
void SaveMTOption()
|
void SaveMTOption()
|
||||||
{
|
{
|
||||||
// 改行をタブに置換
|
// 改行をタブに置換
|
||||||
int len = _tcslen(MTOPTION.WELCOME);
|
int len = _tcslen(MTOPTION.WELCOME);
|
||||||
for(int i = 0; i < len; i++){
|
for(int i = 0; i < len; i++){
|
||||||
if(MTOPTION.WELCOME[i] == _T('\n')){
|
if(MTOPTION.WELCOME[i] == _T('\n')){
|
||||||
|
@ -277,7 +277,7 @@ void SaveMTOption()
|
||||||
TCHAR tmpStrPort[MAX_TITLE] = _T("");
|
TCHAR tmpStrPort[MAX_TITLE] = _T("");
|
||||||
TCHAR* iniSection = MTOPTION.PROFILE;
|
TCHAR* iniSection = MTOPTION.PROFILE;
|
||||||
|
|
||||||
// stdafx.hに記述
|
// stdafx.hに記述
|
||||||
TCHAR iniSystem[MAX_NAME], iniState[MAX_NAME], iniColor[MAX_NAME];
|
TCHAR iniSystem[MAX_NAME], iniState[MAX_NAME], iniColor[MAX_NAME];
|
||||||
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(Profile::SystemSection[0]);
|
mp = Runtime::InteropServices::Marshal::StringToHGlobalAuto(Profile::SystemSection[0]);
|
||||||
_tcscpy_s(iniSystem, static_cast<PTCHAR>(mp.ToPointer()));
|
_tcscpy_s(iniSystem, static_cast<PTCHAR>(mp.ToPointer()));
|
||||||
|
@ -289,7 +289,7 @@ void SaveMTOption()
|
||||||
|
|
||||||
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
||||||
|
|
||||||
// グローバルセクション書き込み
|
// グローバルセクション書き込み
|
||||||
_itot_s(LP_VERSION, buf, 10);
|
_itot_s(LP_VERSION, buf, 10);
|
||||||
WritePrivateProfileString(iniSystem, _T("iniVersion"), buf, ini);
|
WritePrivateProfileString(iniSystem, _T("iniVersion"), buf, ini);
|
||||||
_itot_s(MTOPTION.CONNECTION_TYPE, buf, 10);
|
_itot_s(MTOPTION.CONNECTION_TYPE, buf, 10);
|
||||||
|
@ -359,7 +359,7 @@ void SaveMTOption()
|
||||||
_itot_s(MTOPTION.SHOW_RESULT, buf, 10);
|
_itot_s(MTOPTION.SHOW_RESULT, buf, 10);
|
||||||
WritePrivateProfileString(iniSystem, _T("ShowResult"), buf, ini);
|
WritePrivateProfileString(iniSystem, _T("ShowResult"), buf, ini);
|
||||||
|
|
||||||
// ブックマーク書き込み
|
// ブックマーク書き込み
|
||||||
if(MTOPTION.BOOKMARK_COUNT > 0) {
|
if(MTOPTION.BOOKMARK_COUNT > 0) {
|
||||||
for(UINT i=0;i < MTOPTION.BOOKMARK_COUNT;i++) {
|
for(UINT i=0;i < MTOPTION.BOOKMARK_COUNT;i++) {
|
||||||
if(gcnew String(MTOPTION.BOOKMARK_SERVER_NAME[i]) != ""){
|
if(gcnew String(MTOPTION.BOOKMARK_SERVER_NAME[i]) != ""){
|
||||||
|
@ -375,7 +375,7 @@ void SaveMTOption()
|
||||||
WritePrivateProfileString(iniSystem, _T("BookMarkPort"), tmpStrPort, ini);
|
WritePrivateProfileString(iniSystem, _T("BookMarkPort"), tmpStrPort, ini);
|
||||||
}
|
}
|
||||||
|
|
||||||
// プロファイルリスト書き込み
|
// プロファイルリスト書き込み
|
||||||
WritePrivateProfileString(iniSystem, _T("DefaultProfile"), MTOPTION.PROFILE, ini);
|
WritePrivateProfileString(iniSystem, _T("DefaultProfile"), MTOPTION.PROFILE, ini);
|
||||||
String^ bufProfileList;
|
String^ bufProfileList;
|
||||||
for(int i=0; i < Profile::ProfileList->Count; i++){
|
for(int i=0; i < Profile::ProfileList->Count; i++){
|
||||||
|
@ -390,7 +390,7 @@ void SaveMTOption()
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
WritePrivateProfileString(iniSystem, _T("ProfileList"), MTOPTION.PROFILE_LIST, ini);
|
WritePrivateProfileString(iniSystem, _T("ProfileList"), MTOPTION.PROFILE_LIST, ini);
|
||||||
|
|
||||||
// プロファイルセクション書き込み
|
// プロファイルセクション書き込み
|
||||||
WritePrivateProfileString(iniSection, _T("GameExe"), MTOPTION.GAME_EXE, ini);
|
WritePrivateProfileString(iniSection, _T("GameExe"), MTOPTION.GAME_EXE, ini);
|
||||||
WritePrivateProfileString(iniSection, _T("ReplayFolder"), MTOPTION.REPLAY_FOLDER, ini);
|
WritePrivateProfileString(iniSection, _T("ReplayFolder"), MTOPTION.REPLAY_FOLDER, ini);
|
||||||
_itot_s(MTOPTION.MAX_STAGE, buf, 10);
|
_itot_s(MTOPTION.MAX_STAGE, buf, 10);
|
||||||
|
@ -428,7 +428,7 @@ void SaveMTOption()
|
||||||
_itot_s(MTOPTION.REPLAY_VERSION, buf, 10);
|
_itot_s(MTOPTION.REPLAY_VERSION, buf, 10);
|
||||||
WritePrivateProfileString(iniSection, _T("ReplayVersion"), buf, ini);
|
WritePrivateProfileString(iniSection, _T("ReplayVersion"), buf, ini);
|
||||||
|
|
||||||
// ウィンドウ位置書き込み
|
// ウィンドウ位置書き込み
|
||||||
_itot_s(MTWS.LEFT, buf, 10);
|
_itot_s(MTWS.LEFT, buf, 10);
|
||||||
WritePrivateProfileString(iniState, _T("Left"), buf, ini);
|
WritePrivateProfileString(iniState, _T("Left"), buf, ini);
|
||||||
_itot_s(MTWS.TOP, buf, 10);
|
_itot_s(MTWS.TOP, buf, 10);
|
||||||
|
@ -444,7 +444,7 @@ void SaveMTOption()
|
||||||
_itot_s(MTWS.DIALOG_TOP, buf, 10);
|
_itot_s(MTWS.DIALOG_TOP, buf, 10);
|
||||||
WritePrivateProfileString(iniState, _T("DialogTop"), buf, ini);
|
WritePrivateProfileString(iniState, _T("DialogTop"), buf, ini);
|
||||||
|
|
||||||
// 色書き込み
|
// 色書き込み
|
||||||
_ultot_s(MTCOLOR.SERVER_NAME, buf, 10);
|
_ultot_s(MTCOLOR.SERVER_NAME, buf, 10);
|
||||||
WritePrivateProfileString(iniColor, _T("ServerName"), buf, ini);
|
WritePrivateProfileString(iniColor, _T("ServerName"), buf, ini);
|
||||||
_ultot_s(MTCOLOR.HOST_NAME, buf, 10);
|
_ultot_s(MTCOLOR.HOST_NAME, buf, 10);
|
||||||
|
@ -472,13 +472,13 @@ void SaveMTOption()
|
||||||
_ultot_s(MTCOLOR.SECRET, buf, 10);
|
_ultot_s(MTCOLOR.SECRET, buf, 10);
|
||||||
WritePrivateProfileString(iniColor, _T("Secret"), buf, ini);
|
WritePrivateProfileString(iniColor, _T("Secret"), buf, ini);
|
||||||
}
|
}
|
||||||
// プロファイルセクション削除
|
// プロファイルセクション削除
|
||||||
void DeleteSection(TCHAR* obj){
|
void DeleteSection(TCHAR* obj){
|
||||||
TCHAR ini[_MAX_PATH];
|
TCHAR ini[_MAX_PATH];
|
||||||
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
||||||
WritePrivateProfileStruct(obj, NULL, NULL, 0, ini);
|
WritePrivateProfileStruct(obj, NULL, NULL, 0, ini);
|
||||||
}
|
}
|
||||||
// プロファイル関連のみ書き出し
|
// プロファイル関連のみ書き出し
|
||||||
void SaveProfileOption(){
|
void SaveProfileOption(){
|
||||||
TCHAR ini[_MAX_PATH];
|
TCHAR ini[_MAX_PATH];
|
||||||
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
_stprintf_s(ini, _T("%sLilithPort.ini"), MTOPTION.PATH);
|
||||||
|
@ -503,11 +503,11 @@ void SaveProfileOption(){
|
||||||
|
|
||||||
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
Runtime::InteropServices::Marshal::FreeHGlobal(mp);
|
||||||
}
|
}
|
||||||
// 設定値を軽くチェック
|
// 設定値を軽くチェック
|
||||||
void CheckMTOption()
|
void CheckMTOption()
|
||||||
{
|
{
|
||||||
TCHAR buf[_MAX_PATH];
|
TCHAR buf[_MAX_PATH];
|
||||||
// 相対パス -> 絶対パス
|
// 相対パス -> 絶対パス
|
||||||
_tchdir(MTOPTION.PATH);
|
_tchdir(MTOPTION.PATH);
|
||||||
|
|
||||||
_tsplitpath_s(MTOPTION.GAME_EXE, NULL, 0, NULL, 0, NULL, 0, buf, _MAX_EXT);
|
_tsplitpath_s(MTOPTION.GAME_EXE, NULL, 0, NULL, 0, NULL, 0, buf, _MAX_EXT);
|
||||||
|
@ -550,7 +550,7 @@ void CheckMTOption()
|
||||||
_tfullpath(MTOPTION.KEYWORD_SOUND, buf, _MAX_PATH);
|
_tfullpath(MTOPTION.KEYWORD_SOUND, buf, _MAX_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 絶対パスに変換されるとドライブ名が小文字になるのが気になっていけない
|
// 絶対パスに変換されるとドライブ名が小文字になるのが気になっていけない
|
||||||
MTOPTION.GAME_EXE[0] = _totupper(MTOPTION.GAME_EXE[0]);
|
MTOPTION.GAME_EXE[0] = _totupper(MTOPTION.GAME_EXE[0]);
|
||||||
MTOPTION.REPLAY_FOLDER[0] = _totupper(MTOPTION.REPLAY_FOLDER[0]);
|
MTOPTION.REPLAY_FOLDER[0] = _totupper(MTOPTION.REPLAY_FOLDER[0]);
|
||||||
MTOPTION.VS_SOUND[0] = _totupper(MTOPTION.VS_SOUND[0]);
|
MTOPTION.VS_SOUND[0] = _totupper(MTOPTION.VS_SOUND[0]);
|
||||||
|
@ -562,7 +562,7 @@ void CheckMTOption()
|
||||||
MTOPTION.KEYWORD_SOUND[0] = _totupper(MTOPTION.KEYWORD_SOUND[0]);
|
MTOPTION.KEYWORD_SOUND[0] = _totupper(MTOPTION.KEYWORD_SOUND[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 対戦中のタイトルバー
|
// 対戦中のタイトルバー
|
||||||
void SetCaption()
|
void SetCaption()
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&CS_CAPTION);
|
EnterCriticalSection(&CS_CAPTION);
|
||||||
|
@ -579,9 +579,9 @@ void SetCaption()
|
||||||
}
|
}
|
||||||
|
|
||||||
if(MTINFO.HWND != NULL){
|
if(MTINFO.HWND != NULL){
|
||||||
// 最前面表示
|
// 最前面表示
|
||||||
if(MTINFO.SHOW_TOP == false){
|
if(MTINFO.SHOW_TOP == false){
|
||||||
// 格ツク95ウィンドウサイズ変更
|
// 格ツク95ウィンドウサイズ変更
|
||||||
if(MTOPTION.CHANGE_WINDOW_SIZE && MTINFO.KGT2K == false){
|
if(MTOPTION.CHANGE_WINDOW_SIZE && MTINFO.KGT2K == false){
|
||||||
RECT rc;
|
RECT rc;
|
||||||
SetRect(&rc, 0, 0, 640, 480);
|
SetRect(&rc, 0, 0, 640, 480);
|
||||||
|
@ -597,7 +597,7 @@ void SetCaption()
|
||||||
|
|
||||||
GetWindowText(MTINFO.HWND, MTINFO.ORIGINAL_TITLE, sizeof(MTINFO.ORIGINAL_TITLE));
|
GetWindowText(MTINFO.HWND, MTINFO.ORIGINAL_TITLE, sizeof(MTINFO.ORIGINAL_TITLE));
|
||||||
|
|
||||||
if(_tcslen(MTINFO.ORIGINAL_TITLE) == 0 || _tcscmp(MTINFO.ORIGINAL_TITLE, _T("2D格闘ツクール95")) == 0){
|
if(_tcslen(MTINFO.ORIGINAL_TITLE) == 0 || _tcscmp(MTINFO.ORIGINAL_TITLE, _T("2D格闘ツクール95")) == 0){
|
||||||
MTINFO.HWND = NULL;
|
MTINFO.HWND = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -606,7 +606,7 @@ void SetCaption()
|
||||||
LeaveCriticalSection(&CS_CAPTION);
|
LeaveCriticalSection(&CS_CAPTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 暗号復号用乱数
|
// 暗号復号用乱数
|
||||||
UINT CipherRand(UINT32 seed)
|
UINT CipherRand(UINT32 seed)
|
||||||
{
|
{
|
||||||
static UINT32 a[4] = {1812433254, 3713160357, 3109174145, 64984499};
|
static UINT32 a[4] = {1812433254, 3713160357, 3109174145, 64984499};
|
||||||
|
@ -626,7 +626,7 @@ UINT CipherRand(UINT32 seed)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通常用
|
// 通常用
|
||||||
UINT XorShift(UINT32 seed)
|
UINT XorShift(UINT32 seed)
|
||||||
{
|
{
|
||||||
static UINT32 a[4] = {1812433254, 3713160357, 3109174145, 64984499};
|
static UINT32 a[4] = {1812433254, 3713160357, 3109174145, 64984499};
|
||||||
|
@ -646,7 +646,7 @@ UINT XorShift(UINT32 seed)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ランダムステージ用
|
// ランダムステージ用
|
||||||
UINT RandomStage(UINT32 seed)
|
UINT RandomStage(UINT32 seed)
|
||||||
{
|
{
|
||||||
static UINT32 a[4] = {1812433254, 3713160357, 3109174145, 64984499};
|
static UINT32 a[4] = {1812433254, 3713160357, 3109174145, 64984499};
|
||||||
|
@ -667,7 +667,7 @@ UINT RandomStage(UINT32 seed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// IPのエンコード
|
// IPのエンコード
|
||||||
String^ EncryptionIP(String^ ip)
|
String^ EncryptionIP(String^ ip)
|
||||||
{
|
{
|
||||||
String ^ipString;
|
String ^ipString;
|
||||||
|
@ -675,10 +675,10 @@ String^ EncryptionIP(String^ ip)
|
||||||
ipString = Int64(Net::IPAddress::Parse(ip)->Address).ToString();
|
ipString = Int64(Net::IPAddress::Parse(ip)->Address).ToString();
|
||||||
}
|
}
|
||||||
catch (ArgumentNullException^) {
|
catch (ArgumentNullException^) {
|
||||||
return "変換失敗。IPぬるぽエラー";
|
return "変換失敗。IPぬるぽエラー";
|
||||||
}
|
}
|
||||||
catch (FormatException^) {
|
catch (FormatException^) {
|
||||||
return "変換失敗。IP形式エラー";
|
return "変換失敗。IP形式エラー";
|
||||||
}
|
}
|
||||||
|
|
||||||
array<Byte> ^binaryData = gcnew array<Byte>(11);
|
array<Byte> ^binaryData = gcnew array<Byte>(11);
|
||||||
|
@ -689,28 +689,28 @@ String^ EncryptionIP(String^ ip)
|
||||||
ipBase64 = Convert::ToBase64String(binaryData);
|
ipBase64 = Convert::ToBase64String(binaryData);
|
||||||
}
|
}
|
||||||
catch (ArgumentNullException^) {
|
catch (ArgumentNullException^) {
|
||||||
return "変換失敗。Base64ぬるぽエラー";
|
return "変換失敗。Base64ぬるぽエラー";
|
||||||
}
|
}
|
||||||
catch (FormatException^) {
|
catch (FormatException^) {
|
||||||
return "変換失敗。Base64形式エラー";
|
return "変換失敗。Base64形式エラー";
|
||||||
}
|
}
|
||||||
return ipBase64;
|
return ipBase64;
|
||||||
}
|
}
|
||||||
// IPの変換(MTSPアドレス)
|
// IPの変換(MTSPアドレス)
|
||||||
String^ MTEncryptionIP(String^ ip)
|
String^ MTEncryptionIP(String^ ip)
|
||||||
{
|
{
|
||||||
String^ result, ^buf, ^part;
|
String^ result, ^buf, ^part;
|
||||||
String^ dic = "そぞただちぢっつづてでとどなにぬねのはばabcdefghijklmnopqrstuvwxyz"
|
String^ dic = "そぞただちぢっつづてでとどなにぬねのはばabcdefghijklmnopqrstuvwxyz"
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYGぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜ";
|
"ABCDEFGHIJKLMNOPQRSTUVWXYGぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜ";
|
||||||
|
|
||||||
try{
|
try{
|
||||||
// 10桁+シード
|
// 10桁+シード
|
||||||
Int64^ num = ((IPAddress::Parse(ip)->Address + 0xa68c8b5) ^ 0xe5c06811);
|
Int64^ num = ((IPAddress::Parse(ip)->Address + 0xa68c8b5) ^ 0xe5c06811);
|
||||||
ip = num->ToString();
|
ip = num->ToString();
|
||||||
if((ip->Length % 2) == 1){
|
if((ip->Length % 2) == 1){
|
||||||
ip = String::Concat("0", ip);
|
ip = String::Concat("0", ip);
|
||||||
}
|
}
|
||||||
// 5桁にしよう
|
// 5桁にしよう
|
||||||
for(int i=0; i < ip->Length; i+=2){
|
for(int i=0; i < ip->Length; i+=2){
|
||||||
part = String::Concat(ip->default[i], ip->default[i+1]);
|
part = String::Concat(ip->default[i], ip->default[i+1]);
|
||||||
buf = String::Concat(dic->default[Convert::ToInt32(part)]);
|
buf = String::Concat(dic->default[Convert::ToInt32(part)]);
|
||||||
|
@ -719,11 +719,11 @@ String^ MTEncryptionIP(String^ ip)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
catch(Exception^){
|
catch(Exception^){
|
||||||
return "IPアドレスのMTSP変換に失敗しました。";
|
return "IPアドレスのMTSP変換に失敗しました。";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IPのデコード
|
// IPのデコード
|
||||||
_int64 DecryptionIP(String^ cipher_ip, bool enc)
|
_int64 DecryptionIP(String^ cipher_ip, bool enc)
|
||||||
{
|
{
|
||||||
array<Byte> ^binaryData;
|
array<Byte> ^binaryData;
|
||||||
|
@ -743,7 +743,7 @@ _int64 DecryptionIP(String^ cipher_ip, bool enc)
|
||||||
if(enc){
|
if(enc){
|
||||||
return Convert::ToInt64(Encoding::ASCII->GetString(binaryData));
|
return Convert::ToInt64(Encoding::ASCII->GetString(binaryData));
|
||||||
}else{
|
}else{
|
||||||
// 1.02, 1.03互換用
|
// 1.02, 1.03互換用
|
||||||
return Convert::ToInt64(Encoding::Unicode->GetString(binaryData));
|
return Convert::ToInt64(Encoding::Unicode->GetString(binaryData));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -752,8 +752,8 @@ _int64 MTDecryptionIP(String^ cipher_ip)
|
||||||
String^ buf;
|
String^ buf;
|
||||||
TCHAR part;
|
TCHAR part;
|
||||||
int index;
|
int index;
|
||||||
String^ dic = "そぞただちぢっつづてでとどなにぬねのはばabcdefghijklmnopqrstuvwxyz"
|
String^ dic = "そぞただちぢっつづてでとどなにぬねのはばabcdefghijklmnopqrstuvwxyz"
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYGぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜ";
|
"ABCDEFGHIJKLMNOPQRSTUVWXYGぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜ";
|
||||||
|
|
||||||
try{
|
try{
|
||||||
for(int i=0; i < cipher_ip->Length; i++){
|
for(int i=0; i < cipher_ip->Length; i++){
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
|
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
|
||||||
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
|
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
|
||||||
// を記述します。
|
// を記述します。
|
||||||
#pragma once
|
#pragma once
|
||||||
#pragma warning(disable: 4100)
|
#pragma warning(disable: 4100)
|
||||||
|
|
||||||
// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
|
// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -44,7 +44,7 @@ UINT CipherRand(UINT32 seed = 0);
|
||||||
UINT XorShift(UINT32 seed = 0);
|
UINT XorShift(UINT32 seed = 0);
|
||||||
UINT RandomStage(UINT32 seed = 0);
|
UINT RandomStage(UINT32 seed = 0);
|
||||||
|
|
||||||
// メンバー情報
|
// メンバー情報
|
||||||
public ref struct MemberInfo
|
public ref struct MemberInfo
|
||||||
{
|
{
|
||||||
IPEndPoint^ IP_EP;
|
IPEndPoint^ IP_EP;
|
||||||
|
@ -57,19 +57,19 @@ public ref struct MemberInfo
|
||||||
DWORD RESPONSE;
|
DWORD RESPONSE;
|
||||||
};
|
};
|
||||||
|
|
||||||
// バックアップ
|
// バックアップ
|
||||||
public ref struct MemberInfoBackUp
|
public ref struct MemberInfoBackUp
|
||||||
{
|
{
|
||||||
IPEndPoint^ IP_EP;
|
IPEndPoint^ IP_EP;
|
||||||
UINT16 ID;
|
UINT16 ID;
|
||||||
};
|
};
|
||||||
|
|
||||||
// プロファイルリスト
|
// プロファイルリスト
|
||||||
public ref class Profile
|
public ref class Profile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static Generic::List<String^>^ ProfileList = gcnew Generic::List<String^>;
|
static Generic::List<String^>^ ProfileList = gcnew Generic::List<String^>;
|
||||||
// バリデーション用
|
// バリデーション用
|
||||||
static array<String^>^ SystemSection = gcnew array<String^>{"System", "State", "Color"};
|
static array<String^>^ SystemSection = gcnew array<String^>{"System", "State", "Color"};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -195,11 +195,11 @@ const UINT VOLUME_SET_2_95 = 0x0040203F;
|
||||||
const BYTE VOLUME_SET_2_95_CODE[] = {0x50,0x8B,0x08,0xCC,0x52,0x50,0xFF,0x51,0x3C,0xE9,0x7B,0xFF,0xFF,0xFF,0x50,0x8B,
|
const BYTE VOLUME_SET_2_95_CODE[] = {0x50,0x8B,0x08,0xCC,0x52,0x50,0xFF,0x51,0x3C,0xE9,0x7B,0xFF,0xFF,0xFF,0x50,0x8B,
|
||||||
0x08,0xCC,0x52,0x50,0xFF,0x51,0x3C,0xE9,0x7A,0xFF,0xFF,0xFF};
|
0x08,0xCC,0x52,0x50,0xFF,0x51,0x3C,0xE9,0x7A,0xFF,0xFF,0xFF};
|
||||||
|
|
||||||
// バージョン情報
|
// バージョン情報
|
||||||
// LilithPort 1.03以上互換, それ以前はなし
|
// LilithPort 1.03以上互換, それ以前はなし
|
||||||
const UINT LP_VERSION = 107;
|
const UINT LP_VERSION = 107;
|
||||||
|
|
||||||
// 設定項目
|
// 設定項目
|
||||||
const UINT MAX_NAME = 32;
|
const UINT MAX_NAME = 32;
|
||||||
const UINT MAX_ARRAY = 64;
|
const UINT MAX_ARRAY = 64;
|
||||||
const UINT MAX_ID = 0x3FFF;
|
const UINT MAX_ID = 0x3FFF;
|
||||||
|
@ -212,7 +212,7 @@ const UINT MAX_PROFILE = 2048;
|
||||||
const BYTE TYMT_VERSION = 6;
|
const BYTE TYMT_VERSION = 6;
|
||||||
const UINT TIME_OUT = 3000;
|
const UINT TIME_OUT = 3000;
|
||||||
|
|
||||||
// チームプレイ人数
|
// チームプレイ人数
|
||||||
const UINT MAX_TEAM_ROUND = 4;
|
const UINT MAX_TEAM_ROUND = 4;
|
||||||
|
|
||||||
|
|
||||||
|
@ -403,13 +403,13 @@ typedef enum {
|
||||||
PH_PING,
|
PH_PING,
|
||||||
PH_PONG,
|
PH_PONG,
|
||||||
PH_REQ_CONNECTION, // 1:protocol 1:name_l n:name 1:comment_l n:comment
|
PH_REQ_CONNECTION, // 1:protocol 1:name_l n:name 1:comment_l n:comment
|
||||||
PH_REQ_CONNECTION_H, // HOSTな接続要求
|
PH_REQ_CONNECTION_H, // HOSTな接続要求
|
||||||
PH_RES_CONNECTION, // 1:server_name_l n:server_name 2:ID 1:name_l n:name 1:comment_l n:comment 1:state
|
PH_RES_CONNECTION, // 1:server_name_l n:server_name 2:ID 1:name_l n:name 1:comment_l n:comment 1:state
|
||||||
PH_MESSAGE, // 2:ID 1:msg_l n:msg
|
PH_MESSAGE, // 2:ID 1:msg_l n:msg
|
||||||
PH_NOTICE, // 1:len n:notice
|
PH_NOTICE, // 1:len n:notice
|
||||||
PH_REQ_LIST, // 2:ID 0で全員分
|
PH_REQ_LIST, // 2:ID 0で全員分
|
||||||
PH_RES_LIST, // 2:ID 1:name_l n:name 1:comment_l n:comment 1:state 4:IP 2:Port + 暗号
|
PH_RES_LIST, // 2:ID 1:name_l n:name 1:comment_l n:comment 1:state 4:IP 2:Port + 暗号
|
||||||
PH_NEW_MEMBER, // 上と同じ
|
PH_NEW_MEMBER, // 上と同じ
|
||||||
PH_QUIT, // 2:ID
|
PH_QUIT, // 2:ID
|
||||||
PH_LOST, // 2:ID
|
PH_LOST, // 2:ID
|
||||||
PH_CHANGE_STATE, // 2:ID 1:STATE
|
PH_CHANGE_STATE, // 2:ID 1:STATE
|
||||||
|
@ -417,21 +417,21 @@ typedef enum {
|
||||||
PH_RES_STATE, // 2:ID 1:STATE
|
PH_RES_STATE, // 2:ID 1:STATE
|
||||||
PH_CHANGE_COMMENT, // 2:ID 1:comment_l n:comment
|
PH_CHANGE_COMMENT, // 2:ID 1:comment_l n:comment
|
||||||
PH_DICE, // 1:value
|
PH_DICE, // 1:value
|
||||||
PH_REQ_VS, // 2:ID 4:実行ファイルのハッシュ
|
PH_REQ_VS, // 2:ID 4:実行ファイルのハッシュ
|
||||||
PH_RES_VS, // 1:state
|
PH_RES_VS, // 1:state
|
||||||
PH_REQ_VS_PING, // 1:ID 5個バラでsend
|
PH_REQ_VS_PING, // 1:ID 5個バラでsend
|
||||||
PH_RES_VS_PONG, // 1秒間に4個以上受信で対戦開始
|
PH_RES_VS_PONG, // 1秒間に4個以上受信で対戦開始
|
||||||
PH_REQ_VS_SETTING, // 1:delay localとhostで大きな値にあわせる
|
PH_REQ_VS_SETTING, // 1:delay localとhostで大きな値にあわせる
|
||||||
PH_RES_VS_SETTING, // 1:delay 4:seed 1:max_stage 1:stage 1:round 1:timer
|
PH_RES_VS_SETTING, // 1:delay 4:seed 1:max_stage 1:stage 1:round 1:timer
|
||||||
PH_VS_DATA, // 4:frame n:data 4*delay個分送信
|
PH_VS_DATA, // 4:frame n:data 4*delay個分送信
|
||||||
PH_REQ_VS_DATA, // 4:frame パケット来てないので緊急要請
|
PH_REQ_VS_DATA, // 4:frame パケット来てないので緊急要請
|
||||||
PH_RES_VS_DATA, // 4:frame 2:input
|
PH_RES_VS_DATA, // 4:frame 2:input
|
||||||
PH_VS_END,
|
PH_VS_END,
|
||||||
PH_REQ_WATCH, // 2:ID
|
PH_REQ_WATCH, // 2:ID
|
||||||
PH_RES_WATCH, // 1:state 2:P1ID 2:P2ID 4:seed 1:max_stage 1:stage 1:round 1:timer state = 0:観戦開始 1~:観戦不可
|
PH_RES_WATCH, // 1:state 2:P1ID 2:P2ID 4:seed 1:max_stage 1:stage 1:round 1:timer state = 0:観戦開始 1~:観戦不可
|
||||||
PH_WATCH_DATA, // 4:frame 40:10フレーム分のデータ
|
PH_WATCH_DATA, // 4:frame 40:10フレーム分のデータ
|
||||||
PH_WATCH_END, // 2:ID 自分のと同じIDなら観戦終了、他のIDならリストから削除
|
PH_WATCH_END, // 2:ID 自分のと同じIDなら観戦終了、他のIDならリストから削除
|
||||||
PH_SECRET, // 1:type n:typeごとにいろいろ
|
PH_SECRET, // 1:type n:typeごとにいろいろ
|
||||||
} MT_SP_PACKET_HEADER;
|
} MT_SP_PACKET_HEADER;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
Loading…
Reference in a new issue