/*
 ******************************************************************************
 *
 *	共通データ定義
 *	$Id: m_common_data.h,v 1.3 2004/02/21 02:12:16 tong Exp $
 ******************************************************************************
 */
#ifndef INCLUDE_M_COMMON_DATA_H
#define INCLUDE_M_COMMON_DATA_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif	/* _LANGUAGE_C_PLUS_PLUS */


#define BBPLAYER

#include "m_scene.h"
#include "audio.h"
#include "m_scene_table.h"

#include "m_submenu_h.h"

#include "m_clip.h"
#include "m_demo.h"

#include "m_npc.h"

#include "m_event.h"
#include "m_plant.h"

#include "m_post_office_h.h"
#include "m_police_box_h.h"
#include "m_notice.h"
#include "m_snowman_h.h"
#include "m_weather_type.h"
#include "m_npc_schedule_h.h"
#include "m_npc_walk.h"
#include "famicom_emu.h"	/* FamicomEmu_Common */
#include "m_museum_h.h"

/*
 ************************************************
 *						*
 *		定数データ			*
 *						*
 ************************************************
 */
/* アイテム数 */
#define	ITEM_POSSESS_NUM	(15)
/* プレーヤー持ち金限度額 */
#define	PLAYER_MONEY_MAX	(50000)
/* アドレス帳に登録できる数 */
#define	ADDRESS_REGIST_NUM	(16)
/* 家具の最大数 */
#define mCm_FURNITURE_PLACE_MAX	(10*10)
/* 郵便受けの手紙所持数 */
#define MAIL_BOX_CAPA		(10)
/* ハニワの持ってるアイテムの数 */
#define	HANIWA_ITEM_POSSESS_NUM	(4)
/* ハニワのメッセージ一行文字数 */
#define HANIWA_MESSAGE_COL	(16)
/* ハニワのメッセージ行数 */
#define HANIWA_MESSAGE_LINE	(4)
/* ハニワのメッセージ文字数 */
#define	HANIWA_MESSAGE_NUM	(HANIWA_MESSAGE_COL * HANIWA_MESSAGE_LINE)

/* 来店者数 */
#define mSP_VISITOR_MAX		(10)
/* 陳列商品数 */
#define mSP_GOODS_MAX		(31)
/* 福引景品数 */
#define	mSP_GIFT_MAX		(3)

/** 登録済 NPC数	余分に取ってあります */
#define	mNpc_RGSTD_NPC_NUM	(0xff)
/** 登録済 NPC用ビット情報テーブルサイズ	char用 */
#define	mNpc_RGSTD_NPC_BIT_TBL_SIZE_u8	\
		 		(((mNpc_RGSTD_NPC_NUM + 7) & 0xfff8)/ CHAR_BIT)

/** Flashrom のサイズ */
#define FLASH_SIZE_BYTE		(0x00000080)
#define FLASH_SIZE_BYTE_U32	(int)(FLASH_SIZE_BYTE /4)

/*
 *	植物商品
 */
enum {
    mSP_SEEDLING,	/* 木の苗	*/

    mSP_PLANT_ONLY_MAX,
    
    mSP_SEED1_1 = mSP_PLANT_ONLY_MAX,
    mSP_SEED1_2,
    mSP_SEED1_3,
    mSP_SEED2_1,
    mSP_SEED2_2,
    mSP_SEED2_3,
    mSP_SEED3_1,
    mSP_SEED3_2,
    mSP_SEED3_3,

    mSP_PLANT_MAX
};

/**  商品優先順位用型 */
typedef unchar mSP_list_t;

/*
 * 優先リストをもつ商品の種類
 */
enum {
  mSP_FTR_LIST,
  mSP_BINSEN_LIST,
  mSP_CLOTH_LIST,
  mSP_CARPET_LIST,
  mSP_WALL_LIST,

  mSP_LIST_MAX
};

/*
 *	リハウスの注文
 */
enum {
    /* 小さい家の注文	*/
    SMALL_ROOM_SIZE_ORDER_e,
    /* 中くらいの家の注文	*/
    MEDIUM_ROOM_SIZE_ORDER_e,
    /* 大きい家の注文	*/
    LARGE_ROOM_SIZE_ORDER_e,

    ROOM_SIZE_ALL_TYPES,

    /* 銅像の注文		*/
    BRONZE_STATUE_ORDER_e = ROOM_SIZE_ALL_TYPES,

    ALL_REHOUSE_ORDERS
};

/*
 *	家の料金
 */
#define	SMALL_HOUSE_PRICE	17400
#define	MEDIUM_HOUSE_PRICE	49800
#define	LARGE_HOUSE_PRICE	498000
#define	BRONZE_STATUE_PRICE	0

/*
 *	お金袋の中身の額
 */
enum {
    SMALL_SACK_AMOUNT_e = 1000,
    NORMAL_SACK_AMOUNT_e = 10000,
    LARGE_SACK_AMOUNT_e = 30000,
    LITTLE_SACK_AMOUNT_e = 100
};

/*
 *	お金袋の大きさ
 */
enum {
    SMALL_SACK_SIZE,
    NORMAL_SACK_SIZE,
    LARGE_SACK_SIZE,
    LITTLE_SACK_SIZE,

    SACK_SIZE_ALL_TYPES
};

/*
 *	かぶの数
 */
enum {
    SMALL_KABU_NUM = 10,
    MEDIUM_KABU_NUM = 50,
    LARGE_KABU_NUM = 100,
    BAD_KABU_NUM = 0
};

/*
 *	かぶの種類
 */
