/*	
 *	cliplotr.h
 *
 *	抽選表ROM形式
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015 Naoyuki Sawa
 *
 *	* Wed Feb 18 21:49:13 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	- 当モジュールは、cliplot.cモジュールのラッパーとして動作し、以下の機能を追加します。
 *	  1. 抽選表を、アドレスでなく抽選表番号で指定する、関数インターフェイスを追加します。
 *	  2. 各抽選表の各列の各当選値が、何回当選したかをログとして記録する機能を追加します。
 *	     ログ機能は、LotRom_BeginLog()〜LotRom_EndLog()の間のみ有効となります。
 *	     LotRom_BeginLog()を呼び出さなければ、余分なメモリ消費も処理負荷も生じません。
 *	* Mon Mar 02 21:47:20 JST 2015 Naoyuki Sawa
 *	- ST_LotRom構造体のm_LotTblNo_Max,m_TBL_LotTblフィールドを削除しました。LotRom_Init()の_LotTblNo_Max引数を削除しました。
 *	  やや大幅な変更になので、変更前のコードは残していません。変更前のコードを見返したい場合は、前回のアーカイブを参照してください。
 *	  dLotTblC.exeがTBL_LotTblNo[0]に(LotTblNo_Max+1)を格納するようなったので、アプリケーションから明示的に指定する必要が無くなったからです。
 *	  詳細は/clip/tool/dLotTblC/winapp.hの同日のコメントを参照してください。
 */
#ifndef __CLIP_LOTR_H__
#define __CLIP_LOTR_H__
//USE_LOTROM_LOGシンボルを定義しなければ、ログ機能を含めずにビルドします。
//ログ機能はLotRom_BeginLog()〜LotRom_EndLog()の間のみ有効となるので、ログ機能が不要な場合であっても、ログ機能を含めてビルドしてもプログラムの動作に影響は無いのですが、
//ログ機能を使用しない事が確実な場合(例えば動的メモリ割り当ての無い実行環境など)で、ログ機能のコードも節約したい場合はUSE_LOTROM_LOGの定義をコメントアウトしてください。
//P/ECE用に使用する場合も、Windows用に使用する場合も、ログ機能を利用可能です。
#ifndef __RENESAS__
#define USE_LOTROM_LOG
#endif//__RENESAS__
//──────────────────────────────────────
//■「抽選表ROM形式」について
//│struct 抽選表ROM {
//│  int            TBL_LotTblNo[LotTblNo_Max+1];
//│  unsigned short TBL_LotTbl[〜];
//│}
//MkLotTbl.batとMkLotTblNo.batで出力したLotTbl.cとLotTblNo.cをコンパイルして、
//『LotTblNo.o,LotTbl.o』の順でリンクすれば、「抽選表ROM形式」になります。
//──────────────────────────────────────
/****************************************************************************
 *	構造体定義
 ****************************************************************************/
typedef struct _ST_LotRom {
	const int*			m_TBL_LotTblNo/*[LotTblNo_Max+1]*/;	//抽選表アドレステーブルへのポインタ	[抽選表番号]⇒TBL_LotTbl[]に対するインデクス
	int				(*m_fnRnd)(/*void* fnRndArg*/);		//乱数ジェネレータ関数へのポインタ	引数の無い関数も警告無く指定可能とするために、引数を明示しない型定義にしておく。
	void*				m_fnRndArg;				//乱数ジェネレータ関数への引数		引数の無い関数を指定した場合は、引数はダミーとなる。('cdecl呼出規約'なので安全。)
#ifdef  USE_LOTROM_LOG
	struct _ST_LotRom_TblLog*	m_TBL_TblLog/*[LotTblNo_Max+1]*/;	//抽選表ログ				NULL=ログが開始していない事を示す。
#endif//USE_LOTROM_LOG
} ST_LotRom;
/****************************************************************************
 *	グローバル関数
 ****************************************************************************/
void LotRom_Init(const int* _TBL_LotTblNo/*[LotTblNo_Max+1]*/, int (*_fnRnd)(/*void* fnRndArg*/), void* _fnRndArg);
void LotRom_Free();
#ifdef  USE_LOTROM_LOG
void LotRom_BeginLog();
void LotRom_DumpLog();
void LotRom_EndLog();
#endif//USE_LOTROM_LOG
int LotRom_draw_v(int LotTblNo, const int* pid);
int LotRom_draw_a(int LotTblNo, va_list ap);
int LotRom_draw_l(int LotTblNo, ...);
int LotRom_get_weight_v(int LotTblNo, const int* pid, int hitval_sel);
int LotRom_get_weight_a(int LotTblNo, va_list ap, int hitval_sel);
int LotRom_get_weight_l(int LotTblNo, int hitval_sel, ...);
int LotRom_get_size(int LotTblNo);
int LotRom_get_id_size(int LotTblNo);
void LotRom_get_column_id(int LotTblNo, int i_column, int* pid);
#endif//__CLIP_LOTR_H__
