/*=== CB_V0200 =============================================================*/
/*                                                                          */
/*  このファイルには、ＡＣＴメッセージに応答する動作関数（ＡＣＴ関数）      */
/*                                                                          */
/*  のプログラムを記述します。基本的にプログラムの作成はユーザが行い        */
/*                                                                          */
/*  ますが、ＡＣＴメッセージとＡＣＴ関数の対応の管理は開発支援ツール        */
/*                                                                          */
/*  「キャラクタ・ビルダ」で行うことができます。本ファイルの 'CB_' で       */
/*                                                                          */
/*  始まる行はキャラクタ・ビルダにより作成されたものです。その行は絶対      */
/*                                                                          */
/*  に削除しないように注意して下さい。                                      */
/*                                                                          */
/*  mmp_act.bat を実行すると分割コンパイルできます。                        */
/*                                                                          */
/*==========================================================================*/

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

#define  EXTERN  extern

#include  "action.h"

/*..........  通常動作のリスト  ..........*/

CB_ MMP_FUNC_LIST  mmp_act_list0[] =
CB_ {
CB_   ACT_起き上がり,	Act_起き上がり,	/*  起き上がり  */
CB_   END_OF_MFL
CB_ };

/*..........  攻撃動作のリスト  ..........*/

CB_ MMP_FUNC_LIST  mmp_act_list1[] =
CB_ {
CB_   ACT_直立攻撃A,	Act_直立攻撃A,	/*  立強Ｐ／立強Ｋ  */
CB_   ACT_直立攻撃B,	Act_直立攻撃B,	/*  立弱Ｐ／立弱Ｋ  */
CB_   ACT_座り攻撃A,	Act_座り攻撃A,	/*  座強Ｐ／座強Ｋ  */
CB_   ACT_座り攻撃B,	Act_座り攻撃B,	/*  座弱Ｐ／座弱Ｋ  */
CB_   ACT_必殺技Ｓ,	Act_必殺技Ｓ,	/*  必殺技Ｓ  */
CB_   ACT_必殺技Ａ,	Act_必殺技Ａ,	/*  必殺技Ａ  */
CB_   ACT_必殺技Ｍ,	Act_必殺技Ｍ,	/*  必殺技Ｍ  */
CB_   ACT_超必殺技,	Act_超必殺技,	/*  超必殺技  */
CB_   ACT_地上投げ,	Act_地上投げ,	/*  地上投げ  */
CB_   END_OF_MFL
CB_ };

/*..........  くらい動作のリスト  ..........*/

CB_ MMP_FUNC_LIST  mmp_act_list2[] =
CB_ {
CB_   ACT_投げられ,	Act_投げられ,	/*  つかまれ  */
CB_   END_OF_MFL
CB_ };

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

STAGE *sys_sh; 

CB_ /*T_LOCAL_STATIC_VARS*/
CB_ /*E_LOCAL_STATIC_VARS*/

/*--------------------------------------------------------------------------
  ロード時の処理
  --------------------------------------------------------------------------*/
CB_ void  Act__ロード()
CB_ {
CB_   /*..........  ここに各キャラ固有のプログラムを記述できます  .....*/
CB_ }
CB_ /*E_DC_FUNC*/

/*--------------------------------------------------------------------------
  'OPT_初期化' メッセージ受信時の処理
  --------------------------------------------------------------------------*/
CB_ void  Act__初期化( int p1, int p2 )
CB_ {
CB_   Mmp登録_動作関数２( p1, MMP_TYPE_ACT, mmp_act_list0 );
CB_   Mmp登録_動作関数２( p1, MMP_TYPE_ACT, mmp_act_list1 );
CB_   Mmp登録_動作関数２( p2, MMP_TYPE_ACT, mmp_act_list2 );
CB_   /*..........  ここに各キャラ固有のプログラムを記述できます  .....*/
CB_ }
CB_ /*E_DC_FUNC*/


/*--------------------------------------------------アッパー --------------*/
CB_ void  Act_直立攻撃A( int p1, int p2 )
CB_ {   

  short  c;
  
if(  多重化取得_攻撃間隔( p1, 34 )  )  /*  相手が34ドット以上離れている場合  */
{
     /*  正拳突き  */
    
  short  c = カウンタ設定_初期値( p1, 41 ) ;
  
  if(  c >= 41  )
  {
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );

    if(  状態取得_変身( p1 )  )  音声再生_標準( p1, 1, PCM_変身中 );  /*  変身中の処理  */
    
    音声再生_標準( p1, 0, PCM_振り2 );
    
    セル設定_表示( p1, CELL_直立攻撃2A0 );
  }
  else  if(  c >= 37  )
  {
    セル設定_表示( p1, CELL_直立攻撃2A1 );
    攻撃設定_ヒット情報( p1, HIT_正拳突き );
    攻撃設定_必殺技キャンセル( p1, ON );
  }
  else  if(  c >= 34  )
  {
    セル設定_表示( p1, CELL_直立攻撃2A2 );

    攻撃設定_必殺技キャンセル( p1, OFF );	/*  腕が伸びきったのでキャンセル不可にする  */
  }
  else  if(  c >= 23  )
  {
    セル設定_表示( p1, CELL_直立攻撃2A2 );
  }
  else  if(  c >= 13  )
  {
    セル設定_表示( p1, CELL_直立攻撃2A1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_直立攻撃2A0 );
  }
  else
  {
    セル設定_表示( p1, CELL_直立攻撃2A0 );
    
    同期完了_攻撃( p1);
  }




}else{


  c = カウンタ設定_初期値( p1, 35 ) ;
  
  if(  c >= 35  )
  {
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );

    if(  状態取得_変身( p1 )  )  音声再生_標準( p1, 1, PCM_変身中 );  /*  変身中の処理  */
    
    音声再生_標準( p1, 0, PCM_振り2 );
    
    セル設定_表示( p1, CELL_直立攻撃A0 );
  }
  else  if(  c >= 32  )
  {
    セル設定_表示( p1, CELL_直立攻撃A0 );
  }
  else  if(  c >= 31  )
  {
    セル設定_表示( p1, CELL_直立攻撃A1 );
    
    攻撃設定_ヒット情報( p1, HIT_アッパー );
    攻撃設定_必殺技キャンセル( p1, ON );
  }
  else  if(  c >= 28  )
  {
    セル設定_表示( p1, CELL_直立攻撃A1 );
  }
  else  if(  c >= 27  )
  {
    セル設定_表示( p1, CELL_直立攻撃A2 );
    攻撃設定_必殺技キャンセル( p1, OFF );	/*  腕が伸びきったのでキャンセル不可にする  */
  }
  else  if(  c >= 18  )
  {
    セル設定_表示( p1, CELL_直立攻撃A2 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_直立攻撃A1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
  }
  else
  {
    セル設定_表示( p1, CELL_直立攻撃A1 );
    
    同期完了_攻撃( p1);
  }

}