enum {
    SMALL_KABU,		/* １０カブ	*/
    MEDIUM_KABU,	/* ５０カブ	*/
    LARGE_KABU,		/* １００カブ	*/
    BAD_KABU,		/* 腐ったカブ	*/

    KABU_ALL_TYPES
};

/*
 *	アイテムの状態
 */
enum {
    ITEM_CD_NORMAL,		/* ノーマル		*/
    ITEM_CD_PRESENT,		/* プレゼント		*/
    ITEM_CD_QUEST,		/* クエスト用		*/
    ITEM_CD_CHK_ALL		/* ビットチェック用	*/
};


/*
 *	お金型
 */
typedef unint	money_t;

/*
 *	ハニワの取引条件
 */
enum {
    HANIWA_FREE_TRADE_COND_e,
    HANIWA_ONLY_SHOW_COND_e,
    HANIWA_SELL_COND_e,

    HANIWA_ALL_TRADE_CONDS
};

/*
 *	サウンドモード
 */
enum {
    SOUND_MODE_STEREO,		/* ステレオ	*/
    SOUND_MODE_MONO,		/* モノラル	*/
    SOUND_MODE_HEADPHONE,	/* ヘッドフォン	*/

    SOUND_ALL_MODES
};

/*
 *	ボイスモード
 */
enum {
    VOICE_MODE_HANAMOGERA,	/* ハナモゲラ	*/
    VOICE_MODE_CLICK,		/* クリック	*/
    VOICE_MODE_SILENT,		/* 消音		*/

    VOICE_ALL_MODES
};

/*
 *	リセット魔神の時のリアクション
 */
enum {
    NO_RESET_REACT,

    OPEN_DOOR_RESET_REACT,		/* ドアを開ける		*/
    OUT_OF_BLOCK_RESET_REACT,		/* ブロックから出る	*/
    OPEN_SUBMENU_RESET_REACT,		/* サブメニューを開く	*/
    TALK_WITH_HANIWA_RESET_REACT,	/* はにわに話しかける	*/
    OPEN_MAILBOX_RESET_REACT,		/* 郵便受けを開ける	*/

    ALL_RESET_REACT_TYPES
};



/*
 ************************************************
 *						*
 *	各種クラス設定（セーブ用）		*
 *						*
 ************************************************
 */

/*
 *	国情報クラス	元太郎
 */
typedef struct land_info_class {
    unchar	name[COUNTRY_NAME_NUM];	/** 国名 */
    char	player_exist;	/** プレーヤーの存在  TRUE 存在 / FALSE だめ */
    lndid_t	id;			/** 国識別 ID */
} mLd_lnd_c;


/*
 *	アドレス帳クラス
 */
#if 0
typedef struct {
    Mail_nm_c	name;
} Address_c;
#endif

#define	NO_USE_ADDRESS_CHK_CODE	((lndid_t)0xffff)/* 未使用コード */

/*
 *	かぶ価情報
 */
typedef struct {
    unshort	price[SEVENDAYS_IN_A_WEEK];	/* かぶ価スケジュール	*/
    unshort	trade_market;			/* 景気			*/
    OSRTCTime	rtcTime;			/* かぶ価情報決定日時	*/

} Kabu_price_c;

/*
 *	布クラス
 */
typedef struct {
    unshort	num;		/* データ番号		*/
    mAc_nfs_t	name;		/* プレイヤーの服の名前	*/

} Cloth_c;

/*
 *	設定
 */
typedef struct {
    unchar	sound;		/* サウンド設定	*/
    unchar	voice;		/* ボイス設定	*/
    unshort	pad_s;

} Config_c;

/*
 *	お店で購入する家具情報
 */
typedef struct	shop_ftr_order_info		mPr_sftr_c;
struct	shop_ftr_order_info {
    mAc_nfs_t	itemNo;		/* 家具のアイテムナンバー */
    unchar	shopLevel;	/* 購入したお店のレベル */
    unchar	pad;
};

/*
 *	個人情報クラス
 */
typedef struct {
    PersonalID_c	pID;			/* 識別情報 */

    signed char		Distinction;		/* 主人公の性別 */
    signed char		face_type;		/* プレーヤータイプ */

    unchar		reset;			/* リセットカウンタ */
    mMsm_record_c	museum_record;		/** 博物館情報 */

    /* 所有情報 */
    struct {
	mAc_nfs_t	itemNo[ITEM_POSSESS_NUM];/*所有アイテム(特産物を含む)*/
	u8		ticket_expiration;	/* 福引の賞味期限 */
	unchar		ticket_remain;		/* 渡しきれていない福引の数 */
	unint		item_cond;		/* アイテムの状態 */
	money_t		money;			/* 所持金 */
	money_t		loan;			/* 借金 */

    } possession;

    mQst_dlv_c		delivery[DELIVERY_QUEST_MAX];	/** 配達クエスト */
    mQst_erd_c		errand[ERRAND_QUEST_MAX];	/** お使いクエスト */

    /* 装備情報 */
    struct {
	mAc_nfs_t	item;			/* 装備品 */

    } equipment;

    Mail_mh_c	mail_header;			/* ヘッダー内容（慣用句） */
    Mail_c	mail[MAIL_POSSESS_NUM];		/* お手紙 */

    mAc_nfs_t	back_tex_name;		/* 持ち物画面の裏地の名前 */
    unchar	exist;			/** プレーヤーの存在(国の中にいるか)*/
    unchar	hint;			/** ヒント聞いた回数 */

    Cloth_c	cloth;				/* プレイヤーの服情報 */

    AnmPersonalID_c	foreign_npc_id;		/** 外国人 NPC個人情報 */

    mPr_dst_c	destiny;			/** 運命 */

    mPr_bth_c	birthday;			/** 誕生日 */

    mPr_sftr_c	shop_ftr[SHOP_FTR_ORDER_MAX];	/** お店で購入する家具 */

    mAc_nfs_t	mobile_ftr[MOBILE_FTR_ORDER_MAX];	/** モバイル家具 */

    u32		fish_collect_bit;	/* 魚収集情報 */
    u32		insect_collect_bit;	/* 虫収集情報 */

    unint	md_collect_bit[2];	/** MD収集情報（フラグが落ちること有り）*/

    Anm_remail_c	remail;		/** 外国で送った動物への手紙情報 */

    unint	reset_code;		/** リセットチェックコード */

    mPr_ranm_c	animal_memory;		/** 置いてきた NPC情報 */

    unchar	comp_ins_fish;		/** 虫・魚コンプリート情報 */

    u32		furniture_collect_bit[30];	/* 家具収集情報（服、化石、傘、ハニワ含む）
						   魚、虫の場所は未使用 */
    u32		wall_collect_bit[2];	/* 壁紙収集情報 */
    u32		carpet_collect_bit[2];	/* 絨毯収集情報 */
    u32		paper_collect_bit[2];	/* 便箋収集情報 */
    u32		music_collect_bit[2];	/* 音楽収集情報（フラグが落ちることなし） */

    mPr_map_c	map[GET_MAP_MAX];	/** マップ所持情報 */

    u64		pad;			/* 予備 */
} Private_c;

