/**
 * @file
 * @brief 背景描画制御関連の実装を行う.
 * 
 * @author S.F.
 * @version $Id:
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */

/// 重複インクルード防止マクロ
#if !defined(AFX_Background_H__78BD459C_E52C_4BE9_B8DB_8A6DDAFE1E52__INCLUDED_)
#define AFX_Background_H__78BD459C_E52C_4BE9_B8DB_8A6DDAFE1E52__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "sf.h"
extern "C" {
namespace sf {
	namespace system {
		namespace console {


/** 背景描画制御を行う.
 * 背景の描画を行います。
 * 背景は、64×64pixelのビットマップを敷き詰めることで実現しています。
 * 背景画面の設計は<a href="../../images/2001031102.gif">こちらの図</a>をご参照ください*/
class Background : public ObjRectangle 
{
public:
	///スプライトテクスチャリスト配列型の定義
	typedef std::vector<sprite::Sprite *> TextureList;
	///スプライトテクスチャ情報リスト配列型の定義
	typedef std::vector<sprite::Info> TextureInfoList;
	///マップデータ型の定義
	typedef std::vector<int> MapData;

	/// コンストラクタ
	Background();
	/// デストラクタ
	virtual ~Background();
	/// 背景描画を行う
	virtual void draw();
	// ACCESS //

	/** 現在の画面に対するオフセットＸ座標を参照する 
	 * @return オフセットX */
	const float offsetX() const {return mOffsetX;};
	
	/** 現在の画面に対するオフセットＸ座標を設定する 
	 * @param value オフセットX */
	void offsetX(const float value){mOffsetX = value;};
	 
	/** 現在の画面に対するオフセットＹ座標を参照する 
	 * @return オフセットＹ座標 */
	const float offsetY() const {return mOffsetY;};
	
	/** 現在の画面に対するオフセットＹ座標を設定する 
	 * @param value オフセットＹ座標 */
	void offsetY(const float value)
	{
		if(value < mOffsetYLimit) mOffsetY = value ;else mOffsetY = mOffsetYLimit;
		if(mOffsetY < 0.0f) mOffsetY = 0.0f;
	};
	
	/** 保存しているデータをすべて破棄する */
	void unload();
	
	/** マップデータをロードする 
	 * @param pMapFileName マップファイルPATH */
	void load(const char * const pMapFileName);

	/** スクリーンにマップデータをセットする 
	 * @param screenX スクリーンX座標 
	 * @param screenY スクリーンY座標
	 * @param value ビットマップデータのインデックス */
	void setData(float screenX,float screenY,DWORD value);
	
	/** マップデータを保存する 
	 * @param pFileName 保存先のマップファイルPATH 
	 * @retval true 成功
	 * @retval false 失敗 */
	bool save(const char *pFileName);

	/** スプライトテクスチャリスト配列を参照する 
	 * @return TextureListのポインタ */
	TextureList* textureList(void){ return &mTextureList;};

	/** マップ関連の定数定義クラス.
	 * 名前空間にしたかったのですが、Backgroundの中の定義という形にこだわった結果このようなことに...*/
	class SFDLL Map {
	public:
		static const int WIDTH;///< Mapの幅
		static const int HEIGHT_MAX;///< Mapの最大長
		static const int CELL_SIZE;///< セルのサイズ
		static const int CELL_TEX_COUNT_W;///< 画面横のマップセルの数
		static const int CELL_TEX_COUNT_H;///< 画面縦のマップセルの数

		static const int DRAW_HEIGHT;///< 描画縦サイズ
		static const float DRAW_START_X;///< 描画開始X
		static const float DRAW_START_Y;///< 描画開始Y
		static const float DRAW_CENTER_Y;///< 描画中心Y座標
	};
	
	/** 描画開始オフセットXを取得する 
	 * @return 描画開始オフセットX */
	const float startOffsetX(void) const {return mbEdit ? mStartOffsetX : 0.0f;};

	/** 描画開始オフセットXをセットする 
	 * @param value  描画開始オフセットX */
	void startOffsetX(const float value){mStartOffsetX = value;};
	
	/** 描画開始オフセットY座標を取得する 
	 * @return 描画開始オフセットY座標 */
	const float startOffsetY(void) const {return mbEdit ? mStartOffsetY : 0.0f;};
	
	/** 描画開始オフセットYをセットする 
	 * @param value  描画開始オフセットY */
	void startOffsetY(const float value){mStartOffsetY = value;};
	
	/** 編集中かどうか
	 * @return true 編集中 false 編集中でない */
	const bool edit(void)  const {return mbEdit;};
	
	/** 編集中かどうか設定する
	 * @param value true 編集中 false 編集中でない */
	void edit(const bool value){mbEdit = value;};

private:
	int mMapWidth,///< Mapの幅
		mMapHeight;///< Mapの高さ
	float mOffsetYLimit;///< オフセットYの限度
	float mOffsetX,///< オフセットX
		  mOffsetY;///< オフセットY
	
	float mStartOffsetX,///< 描画開始オフセットX
	mStartOffsetY;///< 描画開始オフセットY
	
	bool mbEdit;///< 編集中かどうか
	int *mpMap;/// Mapの現在位置
	MapData mMapData;///< MapData
	TextureList mTextureList;///< スプライトテクスチャ配列
	TextureInfoList mTextureInfoList;///< スプライトテクスチャ情報配列
	Console *mpConsole;///< Consoleインターフェースのポインタ
	std::string mFileName;///< MapのPATH
	sf::system::console::sprite::Sprite * mpBlankSprite;///< 空白のスプライト
	sf::system::console::ObjQuadrangle mObj[2];///< 編集中の非表示領域を表示するためのObjQuadrangle配列
	static const sf::system::console::sprite::Info Background::msBlankSpriteInfo;///< 空白スプライト情報
};
		}
	}
}
}
#endif // !defined(AFX_Background_H__78BD459C_E52C_4BE9_B8DB_8A6DDAFE1E52__INCLUDED_)
