/*=== CB_V0200 =============================================================*/
/*                                                                          */
/*  このファイルには、ＳＨＯＴ機能で実現されるモジュール（飛び道具など）    */
/*                                                                          */
/*  の制御プログラムを記述します。基本的にプログラムの作成はユーザが行いま  */
/*                                                                          */
/*  すが、ＳＨＯＴ関数の管理は開発支援ツール「キャラクタ・ビルダ」で行う    */
/*                                                                          */
/*  ことができます。本ファイルの 'CB_' で始まる行はキャラクタ・ビルダに     */
/*                                                                          */
/*  より作成されたものです。その行は絶対に削除しないように注意して下さい。  */
/*                                                                          */
/*  shot.bat を実行すると分割コンパイルできます。                           */
/*                                                                          */
/*==========================================================================*/

/*..........  注意：次の２行の命令文は削除しないこと  .....*/

#define  EXTERN  extern

#include  "action.h"

/*..........  各キャラ固有の静的変数  .....*/

CB_ /*T_LOCAL_STATIC_VARS*/

/*..........  セルＩＤと ＰＣＧオフセットの対応表  ..........*/


CB_ /*E_LOCAL_STATIC_VARS*/

/*--------------------------------------------------------------------------
  ロード時の処理
  --------------------------------------------------------------------------*/
CB_ void  Shot__ロード()
CB_ {


CB_   Shot設定_標準SHOT関数( 自分ハンドラ(), Shot_波動 );

CB_ }
CB_ /*E_DC_FUNC*/

/*--------------------------------------------------------------------------
  'OPT_初期化' メッセージ受信時の処理
  --------------------------------------------------------------------------*/
CB_ void  Shot__初期化( int p1, int p2 )
CB_ {
CB_   Shot送信_コマンド( Shot取得_標準ハンドラ( p1 ), SHOT_CMD_無効化, 0, 0 );

CB_ }
CB_ /*E_DC_FUNC*/








/*--------------------------------------------------------------------------
  波動
  --------------------------------------------------------------------------*/
