/*
 *	cliplcds.h
 *
 *	液晶シーケンサ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Wed Sep 14 22:40:37 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	  全画面スプライトや全画面ムービーのレイヤ管理を行うために作成したモジュールです。
 *	  「液晶シーケンサ」という名前ですが、現在の所、シーケンサの機能は持っていません。
 *	  演出シーケンサ(clipdirs.c)モジュール等と組み合わせて、使用して下さい。
 *	* Sat Sep 17 21:29:14 JST 2016 Naoyuki Sawa
 *	- LcdSeqCh_Play(),及び,LcdSeqCh_SetSprNo()に、(SprNo=0)を指定出来るようにしました。
 *	  (SprNo=0)を指定した場合は、LcdSeqCh_Stop()を呼び出すのと同じ意味となります。
 *	- このように変更した理由は、演出シーケンサスクリプト等のデータ上で、(SprNo=0)によってレイヤ停止を意味する事が多く、
 *	  演出実行関数(fnAct)等でそれを判断してLcdSeqCh_Stop()を呼び分けるよりも、LcdSeqCh_Play()で判断する方がアプリケーションの実装が簡単だと思ったからです。
 *	  尚、現在の所LcdSeqCh_SetSprNo()にこの変更を行う必要は無かったのですが、LcdSeqCh_SetSprNo()もLcdSeqCh_Play()と同様とする方が判り易いのでそうしました。
 *	* Wed Oct 12 21:38:09 JST 2016 Naoyuki Sawa
 *	- LcdSeq_GetLcdSeqChInfo(),LcdSeq_GetLcdSeqCh()を、ローカル関数⇒グローバル関数に変更しました。
 *	  関数の動作自体は変えていません。
 *	- 上記の関数をグローバル関数に変更した理由は、アプリケーション側でもこれらの情報を参照したい事が有ったからです。
 *	  例えば、特定のチャネルで現在再生中のスプライト番号を参照して、それによって他の描画も変更したいような場合です。
 *	  とは言え、あまり濫用すると今後、ST_LcdSeqCh構造体,ST_LcdSeqChInfo構造体のフィールドを変更した場合に互換性の問題が生じますので、
 *	  なるべく、アプリケーションが直接LcdSeq_GetLcdSeqChInfo(),LcdSeq_GetLcdSeqCh()を呼び出す事は避けてください。
 *	- また、上記の関数をグローバル関数に変更した事で、既存のLcdSeqCh_GetCnt()は不要になってしまったのですが、残しておく事にしました。
 *	  前述の通り、アプリケーションがLcdSeq_GetLcdSeqChInfo(),LcdSeq_GetLcdSeqCh()を直接呼び出す事は望ましくないので、
 *	  LcdSeqCh_GetCnt()で済むならばLcdSeqCh_GetCnt()を使用するようにして下さい。
 */
#ifndef __CLIP_LCDS_H__
#define __CLIP_LCDS_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	
 ****************************************************************************/
//液晶シーケンサチャネル
typedef struct _ST_LcdSeqCh {
	unsigned short		Cnt;						//+ 0, 2		描画回数					0〜USHRT_MAX(飽和)		LcdSeqCh_Play()で再生開始した後にLcdSeq_Draw()で描画した回数を示す。当モジュールでは利用していない。アプリケーション用のユーティリティとして設けた。
	unsigned short		SprNo;						//+ 2, 2		スプライト番号					0(非表示),1〜SprNo_Max
	unsigned short		Mode;						//+ 4, 2		描画モード		P/ECEでは未使用		DX_BLENDMODE_*			DxLib.hで定義されているDX_BLENDMODE_NUMがUSHRT_MAX以下である事に依存している。2016/09/14現在のVer 3.16fではDX_BLENDMODE_NUM=23なので充分余裕が有る。
	short			Pri;						//+ 6, 2		優先度						SHRT_MIN〜SHRT_MAX
	short			PosX;						//+ 8, 2		座標X						INT_MIN〜INT_MAX
	short			PosY;						//+10, 2		座標Y						INT_MIN〜INT_MAX
} ST_LcdSeqCh;									//=12
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
//液晶シーケンサ
typedef struct _ST_LcdSeq {
	const struct _ST_LcdSeqInfo*	pLcdSeqInfo;				//+ 0, 4		初期化情報へのポインタ
    //	ST_LcdSeqCh		TBL_LcdSeqCh[nLcdSeqCh];			//+ 4,12*nLcdSeqCh	液晶シーケンサチャネル
} ST_LcdSeq;									//= 4+12*nLcdSeqCh
/*--------------------------------------------------------------------------*/
//液晶シーケンサチャネル初期化情報
typedef struct _ST_LcdSeqChInfo {
	unsigned short		Mode;						//+ 0, 2		デフォルト描画モード	P/ECEでは未使用		DX_BLENDMODE_*
	short			Pri;						//+ 2, 2		デフォルト優先度				SHRT_MIN〜SHRT_MAX
	short			PosX;						//+ 4, 2		デフォルト座標X					INT_MIN〜INT_MAX
	short			PosY;						//+ 6, 2		デフォルト座標Y					INT_MIN〜INT_MAX
} ST_LcdSeqChInfo;								//= 8
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
//液晶シーケンサ初期化情報
typedef struct _ST_LcdSeqInfo {
	void	(*fnDraw)(int iLcdSeqCh, const ST_LcdSeqCh* pLcdSeqCh);		//+ 0, 4		アプリケーション定義の描画関数
	unsigned short		_SprNo_Max;					//+ 4, 2		スプライト番号の最大値				アプリケーション事のEnmDef.hで定義されているSprNo_Maxを格納して下さい。#defineで定義されているシンボルなので、このフィールドも静的に初期化可能であるはずです。
	unsigned short		nLcdSeqCh;					//+ 6, 2		液晶シーケンサチャネル数			実際には(unsigned char)でも充分だ。もし今後新しい(unsigned char)型のフィールドを追加する場合は、nLcdSeqChフィールドの型を(unsigned char)に変更しても構わない。
    //	ST_LcdSeqChInfo		TBL_LcdSeqChInfo[nLcdSeqCh];			//+ 8, 8*nLcdSeqCh	液晶シーケンサチャネル初期化情報
} ST_LcdSeqInfo;								//= 8+ 8*nLcdSeqCh
/****************************************************************************
 *	
 ****************************************************************************/