CB_ }
CB_ /*E_MMP_FUNC*/

/*-----------------------------------------------------------ローキック-----*/
CB_ void  Act_直立攻撃B( int p1, int p2 )
CB_ {


  short  c;
  
if(  多重化取得_攻撃間隔( p1, 16 ) )  /*  相手が16ドット以上離れている場合  */
{
    /*  ハイキック  */

  short  c = カウンタ設定_初期値( p1, 10 ) ;
  
  if(  c >= 10  )
  {
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );  
    音声再生_標準( p1, 0, PCM_振り1 );
    
    セル設定_表示( p1, CELL_直立攻撃2B0 );
  }
  else  if(  c >= 6  )
  {
    セル設定_表示( p1, CELL_直立攻撃2B0 );
  }
  else  if(  c >= 2  )
  {
    セル設定_表示( p1, CELL_直立攻撃2B1 );
    
    攻撃設定_ヒット情報( p1, HIT_立ちキック );
    攻撃設定_必殺技キャンセル( p1, ON );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_直立攻撃2B0 );
  }
  else
  {
    セル設定_表示( p1, CELL_直立攻撃2B0 );
    
    同期完了_攻撃( p1);
  }

}else{
  
  c = カウンタ設定_初期値( p1, 5 ) ;
  
  if(  c >= 5  )
  {
    音声再生_標準( p1, 0, PCM_振り1 );
    
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );  
    セル設定_表示( p1, CELL_直立攻撃B0 );
  }
  else  if(  c >= 4  )
  {
    セル設定_表示( p1, CELL_直立攻撃B0 );
  }
  else  if(  c >= 2  )
  {
    セル設定_表示( p1, CELL_直立攻撃B1 );
    
    攻撃設定_ヒット情報( p1, HIT_ローキック );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_直立攻撃B0 );
  }
  else
  {
    セル設定_表示( p1, CELL_直立攻撃B0 );
    
    同期完了_攻撃( p1);
  }
    

}

CB_ }
CB_ /*E_MMP_FUNC*/

/*--------------------------------------------------------------------------*/
CB_ void  Act_座り攻撃A( int p1, int p2 )
CB_ {

  short  c;
  
  状態設定_しゃがみ( p1, ON );  /*  念のため、自分を確実にしゃがませる  */
  
if(  多重化取得_攻撃間隔( p1, 16 ) )  /*  相手が16ドット以上離れている場合  */
{
    /*  回転足払い  */
    
  short  c = カウンタ設定_初期値( p1, 39 ) ;
  
  if(  c >= 39  )
  {
    if(  状態取得_変身( p1 )  )  音声再生_標準( p1, 1, PCM_変身中 );  /*  変身中の処理  */
    
    音声再生_標準( p1, 0, PCM_振り2 );
    
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );  
    セル設定_表示( p1, CELL_座り攻撃2A0 );
  }
  else  if(  c >= 36  )
  {
    セル設定_表示( p1, CELL_座り攻撃2A0 );
  }
  else  if(  c >= 35  )
  {
    セル設定_表示( p1, CELL_座り攻撃2A1 );
    
    攻撃設定_ヒット情報( p1, HIT_回転足払い );
    攻撃設定_必殺技キャンセル( p1, ON );
  }
  else  if(  c >= 27  )
  {
    セル設定_表示( p1, CELL_座り攻撃2A1 );
  }
  else  if(  c >= 19  )
  {
    セル設定_表示( p1, CELL_座り攻撃2A2 );
  }
  else  if(  c >= 13  )
  {
    セル設定_表示( p1, CELL_座り攻撃2A3 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_座り攻撃2A4 );
  }
  else
  {
    セル設定_表示( p1, CELL_座り攻撃2A4 );
    
    同期完了_攻撃( p1);
  }


}else{
  
  c = カウンタ設定_初期値( p1, 41 ) ;
  
  if(  c >= 41  )
  {
    if(  状態取得_変身( p1 )  )  音声再生_標準( p1, 1, PCM_変身中 );  /*  変身中の処理  */
    
    音声再生_標準( p1, 0, PCM_振り2 );
    
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
    セル設定_表示( p1, CELL_座り攻撃A0 );
  }
  else  if(  c >= 38  )
  {
    セル設定_表示( p1, CELL_座り攻撃A0 );
  }
  else  if(  c >= 37  )
  {
    セル設定_表示( p1, CELL_座り攻撃A1 );
    
    攻撃設定_ヒット情報( p1, HIT_アッパー );
    攻撃設定_必殺技キャンセル( p1, ON );
  }
  else  if(  c >= 35  )
  {
    セル設定_表示( p1, CELL_座り攻撃A1 );
  }
  else  if(  c >= 34  )
  {
    セル設定_表示( p1, CELL_座り攻撃A2 );
    攻撃設定_必殺技キャンセル( p1, OFF );	/*  腕が伸びきったのでキャンセル不可にする  */
  }
  else  if(  c >= 25  )
  {
    セル設定_表示( p1, CELL_座り攻撃A2 );
  }
  else  if(  c >= 13  )
  {
    セル設定_表示( p1, CELL_座り攻撃A1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_座り攻撃A0 );
  }
  else
  {
    セル設定_表示( p1, CELL_座り攻撃A0 );
    
    同期完了_攻撃( p1);
  }

}

