/*
 ******************************************************************************
 *  	File 		: m_cpak.h
 *	Programer	: Gentaro Takaki
 *  
 *	$Id: m_cpak.h,v 1.2 2004/02/12 22:54:41 tong Exp $
 ******************************************************************************
 */



#ifndef	M_CPAK_H_INCLUDED
#define	M_CPAK_H_INCLUDED

#if	defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

#ifdef	_LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include "m_cpak_h.h"
#include "m_view.h"

#include "m_common_data.h"

/*
 *	パックセーブデータ
 */
enum	pak_save_data_kind {
    mCPk_DATA_PRIVATE_e,	/** プレーヤーデータ */
    mCPk_DATA_LETTER_e,		/** 手紙データ */
    mCPk_DATA_END_e
};

/*
 *	コントローラパック内のデータ状況
 */
enum	cpak_data_status {
    mCPk_DATA_EX_e,		/** 動物の森のデータが存在する */
    mCPk_DATA_NO_e,		/** 動物の森のデータが存在しない(空きあり) */
    mCPk_DATA_EX_NO_PLAYER_e,	/** 動物の森のデータが存在するが空である */
    mCPk_DATA_LACK_AREA_e,	/** セーブエリア不足 */
    mCPk_DATA_NOTE_FULL_e,	/** パックにデータがなくノートの空きがない */
    mCPk_DATA_ERR_e,		/** エラー */

    mCPk_DATA_STATUS_END_e
};

/*
 *	コントローラーパックセーブ許可
 */
enum	cpak_save_permission {
    mCPk_SAVE_PRM_NO_PAK_e,	/** コントローラパックがない */
    mCPk_SAVE_PRM_DATA_DIFF_e,	/** 開始時とデータが異なる */
    mCPk_SAVE_PRM_NO_AREA_e,	/** パックにデータがなく空きがない */
    mCPk_SAVE_PRM_NO_OK_e,	/** セーブ許可 ( パックにデータなし ) */
    mCPk_SAVE_PRM_EX_OK_e,	/** セーブ許可 ( パックにデータあり ) */
    mCPk_SAVE_PRM_ERR_e,	/** コントローラパックエラー */
    mCPk_SAVE_PRM_NOTE_FULL_e,	/** パックにデータがなくノートの空きがない */

    mCPk_SAVE_PERMISSION_END_e
};

/** フォルダ─数 */
#define	mCPk_PACK_FOLDER_MAX		(8)
/** フォルダ─ラベル文字列の最大文字数 */
#define	mCPk_PACK_LABEL_STR_MAX		(10)
/** フォルダ─内の手紙最大数 */
#define	mCPk_PACK_FOLDER_MAIL_CAPA	(20)


/*
 *	手紙データセーブ・ロード用構造体
 */
typedef struct	pak_save_load_mail_class {
    unshort	check_sum;		/** チェックサム */
    unchar	label[mCPk_PACK_FOLDER_MAX][mCPk_PACK_LABEL_STR_MAX];
    Mail_c	mail[mCPk_PACK_FOLDER_MAX][mCPk_PACK_FOLDER_MAIL_CAPA];
} mCPk_mail_c;

/*
 ****************************************************************
 *	コントローラパックのエラーメッセージ出力関数
 *
 *	in	: パックファイル構造体 (sCPK_pkf_c *)
 *		  コントローラ番号 (int)
 *
 *	out	: なし
 *
 *	返り値	: 正常終了 1
 *		  異常終了 0
 ****************************************************************
 */
#define	mCPk_ErrMsg( pakf, idx )	mCPk_PrintErrMsg( pakf, idx )

extern void mCPk_PrintErrMsg(
    sCPk_pkf_c *pakf_p,	/** パックファイル構造体 */
    int idx		/** コントローラ番号 */
    );

/*
 ****************************************************************
 *	コントローラパックのオープン関数
 *
 *  	in	: コントローラ番号 (int)
 *
 *	out	: パッドマネージャー構造体 (padmgr_t *)
 *
 *	返り値	: 正常終了 1
 *		  異常終了 0
 ****************************************************************
 */