ST_LcdSeq* LcdSeq_New(const ST_LcdSeqInfo* pLcdSeqInfo);
void LcdSeq_Init(ST_LcdSeq* pLcdSeq, const ST_LcdSeqInfo* pLcdSeqInfo);
void LcdSeq_Free(ST_LcdSeq* pLcdSeq);
void LcdSeq_Draw(ST_LcdSeq* pLcdSeq);
void LcdSeqCh_Play(ST_LcdSeq* pLcdSeq, int iLcdSeqCh, int SprNo/*0可*/);	//┬LcdSeqCh_Play()を呼び出して再生を開始する度にST_LcdSeqCh構造体のSprNo以外の設定はST_LcdSeqChInfo構造体から取得したデフォルト値に初期化される。
void LcdSeqCh_SetMode(ST_LcdSeq* pLcdSeq, int iLcdSeqCh, int Mode);		//│デフォルト値以外の設定で再生を行いたい場合はLcdSeqCh_Play()に続けてLcdSeqCh_Set〜()を呼び出せ。
void LcdSeqCh_SetPri(ST_LcdSeq* pLcdSeq, int iLcdSeqCh, int Pri);		//│途中まで再生した時点でLcdSeqCh_Set〜()を呼び出して途中から設定を変更する事も可能である。
void LcdSeqCh_SetPos(ST_LcdSeq* pLcdSeq, int iLcdSeqCh, int PosX, int PosY);	//┘停止中のチャネル対してLcdSeqCh_Set〜()を呼び出した場合は何もしない。
void LcdSeqCh_SetSprNo(ST_LcdSeq* pLcdSeq, int iLcdSeqCh, int SprNo/*0可*/);	//再生中のチャネルの設定を維持したままでスプライトを変更するには、LcdSeqCh_Play()の代わりにLcdSeqCh_SetSprNo()を呼び出せ。停止中ならば何もしない。
int  LcdSeqCh_GetCnt(ST_LcdSeq* pLcdSeq, int iLcdSeqCh);			//再生中ならば描画回数(0〜)を返す。停止中ならば-1を返す。
void LcdSeq_Stop(ST_LcdSeq* pLcdSeq);
void LcdSeqCh_Stop(ST_LcdSeq* pLcdSeq, int iLcdSeqCh);
//{{2016/10/12追加:LcdSeq_GetLcdSeqChInfo(),LcdSeq_GetLcdSeqCh()を、ローカル関数⇒グローバル関数に変更しました。
const ST_LcdSeqChInfo* LcdSeq_GetLcdSeqChInfo(ST_LcdSeq* pLcdSeq, int iLcdSeqCh);
ST_LcdSeqCh* LcdSeq_GetLcdSeqCh(ST_LcdSeq* pLcdSeq, int iLcdSeqCh);
//}}2016/10/12追加:LcdSeq_GetLcdSeqChInfo(),LcdSeq_GetLcdSeqCh()を、ローカル関数⇒グローバル関数に変更しました。
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_LCDS_H__