CB_ }
CB_ /*E_MMP_FUNC*/

/*--------------------------------------------------------------キック --*/
CB_ void  Act_座り攻撃B( int p1, int p2 )
CB_ {

  short  c = カウンタ設定_初期値( p1, 5 ) ;
  
  状態設定_しゃがみ( p1, ON );  /*  念のため、自分を確実にしゃがませる  */
  
  if(  c >= 5  )
  {
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
    セル設定_表示( p1, CELL_座り攻撃B0 );
    
    音声再生_標準( p1, 0, PCM_振り1 );
  }
  else  if(  c >= 4  )
  {
    セル設定_表示( p1, CELL_座り攻撃B0 );
  }
  else  if(  c >= 2  )
  {
    セル設定_表示( p1, CELL_座り攻撃B1 );
    
    攻撃設定_ヒット情報( p1, HIT_キック );
    攻撃設定_必殺技キャンセル( p1, ON );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_座り攻撃B0 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
  }
  else
  {
    セル設定_表示( p1, CELL_座り攻撃B0 );
    
    同期完了_攻撃( p1);
  }


CB_ }
CB_ /*E_MMP_FUNC*/


/*--------------------------------------------------------------------------*/
CB_ void  Act_必殺技Ｓ( int p1, int p2 )
CB_ {

  short  c = カウンタ設定_初期値( p1, 46 ) ;
  
  Cmd設定_超技( p1, OFF );  /*  ＣＰＵが勝手にスパコン扱いしてしまうのを防ぐ  */
  
  if(  c >= 46  )
  {
    状態設定_無敵( p1 , IVC_通常, 0 );  /*  必殺技は最初、無敵状態にされているので解除する  */
    
    セル設定_表示( p1, CELL_必殺技Ｓ0 );
  }
  else  if(  c >= 42  )
  {
    セル設定_表示( p1, CELL_必殺技Ｓ0 );
  }
  else  if(  c >= 37  )
  {
    セル設定_表示( p1, CELL_必殺技Ｓ1 );
  }
  else  if(  c >= 33  )
  {
    セル設定_表示( p1, CELL_必殺技Ｓ2 );
  }
  else  if(  c >= 32  )
  {
    if( ゲージ取得_サブ( p1 ) == 0  )  /*  飛び道具ゲージが０の場合  */
    {
      音声再生_標準( p1, 0, PCM_振り2 );  /*  空振りの音  */
      
      カウンタ設定_現在値( p1, 20 );  /*  隙だけは小さくしてやる  */
    }
    else
    {
      ゲージ増減_サブ( p1, -2 );  /*  飛び道具ゲージ減らす  */
      

      if(  攻撃取得_威力レベル( p1 ) == LEVEL_大  )  /*  Ａボタンの場合  */
      {
        Shot送信_コマンド( Shot取得_標準ハンドラ( p1 ),SHOT_CMD_有効化, 4, OFF );
        
      }
      else  /*  Ｂボタンの場合  */
      {
        Shot送信_コマンド( Shot取得_標準ハンドラ( p1 ),SHOT_CMD_有効化, 2, OFF );
        
      }
      音声再生_標準( p1, 2, PCM_必殺技S );
      
      /*  飛び道具の最初の位置を自分の向きに合わせて決める（ちょっと面倒）  */
      if(  状態取得_表示方向( p1 ) == DRCT_右  )  飛び道具Ｘ位置設定( p1, 座標取得_Ｘ( p1 )+56+8 );
        else                                      飛び道具Ｘ位置設定( p1, 座標取得_Ｘ( p1 )-40-8 );
        
      飛び道具Ｙ位置設定( p1, BASE_LINE+32 );  /*  高さを頭から32ドット下にする  */
    }
    
    セル設定_表示( p1, CELL_必殺技Ｓ3 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_必殺技Ｓ3 );
  }
  else
  {
    セル設定_表示( p1, CELL_必殺技Ｓ3 );
    
    同期完了_攻撃( p1);
  }

CB_ }
CB_ /*E_MMP_FUNC*/

