//////////////////////////////////////////
// Nim.h
// Copyright (c) 01/10/2022 by BCCSkelton
//////////////////////////////////////////
//BCCSkeltonのヘッダー−これに必要なヘッダーが入っている
#include	"BCCSkelton.h"
//リソースIDのヘッダー
#include	"ResNim.h"
//CNIMクラスのヘッダー
#include	"CNIMW.h"

/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCSDIクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CSDI
{
public:	//以下はコールバック関数マクロと関連している
	//２重起動防止用のMutex用ID名称
	CMyWnd(char* UName) : CSDI(UName) {}
	//メンバー変数（システム）
	int m_Width;		//ウインドウ幅
	int m_Height;		//ウインドウ高さ
	int m_Span;			//1コマ幅、高さ
	CANVAS m_cvs;		//仮想ウィンドウ
	//メンバー変数（ゲーム）
	CNIM m_Nim;			//Nim本体
	int m_You;			//Player（先手−1、後手−2）
	int m_Type;			//各種対戦のID（1-人間対乱数、2-人間対評価関数、3-人間対経験値、4-乱数対関数、5-乱数対経験値、6-関数対経験値）
	int m_No;			//連続対戦のゲーム数
	int m_Games;		//対戦の通算ゲーム数
	int m_1st;			//先手の勝数
	int m_2nd;			//後手の勝数
	//メニュー項目、ダイアログコントロール関連
	bool OnRandom();
	bool OnEval();
	bool OnExp();
	bool OnRvf();
	bool OnRve();
	bool OnFve();
	bool OnExit();
	bool OnInfo();
	bool OnAbout();
	bool OnVersion();
	//ウィンドウメッセージ関連
	bool OnCreate(WPARAM, LPARAM);
	bool OnLButtonDown(WPARAM, LPARAM);
	bool OnRButtonDown(WPARAM, LPARAM);
	bool OnNotify(WPARAM, LPARAM);
	bool OnSize(WPARAM, LPARAM);
	bool OnPaint(WPARAM, LPARAM);
	bool OnMinMax(WPARAM, LPARAM);
	bool OnClose(WPARAM, LPARAM);
	//ユーザー定義関数
	void ShowCoins();		//ウィンドウにコインを表示する
	void GameInit();		//ゲーム初期化関数
	void PCvsMan();			//PC対人間対戦
	void PCvsPC();			//PC対PC対戦
	void WhenOver();		//ゲーム終了処理
	void ChangeMenuStatus(bool);	//メニュー、ツールバーの有無効化
};

////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ）の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd Nim("Nim");	//ウィンドウクラスインスタンスの生成

BEGIN_SDIMSG(Nim)	//ダイアログと違い、コールバック関数名を特定しない
	//メニュー項目、ダイアログコントロール関連
	ON_COMMAND(Nim, IDM_RANDOM, OnRandom())
	ON_COMMAND(Nim, IDM_EVAL, OnEval())
	ON_COMMAND(Nim, IDM_EXP, OnExp())
	ON_COMMAND(Nim, IDM_RVF, OnRvf())
	ON_COMMAND(Nim, IDM_RVE, OnRve())
	ON_COMMAND(Nim, IDM_FVE, OnFve())
	ON_COMMAND(Nim, IDM_EXIT, OnExit())
	ON_COMMAND(Nim, IDM_INFO, OnInfo())
	ON_COMMAND(Nim, IDM_ABOUT, OnAbout())
	ON_COMMAND(Nim, IDM_VERSION, OnVersion())
	//ウィンドウメッセージ関連
	ON_CREATE(Nim)
	ON_LBUTTONDOWN(Nim)
	ON_RBUTTONDOWN(Nim)
	ON_NOTIFY(Nim)
	ON_SIZE(Nim)
	ON_PAINT(Nim)
	ON_(Nim, WM_GETMINMAXINFO, OnMinMax(wParam, lParam))
	ON_CLOSE(Nim)
END_WNDMSG

///////////////////
//ツールバーの作成
///////////////////
CTBAR TBar;

///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;

///////////////////////
//ビットマップハンドル
///////////////////////
HBITMAP g_hCoin;
HBITMAP g_hBlanc;

////////////////////////
//CARGクラスインスタンス
////////////////////////
CARG g_arg;

//////////////////////
//Helpファイルパス、名
//////////////////////
CSTR g_HelpFile;

///////////////////////////////////////////
// CDLGクラスからTAKECOINSDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class TAKECOINSDLG : public CDLG {
public:
	bool OnInit(WPARAM, LPARAM);
	bool OnCol(WPARAM, LPARAM);
	bool OnIdok();
	bool OnIdcancel();
};

////////////////////////////////////////////////////////////////////////////
// TAKECOINSDLGクラスダイアログ変数の生成とコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
TAKECOINSDLG takecoinsdlg;

BEGIN_MODALDLGMSG(takecoinsdlgProc, takecoinsdlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(takecoinsdlg, IDC_COL, OnCol(wParam, lParam))
	ON_COMMAND(takecoinsdlg, IDOK, OnIdok())
	ON_COMMAND(takecoinsdlg, IDCANCEL, OnIdok())
END_DLGMSG

///////////////////////////////////////////
// CDLGクラスからINPUTDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class INPUTDLG : public CDLG {
public:
	bool OnInit(WPARAM, LPARAM);
	bool OnIdok();
	bool OnIdcancel();
};

////////////////////////////////////////////////////////////////////////////
// INPUTDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
INPUTDLG inputdlg;

BEGIN_MODALDLGMSG(inputdlgProc, inputdlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(inputdlg, IDOK, OnIdok())
	ON_COMMAND(inputdlg, IDCANCEL, OnIdok())
END_DLGMSG

///////////////////////////////////////////
// CDLGクラスからINFODLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class INFODLG : public CDLG {
public:
	bool OnInit(WPARAM, LPARAM);
	bool OnIdok();
	bool OnIdcancel();
};

////////////////////////////////////////////////////////////////////////////
// INFODLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
INFODLG infodlg;

BEGIN_MODALDLGMSG(infodlgProc, infodlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(infodlg, IDOK, OnIdok())
	ON_COMMAND(infodlg, IDCANCEL, OnIdcancel())
END_DLGMSG

///////////////////////////////////////////
// CDLGクラスからVERSIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class VERSIONDLG : public CDLG {
public:
	bool OnIdok();
	bool OnIdcancel();
};

////////////////////////////////////////////////////////////////////////////
// VERSIONDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
VERSIONDLG versiondlg;

BEGIN_MODALDLGMSG(versiondlgProc, versiondlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(versiondlg, IDOK, OnIdok())
	ON_COMMAND(versiondlg, IDCANCEL, OnIdcancel())
END_DLGMSG