CB_ short  Shot_波動( int p1, int p2, SHOT *shot, short cmd, short param1, short param2 )
CB_ {

	static  short  prm_speed = 0 ;  /*  移動速度  */


	/*....................  無効化（消去）  ....................*/
	if(  cmd == SHOT_CMD_無効化  )
	{
		Shot設定_モジュール状態( shot, SHOT_STATE_無効 );
		return ON;
	}
	/*....................  有効化（放出）  ....................*/
	else  if(  cmd == SHOT_CMD_有効化  )
	{
		Shot設定_モジュール状態( shot, SHOT_STATE_有効 );

		Shot設定_ヒット情報( shot, HIT_波動 );

		if(  状態取得_表示方向( p1 ) == DRCT_右 ) shot->pos_x = 座標取得_Ｘ( p1 )+24+16;
		else					  shot->pos_x = 座標取得_Ｘ( p1 ) -8-16;


		shot->pos_y = 座標取得_Ｙ(p1)+32 ;            /*  絶対Ｙ座標      */

		shot->type = SHOT_TYPE_弾丸 ;                 /*  弾丸タイプ            */
		shot->len_x = 2 ;                             /*  Ｘ方向のＳＰ数        */
		shot->len_y = 2 ;                             /*  Ｙ方向のＳＰ数        */
		shot->rect_x = 0 ;			      /*  衝突矩形の左上Ｘ座標  */
		shot->rect_y = 0;			      /*  衝突矩形の左上Ｙ座標  */
		shot->rect_w = 32 ;			      /*  衝突矩形の幅          */
		shot->rect_h = 32 ;			      /*  衝突矩形の高さ        */
		shot->drct = 状態取得_表示方向( p1 ) ;        /*  水平移動する方向      */
		shot->multi = 1 ;			      /*	 重なり数	*/
		shot->super = OFF ;                           /*  超技扱いのフラグ      */
		shot->sp_num = Spr取得_番号( p1,
					SP_BLK_飛び道具 );    /*  表示用スプライト番号  */
		shot->pcg_num = Pcg取得_コード( p1,
				PAL_BLK_表示_身体,
				PCG_BLK_ユーザ,0,OFF,OFF,OFF);/*  表示用ＰＣＧコード    */
		shot->counter = 0 ;                           /*  消滅表示カウンタ      */
		shot->value16 = 0 ;                           /*  点滅表示カウンタ      */
		/*.....  カスタム属性の設定  .....*/
		prm_speed = param1 ;                          /*  移動速度  */
		return ON;
	}
	/*....................  状態変化（移動）  ....................*/
	else  if(  cmd == SHOT_CMD_状態変化  )
	{
		if(  Shot取得_モジュール状態( shot ) == SHOT_STATE_有効  )
		{
			 /* カウンタはここで回す */
			if( (++shot->counter) > 12 )	shot->counter = 0;

			/* Ｘ移動 */
			if(  shot->drct == DRCT_右  )	shot->pos_x += prm_speed ;
			else				shot->pos_x -= prm_speed ;

			if(  shot->pos_x > 256  ||  shot->pos_x  < -48  )
			{
	 		  Shot送信_コマンド( shot, SHOT_CMD_無効化, 0, 0 );
			}
		}
		else  if(  Shot取得_モジュール状態( shot ) == SHOT_STATE_消滅 )
		{
			if(  ( -- shot->counter ) <= 0  )
			{
				Shot送信_コマンド( shot, SHOT_CMD_無効化, 0, 0 );
			}
		}
		return ON;
	}
	/*....................  グラフィックの表示  ....................*/
	else  if(  cmd == SHOT_CMD_表示  )
	{
		/* short sp,pat; */

		short pat = Pcg取得_反転( shot->pcg_num , shot->drct, DRCT_中 );
		short sp = shot->sp_num ;


		if(  Shot取得_モジュール状態( shot ) == SHOT_STATE_有効  )
		{

			if(shot->counter<=1)
			{
				Pcg設定_標準データ(p1,&sp_shot[0],0,4);

			}
			else if(shot->counter<=4)	/* 1 */
			{
				Pcg設定_標準データ(p1,&sp_shot[128*4],0,4);
			}
			else if(shot->counter<=8)	/* 2 */
			{
				Pcg設定_標準データ(p1,&sp_shot[0],0,4);
			}
			else				/* 3  */
			{
				Pcg設定_標準データ(p1,&sp_shot[128*4],0,4);
			}
		

			pat = Pcg取得_反転( shot->pcg_num, shot->drct, DRCT_中 );
			sp = shot->sp_num ;
			if(  shot->drct == DRCT_右  )  /*  飛行方向  */
			{
			Spr設定_表示( sp++, shot->pos_x   +16, shot->pos_y   +16,pat++ , 1 );
			Spr設定_表示( sp++, shot->pos_x+16+16, shot->pos_y   +16,pat++ , 1 );
			Spr設定_表示( sp++, shot->pos_x   +16, shot->pos_y+16+16,pat++ , 1 );
			Spr設定_表示( sp++, shot->pos_x+16+16, shot->pos_y+16+16,pat++ , 1 );

			}
			else
			{
			Spr設定_表示( sp++, shot->pos_x+16+16, shot->pos_y   +16,pat++ , 1 );
			Spr設定_表示( sp++, shot->pos_x   +16, shot->pos_y   +16,pat++ , 1 );
			Spr設定_表示( sp++, shot->pos_x+16+16, shot->pos_y+16+16,pat++ , 1 );
			Spr設定_表示( sp++, shot->pos_x   +16, shot->pos_y+16+16,pat++ , 1 );

			}
		}
		return ON;
	}
	/*....................  衝突時の処理（対SHOT）  ....................*/
	else  if(  cmd == SHOT_CMD_対SHOT衝突  )
	{
		if(  shot->drct == DRCT_右  )  /*  飛行方向  */
		{Shot演出_ヒットマーク( shot, shot->pos_x+32, shot->pos_y+36, ON, OFF );}
		else
		{Shot演出_ヒットマーク( shot, shot->pos_x-2, shot->pos_y+36, ON, OFF );}

		Shot送信_コマンド( shot, SHOT_CMD_減少, 0, 0 );
		return ON;
	}
	/*....................  衝突時の処理（対身体）  ....................*/
	else  if(  cmd == SHOT_CMD_対身体衝突  )
	{
		if(  shot->drct == DRCT_右  )  /*  飛行方向  */
		{Shot演出_ヒットマーク( shot, shot->pos_x+32, shot->pos_y+36, ON, OFF );}
		else
		{Shot演出_ヒットマーク( shot, shot->pos_x-2, shot->pos_y+36, ON, OFF );}

		Shot演出_ヒット音( shot, PCM_防御 );
		Shot送信_コマンド( shot, SHOT_CMD_減少, 0, 0 );
		return ON;
	}
	/*....................  くらい動作の変更  ....................*/
	else  if(  cmd == SHOT_CMD_くらい動作変更  )
	{

		Shot設定_くらい動作(shot, ACT_波動くらい);

		return ON;
	}
	/*....................  減少時の処理  ....................*/
	else  if(  cmd == SHOT_CMD_減少  )
	{
	    if(  Shot増減_重なり数( shot, -1 ) <= 0  ){
	      Shot送信_コマンド( shot, SHOT_CMD_消滅, 0, 0 );
	    }
	    return ON;
	}
	/*....................  消滅時の処理  ....................*/
	else  if(  cmd == SHOT_CMD_消滅  )
	{
	  Shot設定_モジュール状態( shot, SHOT_STATE_消滅 );
	  Shot設定_カウンタ( shot, 1 );  /*  消滅所要時間  */
	  return ON;
	}
	/*....................  背景スクロール時の処理  ....................*/
	else  if(  cmd == SHOT_CMD_背景スクロール  )
	{
		return ON;
	}
	/*....................  反射時の処理  ....................*/
	else  if(  cmd == SHOT_CMD_反射  )
	{
		Shot設定_方向反転( shot, param1, param2 );
		return ON;
	}


CB_   return OFF;
CB_ }
CB_ /*E_SHOT_FUNC*/

/*==========================================================================*/