#define	NO_USE_PLAYER_CHK_CODE	((lndid_t)0xffff)/* プレーヤー未使用コード */

/*
 *	装飾( 壁紙・絨毯 )の情報
 */
typedef struct	interior_class {
    unchar	floor_num;	/* 絨毯の番号 */
    unchar	wall_num;	/* 壁の番号 */
} Interior_c;


typedef struct {
    mAc_nfs_t	name;		/* 名前 */
    short	trade;		/* 交換条件 */
    unshort	arg_data;	/* そのほかデータ */

} Haniwa_Item_c;

/*
 *	ハニワ情報
 */
typedef struct {
    Haniwa_Item_c	item[HANIWA_ITEM_POSSESS_NUM];	/* アイテム */

    unchar	message[HANIWA_MESSAGE_NUM];		/* メッセージ */

    money_t	proceeds;				/* 売り上げ */

} Haniwa_c;

/** 部屋の中原人コッツ小節配列の大きさ  */
#define	ROOM_RHYTHM_MAX					(8)

/*
 *	「プレーヤーの部屋」	ビット情報
 */
typedef struct	player_rooms_bit_info {
    unchar	room_write:1;	/** 部屋更新フラグ */
    unchar	saved:1;	/** セーブをしたことがあるフラグ **/	
    unchar	hello_happy_room:1;
    unchar	pad3:1;
    unchar	pad4:1;
    unchar	pad5:1;
    unchar	pad6:1;
    unchar	pad7:1;
} mHm_bit_c;


/*
 *	「プレーヤーの部屋」	大きさ・部屋変更情報
 */
typedef struct	player_rooms_size_info {
    /** 注文日 */
    struct {
	u8	day;
	u8	month;
	u16	year;
    } order_date;

    unchar	level:2;	/** 部屋の大きさ */
    unchar	new_level:2;	/** 次の部屋の大きさ */
    unchar	renew:1;	/** 立て替えフラグ */
    unchar	ranking:2;	/** 銅像ランキング */
    unchar	bronze_order:1;	/** 銅像注文 */
} mHm_rmsz_c;

/*
 *	ゴキブリ情報
 */
typedef u8 mHm_num_t;
typedef struct	__goki_info__ {
    lbRTC_ymd_c		time;
    mHm_num_t		num;	/** 生息数 */
    unchar		pad;
} mHm_goki_c;

/*
 *	「プレーヤーの部屋」情報
 */
typedef struct	player_rooms_information_class {
    /* 部屋の持ち主 */
    struct   {
	PersonalID_c	pID;	/* 個人情報 */
	char		secret[3];      /* 秘密情報 */
    } owner;

    Interior_c	interior;	/** 壁紙・絨毯情報 */

    NA_RHYTHM_INFO	rhythm_info;	/** ワルツ・テンポ */

    lbRTC_ymd_c	mark_time;	/** 採点時間 */
    mHm_bit_c	bit_info;	/** ビット情報 */
    mHm_rmsz_c	size;			/** 部屋の大きさ */
    unchar	outlook_pal;		/* 外観パレット */
    unchar	next_outlook_pal;	/* 次の外観パレット */
    
    u64		ftr_switch[mFM_ROOM_FG_LAYER_MAX];	/** 置いてある家具の ON/OFF状態 */
    mAc_nfs_t	on_utinfo[mFM_UT_W_NUM][mFM_UT_H_NUM];	/** FG 情報 */
    mAc_nfs_t	on_on[mFM_UT_W_NUM][mFM_UT_H_NUM];/** さらに上物 FG 情報 */
    u32		rhythm[mFM_ROOM_FG_LAYER_MAX][ROOM_RHYTHM_MAX];	/** 小節数 */
    
    Mail_c	mail_box[MAIL_BOX_CAPA];		/** 郵便受け */

    Haniwa_c	haniwa;

    mHm_goki_c	goki;	/** ゴキブリ情報 */

} mHm_hs_c;

/*
 *	ブロック FG情報
 */
typedef struct field_fg_infomation_class {
    mAc_nfs_t	on[mFM_UT_H_NUM][mFM_UT_W_NUM];		/** FG 情報 */
} mFM_bfg_c;


/*
 * 商品コモンリスト情報
 */
