/*
 *	clipvsl.h
 *
 *	ビデオスロットゲーム用サブルーチン集
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Thu Feb 11 21:46:05 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	* Fri Jun 03 21:47:06 JST 2016 Naoyuki Sawa
 *	- シンボルタイプの定数を定義しました。
 *	  これまではシンボルタイプを直値(-1,0,1)で指定していましたが、今後はシンボル(VslTyp_*)で指定して下さい。
 *	* Tue Jun 07 22:13:11 JST 2016 Naoyuki Sawa
 *	- 通常ラインタイプの、配当額取得関数(旧:fnGetPay)を、ライン配当額取得関数(新:fnLinPay)と、スキャッター配当額取得関数(新:fnScaPay)に分けました。
 *	  243ウェイ・ルート払い戻しタイプの、配当額取得関数(旧:fnGetPay)を、ウェイ配当額取得(新:fnWayPay)と、スキャッター配当額取得関数(新:fnScaPay)に分けました。
 *	  上記のように変更した理由は、揃ったライン(又はウェイ)によって、配当額が変わるケースに対応するためです。
 *	  揃ったライン(又はウェイ)によって配当額が変わるルールの場合は、引数iLin(又はiRow[])を参照して、揃ったラインに応じた配当額を返して下さい。
 *	  揃ったライン(又はウェイ)によって配当額が変わらないルールの場合は、引数iLin(又はiRow[])を無視して下さい。
 *	* Thu Jul 07 21:12:07 JST 2016 Naoyuki Sawa
 *	- 3行以外の行数に対応しました。
 *	  これまでは、5リール3行固定でしたが、今後は、5リール1行〜5リール(VslRow_Max)行まで対応可能になりました。
 *	  行数は、ST_Vsl5nl_GetWin_Inf構造体,又は,ST_Vsl243_GetWin_InfのnRowフィールドで指定して下さい。
 *	- 今回の変更により、'243ウェイ・ルート払い戻しタイプ'は厳密には243ウェイではなく、(nRow^5)ウェイとなります。
 *	  しかし便宜上、243ウェイという名前の方が判り易いので、関数名は変えない事にしました。
 *	- 変更後の検証がまだ不十分です。(特にVsl243_GetWin())
 *	  今後、実際に使いながら、検証する予定です。
 *	* Wed Jul 20 21:23:00 JST 2016 Naoyuki Sawa
 *	- シンボルタイプ(列挙値)を廃止し、シンボル属性(フラグ)に変更しました。
 *	  アプリケーション定義の、シンボルタイプ取得関数(*fnGetTyp)()を、シンボル属性取得関数(*fnGetAtt)()に変更しました。
 *	  この変更によって、通常シンボル,ワイルドシンボル,スキャッターシンボルに加えて、スキャッターワイルドシンボルも表現出来るようになりました。
 *	* Sun Aug 07 21:13:31 JST 2016 Naoyuki Sawa
 *	- VslRel_GetSensorCrossingCount_Linear(),VslRel_GetSensorCrossingCount_Circular()を追加しました。
 *	  直線上,又は,円周上の移動において、特定の位置を跨いだ回数を求める、汎用的な処理ですが、
 *	  今回は、リールアニメーション処理で使用するために作成したので、当モジュールに含める事にしました。
 *	  他の用途にも、使用出来ると思います。
 *	* Mon Aug 29 21:46:36 JST 2016 Naoyuki Sawa
 *	- VslRel_GetSensorExceedingCount_Linear()を追加しました。
 */
#ifndef __CLIP_VSL_H__
#define __CLIP_VSL_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	定数
 ****************************************************************************/
//行数の最大値
#define VslRow_Max		9		//行数の最大値(変更可)
/*--------------------------------------------------------------------------*/
//シンボル属性
// - アプリケーション定義のシンボル属性取得関数(fnGetAtt)は、以下の値の0個以上の組み合わせを返してください。
//   各組み合わせの意味は、以下の通りです。
//	0				通常シンボル。
//					ラインウィンを構成します。
//	VslAtt_Wild			ワイルドシンボル。
//					通常シンボルと混合して,又は,ワイルドシンボル単体で、ラインウィンを構成します。
//	VslAtt_Scatter			スキャッターシンボル。
//					スキャッターウィンを構成します。
//	VslAtt_Wild|VslAtt_Scatter	スキャッターワイルドシンボル。
//					通常シンボル及びワイルドシンボルと混合して,又は,スキャッターワイルドシンボル単体で、ラインウィンを構成します。
//					スキャッターシンボルと混合して,又は,スキャッターワイルドシンボル単体で、スキャッターウィンを構成します。
//					ただし実際には、スキャッターワイルドシンボル単体でラインウィンとスキャッターウィンを同時に払い出すと問題が有ると思うので、リールストリップ,又は,ペイテーブルの設計で回避して下さい。
//					前者の例としては、スキャッターワイルドシンボルを1stリールには配置しないようにしてスキャッターワイルドシンボル単体でラインウィンが構成されないようにする、等です。
//					後者の例としては、(*fnLinPay)()がスキャッターワイルドシンボルに対して常に0を返すようにして、スキャッターワイルドシンボル単体のラインウィン配当を0にする、等です。
#define VslAtt_Wild		(1<<0)		//ワイルドシンボル
#define VslAtt_Scatter		(1<<1)		//スキャッターシンボル
/****************************************************************************
 *	通常ラインタイプ
 ****************************************************************************/
