/*============================================================================
	アクションゲーム ゲームメインルーチンヘッダファイル Title.h
------------------------------------------------------------------------------
												Programmed by Keiichi.Tago.
============================================================================*/

/* -------------------- 2 重定義防止 */
#if !defined WSGAME
#define WSGAME 1

/* -------------------- ヘッダファイル登録 */
#include <sys/fcntl.h>
#include <sys/disp.h>
#include <sys/bios.h>
#include <stdio.h>
#include <stdlib.h>
#include "wsBg.h"
#include "wsSprite.h"
#include "wsPalet.h"
#include "wsSound.h"
#include "Define.h"
#include "System.h"

/* -------------------- 定数定義 */
/* プレイヤーのスプライト番号 */
#define PLAYER_SPNUMBER 38
#define PLAYER_SPDEFINE (384+38)
/* 敵のスプライト番後 */
#define ENEMY_SPNUMBER (38+18)
#define ENEMY_SPDEFINE (384+38+18)
/* メニュー数 */
#define GAMEOVER_MENU_MAX 2
#define PAUSE_MENU_MAX 2
/* 出現後の行動 */
#define IV_WALK_RIGHT 1
#define IV_WALK_LEFT  2
/* イベントメッセージ */
#define IV_MSG_RIGHT      1
#define IV_MSG_LEFT       2
#define IV_MSG_WALK_RIGHT 3
#define IV_MSG_WALK_LEFT  4
#define IV_MSG_DAMAGE     5
#define IV_MSG_DIE        6
#define IV_MSG_STAGECLEAR 7
#define IV_MSG_GAMECLEAR  8

/* -------------------- プレイヤー情報 */
typedef struct {
	int	nType;			/* プレイヤーは誰か */
	int nX;				/* プレイヤーの横座標 */
	int nY;				/* プレイヤーの縦座標 */
	int nVx;			/* 横の加速度 */
	int nVy;			/* 縦の加速度 */
	int nJumpMax;		/* 基本ジャンプ力 */
	int nJumpMax2;		/* 追加ジャンプ力 */
	int nJumpCount;		/* ボタンを押し続けたときのカウンタ */
	int nJumpCount2;	/* ボタンを押し続けたときの間隔のカウンタ */
	int nJump;			/* ジャンプの状態 ( 0=ジャンプしていない, 1=ジャンプ中(1回目), 2=ジャンプ中(2回目) ) */
	int nAttack;		/* 0=攻撃していない, 1=攻撃中 */
	int nMove;			/* 状態 (0=移動していない, 1=左右に移動中, 2=しゃがんでいる ) */
	int nDir;			/* 向いている方向 (0=左, 1=右) */
	int nAnimeCount;	/* アニメカウンタ */
	int nLifeMax;		/* 最大生命力 */
	int nLife;			/* 生命力 0 になったら残機が減る */
	int nLeft;			/* 残機 0 になったらゲームオーバー */
	int nZombieCount;	/* 無敵カウンタ (0=無敵終了, 1〜=無敵) */
	int nDamageDir;		/* ダメージを受けたときのふっ飛ぶ方向 (0=左, 1=右) */
	int nDirBackup;		/* ダメージを受けたときの方向記憶 (0=左, 1=右) */
} PLAYERINFO;

/* -------------------- 敵情報 */
typedef struct {
	int nType;			/* 敵の種類 (0=使われていない, 1=スライム) */
	int nX;				/* 敵の横座標 */
	int nY;				/* 敵の縦座標 */
	int nXBak;			/* 敵の横座標保存 */
	int nYBak;			/* 敵の縦座標保存 */
	int nVx;			/* 横の加速度 */
	int nVy;			/* 縦の加速度 */
	int nXSize;			/* 横の大きさ */
	int nYSize;			/* 縦の大きさ */
	int nAtariX1;		/* 当たり判定の左上の横座標 */
	int nAtariY1;		/* 当たり判定の左上の縦座標 */
	int nAtariX2;		/* 当たり判定の右下の横座標 */
	int nAtariY2;		/* 当たり判定の右下の縦座標 */
	int nDir;			/* 向いている方向 (0=左, 1=右) */
	int nLife;			/* 生命力 */
	int nDrawNumber;	/* 表示するオブジェクト番号 */
	int nDrawCount;		/* 表示するオブジェクト番号用のカウンタ */
	int nAnimeCount;	/* アニメカウンタ */
	int nActionCount;	/* 行動用カウンタ */
	int nActionFlag;	/* スプライト更新 (0=しない, 1=する) */
	int nStat;			/* 状態 (敵によってちがう, (100以降は共通) 100=ふっ飛ぶ, 101=死んだ ) */
	int nJump;			/* ジャンプの状態 ( 0=ジャンプしていない, 1=ジャンプ中 ) */
	int nDamageDir;		/* ダメージを受けたときのふっ飛ぶ方向 (0=左, 1=右) */
	int nRand;			/* 乱数記憶 */
} ENEMYINFO;

/* -------------------- 関数デフォルト定義 */
void Game( void );
void AppearEnemy( void );
void SetEnemy( int nType, int nX, int nY, int nNumber );
void DrawMsg( int nMsgType );
int Gameover( void );
int Pause( void );
void StageClear( void );
void GameClear( void );
void Damage( int nDir );
void DrawStatus( void );
void InitRain( void );
void DrawRain( void );
void MoveObject( void );
void Attack( void );
void SetFire( int nX, int nY, int nDir );
void MoveFire( void );
void MoveItem( void );
void DrawObject( void );
/* -------------------- 敵の行動 */
void MoveEnemy( void );
void EnemyBgAtari( int nIndex, int nYLen );
void MoveSlime( int nIndex );
void MoveJumpSlime( int nIndex );
void Skeleton( int nIndex );
void Skeleton2( int nIndex );
void Wolf( int nIndex );
void Bat( int nIndex );
void Knight( int nIndex );
void KnightAttack( int nIndex );
void Dragon1( int nIndex );
void Dragon2( int nIndex );
void DragonFire( int nIndex );
void AttackToPlayer( int nIndex, int nUpDown );
/* -------------------- イベント用関数デフォルト定義 */
void SetIventFile( char far *lpPath );
void InitIvent( int nInitNumber );
void SetIvent( int nIventNumber );
void ExecIventMsg( int nMessage );

/* -------------------- 2 重定義防止 */
#endif