typedef struct __priority_list__ {
    mSP_list_t	a:2;
    mSP_list_t	b:2;
    mSP_list_t	c:2;   
    mSP_list_t	dummy:2;
} mSP_priority_c;


/*
 * お店雑多情報
 */
typedef struct __shop_misc__ {
    unshort	shop_level:2;			/* お店レベル		*/
    unshort	renewal_chirashi_appoday:1;	/* 当日改装チラシフラグ */
    unshort	renewal_chirashi_notice:1;	/* 予告改装チラシフラグ	*/
    unshort	first_start_data_init:1;	/* start_data_init後初通過*/
    unshort	pad:11;				/* 予備			*/
} mSP_miscInf_c;

/*
 * お店情報
 */
typedef	struct shop_class {
    mSP_priority_c	priority[mSP_LIST_MAX];		/* リストの優先順位 */
    PersonalID_c	visitor[mSP_VISITOR_MAX];	/* お客名簿(10) */
    mAc_nfs_t		goods[mSP_GOODS_MAX];		/* 陳列商品 */
    mAc_nfs_t		rare;				/* レア家具 */
    mAc_nfs_t		gift[mSP_GIFT_MAX];		/* 福引景品 */
    signed char		plant_goods[mSP_PLANT_MAX];	/* 植物商品数 */
    mSP_miscInf_c	misc;			/* 雑多情報 */
    money_t		sales_sum;		/* 通算売り上げ金額 */
    lbRTC_time_c	exchange_time;		/* 前回の商品入れ替え日 */
    lbRTC_time_c	renewal_time;		/* 新装開店日 */
    int			visitor_flag;		/* 来客フラグ */
} mSP_shop_c;

#ifdef BBPLAYER
typedef struct bbRTC_delta_class {
    u32 minutes;
    int sign;
} bbRTC_delta_c;
#endif

/*
 *	セーブデータチェッククラス
 * 4+4+2+64+2 = 76 バイト
 */
typedef struct save_data_check_class {
    int			version;	/*  4 セーブデータのバージョン */
    unint		code;           /*  4 どうぶつの森ID NAFJ */
    lndid_t		land_id;        /*  2 国識別 ID */
    lbRTC_time_c	time;		/* 64 セーブ時間 */
    unshort		check_sum;	/*  2 チェックサム(全体の加算値が 0 になるように) */
} mFRm_chk_c;
/** セーブコード */
#define mFRm_SAVE_ID                    (('N' << 24) | ('A' << 16) | ('F' << 8) | ('J')) /* ゲームコードと同じ */

/*
 *	セーブクラス
 */
typedef struct flash_save_class		Save_c;
struct flash_save_class {

    mFRm_chk_c	save_check;		/** セーブデータチェッククラス */
    
    Scene_No 	scene_no;		/* シーン番号 */

    unchar	now_npc_max;		/** 現在住んでいる NPC最大数 */

    unchar	remove_animal_no;	/** 引っ越し予定 NPC動物情報番号 */

    Private_c	privateInfo[COMPATRIOT_PLAYER_NUM];	/* プレイヤーデータ */

    mLd_lnd_c	landinfo;		/* 国情報 */

    mNtc_ntc_c	boardinfo[mNtc_BOARD_MAX];	/* 掲示板情報 */

    mHm_hs_c	home[COMPATRIOT_PLAYER_NUM];			/* 家情報 */

    mFM_bfg_c	fg[mFM_FD_BK_H_NUM][mFM_FD_BK_W_NUM];	/* ブロック FG情報 */

    mFM_cmb_c	combitable[mFM_FD_BK_H_MAX_NUM][mFM_FD_BK_W_MAX_NUM];

    Animal_c	animal[mNpc_REMOVE_NPC_MAX];	/** 引っ越しNPC動物情報 */

    AnmPersonalID_c	last_remove_animal_id;	/** 最近引っ越した動物情報 */

    mSP_shop_c	shop;			/** お店情報 */

    Kabu_price_c	kabu_schedule;	/* かぶ価情報 */

    mEv_sec_c	event_save;		/** イベントセーブ情報 */
    mEv_Save    event;                  /** 新システム **/

    mAc_nfs_t	fruit;			/** 国固有の果物 */

    unchar	house_arrange;		/* 家の配置 */
    unchar	next_figure;		/** 次に建てる銅像情報 */

    lbRTC_time_c	GrowTime;		/* 成長時間 */

    PostOffice_c	postOffice;	/* 郵便局 */

    PoliceBox_c	policeBox;		/* 交番 */

    mSN_save_c	snowman;		/* 雪だるま */

    u64		melody;			/* 国の音楽 */

    Config_c	config;			/* 設定 */

    lbRTC_ymd_c	renew_time;		/* 日付変更時の更新日付 */

    unchar	station_type;		/* 駅の種類 */
    unchar	weatherInfo;		/* 天気・量 各 4bit */
    unshort	pad_s;

    unshort	deposit[mFM_FD_BK_W_NUM * mFM_FD_BK_H_NUM][mFM_UT_H_NUM]; /* 埋蔵情報 */

    lbRTC_time_c	remove_time;	/** 動物自然増加記録 */

    mPr_pmm_c	mother_mail[COMPATRIOT_PLAYER_NUM];	/** 母からの手紙情報 */

    lbRTC_ymd_c	mushroom_time;		/** まつたけチェック時間 */
    lbRTC_ymd_c	event_time;		/** イベントチェック時間 */
    
    u16		famicom_high_scores[20]; /* ファミコンハイスコア保存用(0-8,10-18使用) */