/** システム用 */
extern int mCPk_PakOpen(
    mCPk_pkinfo_c	*paks_p,
    int			idx	/** コントローラ番号 */
    );
/** パックオープン */
#define	mCPk_Open(idx)		mCPk_PakOpen( mCPk_get_pkinfo( ), (idx))

/*
 ****************************************************************
 *	コントローラパックのノートの最大数と使用数を算出する関数
 *
 *	in	: パッドマネージャー構造体 (padmgr_t *)
 *		  コントローラ番号 (int)
 *
 *	out	: なし
 *
 *	返り値	: 正常終了 1
 *		  異常終了 0
 ****************************************************************
 */
/** システム用 */
extern int mCPk_NoteNum(
    mCPk_pkinfo_c	*pak_p
    );

/*
 ****************************************************************
 *	コントローラパックのノートのステータスを取得する関数
 *
 *	in	: パッドマネージャー構造体 (padmgr_t *)
 *		  コントローラ番号 (int)
 *
 *	out	: なし
 *
 *	返り値	: 正常終了 1
 *		  異常終了 0
 ****************************************************************
 */
/** システム用 */
extern int mCPk_AllFileState(
    mCPk_pkinfo_c	*pak_p
    );

/*
 ****************************************************************
 *	コントローラパックのノートの空きブロック数を取得する関数
 *
 *	in	: パッドマネージャー構造体 (padmgr_t *)
 *		  コントローラ番号 (int)
 *
 *	out	: なし
 *
 *	返り値	: 正常終了 1
 *		  異常終了 0
 ****************************************************************
 */
/** システム用 */
extern int mCPk_FreeBlockNum(
    mCPk_pkinfo_c	*pak_p
    );

/*
 ****************************************************************
 *	コントローラパック情報の初期化
 *
 *	in	: コントローラ番号 (int)
 *
 *	out	:
 *	   
 *	返り値	: 1 正常終了 / 0 異常終了
 ****************************************************************
 */
extern int mCPk_InitPak(
    int			idx		/** コントローラ番号 */
    );

/*
 ****************************************************************
 *	パックセーブ用領域にプレーヤーデータセット
 ****************************************************************
 */
extern void mCPk_SetPrivateSavefile(
    Private_c	*private_p
    );

/*
 ****************************************************************
 *	パックセーブ用領域のプレーヤーデータポインタ取得
 ****************************************************************
 */
extern Private_c *mCPk_GetSaveFilePrivateP( void );

/*
 ****************************************************************
 *	持ち出すデータをパックにセーブ
 *
 *	正常終了	TRUE
 *	異常終了	FALSE
 ****************************************************************
 */
extern int mCPk_SavePak(
    Private_c		*private_p,
    Animal_c		*animal_p,
    mCPk_pkinfo_c	*pak_info_p
    );

/*
 ****************************************************************
 *	プレイヤー情報をコントローラパックからロードする関数
 *
 *	in	: プレーヤーデータポインタ
 *
 *	out	: なし
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 ****************************************************************
 */
extern int mCPk_PakPrivateLoad(
    Private_c		*private_p,
    Animal_c		*animal_p,
    mCPk_pkinfo_c	*pak_info_p
    );

/*
 ****************************************************************
 *	コントローラパック内のプレーヤーのプレーヤーナンバー取得
 *
 *	返り値
 *
 *	取得成功	プレーヤーナンバー
 *		この国の人	0 〜 (COMPATRIOT_PLAYER_NUM - 1)
 *		違う国の人	mPr_FOREIGNER_PLAYER_NO
 *
 *	取得失敗	-1
 ****************************************************************
 */
extern int mCPk_GetPakPlayerNo( void );

/*
 ****************************************************************
 *	コントローラパックのプレーヤーの名前取得
 ****************************************************************
 */
extern unchar *mCPk_GetPakPlayerName( void );