typedef struct _ST_Vsl5nl_GetWin_Inf {
	int nRow;										//行数				1〜VslRow_Max
	int nLin;										//ライン数			1〜
	int (*fnGetRow)(int iLin, int iRel, void* arg);						//ライン行取得			(ライン番号=iLin,リール番号=iRel)に対する、行番号(0〜(nRow-1))を返して下さい。
	int (*fnLinPay)(int iSym, int nOak, int iLin, void* arg);				//ライン配当額取得		(シンボル番号=iSym,出現数=nOak,ライン番号=iLin)に対する、配当額(0〜)を返して下さい。
	int (*fnScaPay)(int iSym, int nOak, void* arg);						//スキャッター配当額取得	(シンボル番号=iSym,出現数=nOak)に対する、配当額(0〜)を返して下さい。
	int (*fnGetAtt)(int iSym, void* arg);							//シンボル属性取得		0,VslAtt_Wild,VslAtt_Scatter,(VslAtt_Wild|VslAtt_Scatter)のいずれかの値を返して下さい。
	int (*fnGetSta)(int iRel, int iRow, void* arg);						//停止形取得(Stationary)	0以上の値で、アプリケーション定義のシンボル番号を返して下さい。
	void (*fnLinWin)(int iSym, int nOak, int iLin, int nPay, void* arg);			//ラインウィン通知		このラインで揃った(nOak≧1)のコンビネーションの内、最大の配当額(0も含む)について通知する。
	void (*fnScaWin)(int iSym, int nOak, int nPay, void* arg);				//スキャッターウィン通知	当関数は配当額を考慮しない。(nOak≧1)のコンビネーションを全て通知する。
} ST_Vsl5nl_GetWin_Inf;
int Vsl5nl_GetWin(const ST_Vsl5nl_GetWin_Inf* pInf, void* arg);
/****************************************************************************
 *	243ウェイ・ルート払い戻しタイプ
 ****************************************************************************/
typedef struct _ST_Vsl243_GetWin_Inf {
	int nRow;										//行数				1〜VslRow_Max
//無し	int nLin;										//ライン数			1〜
//無し	int (*fnGetRow)(int iLin, int iRel, void* arg);						//ライン行取得			(ライン番号=iLin,リール番号=iRel)に対する、行番号(0〜(nRow-1))を返して下さい。
	int (*fnWayPay)(int iSym, int nOak, const int iRow[/*nOak*/], void* arg);		//ウェイ配当額取得		(シンボル番号=iSym,出現数=nOak,ウェイ=iRow[0〜(nOak-1)])に対する、配当額(0〜)を返して下さい。
	int (*fnScaPay)(int iSym, int nOak, void* arg);						//スキャッター配当額取得	(シンボル番号=iSym,出現数=nOak)に対する、配当額(0〜)を返して下さい。
	int (*fnGetAtt)(int iSym, void* arg);							//シンボル属性取得		0,VslAtt_Wild,VslAtt_Scatter,(VslAtt_Wild|VslAtt_Scatter)のいずれかの値を返して下さい。
	int (*fnGetSta)(int iRel, int iRow, void* arg);						//停止形取得(Stationary)	0以上の値で、アプリケーション定義のシンボル番号を返して下さい。
	void (*fnWayWin)(int iSym, int nOak, const int iRow[/*nOak*/], int nPay, void* arg);	//ウェイウィン通知		当関数は配当額を考慮しない。(nOak≧1)のコンビネーションを全て通知する。
	void (*fnScaWin)(int iSym, int nOak, int nPay, void* arg);				//スキャッターウィン通知	当関数は配当額を考慮しない。(nOak≧1)のコンビネーションを全て通知する。
} ST_Vsl243_GetWin_Inf;
int Vsl243_GetWin(const ST_Vsl243_GetWin_Inf* pInf, void* arg);
/****************************************************************************
 *	リールアニメーション処理の補助関数
 ****************************************************************************/
int VslRel_GetSensorCrossingCount_Linear(double oldpos, double vec, double snspos, double* pnewpos/*NULL可*/);
int VslRel_GetSensorCrossingCount_Circular(double oldpos, double vec, double snspos, double lbound, double ubound, double* pnewpos/*NULL可*/);
/*--------------------------------------------------------------------------*/
int VslRel_GetSensorExceedingCount_Linear(double oldpos, double vec, double snspos, double* pnewpos/*NULL可*/);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_VSL_H__