    u8		used_npc[mNpc_RGSTD_NPC_BIT_TBL_SIZE_u8];
    lbRTC_time_c	debug_time;	/* デバッグ用の時間です */

    u8		zuru_check_flg;	/* 時間を変更したフラグ（ずるチェック用） */
    u8		famicom_high_scores2[7]; /* ファミコンハイスコア保存用２(0-5使用) */

    lbRTC_time_c	treasure_set_time;	/* 宝箱セット時間 */
    lbRTC_time_c	treasure_check_time;	/* 宝箱チェック時間 */

    unchar	saved_rom_d;	/** ON rom_dでセーブした / OFF したことない */
    u8		snowman_date_year;	/* 雪だるま完成年 下２桁 */
    u8		snowman_date_month;	/* 雪だるま完成月 */
    u8		snowman_date_day;	/* 雪だるま完成日 */
    u8		snowman_date_hour;	/* 雪だるま完成時間 */
    unchar	deposit_haniwa;		/** ハニワ埋蔵命令 */
    unchar	pad[2];

#ifdef BBPLAYER
    bbRTC_delta_c delta; /* delta between animal forest clock and bb clock */

    /** 本チャンでのデータ追加はこの上 ↑ にやって下さい */
    u64		dummy_alignment0;	/** アライメント用 */

    /** 実験のデータ追加はここでやって、その日の内に上に移動して下さい */
    u64		pading[14];	/** 追加の時はココを削って使って下さい */
#else
    /** 本チャンでのデータ追加はこの上 ↑ にやって下さい */
    u64		dummy_alignment0;	/** アライメント用 */

    /** 実験のデータ追加はここでやって、その日の内に上に移動して下さい */
    u64		pading[15];	/** 追加の時はココを削って使って下さい */
#endif
    
    /*
     *
     *	この後ろにはメンバを切らないでネン
     *	新しく切るときはpading[]から使っていってネン
     *	余ったらpad_?にして空いてることを明示してネン
     *
     */
};

/* 2001.01.24	セーブデータ初バージョンアップ	*/
typedef struct flash_save_class_old	Save_c_old;
struct flash_save_class_old {

    mFRm_chk_c	save_check;		/** セーブデータチェッククラス */
    
    Scene_No 	scene_no;		/* シーン番号 */
    
    unchar	now_npc_max;		/** 現在住んでいる NPC最大数 */

    unchar	remove_animal_no;	/** 引っ越し予定 NPC動物情報番号 */

    Private_c	privateInfo[COMPATRIOT_PLAYER_NUM];	/* プレイヤーデータ */

    mLd_lnd_c	landinfo;		/* 国情報 */

    mNtc_ntc_c	boardinfo[mNtc_BOARD_MAX];	/* 掲示板情報 */

    mHm_hs_c	home[COMPATRIOT_PLAYER_NUM];			/* 家情報 */

    mFM_bfg_c	fg[mFM_FD_BK_H_NUM][mFM_FD_BK_W_NUM];	/* ブロック FG情報 */

    mFM_cmb_c	combitable[mFM_FD_BK_H_MAX_NUM][mFM_FD_BK_W_MAX_NUM];

    Animal_c	animal[mNpc_REMOVE_NPC_MAX];	/** 引っ越しNPC動物情報 */

    AnmPersonalID_c	last_remove_animal_id;	/** 最近引っ越した動物情報 */

    mSP_shop_c	shop;			/** お店情報 */

    Kabu_price_c	kabu_schedule;	/* かぶ価情報 */

    mEv_sec_c_old	event_save;		/** イベントセーブ情報 */
    mEv_Save_old	event;                  /** 新システム **/

    mAc_nfs_t	fruit;			/** 国固有の果物 */

    unchar	house_arrange;		/* 家の配置 */
    unchar	next_figure;		/** 次に建てる銅像情報 */

    lbRTC_time_c	GrowTime;		/* 成長時間 */

    PostOffice_c	postOffice;	/* 郵便局 */

    PoliceBox_c	policeBox;		/* 交番 */

    mSN_save_c	snowman;		/* 雪だるま */

    u64		melody;			/* 国の音楽 */

    Config_c	config;			/* 設定 */

    lbRTC_ymd_c	renew_time;		/* 日付変更時の更新日付 */

    unchar	station_type;		/* 駅の種類 */
    unchar	weatherInfo;		/* 天気・量 各 4bit */
    unshort	pad_s;

    unshort	deposit[mFM_FD_BK_W_NUM * mFM_FD_BK_H_NUM][mFM_UT_H_NUM]; /* 埋蔵情報 */

    lbRTC_time_c	remove_time;	/** 動物自然増加記録 */

    mPr_pmm_c	mother_mail[COMPATRIOT_PLAYER_NUM];	/** 母からの手紙情報 */

    lbRTC_ymd_c	mushroom_time;		/** まつたけチェック時間 */
    lbRTC_ymd_c	event_time;		/** イベントチェック時間 */
    
    u16		famicom_high_scores[20]; /* ファミコンハイスコア保存用(0-8,10-18使用) */

    u8		used_npc[mNpc_RGSTD_NPC_BIT_TBL_SIZE_u8];
    lbRTC_time_c	debug_time;	/* デバッグ用の時間です */

    u8		zuru_check_flg;	/* 時間を変更したフラグ（ずるチェック用） */
    u8		famicom_high_scores2[7]; /* ファミコンハイスコア保存用２(0-5使用) */

    lbRTC_time_c	treasure_set_time;	/* 宝箱セット時間 */
    lbRTC_time_c	treasure_check_time;	/* 宝箱チェック時間 */

