/**
 * @file System.h
 * @brief OSへのインターフェースです
 *
 * @author S.F.
 * @version $Id:
 * 
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */
#if !defined(AFX_System_H__DD8D138F_B5A2_4C7B_B543_6BCE1BFB1ED5__INCLUDED_)
/// 2重インクルードを防止するための定義
#define AFX_System_H__DD8D138F_B5A2_4C7B_B543_6BCE1BFB1ED5__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <string>
#include "sf.h"

extern "C" {

/** S.F.の名前空間.
 * これは他のライブラリと名前の衝突を回避するために定義されています。 
 * S.F.が定義する名前空間・クラス・変数・定数はすべてこの中に含まれます。 */
namespace sf {

/** DWORD の定義 */
typedef unsigned long DWORD;///< これは、WindowsAPIのライブラリを取り込まなくてもよいようにDWORDを定義しています。

namespace application {
	class Main;
}

/** システム名前空間. 
 *この名前空間は、システムリソースのアクセスを行うクラスや、
 *どのような名前空間でも使用される基本的な定数が格納されます。
 */
namespace system {

const float PI = 3.1415926f;///< π
const int MAX_PATH_ = 256;///< 最大ファイルPATHの長さ

namespace console {
	class Console;
}

namespace sound {
	class Sound;
}

namespace input {
	class Input;
}

// System のインターフェース --------------------------------------------------

const DWORD TIMER_INTERVAL = 32;///< 1フレームの時間(ms)

const float FRAME_SEC = 30.0f;///< Frame Per Second (FPS)

/** システムクラス.
 * 入出力など、システムリソースへのアクセスを抽象化するために
 * 定義されているインターフェースです。
 * sf::system::instance()でインターフェースのポインタ（実際は実装クラスのインスタンスのポインタをキャストしたもの）を取得し、アクセスします。
 */
class System
{
	// LIFECYCLE
public:
	/// コンストラクタ(ダミー)
	System(){}; ///< コンストラクタ(ダミー).
	/// デストラクタ（ダミー）
	virtual ~System(){}; ////< デストラクタ(ダミー).
	// OPERATORS

	// OPERATIONS

	virtual void wait(void) = 0; ///< 次のフレームのタイミングまで待つ
	
	/** エラーメッセージを表示してアプリケーションを終了する.
	 * エラーメッセージダイアログを表示(Windows系の場合)して、アプリケーションを終了します。
	 * @param errString 出力文字列へのポインタ */
	virtual void errorTerminate(const wchar_t *errString) = 0;
	/** エラーメッセージを表示する.
	 * @param errString 出力文字列へのポインタ */
	virtual void outputError(const wchar_t *errString) = 0;

	// ACCESS
	
	/** フレーム間隔を設定する. 
	 * @param msValue 1フレームの間隔をms単位で指定する */
	virtual void timerInterval(const unsigned long msValue) = 0;
	
	/** フレーム間隔を取得する
	 * @return 1フレームの間隔(ms) */
	virtual const unsigned long timerInterval (void) const = 0;
	
	/** ms単位のシステム時間を取得する.
	 * @return ms単位のシステム時間 */
	virtual const DWORD	time(void) const = 0;

	/** コンソールインターフェースのポインタを取得する.
	 * 描画(スプライト・背景画像) 用のインターフェースのポインタを取得します。
	 * 画面への描画作業はこのポインタを通じて行われます。
	 * @return Console インターフェースへのポインタ */
	virtual console::Console * const console(void) = 0;

	/** サウンドインターフェースのポインタを取得する.
	 * サウンド出力（BGM・効果音）用のインターフェースのポインタを取得します。
	 * サウンド出力はこのポインタを通じて行われます。
	 * @return Sound インターフェースのポインタ */
	virtual sound::Sound * const sound(void) = 0;
	
	/** 入力インターフェースのポインタを取得する.
	 * 入力（キーボード・マウス・ジョイスティック）用のインターフェースのポインタを取得します.
	 * @return Input インターフェースのポインタ */
	virtual input::Input * const input(void) = 0;

	/** メインインターフェースのポインタを取得する.
	 * ゲームアプリケーションメインインターフェースのポインタを取得します。
	 * このインターフェースは、Sceneをコントロールするためにあります。
	 * @return Main インターフェースへのポインタ */
	virtual application::Main * const main() = 0;
	
	/** メインインターフェースへのポインタをセットする 
	 * @return pMain メインインターフェースへのポインタ
 	 */
	virtual void main(application::Main * const pMain ) = 0;
	
	/** 30FPSとの比率を取得する.
	 * この値は1フレームでの移動物体の移動基準値となり、30FPSの場合1.0f、60FPSの場合約0.5fとなります。
	 * システムのデフォルトは30FPSであるので、60FPSなどにした場合、敵の移動速度が倍になるのでゲームになりません。
	 * そのような場合このdeltaTimeの値を利用して敵の移動速度を調整します。
	 * @return 比率(TIMER_INTERVAL / 32.0f) */
	virtual const float deltaTime(void) = 0;
	
	/** 現在のFPSを取得する.
	 * 現在設定されているFPS値を取得します
	 * @return FPS値 */
	virtual	const float	framePerSec(void) = 0;
	
	// INQUIRY
	/** システムがアクティブであるかどうか問い合わせる
	 * @retval true 活動中
	 * @retval false 活動中でないのでSystemインターフェースは使用できません*/
	 virtual bool isActive(void) = 0;
}; // System

/** Systemインスタンスへのポインタを得る.
 * Systemインターフェースへのポインタを取得します。
 * このメソッドを使用して、Systemインターフェースを取得し、システムリソースにアクセスします。
 * @return System インターフェースのポインタ */
SFDLL System * const instance(void);

} // namespace system
} // namespace sf
}
#endif // !defined(AFX_System_H__DD8D138F_B5A2_4C7B_B543_6BCE1BFB1ED5__INCLUDED_)