/*--------------------------------------------------------------------------*/
CB_ void  Act_必殺技Ａ( int p1, int p2 )
CB_ {


  static  short  X00[] = {  1, 1, 0, 0, 0, 0 } ,  /*  上昇下降軌道テーブル  */
                 Y00[] = { -3,-3,-2,-1, 0    } ,
                 Y01[] = {  2, 2, 2, 2, 1, 0 } ;
  
  short  c;
  
  /*  背景スクロール停止();  横への伸びを強調するために、背景スクロールを停止する  */
  
if(  Cmd取得_超技( p1 ) != OFF  )  /*  スーパーコンボの場合  */
{
    Cmd実行_動作( p1, ACT_超必殺技 ); 

    return;  /*  リターン  */
}
else  if(  攻撃取得_威力レベル( p1 ) == LEVEL_大  )  /*  Ａボタンの場合  */
{


  static  short  X10[] = {  3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0    } ,
                 Y10[] = { -9,-9,-9,-9,-9,-8,-8,-8,-8,-7,-7,-6,-5,-4,-3,-1, 0    } ,
                 Y11[] = {  8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 1, 0 } ;
                                                               /*  上昇下降軌道テーブル  */  
  
  short  c = カウンタ設定_初期値( p1, 11 ) ;
  
  if(  c >= 11  )
  {
    状態設定_無敵( p1 , IVC_無敵, 0 );  /*  出始めから無敵にする  */
    
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
    攻撃設定_必殺技キャンセル( p1, OFF );
    セル設定_表示( p1, CELL_必殺技Ａ0 );
  }
  else  if(  c >= 8  )
  {
    セル設定_表示( p1, CELL_必殺技Ａ1 );
    
    攻撃設定_ヒット情報( p1, HIT_昇龍拳11 );  /*  １０００点昇龍拳  */
  }
  else  if(  c >= 7  )
  {
    /*状態設定_無敵( p1 , IVC_ゾンビ, 0 );*/
    
    音声再生_標準( p1, 2, PCM_必殺技A );
    
    セル設定_表示( p1, CELL_必殺技Ａ1 );
    
    攻撃設定_ヒット情報( p1, HIT_昇龍拳11 );  /*  １０００点昇龍拳  */
  }
  else  if(  c >= 6  )
  {
    short  index = ( BASE_LINE - 座標取得_Ｙ( p1 ) ) >> 3 ;  /*  軌道テーブルのオフセット  */
    
    攻撃設定_最多ヒット数２( p1, 1, 0 );  /*  多重ヒットを防ぐために、再設定()の方を使用する      */
                                 /*  設定()を使用すると、この動作過程において毎サイクル  */
                                 /*  でヒット数が設定されてしまう                        */
    
    if(  index < 16  )
    {
      座標設定_移動( p1, X10[ index ] , 0,DRCT_前 );
      
      座標設定_移動( p1, 0, Y10[ index ] , DRCT_中 );
      
      カウンタ設定_値維持( p1 );  /*  カウンタの自動デクリメントをキャンセルする  */
    }
    
    セル設定_表示( p1, CELL_必殺技Ａ2 );
    
    攻撃設定_ヒット情報( p1, HIT_昇龍拳12 );
  }
  else  if(  c >= 5  )
  {
    short  index = BASE_LINE - 座標取得_Ｙ( p1 ) ;
    
    状態設定_無敵( p1 , IVC_通常, 0 );  /*  下降動作に入ったので、無敵を解除する  */
    攻撃設定_ヒット情報( p1, HIT_OFF );

    if(  index < 0  )  index = 0 ;  /*  念のため一応  */
    
    index >>= 3 ;
    
    座標設定_移動( p1, 0, Y11[ index ] , DRCT_中 );
    
    if(  index > 13  )  セル設定_表示( p1, CELL_必殺技Ａ3 );
      else              セル設定_表示( p1, CELL_必殺技Ａ4 );
      
    if(  座標取得_Ｙ( p1 ) < BASE_LINE  )  カウンタ設定_値維持( p1 );
                              /*  着地するまでカウンタの自動デクリメントをキャンセルする  */
  }
  else  if(  c >= 4  )
  {
    座標設定_Ｙ( p1, BASE_LINE );  /*  自分の体の高さを、確実に地面に合わせる  */
    
    セル設定_表示( p1, CELL_必殺技Ａ5 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_必殺技Ａ5 );
  }
  else
  {
    音声再生_標準( p1, 0, PCM_着地 );
    
    セル設定_表示( p1, CELL_必殺技Ａ5 );
    
    同期完了_攻撃( p1);
  }


}else{
  
  /* 弱威力 */

  c = カウンタ設定_初期値( p1, 11 ) ;
  
  if(  c >= 11  )
  {
    状態設定_無敵( p1 , IVC_無敵, 0 );  /*  出始めから無敵にする  */
    
    攻撃設定_最多ヒット数( p1, 1 );
    攻撃設定_ヒット情報( p1, HIT_OFF );
    攻撃設定_必殺技キャンセル( p1, OFF );
    セル設定_表示( p1, CELL_必殺技Ａ0 );
  }
  else  if(  c >= 8  )
  {
    セル設定_表示( p1, CELL_必殺技Ａ1 );
    
    攻撃設定_ヒット情報( p1, HIT_昇龍拳01 );  /*  １０００点昇龍拳  */
  }
  else  if(  c >= 7  )
  {
    音声再生_標準( p1, 2, PCM_必殺技A );
    
    セル設定_表示( p1, CELL_必殺技Ａ1 );
    
    攻撃設定_ヒット情報( p1, HIT_昇龍拳01 );  /*  １０００点昇龍拳  */
  }
  else  if(  c >= 6  )
  {
    short  index = ( BASE_LINE - 座標取得_Ｙ( p1 ) ) >> 3 ;  /*  軌道テーブルのオフセット  */
    
    攻撃設定_最多ヒット数２( p1, 1, 0 );  /*  多重ヒットを防ぐために、再設定()の方を使用する      */
                                 /*  設定()を使用すると、この動作過程において毎サイクル  */
                                 /*  でヒット数が設定されてしまう                        */
    
    if(  index < 4  )
    {
      座標設定_移動( p1, X00[ index ] , 0,DRCT_前 );
      
      座標設定_移動( p1, 0, Y00[ index ] , DRCT_中 );
      
      カウンタ設定_値維持( p1 );  /*  カウンタの自動デクリメントをキャンセルする  */
    }
    
    セル設定_表示( p1, CELL_必殺技Ａ2 );
    
    攻撃設定_ヒット情報( p1, HIT_昇龍拳02 );
  }
  else  if(  c >= 5  )
  {
    short  index = BASE_LINE - 座標取得_Ｙ( p1 ) ;
    
    状態設定_無敵( p1 , IVC_通常, 0 );  /*  下降動作に入ったので、無敵を解除する  */
    攻撃設定_ヒット情報( p1, HIT_OFF );

    if(  index < 0  )  index = 0 ;  /*  念のため一応  */
    
    index >>= 3 ;
    
    座標設定_移動( p1, 0, Y01[ index ] , DRCT_中 );
    
    if(  index > 2  )  セル設定_表示( p1, CELL_必殺技Ａ3 );
      else             セル設定_表示( p1, CELL_必殺技Ａ4 );
      
    if(  座標取得_Ｙ( p1 ) < BASE_LINE  )  カウンタ設定_値維持( p1 );
                              /*  着地するまでカウンタの自動デクリメントをキャンセルする  */
  }
  else  if(  c >= 4  )
  {
    座標設定_Ｙ( p1, BASE_LINE );  /*  自分の体の高さを、確実に地面に合わせる  */
    
    セル設定_表示( p1, CELL_必殺技Ａ5 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_必殺技Ａ5 );
  }
  else
  {
    音声再生_標準( p1, 0, PCM_着地 );
    
    セル設定_表示( p1, CELL_必殺技Ａ5 );
    
    同期完了_攻撃( p1);
  }

}



CB_ }
CB_ /*E_MMP_FUNC*/