    unchar	saved_rom_d;	/** ON rom_dでセーブした / OFF したことない */
    u8		snowman_date_year;	/* 雪だるま完成年 下２桁 */
    u8		snowman_date_month;	/* 雪だるま完成月 */
    u8		snowman_date_day;	/* 雪だるま完成日 */
    u8		snowman_date_hour;	/* 雪だるま完成時間 */
    unchar	deposit_haniwa;		/** ハニワ埋蔵命令 */
    unchar	pad[2];

#ifdef BBPLAYER
    bbRTC_delta_c delta;       /* delta between animal forest clock and bb clock */

    /** 本チャンでのデータ追加はこの上 ↑ にやって下さい */
    u64		dummy_alignment0;	/** アライメント用 */

    /** 実験のデータ追加はここでやって、その日の内に上に移動して下さい */
    u64		pading[14];	/** 追加の時はココを削って使って下さい */
#else
    /** 本チャンでのデータ追加はこの上 ↑ にやって下さい */
    u64		dummy_alignment0;	/** アライメント用 */

    /** 実験のデータ追加はここでやって、その日の内に上に移動して下さい */
    u64		pading[15];	/** 追加の時はココを削って使って下さい */
#endif
    
    /*
     *
     *	この後ろにはメンバを切らないでネン
     *	新しく切るときはpading[]から使っていってネン
     *	余ったらpad_?にして空いてることを明示してネン
     *
     */
};

/*
 *	セーブデータファイルクラス
 */
#define	ALIGNMENT_128(a)	(((a)+127) & 0xffffff80u )
#define SAVE_DATA_SIZE		(1024 * 64)
#define SAVE_DATA_SIZE_U32	((int)(ALIGNMENT_128(SAVE_DATA_SIZE) / sizeof(u32)))

typedef	union {
    u32		data[SAVE_DATA_SIZE_U32];
    Save_c	element;
    Save_c_old	element_old;
    u64		dummy;				/* ８バイトアライメントの為(マニュアルでは１６バイトを推奨) */
} RWF_c;





/*
 ************************************************
 *						*
 *	各種クラス設定（非セーブ用）		*
 *						*
 ************************************************
 */
/*
 *	時間関係クラス
 */
typedef struct {
    unint	season;			/* 季節			*/
    unint	termIdx;		/* 期間インデックス	*/
    short	bgItem_profile;		/* ＢＧ道具プロファイル	*/
    Object_Bank	bgItem_bank;		/* ＢＧ道具バンク	*/
    int		now_sec;		/* １日の何秒目か	*/
    OSRTCTime	rtcTime;		/* ＲＴＣタイマー	*/
    short	rad_min;		/* 時計の短針のラジアン	*/
    short	rad_hour;		/* 時計の長針のラジアン	*/
    unchar	timeSignal;		/* 時報フラグ		*/
    unchar	under_sec;		/* 秒未満値		*/
#if DEBUG || defined(FDEBUG)
    unchar	disp;			/* 時間描画		*/
#else	/* DEBUG || defined(FDEBUG) */
    unchar	pad;			/* 空き			*/
#endif	/* DEBUG || defined(FDEBUG) */

    unchar	rtc_crash;		/* ＲＴＣクラッシュ	*/

    int		rtc_use;		/* ＲＴＣ使用フラグ	*/
    int		add_sec;		/* 加算秒数		*/
#if DEBUG || defined(FDEBUG)
    int		add_idx;		/* 加算段階		*/
#else	/* DEBUG || defined(FDEBUG) */
    int		pad_i;
#endif	/* DEBUG || defined(FDEBUG) */

} Time_c;

/* ＲＴＣ使用チェック */
#define	RTC_USE_CHK	((ZCommonGet(time.rtc_use) == ON) && (ZCommonGet(time.rtc_crash) == OFF))

/*
 *	スクリーンエフェクト
 */
typedef struct {
    unchar	fade_go;		/* デモフェード受け渡し */
    unchar	fade_speed;		/* フェードスピード */
    unchar	wipe_speed;		/* ワイプ  スピード */
    unchar	next_wipe;		/* 次シーン強制ワイプイン番号 */
} Screff_c;

/*
 *	オプション項目クラス
 */
typedef struct {
    unchar	j_n;			/* (どうぶつの森では未使用)０：ＪＡＰＡＮ ／ １：ＮＥＳ */
    unchar	s_sound;		/* ＳＯＵＮＤ ステレオ／モノラル／ヘッドホン／３Ｄ */
    unchar	language;		/* 言語 */
    unchar	pad_c;			/* ＜空き＞ */
} Option_c;



/*
 ************************************************
 *						*
 *		常駐データクラス		*
 *						*
 ************************************************
 */