/*
 ****************************************************************
 *	コピー対策処理
 *
 *	セット成功	TRUE
 *	セット失敗	FALSE
 ****************************************************************
 */
extern int mCPk_SetPakCopyProtect(
    mCPk_pkinfo_c	*pak_info_p
    );

/*
 ****************************************************************
 *	コピー対策コードチェック
 *
 *	OK	TRUE
 *	NG	FALSE
 ****************************************************************
 */
extern int mCPk_CheckPakCopyProtect(
    mCPk_pkinfo_c	*pak_info_p
    );

/*
 ****************************************************************
 *	パックセーブ許可取得	プレーヤーデータセーブ用
 *
 *	返り値	:	パックセーブ許可
 ****************************************************************
 */
extern int mCPk_GetPermissionSavePakPlayer( void );

/*
 ****************************************************************
 *	パックセーブ許可	手紙データセーブ用
 *
 *	返り値	: セーブ許可 ( cpak_save_permission参照 )
 *---------------------------------------------------------------
 *	※ 注意 ※
 *
 *	この関数内ではパックのオープンは行っていません。
 *	必ずコントローラパックの一連の処理の最初に
 *	パックのオープン関数をコールしてください
 ****************************************************************
 */
extern int mCPk_GetPermissionSavePakMail(
    mCPk_pkinfo_c	*pak_info_p
    );
/* パックオープンつき */
extern int mCPk_GetPermissionSavePakMailAndOpen( void );
/*
 ****************************************************************
 *	手紙データのセーブ
 *
 *	正常終了	TRUE	
 *	処理中		FALSE
 *	異常終了	-1
 ****************************************************************
 */
extern int mCPk_SavePakMail2(
    mCPk_mail_c		*mail_p,	/** セーブする手紙データ */
    mCPk_pkinfo_c	*pak_info_p
    );
#define	mCPk_SavePakMail( m )	mCPk_SavePakMail2( m, mCPk_get_pkinfo( ))

/*
 ****************************************************************
 *	手紙データのロード
 *
 *	正常終了		1
 *	ノートのオープン失敗	0
 *	ロード失敗		-1
 ****************************************************************
 */
extern int mCPk_LoadPakMail2(
    mCPk_mail_c		*mail_p,	/** セーブする手紙データ */
    mCPk_pkinfo_c	*pak_info_p
    );

#define	mCPk_LoadPakMail( m )	mCPk_LoadPakMail2( m, mCPk_get_pkinfo( ))

/*
 ****************************************************************
 *	コントローラパック内のデータ消去
 *
 *	正常終了	TRUE
 *	異常終了	FALSE
 ****************************************************************
 */
extern int mCPk_EraseForestData( void );

/*
 ****************************************************************
 *	プレーヤーデータののチェックサム
 *
 *	成功		TRUE
 *	失敗		FALSE
 *	パックエラー	-1
 *
 *	注意
 *	この関数の前にパックオープンの関数をよんでください
 ****************************************************************
 */
extern int mCPk_CheckCheckSumPlayer( void );

/*
 ****************************************************************
 *	ゲーム開始時のチェックサムによるノートの消去
 *
 *	注意
 *	この関数の前にパックオープンの関数をよんでください
 ****************************************************************
 */
extern void mCPk_CheckCheckSumPlayerErase( void );


/*
 ****************************************************************
 *	現在オープン中のパックの IDが正常かチェック
 *
 *	ID 正常		TRUE
 *	ID 異常		FALSE
 *
 *	この関数をコールする前に必ずパックをオープンしてください
 *	この関数は IDの 正常異常しかみれません
 ****************************************************************
 */
extern int mCPk_CheckPakID( void );

/*
 *	コントローラパック構造体取得
 */
extern mCPk_pkinfo_c *mCPk_get_pkinfo(void);

#ifdef	_LANGUAGE_C_PLUS_PLUS
}
#endif

#endif
#endif	/* M_CPAK_H_INCLUDED */