/*--------------------------------------------------------------------------*/
CB_ void  Act_必殺技Ｍ( int p1, int p2 )
CB_ {

  static  short  c0 ;  /*  特別な処理をさせるので、静的変数を確保する  */
  
  short  c = カウンタ設定_初期値( p1, 48 ) ;
  
  Cmd設定_超技( p1, OFF );  /*  ＣＰＵが勝手にスパコン扱いしてしまうのを防ぐ  */
  
  if(  c >= 48  )
  {
    状態設定_無敵( p1 , IVC_通常, 0 );  /*  必殺技は最初、無敵状態にされているので解除する  */
    
    攻撃設定_最多ヒット数( p1, 4 );	/* 当てると反撃されるので3=>4に変更 */
    攻撃設定_ヒット情報( p1, HIT_OFF );
    攻撃設定_必殺技キャンセル( p1, OFF );

    c0 = 0 ;
    
    音声再生_標準( p1, 2, PCM_必殺技M );
      
    セル設定_表示( p1, CELL_垂直Ｊ技B0 );  /*  垂直ジャンプから流用  */
  }
  else  if(  c >= 47  )
  {
    座標設定_移動( p1, 1 , 0,DRCT_前 );
    
    座標設定_移動( p1, 0, -5 , DRCT_中 );  /*  上昇  */
    
    セル設定_表示( p1, CELL_垂直Ｊ技B0 );  /*  垂直ジャンプから流用  */
    
    if(  座標取得_Ｙ( p1 ) <= BASE_LINE-30  )  /*  上昇完了の場合  */
    {
      座標設定_Ｙ( p1, BASE_LINE-30 );  /*  完了時の高さに、確実に合わせる  */
      
      if(  攻撃取得_威力レベル( p1 ) == LEVEL_小  )  カウンタ設定_現在値( p1, 26 );
              /*  Ｂボタンの場合、回転時間を減らすためにカウンタの値を少なくしてやる  */
    }
    else
    {
      カウンタ設定_値維持( p1 );   /*  上昇完了までカウンタの自動デクリメントをキャンセルする  */
    }
  }
  else  if(  c >= 5  )
  {
          if(  c0 < 2  )  座標設定_移動２( p1, 0, 0, DRCT_前, 2 );  /*  速度を微調整する  */
    else  if(  c0 < 5  )  座標設定_移動(   p1, 1    , 0,DRCT_前 );
    else  if(  c0 < 7  )  座標設定_移動(   p1, 1    , 0,DRCT_前 );
    else                  座標設定_移動(   p1, 1    , 0,DRCT_前 );
    
          if(  c0 < 2  )  セル設定_表示( p1, CELL_必殺技Ｍ0 );  /*  回転パターン  */
    else  if(  c0 < 5  )  セル設定_表示( p1, CELL_必殺技Ｍ1 );
    else  if(  c0 < 7  )  セル設定_表示( p1, CELL_必殺技Ｍ2 );
    else                  セル設定_表示( p1, CELL_必殺技Ｍ3 );
    
    if(  c0 == 0  ||  c0 == 5  )  /*  C0=0,5 の２点だけに攻撃判定を持たせる  */
    {
      音声再生_標準( p1, 0, PCM_振り2 );
      
      if( 攻撃取得_最多ヒット数( p1 ) > 1 ) 攻撃設定_ヒット情報( p1, HIT_竜巻旋風脚 );
      else                                  攻撃設定_ヒット情報( p1, HIT_竜巻転倒 );
    }
    else{    攻撃設定_ヒット情報( p1, HIT_OFF ); }

    if(  ( ++ c0 ) >= 10  )  c0 = 0 ;  /*  静的変数を回す  */
  }
  else  if(  c >= 4  )
  {
    座標設定_移動２( p1, 0, 0, DRCT_前, 2 );
    
    座標設定_移動( p1, 0, 4 , DRCT_中 );
    
    セル設定_表示( p1, CELL_垂直Ｊ技B0 );
    攻撃設定_ヒット情報( p1, HIT_OFF );

    if(  座標取得_Ｙ( p1 ) < BASE_LINE  )  カウンタ設定_値維持( p1 );
                              /*  着地するまでカウンタの自動デクリメントをキャンセルする  */
  }
  else  if(  c >= 3  )
  {
    座標設定_Ｙ( p1, BASE_LINE );  /*  自分の体の高さを、確実に地面に合わせる  */
    
    セル設定_表示( p1, CELL_着地 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_着地 );
  }
  else
  {
    音声再生_標準( p1, 0, PCM_着地 );
    
    セル設定_表示( p1, CELL_着地 );
    
    同期完了_攻撃( p1);
  }

CB_ }
CB_ /*E_MMP_FUNC*/