typedef struct common_data_class {
    /* ＳＡＶＥ */
    RWF_c	save;
    /* 上記の【注意！！】を見てください！！！！！！！！！ */



    /* ＮＯ─ＳＡＶＥ */
    unchar	game_1_patu;		/* ゲーム１発 */
    unchar	field_type;		/* フィールドタイプ */
    unchar	field_draw_type;	/* フィールド描画タイプ */
    unchar	player_no;		/* プレイヤーナンバー */

    Scene_No	before_scene_no;	/* １つ前のシーンＮｏ． */

    int		player_data_mode;	/** 使用するプレーヤーデータの種類 */

    Clip_c	clip;			/* クリップ情報 */

    Time_c	time;			/* 時間関係 */

#if 0
    Address_c	plAddress[COMPATRIOT_PLAYER_NUM];	/*プレイヤーアドレス*/

    Address_c	anmAddress[ADDRESS_REGIST_NUM];	/* 動物アドレス */
#endif

    Private_c	*now_private;		/* 現在のプレーヤーの個人情報 */
    mHm_hs_c	*now_home;		/* 家情報 */

    unchar	map_flg;		/* マップ表示許可フラグ */
    unchar	fish_location;		/* 魚の発生位置条件 */
    unshort	pad_ss;

    Option_c	option;			/* オプション項目 */

    Screff_c	screff;			/* スクリーンエフェクト */

    short	item_type;		/* ＢＧ道具タイプ */
    short	item_profile;		/* ＢＧ道具プロフィール */

    int		item_idx;		/* 受け渡しアイテムインデックス */

    PlantGrow_c	plantGrow;		/* 植物成長情報 */

    Npclist_c	npclist[mNpc_REMOVE_NPC_MAX];	/** NPC発生情報クラス */
    mAc_nfs_t	houseIdx;		/* プレイヤーの入った家の持ち主のFG名 */
    mAc_nfs_t	before_fieldID;		/* １つ前のフィールドＩＤ */
    unchar	first_block;		/* フィールドが代わってはじめてのブロックか */
    unchar	submenu_call_refuse;	/* サブメニューコール無効フラグ（前のフィールドからの持ち越し） */
    unchar	sun_light_flg;		/* 太陽光フラグ */
    unchar	train_set_flg;		/* 定刻汽車発生済みフラグ */

    Mail_c	send_mail;		/* 手紙一時格納 */
    mAc_nfs_t	toBox;			/* ポスト宛 or 郵便受け宛 */
    mAc_nfs_t	from;			/* 差し出し人 */

    Mail_nm_c	send_npc_mail;		/* NPC宛の手紙宛名 */
    mAc_nfs_t	npc_new_cloth;		/* NPCがクエストで着替える服名 */

    Weather_c	weather;		/* 天気 */

    mEv_nsc_c	event_chk;		/** イベントチェック情報 */

    mQst_uni_c	quest;			/** クエスト共有情報 */

    Scene_No 	start_demo_scene_no;	/* スタートデモシーン番号 */

    NpcSche_c	npc_sche[mNpc_REMOVE_NPC_MAX];	/* ＮＰＣスケジュール */

    mNpcW_wlk_c	npc_walk;		/* NPC散歩情報 */

    EventNpc_c	event_npc[mNpc_EVENT_NPC_NUM];		/* イベントＮＰＣ */

    int		snowman_msg;		/* 雪だるまの本日の御言葉 */

    short	moneyPower;		/* 金運パワー */
    short	goodsPower;		/* 物運パワー */

    Door_data	door_data;		/* ドアデータ */
    Door_data	str_out_data;		/* 構造物から出る時のドアデータ */
    M_DEMO_CLIENT  start_demo;		/* スタート時に強制的に走るデモ */
    Door_data	event_door_data;	/* イベントから戻る時のドアデータ */
    Door_data	emu_ret_data;		/* エミュゲームから戻る時のドアデータ*/

    unchar	clear_cut_tree;		/** 木を切った情報クリアビット情報 */
    signed char	floor_idx;		/* 足音用絨毯番号 */

    short	sp_demo_profile;	/* 特殊デモプロファイル */

    int		event_pstat[4];		/* イベントの走ってるフラグ */

    Position_Angle	p_world;	/* イベント画面切り替え用一時記憶領域	*/
    unchar		evfade_fg;	/* イベント画面切り替え用フラグ		*/

    signed char request_warp;	/* プレイヤーにワープ可能体制をさせるフラグ */
    signed char exist_player;	/* プレイヤーアクターが存在しているか？ */
    signed char complete_payment_demo_type;	/* 借金返済完了デモタイプ */
    signed char player_decoy;	/* プレイヤーがお出掛け中でのプレイ中 */
    
    u8		furniture_set;

    short	title_event, title_event_flag;

    mEv_Common  event;			/* イベント */

    FamicomEmu_Common	famicomemu; /* ファミコンエミュ用データ(8B) */

    signed char bee_swell_player;		/* プレイヤーが蜂に刺されたか？ */
    signed char bee_chase_player;		/* プレイヤーが蜂に追われているか？ */
    signed char already_shock_goki;		/* ゴキブリを見てショックを既に受けたか？ */
    unchar	time_change_flg;		/* 時間を変更したフラグ（ＲＴＣ設定用） */
    signed char unable_wade;			/* ゼルダスクロールの禁止 */
    signed char set_msg_fail_emu;		/* エミュレターの読み込み失敗メッセージ表示命令 */

    /* 汽車管理用	by sumiyosi 00/09/27(WED)	*/
    unchar	mTRC_train_set_flag;		/* 汽車セットフラグ	*/
    unchar	mTRC_train_exist;		/* 汽車存在		*/
    unchar	mTRC_control_now;		/* 強制停車フラグ	*/
    unchar	mTRC_control_old;		/* 強制停車フラグ-old-	*/
    unchar	mTRC_signal;			/* SIGNAL		*/
    unchar	mTRC_day;			/* 日替わりチェック用	*/
    unchar	mTRC_action;			/* 汽車の状態		*/
    unchar	mTRC_timer;			/* 汎用 TIMER		*/
    u32		mTRC_start_timer;		/* 発生時刻(単位: 秒)	*/
    float	mTRC_train_speed;		/* 汽車の速度		*/
    xyz_t	mTRC_train_pos;			/* 汽車の位置		*/
    f32		mTRC_mic_distanceXYZ_1;
    f32		mTRC_mic_distanceXYZ_2;
    u16		mTRC_angleY_1;
    u16		mTRC_angleY_2;
    /* ここまで‥	*/

    unchar	reset_flag;		/** リセット押されたかフラグ */
    unchar	reset_react;		/* リセットリアクション */
    unchar	mail_extra_delivery;	/* 郵便臨時配達 */
    unchar	post_npc_type;		/* ペリコ／ペリミタイプ */

    xyz_t	ball_pos;		/* ボールポジションバッファ */
    char	ball_type;		/* ボールの種類		    */
    unchar	auto_nwrite_num;	/* 掲示板自動書き込み用ナンバー */
    unshort	auto_nwrite_year;	/* 掲示板自動書き込み用年データ */

    unchar	flash_rom_condition;		/** FLASHROMの破壊 */

    /* 汽車管理用 １１月１５日	*/
    unchar	mTRC_approach_trg;

    unchar	treasure_set_flg;	/* 宝探し用フラグ */

    unchar	pad_c[2];
    unshort	event_message;          /* イベント告知デモフラグ */ 

    OSRTCTime		new_set_time;		/* 新規設定時間 */
    OSRTCTime		old_RTC_time;		/* 新規設定した時のＲＴＣの時間 */

    short       balloon_live;           /* 風船が生きている */
    short       balloon_min;            /* 風船が発生した時間（分） */
    float       balloon_ratio;          /* 風船の発生確率   */
    
    int 	ins_check_flag;		/* 昆虫セット座標チェックフラグ		*/
    unchar	ins_ut_xnum_bak[ 2 ];	/* 上記チェック用Ｘユニット座標履歴	*/
    unchar	ins_ut_znum_bak[ 2 ];	/* 上記チェック用Ｚユニット座標履歴	*/
    
    int		tanuki_shop_status;	/* たぬきの店内状況 */
    
    int 	gyo_check_flag;		/* 昆虫セット座標チェックフラグ		*/
    unchar	gyo_ut_xnum_bak[ 2 ];	/* 上記チェック用Ｘユニット座標履歴	*/
    unchar	gyo_ut_znum_bak[ 2 ];	/* 上記チェック用Ｚユニット座標履歴	*/
    unchar	pad_connect_chk;	/* コントローラの接続チェック	*/
    
    short	weather_se;		/*天気サウンドラベルバッファ	*/
    short	pad_s;			/*パディングのショートでとった
					  あまり		*/
    /** 本チャンでのデータ追加はこの上 ↑ にやって下さい */
#if DEBUG
    u64	dummy_alignment0;		
#endif	/* DEBUG */
    /** 実験のデータ追加はここでやって、その日の内に上に移動して下さい */
#if DEBUG
    int		pad_i[19];		/** 追加の時はココを削って使って下さい */
#endif	/* DEBUG */

    
#if DEBUG
    mAc_nfs_t	test_npc;		/* テスト用ＮＰＣ */
    u64	dummy_alignment1;
#endif	/* DEBUG */

    /*
     *
     *	この後ろにはメンバを切らないでネン
     *	新しく切るときはpad_i[]から使っていってネン
     *	余ったらpad_?にして空いてることを明示してネン
     *
     */

} Common_data_c;

