/*!
 *  @file Dice.h
 *  @brief Diceクラスとその他付随要素の定義
 *  @date 2014/01/19
 *  @author Deskull
 *  2014 Sikabane Works.
 */

#pragma once

/*!
 * @class Dice
 * @brief ゲーム中のダイス処理
 */
class Dice
{
private:

	int num; //!< ダイスの数
	int side; //!< ダイスの面数
	static std::mt19937 Dice::mt; //!< メルセンヌツイスタによる乱数生成エンジン

public:

	/*!
	 * @brief コンストラクタ
	 */
	Dice::Dice(void);

	/*!
	 * @brief コンストラクタ
	 * @brief ダイスの数
	 * @brief ダイスの面
	 */
	Dice::Dice(int num, int side);

	/*!
	 * @brief デストラクタ
	 */
	Dice::~Dice(void);

	/*!
	 * @brief ダイスの数値設定を行う。
	 * @return なし
	 */
	void Dice::Set(int num, int side);

	/*!
	 * @brief 乱数初期化関数
	 * @return なし
	 */
	static void Dice::Initialize(void);

	/*!
	 * @brief ダイスの数を返す
	 * @return ダイスの数
	 */
	int Dice::GetNum(void);

	/*!
	 * @brief ダイスの面数を返す
	 * @return ダイスの面数
	 */
	int Dice::GetSide(void);

	/*!
	 * @brief ダイスを振る
	 * @return ダイスの総計値
	 */
	int Dice::Cast(void);

	/*!
	 * @brief ダイスを振る
	 * @param num ダイスの数
	 * @param side ダイスの面数
	 * @return ダイスの総計値
	 */
	static int Dice::Cast(int num, int side);

	/*!
	 * @brief ダイスの取り得る最大値を返す
	 * @return ダイスの最大値
	 */
	int Dice::MaxCast(void);

	/*!
	 * @brief ダイスの取り得る最大値を返す
	 * @param num ダイスの数
	 * @param side ダイスの面数
	 * @return ダイスの最大値
	 */
	static int Dice::MaxCast(int num, int side);

	/*!
	 * @brief 0を最小値とした乱数を返す
     * @param max 乱数の範囲(0〜max-1)
	 * @return 乱数の値
	 */
	static int Dice::Rand0(int max);

	/*!
	 * @brief 1を最小値とした乱数を返す
     * @param max 乱数の最大値(1〜max)
	 * @return 乱数の値
	 */
	static int Dice::Rand1(int max);

	/*!
	 * @brief セービング判定
     * @param diff セービング難度-セービング値差分
	 * @return セービング成功ならば true を返す。
	 */
	static bool Dice::Saving(int diff);

};