/*--------------------------------------------------------------------------*/
CB_ void  Act_地上投げ( int p1, int p2 )
CB_ {

  short  c = カウンタ設定_初期値( p1, 66 ) ;
  
  状態設定_無敵( p1 , IVC_ゾンビ, 0 );  /*  自分の体が何にも衝突しないようにする  */
  
  if(  c >= 66  )
  {
    同期開始_地上投げ( p1, 24 ,DRCT_自動 );  /*  地上投げの開始をシステムに宣告する  */
    
    音声再生_標準( p1, 2, PCM_投げ );  /*  相手を掴んだ瞬間に、掛け声を出させる  */
    
    セル設定_表示( p1, CELL_地上投げ0 );
  }
  else  if(  c >= 47  )
  {
    セル設定_表示( p1, CELL_地上投げ0 );
  }
  else  if(  c >= 48  )
  {
   /*  背景スクロール停止();   背景スクロールをとりあえず停止させる  */
    
    座標設定_移動( p1, -4 , 0, DRCT_動作 );
    
    セル設定_表示( p1, CELL_地上投げ0 );
  }
  else  if(  c >= 38  )
  {
    セル設定_表示( p1, CELL_地上投げ1 );
  }
  else  if(  c >= 39  )
  {
    /*  背景スクロール停止();  背景スクロールを再び停止させる  */
    
    座標設定_移動( p1, -4 , 0, DRCT_動作 );
    
    セル設定_表示( p1, CELL_地上投げ1 );
  }
  else  if(  c >= 33  )
  {
    セル設定_表示( p1, CELL_地上投げ2 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_地上投げ3 );
  }
  else
  {
    セル設定_表示( p1, CELL_地上投げ3 );
    
    同期完了_攻撃( p1);
  }

CB_ }
CB_ /*E_MMP_FUNC*/

/*--------------------------------------------------------------------------
  投げられ
  --------------------------------------------------------------------------*/
CB_ void  Act_投げられ( int p1, int p2 )
CB_ {


  static short  c0;
  short  c = カウンタ設定_初期値( p1, 41 ) ;
  short  dy;

  状態設定_無敵( p1, IVC_ゾンビ, 0 );
  
  if(  c >= 41  )
  {
    c0 = 0;
    同期開始_地上投げられ( p1, DRCT_自動 );
    
    同期開始_先制攻撃判定( p2 );
    
    コンボ設定_クリア( p2 );
    
    座標設定_Ｙ( p1, BASE_LINE );

    セル設定_表示( p1, CELL_投げられ0 );
  }
  else  if(  c >= 26  ){ 座標設定_移動( p1, 0,  0, DRCT_後 ); セル設定_表示( p1, CELL_投げられ0 ); }
  
  /*  上降  */
  else  if(  c >= 22  ){ 座標設定_移動( p1, 4, -8, DRCT_後 ); セル設定_表示( p1, CELL_投げられ0 ); }
  else  if(  c >= 18  ){ 座標設定_移動( p1, 3, -3, DRCT_後 ); セル設定_表示( p1, CELL_投げられ1 ); }
  else  if(  c >= 14  ){ 座標設定_移動( p1, 2, -1, DRCT_後 ); セル設定_表示( p1, CELL_投げられ2 ); }

  /*  下降  */
  else  if(  c >= 13  ){
          if(  c0 <  6  ) { dy =  2 ; セル設定_表示( p1, CELL_投げられ3 );}
    else  if(  c0 < 12  ) { dy =  4 ; セル設定_表示( p1, CELL_投げられ3 );}
    else  if(  c0 < 18  ) { dy =  7 ; セル設定_表示( p1, CELL_投げられ4 );}
    else  if(  c0 < 24  ) { dy = 11 ; セル設定_表示( p1, CELL_投げられ4 );}
    else  if(  c0 < 30  ) { dy = 16 ; セル設定_表示( p1, CELL_投げられ4 );}
    else  if(  c0 < 36  ) { dy = 22 ; セル設定_表示( p1, CELL_投げられ4 );}
    else                  { dy = 29 ; セル設定_表示( p1, CELL_投げられ4 );}

    c0 ++ ;
    
    if(  座標取得_Ｙ( p1 ) >= BASE_LINE - dy  ){

      音声再生_標準( p1, 0, PCM_転倒 );
      状態設定_燃焼( p1, 0 );  /*  燃焼停止  */
      座標設定_Ｙ( p1, BASE_LINE );
      演出表示_砂煙(p1,ON);  /*  砂煙を出す  */

      状態設定_残り体力( p1, 属性取得_地上投げ威力(p2), 1 ); /* ダメージ */
    }
    else { 
      座標設定_移動( p1, 2, dy, DRCT_後 );
      カウンタ設定_値維持( p1 );
    }
    
  }
  else  if(  c >= 5  )  /*  上昇２  */
  {
    座標設定_移動( p1, 1, -2, DRCT_後 );
    セル設定_表示( p1, CELL_投げられ5 );
  }
  else  if(  c >= 4  )  /*  下降２  */
  {
    座標設定_移動( p1, 1, 2, DRCT_後 );
    セル設定_表示( p1, CELL_投げられ5 );

    if(  座標取得_Ｙ( p1 ) >= BASE_LINE  )
    {

      座標設定_Ｙ( p1, BASE_LINE );
      音声再生_標準( p1, 0, PCM_転倒 );
      演出表示_砂煙(p1,ON);
    }
    else { カウンタ設定_値維持( p1 );}
  }
  else  if(  c >= 1  ){ 
    座標設定_移動( p1, 0, 0, DRCT_後 );
    セル設定_表示( p1, CELL_投げられ6 );
    演出表示_砂煙(p1,ON);
  }
  else{
    演出表示_砂煙(p1,OFF);
    座標設定_Ｙ( p1, BASE_LINE );
    セル設定_表示( p1, CELL_投げられ6 );
    カウンタ設定_現在値( p1, 0 );
    Cmd実行_動作( p1, ACT_起き上がり );
  }



CB_ }
CB_ /*E_MMP_FUNC*/