/*
 ************************************************
 *						*
 *		外部参照用			*
 *						*
 ************************************************
 */
/*
 * 共通データ定義
 * 必ずアクセスマクロを経由してください
 */
extern Common_data_c	common_data;

/*
 *	共通データ初期化
 */
extern void	common_data_init(void);

/*
 *	共通データ再初期化
 * (ゲームモードだけは保存されます)
 */
extern void	common_data_reinit(void);

/*
 *	シーンが切り替わったときのクリア
 */
extern void	common_data_clear(void);

/*
 * アクセスマクロ
 */
/* メンバの値を取得 */
#define ZCommonGet(member)		(common_data.member)
/* メンバのポインタを取得（構造体のアクセスはこれを推奨する） */
#define ZCommonGetP(member)		(&common_data.member)
/* メンバに値を設定 */
#define ZCommonSet(member, value)	(common_data.member = (value))



/*
 * セーブデータアクセスマクロ
 */
#define SaveGet(member)			(ZCommonGet(save.element.member))
#define SaveGetP(member)		(ZCommonGetP(save.element.member))
#define SaveSet(member, value)		(ZCommonSet(save.element.member,value))

#define SaveGet_old(member)		(ZCommonGet(save.element_old.member))
#define SaveGetP_old(member)		(ZCommonGetP(save.element_old.member))
#define SaveSet_old(member, value)	(ZCommonSet(save.element_old.member,value))

/* プライベートクラスの先頭取得 */
#define	PrivateGet(member,who)		(SaveGet(privateInfo[who].member))
#define	PrivateGetP(member,who)		(SaveGetP(privateInfo[who].member))
#define	PrivateSet(member, who, value)	(SaveSet(privateInfo[who].member, value))

/* 現在のプレーヤーのプライベートクラスの先頭取得 */
#define	nowPrivateGet(member)	(ZCommonGet(now_private->member))
#define	nowPrivateGetP(member)	(ZCommonGetP(now_private->member))
#define	nowPrivateSet(member, value)	(ZCommonSet(now_private->member,value))


/* アイテムの状態 */
#define	itemCondGet(i)		((nowPrivateGet(possession.item_cond) >> ((unint)(i) << 1)) & ITEM_CD_CHK_ALL)
#define	itemCondSet(i,v)	(nowPrivateSet(possession.item_cond, ((nowPrivateGet(possession.item_cond) & ~((unint)ITEM_CD_CHK_ALL << ((unint)(i) << 1))) | ((unint)(v) << ((unint)(i) << 1)))))





#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif	/* _LANGUAGE_C_PLUS_PLUS */

#endif /* INCLUDE_M_COMMON_DATA_H */


/*** m_common_data.h ***/