/*--------------------------------------------------------------------------*/
CB_ void  Act_起き上がり( int p1, int p2 )
CB_ {

  /*..........  起き上がり  ..........*/
  
  short  c = カウンタ設定_初期値( p1, 28 ) ;
  
  if(  c >= 28  )
  {
    状態設定_無敵( p1, IVC_ゾンビ, 0 );
    
    コンボ設定_クリア( p2 );
    
    演出表示_砂煙( p1, ON );
    
    座標設定_Ｙ( p1, BASE_LINE );
    
    セル設定_表示( p1, CELL_起き上がり0 );
  }
  else  if(  c >= 21  )
  {
    セル設定_表示( p1, CELL_起き上がり0 );
  }
  else  if(  c >= 16  )
  {
    セル設定_表示( p1, CELL_起き上がり1 );
  }
  else  if(  c >= 11  )
  {
    セル設定_表示( p1, CELL_起き上がり2 );
  }
  else  if(  c >= 7  )
  {
    セル設定_表示( p1, CELL_起き上がり3 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_起き上がり4 );
    
    状態設定_起き上がり必殺技許可( p1 );
  }
  else
  {
    セル設定_表示( p1, CELL_起き上がり4 );
    
    状態設定_起き上がり必殺技許可( p1 );
    
    同期完了_起き上がり( p1 );
  }

CB_ }
CB_ /*E_MMP_FUNC*/




/*--------------------------------------------------------------------------*/
CB_ void  Act_超必殺技( int p1, int p2 )
CB_ {

  static  short  X00[] = {  1, 1, 2, 3    } ,  /*  上昇下降軌道テーブル１  */
                 X01[] = {  1, 1, 1, 2, 2 } ,
                 Y00[] = { -5,-4,-3,-3    } ,
                 Y01[] = {  4, 4, 3, 3, 2 } ;
  
  static  short  X10[] = {  3, 2, 2, 1, 1, 1, 1, 0    } ,  /*  上昇下降軌道テーブル２  */
                 Y10[] = { -5,-5,-4,-4,-3,-3,-3,-2    } ,
                 Y11[] = {  5, 5, 4, 4, 4, 3, 3, 2, 2 } ;
  
  short  c = カウンタ設定_初期値( p1, 28 ) ;
  
  演出表示_身体残像( p1 );  /*  残像を表示させる  */
  
  if(  c >= 28  )
  {
    状態設定_無敵( p1 , IVC_無敵, 0 );  /*  出始めから無敵にする  */
    
    セル設定_表示( p1, CELL_必殺技Ａ0 );
    
    同期開始_気集中( p1, 24, 48, DRCT_前 );  /*  集中光を発し、ゲーム動作のブロックを開始する  */
  }
  else  if(  c >= 27  )
  {
    セル設定_表示( p1, CELL_必殺技Ａ0 );
    
    if(  同期取得_気集中( p1 ) > 0  )  カウンタ設定_値維持( p1 );
                /*  ブロックが解除されるまで、カウンタの自動デクリメントをキャンセルする  */
  }
  else  if(  c >= 26  )  /*  １発目開始  */
  {
    攻撃設定_最多ヒット数( p1, 1 );  /*  最初は１ヒットしかさせない  */
    攻撃設定_ヒット情報( p1, HIT_OFF );
    攻撃設定_必殺技キャンセル( p1, OFF );

    音声再生_標準( p1, 0, PCM_振り2 );
    
    音声再生_標準( p1, 2, PCM_必殺技A );
    
    セル設定_表示( p1, CELL_必殺技Ａ0 );
  }
  else  if(  c >= 25  )  /*  １発目開始  */
  {
    セル設定_表示( p1, CELL_必殺技Ａ1 );
    
    if(  座標取得_Ｙ( p2 ) == BASE_LINE  )  攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞1 );
      else                                  攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞F );
                                            /*  空中でヒットした時だけ、空中多段にする  */
  }
  else  if(  c >= 24  )
  {
    short  index = ( BASE_LINE - 座標取得_Ｙ( p1 ) ) >> 3 ;  /*  軌道テーブルのオフセット  */
    
    if(  index < 3  )
    {
      座標設定_移動( p1, X00[ index ] , 0,DRCT_前 );
      
      座標設定_移動( p1, 0, Y00[ index ] , DRCT_中 );
      
      カウンタ設定_値維持( p1 );  /*  カウンタの自動デクリメントをキャンセルする  */
    }
    
    セル設定_表示( p1, CELL_必殺技Ａ2 );
    
    攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞F );
  }
  else  if(  c >= 23  )
  {
    short  index = BASE_LINE - 座標取得_Ｙ( p1 ) ;

    if(  index < 0  )  index = 0 ;  /*  念のため一応  */
    
    index >>= 3 ;
    
    座標設定_移動( p1, X01[ index ] , 0,DRCT_前 );
    
    座標設定_移動( p1, 0, Y01[ index ] , DRCT_中 );
    
    if(  index > 2  )  セル設定_表示( p1, CELL_必殺技Ａ3 );
      else             セル設定_表示( p1, CELL_必殺技Ａ4 );
      
    if(  座標取得_Ｙ( p1 ) < BASE_LINE  )  カウンタ設定_値維持( p1 );
                              /*  着地するまでカウンタの自動デクリメントをキャンセルする  */
  }
  else  if(  c >= 22  )
  {
    座標設定_Ｙ( p1, BASE_LINE );  /*  自分の体の高さを、確実に地面に合わせる  */
    
    セル設定_表示( p1, CELL_必殺技Ａ5 );
  }
  else  if(  c >= 21  )  /*  ２発目開始  */
  {
    状態設定_無敵( p1 , IVC_通常, 0 );  /*  無敵状態を解除する  */
    
    音声再生_標準( p1, 0, PCM_振り2 );
    
    攻撃設定_最多ヒット数( p1, 1 );  /*  さらに１ヒットさせる  */
    
    セル設定_表示( p1, CELL_必殺技Ａ0 );
  }
  else  if(  c >= 20  )
  {
    セル設定_表示( p1, CELL_必殺技Ａ1 );
    
    if(  座標取得_Ｙ( p2 ) == BASE_LINE  )  攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞1 );
      else                                  攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞F );
                                            /*  空中でヒットした時だけ、空中多段にする  */
  }
  else  if(  c >= 19  )
  {
    short  index = ( BASE_LINE - 座標取得_Ｙ( p1 ) ) >> 3 ;  /*  軌道テーブルのオフセット  */
    
    攻撃設定_最多ヒット数２( p1, 1, 0 );  /*  多重ヒットを防ぐために、再設定()の方を使用する      */
                                 /*  設定()を使用すると、この動作過程において毎サイクル  */
                                 /*  でヒット数が設定されてしまう                        */
    
    if(  index < 3  )
    {
      座標設定_移動( p1, X00[ index ] , 0,DRCT_前 );
      
      座標設定_移動( p1, 0, Y00[ index ] , DRCT_中 );
      
      カウンタ設定_値維持( p1 );  /*  カウンタの自動デクリメントをキャンセルする  */
    }
    
    セル設定_表示( p1, CELL_必殺技Ａ2 );
    
    if(  座標取得_Ｙ( p2 ) == BASE_LINE  )  攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞1 );
      else                                  攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞F );
                                            /*  空中でヒットした時だけ、空中多段にする  */
  }
  else  if(  c >= 18  )
  {
    short  index = BASE_LINE - 座標取得_Ｙ( p1 ) ;

    if(  index < 0  )  index = 0 ;  /*  念のため一応  */
    
    index >>= 3 ;
    
    座標設定_移動( p1, X01[ index ] , 0,DRCT_前 );
    
    座標設定_移動( p1, 0, Y01[ index ] , DRCT_中 );
    
    if(  index > 2  )  セル設定_表示( p1, CELL_必殺技Ａ3 );
      else             セル設定_表示( p1, CELL_必殺技Ａ4 );
      
    if(  座標取得_Ｙ( p1 ) < BASE_LINE  )  カウンタ設定_値維持( p1 );
                              /*  着地するまでカウンタの自動デクリメントをキャンセルする  */
  }
  else  if(  c >= 17  )
  {
    座標設定_Ｙ( p1, BASE_LINE );  /*  自分の体の高さを、確実に地面に合わせる  */
    
    セル設定_表示( p1, CELL_必殺技Ａ5 );
  }
  else  if(  c >= 16  )  /*  ３発目開始  */
  {
    攻撃設定_最多ヒット数( p1, 1 );  /*  最後は１ヒットしかさせない  */
    
    音声再生_標準( p1, 2, PCM_必殺技A );
    
    音声再生_標準( p1, 0, PCM_振り2 );
    
    セル設定_表示( p1, CELL_必殺技Ａ0 );
  }
  else  if(  c >= 15  )
  {
    セル設定_表示( p1, CELL_必殺技Ａ1 );
    
    攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞2 );
  }
  else  if(  c >= 14  )
  {
    short  index = ( BASE_LINE - 座標取得_Ｙ( p1 ) ) >> 3 ;  /*  軌道テーブルのオフセット  */
    
    if(  index < 7  )
    {
      座標設定_移動( p1, X10[ index ] , 0, DRCT_前 );
      
      座標設定_移動( p1, 0, Y10[ index ] , DRCT_中 );
      
      カウンタ設定_値維持( p1 );  /*  カウンタの自動デクリメントをキャンセルする  */
    }
    
    セル設定_表示( p1, CELL_必殺技Ａ2 );
    
    攻撃設定_ヒット情報( p1, HIT_ドラゴン乱舞2 );
  }
  else  if(  c >= 13  )
  {
    short  index = BASE_LINE - 座標取得_Ｙ( p1 ) ;

    攻撃設定_ヒット情報( p1, HIT_OFF );

    if(  index < 0  )  index = 0 ;  /*  念のため一応  */
    
    index >>= 3 ;
    
    座標設定_移動( p1, 0, Y11[ index ] , DRCT_中 );
    
    if(  index > 2  )  セル設定_表示( p1, CELL_必殺技Ａ3 );
      else             セル設定_表示( p1, CELL_必殺技Ａ4 );
      
    if(  座標取得_Ｙ( p1 ) < BASE_LINE  )  カウンタ設定_値維持( p1 );
                              /*  着地するまでカウンタの自動デクリメントをキャンセルする  */
  }
  else  if(  c >= 9  )
  {
    座標設定_Ｙ( p1, BASE_LINE );  /*  自分の体の高さを、確実に地面に合わせる  */
    
    セル設定_表示( p1, CELL_必殺技Ａ5 );
  }
  else  if(  c >= 1  )
  {
    セル設定_表示( p1, CELL_着地 );
  }
  else
  {
    セル設定_表示( p1, CELL_着地 );
    
    同期完了_攻撃( p1);
  }


CB_ }
CB_ /*E_MMP_FUNC*/

/*  --------------------------------------------------------------------------*/










