/* 人物動作プログラム 雛形 外部から呼ばれる関数は、 (1)void Ch0Move(MAN *p,MAN *e) mainから呼ばれる、キャラクタ移動関数。 ほぼすべての処理は、ここから呼ばれる。 (2)void SetCh0Coord(MAN *m); 初期設定時に呼ばれるキャラクタ初期設定関数。 モデリングや判定、座標などの初期設定を行う。 (3)void SetCh0Dmg( MAN *pl, MAN *en, int num ); //敵の攻撃が当たった void SetCh0OtherDmg( MAN *p, HITDATA *hf, int num ); //飛び道具などが当たった 敵の攻撃が自分にヒットしたときに呼ばれるダメージ適用関数。 この関数の中で相手の攻撃に合わせて食らいモーションが発生する。 numは食らったパーツのパーツ番号。 となっている。 【新しい動作の作り方】  (1).状態フラグ(define定義)を新たに作る[40行付近]  (2).関数プロトタイプ宣言を新たに作る[60行付近]  (3).移動処理メイン関数(Ch0Move()関数)のswitch文に状態フラグと関数を追加する      [130行付近]  (4).(2)で宣言した関数の実体を作る[空いているところに適当に]  (5).その動作がボタン操作などの条件で呼び出されるようにする[動作によって臨機応変に] 以上。 */ //CH0 汎用フラグ使用状況 // dat1 ジャンプ吹き飛ばし攻撃が当たったかどうか 当たった..1 まだ当たっていない..0 // dat2 簡易飛び道具のボタンが押されたときの初期発射角度 // dat3 飛び道具のため具合 // dat4 コンボの進行具合 // dat5 超技未ヒットかどうか //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // includeファイル //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− #include #include "pad.h" #include "gamemain.h" #include "commot.h" //モーション関連 キャラ共通ヘッダ(CHxMOT.Hより先にインクルードする) #include "Ch0Mot.h" //モーションデータヘッダファイル //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // define定義 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− #define CH_SUMMER 32 #define CH_JSL 33 #define CH_JSH 34 #define CH_JS_B 35 #define CH_RANBU 36 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // 関数プロトタイプ宣言 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //各種状態実行関数 //新しい動作を作る場合にはこれを追加(2) void Ch0Stand( MAN *p ); void Ch0Walk_f( MAN *p ); void Ch0FDash( MAN *p ); void Ch0BDash( MAN *p ); void Ch0Jump_b( MAN *p ); void Ch0SJump_b( MAN *p ); void Ch0Jump( MAN *p ); void Ch0SJump( MAN *p ); void Ch0Jump_a( MAN *p ); void Ch0Sit( MAN *p ); void Ch0Guard( MAN *p ); void Ch0SGuard( MAN *p ); void Ch0Turn( MAN *p ); void Ch0Dmg( MAN *p ); void Ch0Uki( MAN *p ); void Ch0Down0( MAN *p ); void Ch0Ukemi( MAN *p ); void Ch0LP0( MAN *p ); void Ch0RP0( MAN *p ); void Ch0SLP0( MAN *p ); void Ch0SRP0( MAN *p ); void Ch0SH0( MAN *p ); void Ch0SH1( MAN *p ); void Ch0JRK0( MAN *p ); void Ch0JP0( MAN *p ); void Ch0DLK0( MAN *p ); void Ch0RK0( MAN *p ); void Ch0LH0( MAN *p ); void Ch0Hadou( MAN *p ); void Ch0Kidan( MAN *p ); void Ch0JKidan( MAN *p ); void Ch0Summer( MAN *p ); void Ch0JSL( MAN *p ); void Ch0JSH( MAN *p ); void Ch0JS_B( MAN *p ); void Ch0Ranbu( MAN *p ); //コマンド入力判定関数 void GetCommand( MAN *p ); //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // グローバル変数(必要に応じて新設してください) // 各プレイヤー毎に内容の変わる変数が必要な場合はここで追加してはいけないので注意。 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− int PADfront,PADback; //前、後ろの入力判定生成 //これらはCh0Move()関数で毎回必要な値が代入される //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // // 【移動メイン処理】 // //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //移動処理メイン(main()からはこの関数が呼ばれる) //《引数》 // MAN *p...プレイヤーキャラの人物構造体 // MAN *e...敵プレイヤーキャラの人物構造体 void Ch0Move(MAN *p,MAN *e) { int bx; MOVDATA *pmv; //前後のキー判定作成 if( p->face == LEFT ) { //自分が左向きなら PADfront = PADLleft; //左が前 PADback = PADLright; } else { //自分が右向きなら PADfront = PADLright; //右が前になる PADback = PADLleft; } p->gage += 4; //飛び道具ゲージ回復 if( p->gage > GAGE_MAX ) p->gage = GAGE_MAX; //技コマンド入力判定(入力判定のみで発生判定はしていない。発生判定は各動作関数内で)) GetCommand( p ); //硬直時間でなければフラグに応じて行動分岐 //新しい動作を作る場合にはこれを追加(3) if( p->hit_stop != 0 ) p->hit_stop--; //ヒット硬直中ならカウント減算 //if( (p->hit_stop & 1)== 0 ) else switch( p->st ) { //硬直中でなければ分岐 case CH_JYA: //食らいポーズ0 case CH_TYU: //食らいポーズ1 case CH_KYO: //食らいポーズ2 case CH_YRO: ChDmg(p); //食らいポーズ3 break; case CH_UKI: ChUki(p); //吹き飛び0 break; case CH_UKEMI: ChUkemi(p); //受け身 break; case CH_STAND: Ch0Stand(p); //立ち break; case CH_WALK_F: Ch0Walk_f(p); //前進 break; case CH_FDASH: Ch0FDash(p); //前ダッシュ break; case CH_JUMP_B: Ch0Jump_b(p); //ジャンプ準備 break; case CH_SJUMP_B:Ch0SJump_b(p); //ジャンプ準備 break; case CH_JUMP: //ジャンプ中 これら2つは case CH_JUMP2: Ch0Jump(p); //二段ジャンプ中  同じ関数に飛ぶ break; case CH_SJUMP: Ch0SJump(p); //二段ジャンプ中  同じ関数に飛ぶ break; case CH_JUMP_A: ChJump_a(p); //ジャンプ着地硬直 break; case CH_SIT: ChSit(p); //しゃがみ break; case CH_GETON: ChGet(p); //拾い break; case CH_GUARD: ChGuard(p); //立ちガード break; case CH_SGUARD: ChSGuard(p); //しゃがみガード break; case CH_JGUARD: ChJGuard(p); //空中ガード break; case CH_TURN: ChTurn(p); //振り向き break; case CH_DOWN0: ChDown0(p); //ダウン0 break; case CH_OKI: ChOki(p); //OKI break; case CH_LP0: Ch0LP0(p); //左パンチ0 break; case CH_RP0: Ch0RP0(p); //右パンチ0 break; case CH_SLP0: Ch0SLP0(p); //しゃがみ左パンチ0 break; case CH_SRP0: Ch0SRP0(p); //しゃがみ右パンチ0 break; case CH_SH0: Ch0SH0(p); //しゃがみ右キック0 break; case CH_SH1: Ch0SH1(p); //しゃがみスライディング break; case CH_JRK0: Ch0JRK0(p); //ジャンプ右キック0 break; case CH_JP0: Ch0JP0(p); //ジャンプぱんち0 break; case CH_DLK0: Ch0DLK0(p); //ダッシュキック0 break; case CH_RK0: Ch0RK0(p); //右キック0 break; case CH_LH0: Ch0LH0(p); //右キック0 break; case CH_HADOU: Ch0Hadou(p); //飛び道具 break; case CH_KIDAN: Ch0Kidan(p); //飛び道具2 break; case CH_JKIDAN: Ch0JKidan(p); //J飛び道具2 break; case CH_SUMMER: Ch0Summer(p); //サマー break; case CH_JSL: Ch0JSL(p); //飛びL break; case CH_JSH: Ch0JSH(p); //飛びH break; case CH_JS_B: Ch0JS_B(p); //飛び after break; case CH_RANBU: Ch0Ranbu(p); //飛び after break; } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) bx = p->pl.vx; ChkWallHit(p); pmv = &p->mv[p->m_no]; if( bx != p->pl.vx ) { if( !(e->mv[e->m_no].flg&MOV_JUMP) && ((pmv->flg&MOV_DMG) || ( p->grd_flg == GRD_AFTER )) ) { if( abs(p->pl.vx-e->pl.vx) < 5000 ) { e->pl.vx += (p->pl.vx-bx); } } } if( !(pmv->flg&MOV_JUMP) && !(pmv->flg&MOV_UKI) ) { int gy = GetGrandHeight(p->pl.vx); //現在の立ち位置の床の高さを求める if( p->pl.vy >= (gy + p->zero-200) ) { //地面と近いなら修正 p->pl.vy = gy + p->zero; } if( ChkGrandHit(p) == FALSE ) { if( (pmv->flg&MOV_DMG) || (pmv->flg&MOV_DOWN)){ p->g_pl.vy = -80; //垂直移動量初期値設定 p->st = CH_UKI; SetNewMotion( p, &uki0[0], 0 ); } else { p->g_pl.vy = 0; //垂直移動量初期値設定 p->st = CH_JUMP; SetNewMotion( p, &jump[0], 0 ); } } } //振り向き処理 if( p->r.vy > 0 ) { //回転中なら p->r.vy -= p->turn_sp; //振り向きスピード分回転を進める if( p->r.vy < 0 ) { //回転終了で立ちモーションに戻る p->r.vy = 0; //p->r.vy=0で正面を向く } } //人間の表示 SetManData( p ); //この関数で人間のすべてのパーツが表示される } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // // 【各種動作発生判定】 //  いろいろなところで呼ばれる動作の発生判定をまとめて関数化 // //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //ジャンプ発生判定 void SetCh0Jump(MAN *p) { //上が押されたならジャンプ準備に移行 //ここでは横移動量を0にしてジャンプ準備モーションに行くだけ //斜めジャンプ判定はジャンプ準備モーション中で行う。 if( p->cont & PADLup ) { p->g_pl.vx = 0; //ジャンプ中横移動量クリア p->st = CH_JUMP_B; //ジャンプ準備モーションに移行 SetNewMotion( p, &jump_b[0], 0 ); return; } } //しゃがみ発生判定 void SetCh0Sit(MAN *p) { //下が押されたならしゃがみに移行 if( p->cont & PADLdown ) { p->st = CH_SIT; SetNewMotion( p, &sit[0], 0 ); return; } } //なげ発生判定 void SetCh0Nage(MAN *p) { if( p->throw_flg == THROW_NO ) { if( !(p->cont & PADLdown) ) { if( p->trg & PAD_HI ) { p->throw_syu = 0; if( p->cont & PADLleft ) { p->face = LEFT; p->throw_flg = THROW_PUT; p->throw_distance = 2800; } else if( p->cont & PADLright ) { p->face = RIGHT; p->throw_flg = THROW_PUT; p->throw_distance = 2800; } } } } } //振り向き発生判定 void SetCh0Turn(MAN *p) { //後ろが押されたなら回転 if( p->cont & PADback ) { if( p->face == LEFT ) p->face = RIGHT; //方向反転 else p->face = LEFT; p->r.vy = 2048; p->st = CH_TURN; //振り向きモーションへ // SetNewMotion( p, &stand[0], 0 ); //振り向きには特別なモーションはなく、現在のモーションを進行させながら回る。 //そのために上記の関数は呼ばれる必要がないため、コメントになっている。 return; } } //前ダッシュ発生判定 //前ダッシュが出た場合にはTRUEを返す BOOL SetCh0FDash(MAN *p) { //ダッシュコマンドが入力されたならダッシュに移行 if( p->face == LEFT ) { //左向きの場合 if( p->Ldash_flg == -1 ) { //ダッシュの左入力の判定 p->Ldash_flg = 0; //ダッシュ入力フラグクリア p->st = CH_FDASH; SetNewMotion( p, &fdash[0], 0 ); return TRUE; } } else { //右向きの場合 if( p->Rdash_flg == -1 ) { //ダッシュの右入力の判定 p->Rdash_flg = 0; //ダッシュ入力フラグクリア p->st = CH_FDASH; SetNewMotion( p, &fdash[0], 0 ); return TRUE; } } return FALSE; } //波動件が出た場合にはATK_HISSATUを返す BOOL SetCh0Hadou(MAN *p) { //波動件コマンドが入力されたなら波動件に移行 if( p->mv != &Srp0[0] ) { if( p->face == LEFT ) { //左向きの場合 if( p->Lhd_flg == -1 ) { //波動件の左入力の判定 if( p->HB_flg ) { //強攻撃ボタンが入力されていた場合 p->hit_flg = HH_NO; p->HB_flg = 0; //強攻撃入力フラグクリア p->Lhd_flg = 0; //波動件入力フラグクリア p->st = CH_HADOU; SetNewMotion( p, &hadouH[0], 0 ); return ATK_HISSATU; } if( p->LB_flg ) { //弱攻撃ボタンが入力されていた場合 p->hit_flg = HH_NO; p->LB_flg = 0; //弱攻撃入力フラグクリア p->Lhd_flg = 0; //波動件入力フラグクリア p->st = CH_HADOU; SetNewMotion( p, &hadouL[0], 0 ); return ATK_HISSATU; } } } else { //右向きの場合 if( p->Rhd_flg == -1 ) { //波動件の右入力の判定 if( p->HB_flg ) { //強攻撃ボタンが入力されていた場合 p->hit_flg = HH_NO; p->HB_flg = 0; //強攻撃入力フラグクリア p->Rhd_flg = 0; //波動件入力フラグクリア p->st = CH_HADOU; SetNewMotion( p, &hadouH[0], 0 ); return ATK_HISSATU; } if( p->LB_flg ) { //弱攻撃ボタンが入力されていた場合 p->hit_flg = HH_NO; p->LB_flg = 0; //弱攻撃入力フラグクリア p->Rhd_flg = 0; //波動件入力フラグクリア p->st = CH_HADOU; SetNewMotion( p, &hadouL[0], 0 ); return ATK_HISSATU; } } } } if( p->gage2 >= GAGE_MAX ) { if( p->Lhd_flg == -1 || p->Rhd_flg == -1 ) { //波動件の左入力の判定 if( p->PB_flg ) { //弱攻撃ボタンが入力されていた場合 p->gage2 -= p->gage2/3; p->hit_flg = HH_NO; p->PB_flg = 0; //弱攻撃入力フラグクリア p->Lhd_flg = 0; //波動件入力フラグクリア p->Rhd_flg = 0; //波動件入力フラグクリア p->st = CH_RANBU; SetNewMotion( p, &ranbu[0], 0 ); return ATK_HISSATU; } } } return ATK_NO; } //波動件が出た場合にはATK_HISSATUを返す BOOL SetCh0JHadou(MAN *p) { //波動件コマンドが入力されたなら波動件に移行 if( p->Lhd_flg == -1 || p->Rhd_flg == -1 ) { //波動件の右入力の判定 if( p->HB_flg || p->LB_flg ) { //強攻撃ボタンが入力されていた場合 p->hit_flg = HH_NO; p->LB_flg = p->HB_flg = 0; //強攻撃入力フラグクリア p->Rhd_flg = p->Lhd_flg = 0; //波動件入力フラグクリア p->st = CH_HADOU; SetNewMotion( p, &hadouL[0], 0 ); return ATK_HISSATU; } } return ATK_NO; } //必殺技入力判定 //必殺技が出た場合にはATK_HISSATUを返す BOOL SetCh0Hissatu(MAN *p) { if( SetCh0Hadou(p) == ATK_HISSATU ) return ATK_HISSATU; if( p->DD_flg == -1 ) { //波動件の右入力の判定 if( p->FB_flg ) { //吹き飛ばし攻撃ボタンが入力されていた場合 p->FB_flg = 0; //吹き飛ばし攻撃入力フラグクリア p->DD_flg = 0; //波動件入力フラグクリア p->st = CH_SUMMER; SetNewMotion( p, &sumH[0], 0 ); p->g_pl.vx = 0; //ジャンプ中横移動量クリア p->g_pl.vy = -140; //ジャンプ移動量 return ATK_HISSATU; } if( p->HB_flg ) { //強攻撃ボタンが入力されていた場合 p->HB_flg = 0; //強攻撃入力フラグクリア p->DD_flg = 0; //波動件入力フラグクリア p->st = CH_SUMMER; SetNewMotion( p, &sumH[0], 0 ); p->g_pl.vx = 0; //ジャンプ中横移動量クリア p->g_pl.vy = -140; //ジャンプ移動量 return ATK_HISSATU; } if( p->LB_flg ) { //弱攻撃ボタンが入力されていた場合 p->LB_flg = 0; //弱攻撃入力フラグクリア p->DD_flg = 0; //波動件入力フラグクリア p->st = CH_SUMMER; SetNewMotion( p, &sumL[0], 0 ); p->g_pl.vx = 0; //ジャンプ中横移動量クリア p->g_pl.vy = -70; //ジャンプ移動量 return ATK_HISSATU; } } //気弾 if( p->PB_flg ) { //飛び道具攻撃ボタンが入力されていた場合 p->PB_flg = 0; //飛び道具攻撃フラグクリア p->st = CH_KIDAN; SetNewMotion( p, &kidan0[0], 0 ); return ATK_HISSATU; } return ATK_NO; } //地上攻撃モーション発生判定 ATK_HISSATU ATK_TUUJYOU BOOL SetCh0Atk(MAN *p) { p->hit_flg = HH_NO; //攻撃判定フラグクリア //必殺技入力判定 //必殺技が出た場合には強制リターン(必殺技が出た場合は通常技を出す必要が無いので) if( SetCh0Hissatu(p) == ATK_HISSATU ) return ATK_HISSATU; //拾い if( p->FB_flg ) { //ボタンが入力されていた場合 p->FB_flg = 0; //フラグクリア p->st = CH_GETON; SetNewMotion( p, &get[0], 0 ); return ATK_TUUJYOU; } //しゃがみ攻撃 if( p->cont & PADLdown ) { //下が押されているときに、 //しゃがみ左パンチ if( p->LB_flg ) { //弱攻撃ボタンが入力されていた場合 p->LB_flg = 0; //弱攻撃フラグクリア p->st = CH_SLP0; SetNewMotion( p, &Slp0[0], 0 ); return ATK_TUUJYOU; } //しゃがみ右キック if( p->HB_flg ) { //キックボタン(後になくなる予定)が入力されていた場合 p->HB_flg = 0; //強攻撃フラグクリア if( p->cont & PADfront ) { //maeが押されているときに、 //しゃがみ右パンチ p->st = CH_SRP0; SetNewMotion( p, &Srp0[0], 0 ); return ATK_TUUJYOU; } else { p->st = CH_SH0; SetNewMotion( p, &Sh0[0], 0 ); return ATK_TUUJYOU; } } } else { //立ち攻撃、下が押されていない時に、 //左パンチ if( p->dat4 == 0 ) { //if conbo num clear if( p->LB_flg ) { //弱攻撃ボタンが入力されていた場合 p->LB_flg = 0; //弱攻撃フラグクリア p->st = CH_LP0; SetNewMotion( p, &lp0[0], 0 ); return ATK_TUUJYOU; } } //右キック if( p->HB_flg ) { //キックボタン(後になくなる予定)が入力されていた場合 p->HB_flg = 0; //強攻撃フラグクリア //先行入力を受け付けていないので目押しでのみ発生 if( p->cont & PADfront ) { //キックボタン(後になくなる予定)が入力されていた場合 p->st = CH_LH0; SetNewMotion( p, &lh[0], 0 ); return ATK_TUUJYOU; } else { //キックボタン(後になくなる予定)が入力されていた場合 p->st = CH_RK0; SetNewMotion( p, &rk0[0], 0 ); return ATK_TUUJYOU; } } } //ガード判定 if( p->GR_flg ) {//trg & PAD_GRD ) { //ガードボタンが押されているときに、 if( p->cont & PADLdown) { //下が押されていれば p->st = CH_SGUARD; //しゃがみガードする SetNewMotion( p, &Sguard[0], 0 ); return ATK_TUUJYOU; } else { //下が押されていなければ p->st = CH_GUARD; //立ちガードする SetNewMotion( p, &guard[0], 0 ); return ATK_TUUJYOU; } } return ATK_NO; } BOOL SetCh0Attack(MAN *p) { MAN *e; if( SetCh0Atk(p) == ATK_TUUJYOU ) { if( p == &man[0] ) e = &man[1]; else e = &man[0]; if( abs(p->pl.vx - e->pl.vx) < 4000 ) { if( p->pl.vx > e->pl.vx ) p->face = RIGHT; else p->face = LEFT; } } } //JUMP DDモーション発生判定 ATK_HISSATU ATK_TUUJYOU BOOL SetCh0JDD(MAN *p) { //jump下下 if( p->DD_flg == -1 && p->DD_cnt > 13 ) { //入力の判定 if( p->HB_flg ) { //吹き飛ばし攻撃ボタンが入力されていた場合 p->HB_flg = 0; //吹き飛ばし攻撃入力フラグクリア p->DD_flg = 0; //入力フラグクリア p->hit_flg = HH_NO; //攻撃判定フラグクリア p->dat1 = 0; //攻撃当たった判定フラグクリア p->st = CH_JSH; SetNewMotion( p, &JsH[0], 0 ); if( p->face == LEFT ) p->g_pl.vx = 345; //ジャンプ中横移動量クリア else p->g_pl.vx = -345; //ジャンプ中横移動量クリア p->g_pl.vy = 57; //ジャンプ移動量 return ATK_HISSATU; } if( p->LB_flg ) { //弱攻撃ボタンが入力されていた場合 p->LB_flg = 0; //弱攻撃入力フラグクリア p->DD_flg = 0; //波動件入力フラグクリア p->hit_flg = HH_NO; //攻撃判定フラグクリア p->dat1 = 0; //攻撃当たった判定フラグクリア p->st = CH_JSL; SetNewMotion( p, &JsL[0], 0 ); if( p->face == LEFT ) p->g_pl.vx = 185; //ジャンプ中横移動量クリア else p->g_pl.vx = -185; //ジャンプ中横移動量クリア p->g_pl.vy = 145; //ジャンプ移動量 return ATK_HISSATU; } } return ATK_NO; } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // // 【動作進行関数】 // フラグに応じて呼ばれ、動作を進める。 // 動作が終わると、立ちやしゃがみなどの動作に戻る。 // //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // 基本動作 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //立ちモーション void Ch0Stand( MAN *p ) { p->g_pl.vx = 0; //ジャンプ中横移動量クリア p->dat4 = 0; //conbo num clear //前が押されたなら前進に移行 if( p->cont & PADfront ) { p->st = CH_WALK_F; SetNewMotion( p, &walk_f[0], 0 ); return; } //後ろが押されたなら振り向き SetCh0Turn( p ); //上が押されたならジャンプに移行 SetCh0Jump( p ); //下が押されたならしゃがみに移行 SetCh0Sit( p ); //ダッシュ入力がされたならダッシュに移行 SetCh0FDash( p ); //和げモーション発生判定 優先順位により必殺が出ていない場合のみ SetCh0Nage(p); //攻撃モーション発生判定 SetCh0Attack( p ); //モーションを進めて、モーションが終わったならもう一度モーションを発動させる if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &stand[0], 0 ); } } //前進モーション void Ch0Walk_f( MAN *p ) { p->r.vy = 0; //振り向き中にキャンセルでここに来ても大丈夫なように回転を正面に補正 //上が押されたならジャンプに移行 SetCh0Jump( p ); //下が押されたならしゃがみに移行 SetCh0Sit( p ); //ダッシュ入力がされたならダッシュに移行 SetCh0FDash( p ); //前が押されたなら前進を継続 if( p->cont & PADfront ) { //モーションを進めて、モーションが終わったならもう一度歩きモーションを発動させる if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &walk_f[0], 0 ); } //押されている方向に応じてキャラを移動(美しくない処理?) if( p->cont & PADLleft ) { p->pl.vx += p->walk_sp; p->g_pl.vx = p->walk_sp; //ジャンプ中横移動量クリア } else { p->pl.vx -= p->walk_sp; p->g_pl.vx = -p->walk_sp; //ジャンプ中横移動量クリア } } else { //前が押され続けていなければ立ちモーションに戻る p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } //和げモーション発生判定 優先順位により必殺が出ていない場合のみ SetCh0Nage(p); //攻撃モーション発生判定 SetCh0Attack( p ); } //前ダッシュモーション void Ch0FDash( MAN *p ) { int sp; p->r.vy = 0; //振り向き中にキャンセルでここに来ても大丈夫なように回転を正面に補正 if( p->m_cnt == 3 ) SetHitMark( MK_KEMURI,&p->obj[11].co.workm,16 ,2000);//ヒットマークのセット //和げモーション発生判定 優先順位により必殺が出ていない場合のみ SetCh0Nage(p); //ダッシュ左キック(ダッシュ時のみ出せる) if( !(p->cont&PADLdown) && p->HB_flg ) { //p->trg & PADRright ) { if( p->face == LEFT ) p->g_pl.vx = p->walk_sp*2; //左右移動量設定 else p->g_pl.vx = -p->walk_sp*2; p->g_pl.vy = -120; //垂直移動量設定 p->pl.vy--; //ジャンプさせるため(これを入れないと一瞬で着地判定が出てしまう) p->hit_flg = HH_NO; //攻撃判定フラグクリア p->st = CH_DLK0; //ダッシュキックへ SetNewMotion( p, &Dlk0[0], 0 ); return; } //攻撃モーション発生判定 SetCh0Attack( p ); //後ろが押されたなら振り向き SetCh0Turn( p ); //上が押されたならジャンプに移行 SetCh0Jump( p ); //ダッシュ移動 if( p->m_no == 0 ) sp = p->walk_sp*2-p->walk_sp/8; //最初の1モーションは通常の1.5倍の速さで移動 else sp = p->walk_sp+p->walk_sp/2; //残りは通常の1.35倍移動 //自分の向きに応じて左右移動 if( p->face == LEFT ) { p->pl.vx += sp; p->g_pl.vx = sp; //ジャンプ中横移動量クリア } else { p->pl.vx -= sp; p->g_pl.vx = -sp; //ジャンプ中横移動量クリア } //終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { if( p->cont & PADfront ) { SetNewMotion( p, &fdash[0], 0 ); } else { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } } //ジャンプ準備モーション void Ch0Jump_b( MAN *p ) { p->r.vy = 0; //振り向き中にキャンセルできても大丈夫なように回転を補正 if( p->m_cnt == 1 ) SetHitMark( MK_KEMURI,&p->obj[11].co.workm,16 ,2500);//ヒットマークのセット if( p->m_cnt == 3 ) SetHitMark( MK_KEMURI,&p->obj[14].co.workm,16 ,2500);//ヒットマークのセット //上気弾 if( p->PB_flg ) { //飛び道具攻撃ボタンが入力されていた場合 p->PB_flg = 0; //飛び道具攻撃フラグクリア p->st = CH_KIDAN; SetNewMotion( p, &kidan0[0], 0 ); return; } //左か右が押されると斜めジャンプ準備 //ジャンプ中の左右移動量の初期設定 if( p->cont & PADLleft ) p->g_pl.vx = p->walk_sp; if( p->cont & PADLright ) p->g_pl.vx = -p->walk_sp; //モーション終了でジャンプに移行 //(ジャンプ準備モーションのフレーム数はモーションデータに依存する) if( MoveNextMotion( p ) == FALSE ) { p->g_pl.vy = -p->jump_sp; //垂直移動量初期値設定 p->st = CH_JUMP; SetNewMotion( p, &jump[0], 0 ); } } //スーパージャンプ準備モーション void Ch0SJump_b( MAN *p ) { p->r.vy = 0; //振り向き中にキャンセルできても大丈夫なように回転を補正 if( p->m_no == 0 && p->m_cnt == 1 ) p->HB_flg = 0; if( p->m_cnt == 1 ) SetHitMark( MK_KEMURI,&p->obj[11].co.workm,16 ,3500);//ヒットマークのセット if( p->m_cnt == 3 ) SetHitMark( MK_KEMURI,&p->obj[14].co.workm,16 ,3500);//ヒットマークのセット //上気弾 if( p->PB_flg ) { //飛び道具攻撃ボタンが入力されていた場合 p->PB_flg = 0; //飛び道具攻撃フラグクリア p->st = CH_KIDAN; SetNewMotion( p, &kidan0[0], 0 ); return; } //左か右が押されると斜めジャンプ準備 //ジャンプ中の左右移動量の初期設定 if( p->cont & PADLleft ) p->g_pl.vx = p->walk_sp; if( p->cont & PADLright ) p->g_pl.vx = -p->walk_sp; //モーション終了でジャンプに移行 //(ジャンプ準備モーションのフレーム数はモーションデータに依存する) if( MoveNextMotion( p ) == FALSE ) { p->g_pl.vy = -p->jump_sp-80; //垂直移動量初期値設定 p->pl.vy -= (p->jump_sp-80)*2; //垂直移動量初期値設定 p->st = CH_SJUMP; SetNewMotion( p, &jump[0], 0 ); } } //ジャンプモーション void Ch0Jump( MAN *p ) { p->dat4 = 0; if( SetCh0JHadou(p) == ATK_HISSATU ) return; //JUMP DD if( SetCh0JDD(p) == ATK_HISSATU ) return; if( p->GR_flg ) {//trg & PAD_GRD ) { //ガードボタンが押されているときに、 p->st = CH_JGUARD; //ジャンプガードする SetNewMotion( p, &Jguard[0], 0 ); return; } //JUMP気弾 if( p->PB_flg ) { //飛び道具攻撃ボタンが入力されていた場合 p->PB_flg = 0; //飛び道具攻撃フラグクリア p->st = CH_JKIDAN; SetNewMotion( p, &Jkidan0[0], 0 ); return; } //ジャンプ右キック if( p->HB_flg ) { p->HB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア p->st = CH_JRK0; if( p->cont & PADLup ) { SetNewMotion( p, &Jrk1[0], 0 ); } else SetNewMotion( p, &Jrk0[0], 0 ); return; } //ジャンプPANNTI if( p->LB_flg ) { p->LB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア p->st = CH_JP0; if( p->cont & PADLup ) { p->dat4 = 1; //コンボ進行1 p->g_pl.vy = -90; //二段ジャンプする(少し高さは劣る) SetNewMotion( p, &Jp1[0], 0 ); } else if( p->cont & PADLdown ) { SetNewMotion( p, &Jp2[0], 0 ); } else SetNewMotion( p, &Jp0[0], 0 ); return; } //二段ジャンプ可能状態なら二段ジャンプ if( p->st != CH_JUMP2 ) { //ジャンプ二段めではなくて、 if( p->trg & PADLup ) { //上がトリガで押された場合 p->st = CH_JUMP2; SetNewMotion( p, &jump[0], 0 ); if( p->cont & PADLleft ) p->g_pl.vx = p->walk_sp; if( p->cont & PADLright ) p->g_pl.vx = -p->walk_sp; p->g_pl.vy = -(p->jump_sp-p->jump_sp/8); //二段ジャンプする(少し高さは劣る) } } else { //ジャンプ二段目ならわずかに空中制動可能 if(0);//コンパイラのバグ? if( p->cont & PADLright ){ p->pl.vx-=29; p->g_pl.vx-=1; } if( p->cont & PADLleft ) { p->pl.vx+=29; p->g_pl.vx+=1; } //p->pl.vx -= p->g_pl.vx/2; //左右移動減速 } //空中制動可能 if(0);//コンパイラのバグ? if( p->cont & PADLright ){ p->pl.vx-=25; p->g_pl.vx-=1; } if( p->cont & PADLleft ) { p->pl.vx+=25; p->g_pl.vx+=1; } if( p->g_pl.vx > p->walk_sp+p->walk_sp/4 ) p->g_pl.vx = p->walk_sp+p->walk_sp/4; //左右移動制限 if( p->g_pl.vx < -(p->walk_sp+p->walk_sp/4) ) p->g_pl.vx = -(p->walk_sp+p->walk_sp/4); //左右移動制限 //重力にしたがって移動 p->pl.vx += p->g_pl.vx; //左右移動 p->pl.vy += p->g_pl.vy; //垂直落下 p->g_pl.vy += G_POINT+2; //重力分の移動量増加 //ジャンプ中モーションが終わってもモーションは変更ぜず if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &jump[0], 1 ); } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHit(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { p->st = CH_JUMP_A; //着地モーションへ SetNewMotion( p, &jump_b[0], 0 ); } } //スーパージャンプモーション void Ch0SJump( MAN *p ) { p->dat4 = 0; if( !(p->m_no == 0 && p->m_cnt > 10) ) { //JUMP DD if( SetCh0JHadou(p) == ATK_HISSATU ) return; if( SetCh0JDD(p) == ATK_HISSATU ) return; if( p->GR_flg ) {//trg & PAD_GRD ) { //ガードボタンが押されているときに、 p->st = CH_JGUARD; //ジャンプガードする SetNewMotion( p, &Jguard[0], 0 ); return; } //JUMP気弾 if( p->PB_flg ) { //飛び道具攻撃ボタンが入力されていた場合 p->PB_flg = 0; //飛び道具攻撃フラグクリア p->st = CH_JKIDAN; SetNewMotion( p, &Jkidan0[0], 0 ); return; } //ジャンプ右キック if( p->HB_flg ) { p->HB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア p->st = CH_JRK0; if( p->cont & PADLup ) { SetNewMotion( p, &Jrk1[0], 0 ); } else SetNewMotion( p, &Jrk0[0], 0 ); return; } //ジャンプPANNTI if( p->LB_flg ) { p->LB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア p->st = CH_JP0; if( p->cont & PADLup ) { p->dat4 = 1; //コンボ進行1 p->g_pl.vy = -90; //二段ジャンプする(少し高さは劣る) SetNewMotion( p, &Jp1[0], 0 ); } else if( p->cont & PADLdown ) { SetNewMotion( p, &Jp2[0], 0 ); } else SetNewMotion( p, &Jp0[0], 0 ); return; } } //二段ジャンプ可能状態なら二段ジャンプ if( p->st != CH_JUMP2 ) { //ジャンプ二段めではなくて、 if( p->trg & PADLup ) { //上がトリガで押された場合 p->st = CH_JUMP2; SetNewMotion( p, &jump[0], 0 ); if( p->cont & PADLleft ) p->g_pl.vx = p->walk_sp; if( p->cont & PADLright ) p->g_pl.vx = -p->walk_sp; p->g_pl.vy = -(p->jump_sp-p->jump_sp/8); //二段ジャンプする(少し高さは劣る) } } else { //ジャンプ二段目ならわずかに空中制動可能 if(0);//コンパイラのバグ? if( p->cont & PADLright ){ p->pl.vx-=22; p->g_pl.vx-=2; } if( p->cont & PADLleft ) { p->pl.vx+=22; p->g_pl.vx+=2; } } //空中制動可能 if(0);//コンパイラのバグ? if( p->cont & PADLright ){ p->pl.vx-=36; p->g_pl.vx-=3; } if( p->cont & PADLleft ) { p->pl.vx+=36; p->g_pl.vx+=3; } if( p->g_pl.vx > p->walk_sp+p->walk_sp/4 ) p->g_pl.vx = p->walk_sp+p->walk_sp/4; //左右移動制限 if( p->g_pl.vx < -(p->walk_sp+p->walk_sp/4) ) p->g_pl.vx = -(p->walk_sp+p->walk_sp/4); //左右移動制限 //重力にしたがって移動 p->pl.vx += p->g_pl.vx; //左右移動 p->pl.vy += p->g_pl.vy; //垂直落下 p->g_pl.vy += G_POINT+6; //重力分の移動量増加 //ジャンプ中モーションが終わってもモーションは変更ぜず if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &jump[0], 1 ); } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHit(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { p->st = CH_JUMP_A; //着地モーションへ SetNewMotion( p, &jump_b[0], 0 ); } } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // 攻撃動作 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //左パンチモーション void Ch0LP0( MAN *p ) { if( p->m_no > 2 ) { if( p->dat4 != 3 ) { //後ろが押されたなら振り向き //SetCh0Turn( p ); //必殺攻撃モーション発生判定 if( SetCh0Hissatu( p ) == ATK_HISSATU ) { p->hit_flg = HH_NO; return; } //キャンセル右キック if( p->HB_flg ) { p->HB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア if( p->cont & PADLdown ) { //下が押されているときに、 if( p->cont & PADfront ) { //MAEが押されているときに、 p->st = CH_SRP0; SetNewMotion( p, &Srp0[0], 1 ); return; } else { p->st = CH_SH0; SetNewMotion( p, &Sh0[0], 0 ); return; } } else { p->st = CH_RK0; SetNewMotion( p, &rk0[0], 1 ); return; } } } } //戻りキャンセル if( p->m_no > 3 ) { if( p->hit_flg != HH_NO ) { //攻撃判定フラグクリア if( p->dat4 == 0 ) { //conbo num if( p->LB_flg ) { p->LB_flg = 0; p->dat4 = 1; p->hit_flg = HH_NO; //攻撃判定フラグクリア SetNewMotion( p, &C0[0], 0 ); return; } } } if( p->dat4 == 1 ) { //conbo num if( p->LB_flg ) { p->LB_flg = 0; p->dat4 = 2; p->hit_flg = HH_NO; //攻撃判定フラグクリア SetNewMotion( p, &C1[0], 0 ); return; } } /* else if( p->dat4 == 2 ) { //conbo num if( p->LB_flg ) { p->LB_flg = 0; p->dat4 = 3; p->hit_flg = HH_NO; //攻撃判定フラグクリア SetNewMotion( p, &C2[0], 0 ); return; } } */ //攻撃モーション発生判定 if( p->dat4 != 3 ) SetCh0Attack( p ); } //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //右パンチモーション void Ch0RP0( MAN *p ) { //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //しゃがみ左パンチモーション void Ch0SLP0( MAN *p ) { if( p->hit_flg != HH_GRD ) { //キャンセルしゃがみ右パンチ if( p->m_no > 1 ) { //後ろが押されたなら振り向き SetCh0Turn( p ); //必殺攻撃モーション発生判定 if( SetCh0Hissatu( p ) == ATK_HISSATU ) { p->hit_flg = HH_NO; return; } //キャンセル右キック if( p->HB_flg ) { p->HB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア if( p->cont & PADLdown ) { //下が押されているときに、 if( p->cont & PADfront ) { //MAEが押されているときに、 p->st = CH_SRP0; SetNewMotion( p, &Srp0[0], 1 ); return; } else { p->st = CH_SH0; SetNewMotion( p, &Sh0[0], 0 ); return; } } else { p->st = CH_RK0; SetNewMotion( p, &rk0[0], 1 ); return; } } } //キャンセルしゃがみ左パンチ連打 if( p->m_no > 2 ) { if( p->cont & PADLdown && p->LB_flg ) { p->LB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア SetNewMotion( p, &Slp0[0], 0 ); return; } } //キャンセル左パンチ連打 if( p->m_no > 2 ) { if( p->LB_flg ) { p->LB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア p->st = CH_LP0; SetNewMotion( p, &lp0[0], 0 ); return; } } //キャンセル if( p->m_no > 3 ) { //攻撃モーション発生判定 SetCh0Attack( p ); } } //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_SIT; SetNewMotion( p, &sit[0], 0 ); } } //しゃがみ右パンチモーション void Ch0SRP0( MAN *p ) { if( p->m_no < 5 && (p->m_cnt%1) == 0 ) SetHitMark( MK_KEMURI,&p->obj[11].co.workm,16 ,2000);//ヒットマークのセット //キャンセル if( p->m_no > 3 ) { if( p->hit_flg == HH_HIT && p->m_no > 5 ) { //キャンセルジャンプモーション発生判定 if( p->cont & PADLup ) { p->g_pl.vx = 0; //ジャンプ中横移動量クリア p->st = CH_SJUMP_B; //ジャンプ準備モーションに移行 SetNewMotion( p, &jump_b[0], 0 ); return; } //ダッシュ入力がされたならダッシュに移行 SetCh0FDash( p ); //必殺技入力判定 //必殺攻撃モーション発生判定 if( SetCh0Hissatu( p ) == ATK_HISSATU ) { p->hit_flg = HH_NO; return; } } } if( p->m_no > 8 ) { //攻撃モーション発生判定 SetCh0Attack( p ); //ダッシュ入力がされたならダッシュに移行 SetCh0FDash( p ); //前が押されたなら前進に移行 if( p->cont & PADfront ) { p->st = CH_WALK_F; SetNewMotion( p, &walk_f[0], 0 ); return; } } //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //右キックモーション void Ch0RK0( MAN *p ) { if( p->m_no > 3 ) { //必殺攻撃モーション発生判定 if( SetCh0Hissatu( p ) == ATK_HISSATU ) { p->hit_flg = HH_NO; return; } if( p->HB_flg ) { //キックボタン(後になくなる予定)が入力されていた場合 p->HB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア if( p->cont & PADfront || p->cont & PADLdown ) { //キックボタン(後になくなる予定)が入力されていた場合 p->st = CH_SRP0; SetNewMotion( p, &Srp0[0], 1 ); } else { p->st = CH_LH0; SetNewMotion( p, &lh[0], 0 ); } } } //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //右キックモーション void Ch0LH0( MAN *p ) { if( p->m_no == 0 ) { //和げモーション発生判定 優先順位により必殺が出ていない場合のみ SetCh0Nage(p); } //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //しゃがみ右キックモーション void Ch0SH0( MAN *p ) { if( p->m_no > 3 ) { //必殺攻撃モーション発生判定 if( SetCh0Hissatu( p ) == ATK_HISSATU ) { p->hit_flg = HH_NO; return; } } //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_SIT; SetNewMotion( p, &sit[0], 0 ); } } //しゃがみ右キックモーション void Ch0SH1( MAN *p ) { //if( p->m_no > 3 ) { // //必殺攻撃モーション発生判定 // if( SetCh0Hissatu( p ) == ATK_HISSATU ) { p->hit_flg = HH_NO; return; } //} //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_SIT; SetNewMotion( p, &sit[0], 0 ); } } //ジャンプ右キックモーション void Ch0JRK0( MAN *p ) { //JUMP DD if( SetCh0JHadou(p) == ATK_HISSATU ) return; if( SetCh0JDD(p) == ATK_HISSATU ) return; //重力にしたがって移動 p->pl.vx += p->g_pl.vx; p->pl.vy += p->g_pl.vy; p->g_pl.vy += G_POINT; //ジャンプ中モーションが終わってもモーションは変更ぜず if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &Jrk0[0], 3 ); } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHit(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { p->st = CH_JUMP_A; SetNewMotion( p, &jump_b[0], 0 ); } } //ジャンプぱんちモーション void Ch0JP0( MAN *p ) { //重力にしたがって移動 p->pl.vx += p->g_pl.vx; p->pl.vy += p->g_pl.vy; p->g_pl.vy += (G_POINT-3); //JUMP DD if( SetCh0JHadou(p) == ATK_HISSATU ) return; if( SetCh0JDD(p) == ATK_HISSATU ) return; //コンボ進行1 if( p->LB_flg && p->hit_flg != HH_NO ) { if( p->dat4 == 1 ) { p->dat4 = 2; //コンボ進行2 p->LB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア SetNewMotion( p, &JC0[0], 0 ); } else if( p->dat4 == 2 ) { p->dat4 = 3; //コンボ進行2 p->LB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア SetNewMotion( p, &JC1[0], 0 ); } } //ジャンプ右キック if( p->HB_flg ) { p->HB_flg = 0; p->hit_flg = HH_NO; //攻撃判定フラグクリア p->st = CH_JRK0; if( p->cont & PADLup ) { SetNewMotion( p, &Jrk1[0], 0 ); } else SetNewMotion( p, &Jrk0[0], 0 ); return; } //攻撃モーションが終わるとジャンプへ if( MoveNextMotion( p ) == FALSE ) { if( p->dat4 != 0 ) { //ジャンプ中モーションが終わってもモーションは変更ぜず SetNewMotion( p, &Jrk0[0], 3 ); } else { p->st = CH_JUMP2; SetNewMotion( p, &jump[0], 0 ); } } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHit(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { p->st = CH_JUMP_A; SetNewMotion( p, &jump_b[0], 0 ); } } //ダッシュ左キックモーション void Ch0DLK0( MAN *p ) { if( p->m_no == 0 && p->m_cnt == 1 ) SetHitMark( MK_KEMURI,&p->obj[14].co.workm,16 ,2500);//ヒットマークのセット if( p->m_no == 1 && (p->m_cnt%4) == 0 ) SetHitMark( MK_KEMURI,&p->obj[11].co.workm,16 ,2500);//ヒットマークのセット //重力にしたがって移動 if( p->m_no > 0 ) { p->pl.vx += p->g_pl.vx; p->pl.vy += p->g_pl.vy; p->g_pl.vy += 8;//G_POINT; } else { //和げモーション発生判定 優先順位により必殺が出ていない場合のみ SetCh0Nage(p); } //ジャンプ中モーションが終わってもモーションは変更ぜず if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &Dlk0[0], 4 ); } //硬化をつけた方が良い? //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHitInJump(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { if( p->m_no == 4 ) { p->st = CH_JUMP_A; SetNewMotion( p, &jump_b[0], 0 ); } } } // void Ch0JSL( MAN *p ) { p->dat4++; if( (p->dat4%6)==0 ) SetHitMark( MK_HIT4,&p->obj[11].co.workm,14,2100);//ヒットマークのセット if( p->dat1 == 0 && p->hit_flg != HH_NO ) { //攻撃がヒットした場合 p->dat1 = 1; //ヒットフラグを立てる p->g_pl.vy = -180; if( p->face == LEFT ) p->g_pl.vx = -90; else p->g_pl.vx = 90; p->st = CH_UKEMI; SetNewMotion( p, &ukemi[0], 0 ); } //ジャンプ中モーションが終わってもモーションは変更ぜず if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &JsL[0], 5 ); } if( p->m_no == 5 ) { //重力にしたがって移動 p->pl.vx += p->g_pl.vx; p->pl.vy += p->g_pl.vy; p->g_pl.vy += 9; } else { p->pl.vx -= p->g_pl.vx/16; p->pl.vy -= p->g_pl.vy/16; p->g_pl.vy += G_POINT; } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHitInJump(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { p->st = CH_JS_B; SetNewMotion( p, &Js_bL[0], 0 ); } } void Ch0JSH( MAN *p ) { p->dat4++; if( (p->dat4%6)==0 ) SetHitMark( MK_HIT4,&p->obj[11].co.workm,14,2200);//ヒットマークのセット if( p->dat1 == 0 && p->hit_flg != HH_NO ) { //攻撃がヒットした場合 p->dat1 = 1; //ヒットフラグを立てる p->g_pl.vy = -240; if( p->face == LEFT ) p->g_pl.vx = -140; else p->g_pl.vx = 140; p->st = CH_UKEMI; SetNewMotion( p, &ukemi[0], 0 ); } //ジャンプ中モーションが終わってもモーションは変更ぜず if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &JsH[0], 5 ); } if( p->m_no == 5 ) { //重力にしたがって移動 p->pl.vx += p->g_pl.vx; p->pl.vy += p->g_pl.vy; p->g_pl.vy += 2; } else { p->pl.vx -= p->g_pl.vx/8; p->pl.vy -= p->g_pl.vy/8; p->g_pl.vy += G_POINT; } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHitInJump(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { p->st = CH_JS_B; SetNewMotion( p, &Js_bH[0], 0 ); } } //JDD AFTERモーション void Ch0JS_B( MAN *p ) { if( (p->m_cnt%3)==0 ) { SetHitMark( MK_KEMURI,&p->obj[14].co.workm,16,Random(2000,500));//ヒットマークのセット SetHitMark( MK_KEMURI,&p->obj[12].co.workm,16,Random(2000,500));//ヒットマークのセット } p->g_pl.vx -= p->g_pl.vx/16; p->pl.vx += p->g_pl.vx; //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //波動件モーション #define HADOU_SPD 260 void Ch0Hadou( MAN *p ) { int gy; int px,flg; if( p->mv == &hadou1[0] ) { if( p->m_no < 6 ) if( (p->m_cnt&1) ) SetHitMark( MK_BOMB1,&p->obj[14].co.workm,10,2500);//ヒットマークのセット } else if( p->mv == &hadouL[0] ) { if( p->m_no < 10 ) if( (p->m_cnt&1) ) SetHitMark( MK_BOMB1,&p->obj[14].co.workm,10,2500);//ヒットマークのセット } else if( p->mv == &hadouH[0] || p->mv == &hadou2[0] ) { if( (p->m_cnt&1) ) SetHitMark( MK_KEMURI,&p->obj[14].co.workm,16,1500);//ヒットマークのセット } if( p->mv[p->m_no].mdat == st1 ) { if( p->Lhd_flg == -1 || p->Rhd_flg == -1 ) { //波動件の左入力の判定 if( p->LB_flg || p->HB_flg ) { //強攻撃ボタンが入力されていた場合 p->LB_flg = p->HB_flg = 0; //強攻撃入力フラグクリア p->Lhd_flg = p->Rhd_flg = 0; //波動件入力フラグクリア p->hit_flg = HH_NO; if( p->mv == &hadouH[0] ) { p->st = CH_HADOU; SetNewMotion( p, &hadou1[0], 0 ); return; } else { p->st = CH_LH0; SetNewMotion( p, &hadou2[0], 0 ); return; } } } } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHit(p); //着地すると着地モーションに移行 gy = GetGrandHeight(p->pl.vx);//現在の立ち位置の床の高さを求める if( p->pl.vy >= gy + p->zero ) { //地面に着いたら p->pl.vy = gy + p->zero; } if( ChkGrandHit( p ) == TRUE ) { // p->st = CH_STAND; //着地モーションへ // SetNewMotion( p, &fire_stand[0], 0 ); } else {//重力にしたがって移動 p->pl.vx += p->g_pl.vx; //左右移動 p->pl.vy += p->g_pl.vy; //垂直落下 p->g_pl.vy += G_POINT+3; //重力分の移動量増加 if( p->pl.vy >= gy + p->zero ) { //地面に着いたら p->pl.vy = gy + p->zero; } } //サマー終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //気弾モーション(ジャンプ準備状態でも出るようにして、上芳香も地上から出る) #define KIDAN_SPD 375 void Ch0Kidan( MAN *p ) { int deg; int px,py,flg; //最初にここに来たときに十時キー状態をdat2に記憶 if( p->m_no == 0 && p->m_cnt == 1 ) p->dat3 = 2048; if( ( p->m_no == 0 && p->m_cnt == 1 ) || ( p->cont&PADRright && p->dat3 > 2100 ) ) { //ため中なら MAN *e; if( p == &man[0] ) e = &man[1]; else e = &man[0]; deg = ATAN( e->obj[0].co.workm.t[0] - p->obj[0].co.workm.t[0], e->obj[0].co.workm.t[1] - p->obj[0].co.workm.t[1] ); #define DEG_PLUS 58 if( deg > 192 && deg < 192+DEG_PLUS ) deg = 192+DEG_PLUS; if( deg < 192 && deg > 192-DEG_PLUS ) deg = 192-DEG_PLUS; if( deg > 64 && deg < 64+DEG_PLUS ) deg = 64+DEG_PLUS; if( deg < 64 && deg > 64-DEG_PLUS ) deg = 64-DEG_PLUS; if( p->cont & PADLup ) { if( p->cont & PADLright ) deg = 192-32; else if( p->cont & PADLleft ) deg = 192+32; else deg = 192; } else if( p->cont & PADLdown ) { if( p->cont & PADLright ) deg = 64+32; else if( p->cont & PADLleft ) deg = 64-32; else if( p->face == RIGHT ) deg = 64+12; else deg = 64-12; } else if( p->cont & PADLright ) deg = 128; else if( p->cont & PADLleft ) deg = 0; else{ if( p->face == RIGHT ) { if( p->pl.vx < e->pl.vx ) deg = 128; } else { if( p->pl.vx > e->pl.vx ) deg = 0; } } p->dat2 = deg; } deg = p->dat2; if( p->face == LEFT ) { p->mdat.r[3].vx = 606 - deg*16; p->d_dat.r[3].vx = 0; p->mdat.r[6].vx = 1036 - deg*16; p->d_dat.r[6].vx = 0; } else { deg -= 128; p->mdat.r[3].vx = 606 + deg*16; p->d_dat.r[3].vx = 0; p->mdat.r[6].vx = 1036 + deg*16; p->d_dat.r[6].vx = 0; } //記憶しておいたdat2を使用して弾発射 if( p->m_no == 1 && p->m_cnt == 1 ) { px = KIDAN_SPD*COS(p->dat2)/256; py = KIDAN_SPD*SIN(p->dat2)/256; if( p == &man[0] ) flg = FLG_1P; else flg = FLG_2P; if( p->cont&PADRright && p->gage > 0 ) { //ため if( p->dat3 > 2100 || p->gage > 0 ) { //ため中なら if( p->cont & PADLright ) p->face = RIGHT; if( p->cont & PADLleft ) p->face = LEFT; if( p->gage > -100 ) { //ゲージ消費可能? p->gage2 += 40; p->dat3 += 170; //ゲージ消費でため if( p->dat3 > 32700 ) p->dat3 = 32000; if( p->dat3 < 3000 ) p->gage -= 20; else p->gage -= 110; } //ため表示 SetFlyObject( 1, &p->obj[8].co.workm, flg, p->face, px, py, 0, 1, p->dat3 ); } if( p->gage <= 0 && p->dat3 < 2100 ) p->gage = -1000; return; } else { //発射 p->gage2 += 130; if( p->gage <= 0 && p->dat3 > 2100 ) p->gage = 1; if( p->gage > 0 ) { p->gage -= 460; SetFlyObject( 1, &p->obj[8].co.workm, flg, p->face, px, py, 2, 0, p->dat3 ); } else { p->obj[8].co.workm.t[0] += 600*COS(p->dat2)/256; p->obj[8].co.workm.t[1] += 600*SIN(p->dat2)/256; SetFlyObject( 6, &p->obj[8].co.workm, flg, p->face, px/64, py/64, 2, 16, 2580 ); SetHitMark( MK_BOMB1,&p->obj[8].co.workm,16,2200 );//ヒットマークのセット PlaySE( SE_JYA ); //指定番号のSEを鳴らす p->obj[8].co.workm.t[0] -= 600*COS(p->dat2)/256; p->obj[8].co.workm.t[1] -= 600*SIN(p->dat2)/256; if( p->gage > -1000 ) { p->light_flg |= LIGHT_R;p->gage = -1000; } } } } //連続気弾 if( p->m_no == 2 ) { //後ろが押されたなら振り向き if( p->cont & PADback ) { if( p->face == LEFT ) p->face = RIGHT; //方向反転 else p->face = LEFT; p->r.vy = 0; } if( p->PB_flg ) { //飛び道具攻撃ボタンが入力されていた場合 p->PB_flg = 0; //飛び道具攻撃フラグクリア SetNewMotion( p, &kidan0[0], 0 ); } } //パンチ終了で立ちモーションに if( p->m_cnt <= 0 ) { if( p->mv[p->m_no].flg & MOV_END ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } p->m_no++; SetNewMotion( p, p->mv, p->m_no ); } if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } #define JKIDAN_SPD 355 void Ch0JKidan( MAN *p ) { MAN *e; int px,py,deg,flg; //最初にここに来たときに十時キー状態をdat2に記憶 if( p->m_no == 0 && p->m_cnt == 1 ) { int px,py,flg; MAN *e; int deg; if( p == &man[0] ) e = &man[1]; else e = &man[0]; deg = ATAN( e->obj[0].co.workm.t[0] - p->obj[0].co.workm.t[0], e->obj[0].co.workm.t[1] - p->obj[0].co.workm.t[1] ); #define DEG_PLUSJ 57 if( deg > 192 && deg < 192+DEG_PLUSJ ) deg = 192+DEG_PLUSJ; if( deg < 192 && deg > 192-DEG_PLUSJ ) deg = 192-DEG_PLUSJ; if( deg > 64 && deg < 64+DEG_PLUSJ ) deg = 64+DEG_PLUSJ; if( deg < 64 && deg > 64-DEG_PLUSJ ) deg = 64-DEG_PLUSJ; if( p->cont & PADLup ) { if( p->cont & PADLright ) deg = 192-32; else if( p->cont & PADLleft ) deg = 192+32; else deg = 192; } else if( p->cont & PADLdown ) { //p->g_pl.vy -= 80; if( p->cont & PADLright ) deg = 64+32; else if( p->cont & PADLleft ) deg = 64-32; else if( p->face == RIGHT ) deg = 64+8; else deg = 64-8; } else if( p->cont & PADLright ) deg = 128; else if( p->cont & PADLleft ) deg = 0; else{ if( p->face == RIGHT ) { if( p->pl.vx < e->pl.vx ) deg = 128; } else { if( p->pl.vx > e->pl.vx ) deg = 0; } } p->dat2 = deg; px = JKIDAN_SPD*COS(p->dat2)/256; py = JKIDAN_SPD*SIN(p->dat2)/256; if( p == &man[0] ) flg = FLG_1P; else flg = FLG_2P; if( p->gage > 0 ) { p->gage2 += 180; p->gage -= 820; p->g_pl.vx /= 4; p->g_pl.vy /= 4; p->g_pl.vx -= 200*COS(p->dat2)/256/2; p->g_pl.vy -= 200*SIN(p->dat2)/256; SetFlyObject( 1, &p->obj[8].co.workm, flg, p->face, px, py, 2, 0, 3000 ); } else { if( p->gage > -1000 ) p->gage = -1000; p->obj[8].co.workm.t[0] += 600*COS(p->dat2)/256; p->obj[8].co.workm.t[1] += 600*SIN(p->dat2)/256; SetFlyObject( 6, &p->obj[8].co.workm, flg, p->face, px/64, py/64, 2, 16, 2580 ); SetHitMark( MK_BOMB1,&p->obj[8].co.workm,16,2200 );//ヒットマークのセット PlaySE( SE_JYA ); //指定番号のSEを鳴らす p->obj[8].co.workm.t[0] -= 600*COS(p->dat2)/256; p->obj[8].co.workm.t[1] -= 600*SIN(p->dat2)/256; p->light_flg |= LIGHT_R; } } deg = p->dat2; if( p->face == LEFT ) { p->mdat.r[3].vx = 606 - deg*16; p->d_dat.r[3].vx = 0; p->mdat.r[6].vx = 1036 - deg*16; p->d_dat.r[6].vx = 0; } else { deg -= 128; p->mdat.r[3].vx = 606 + deg*16; p->d_dat.r[3].vx = 0; p->mdat.r[6].vx = 1036 + deg*16; p->d_dat.r[6].vx = 0; } //連続気弾 if( p->m_no > 1 ) { //後ろが押されたなら振り向き if( p->cont & PADback ) { if( p->face == LEFT ) p->face = RIGHT; //方向反転 else p->face = LEFT; p->r.vy = 0; } if( p->PB_flg ) { //飛び道具攻撃ボタンが入力されていた場合 p->PB_flg = 0; //飛び道具攻撃フラグクリア SetNewMotion( p, &Jkidan0[0], 0 ); } } //重力にしたがって移動 p->pl.vx += p->g_pl.vx; p->pl.vy += p->g_pl.vy; p->g_pl.vy += (G_POINT-2); //ジャンプ中モーションが終わってもモーションは変更ぜず if( MoveNextMotion( p ) == FALSE ) { SetNewMotion( p, &jump[0], 1 ); } //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHit(p); //着地すると着地モーションに移行 if( ChkGrandHit( p ) == TRUE ) { p->st = CH_JUMP_A; SetNewMotion( p, &jump_b[0], 0 ); } } //サマーモーション void Ch0Summer( MAN *p ) { //重力にしたがって移動 p->pl.vy += p->g_pl.vy; p->g_pl.vy += 9; //(G_POINT-2); //壁あたり判定(地面判定よりも先に行わないと壁判定がおかしくなる) ChkWallHit(p); //着地 //着地すると着地モーションに移行 ChkGrandHit( p ); //サマー終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } extern MDATA ShA0[];//, -50, 0, 0, 2, MOV_SIT|MOV_JUMP, NULL}, //ranbuモーション void Ch0Ranbu( MAN *p ) { int px,py,flg; if( p->m_no < 38 ) p->gage2 -= 16; else p->gage2 -= 50; anten_flg = ANTEN_ON; p->light_flg |= LIGHT_B; if( p->m_no == 0 && p->m_cnt == 1 ) p->dat5 = 0; if( p->m_no < 2 ) { if( (p->m_cnt&7)==0 ) SetHitMark( MK_KEMURI,&p->obj[11].co.workm,16 ,(p->m_no*10+p->m_cnt)*100+2000);//ヒットマークのセット } if( p->m_cnt == 1 ) { if( p->mv[p->m_no-1].hf != NULL ) { if( p->hit_flg != HH_NO ) { p->gage2 -= 58; p->dat5++;//ヒットしたよフラグ p->hit_flg = HH_NO; } } } if( p->m_no == 42 ) { //歯同キック終了時に // if( p->mv->mdat == &ShA0[0] ) { if( p->dat5 < 4 ) { //攻撃がまだヒットしていなければ p->dat5 = -1; SetNewMotion( p, &ranbuMiss[0], 0 ); anten_cnt = 5; } } else if( p->dat5 != -1 ) anten_cnt = 40; if( p->m_no == 70 && p->m_cnt == 1 ) { p->g_pl.vx = 0; //ジャンプ中横移動量クリア p->g_pl.vy = -145; //ジャンプ移動量 } else p->pl.vy += 50; ChkWallHit(p); if( ChkGrandHit( p ) == TRUE ) { } else {//重力にしたがって移動 int gy; gy = GetGrandHeight(p->pl.vx);//現在の立ち位置の床の高さを求める if( p->pl.vy > gy-200 ) p->pl.vy = gy; p->pl.vx += p->g_pl.vx; //左右移動 p->pl.vy += p->g_pl.vy; //垂直落下 p->g_pl.vy += G_POINT+3; //重力分の移動量増加 } //パンチ終了で立ちモーションに if( MoveNextMotion( p ) == FALSE ) { // anten_cnt = 40; p->st = CH_STAND; SetNewMotion( p, &stand[0], 0 ); } } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // // 【その他の処理】 // システムに関わる部分なので、普段はほとんど触る必要はない。 // //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //キャラクタのデータ初期設定 void SetCh0Coord(MAN *m) { GsInitCoordinate2(WORLD, &m->co); m->obj[0].mov.vx = 0; m->obj[0].mov.vy = 0; m->obj[0].mov.vz = 0; GsLinkObject4((unsigned long)dop[OBJ_CH0_0],&m->obj[0].obj,0); GsInitCoordinate2(&m->co, &m->obj[0].co); m->obj[1].mov.vx = 0; m->obj[1].mov.vy = -170; m->obj[1].mov.vz = 45; GsLinkObject4((unsigned long)dop[OBJ_CH0_1],&m->obj[1].obj,0); GsInitCoordinate2(&m->obj[0].co, &m->obj[1].co); m->obj[2].mov.vx = 0; m->obj[2].mov.vy = -720; m->obj[2].mov.vz = -110; GsLinkObject4((unsigned long)dop[OBJ_CH0_2],&m->obj[2].obj,0); GsInitCoordinate2(&m->obj[1].co, &m->obj[2].co); m->obj[3].mov.vx = -320; m->obj[3].mov.vy = -500; m->obj[3].mov.vz = -60; GsLinkObject4((unsigned long)dop[OBJ_CH0_3],&m->obj[3].obj,0); GsInitCoordinate2(&m->obj[1].co, &m->obj[3].co); m->obj[4].mov.vx = 0; m->obj[4].mov.vy = 485; m->obj[4].mov.vz = 0; GsLinkObject4((unsigned long)dop[OBJ_CH0_4],&m->obj[4].obj,0); GsInitCoordinate2(&m->obj[3].co, &m->obj[4].co); m->obj[5].mov.vx = 0; m->obj[5].mov.vy = 445; m->obj[5].mov.vz = 0; GsLinkObject4((unsigned long)dop[OBJ_CH0_5],&m->obj[5].obj,0); GsInitCoordinate2(&m->obj[4].co, &m->obj[5].co); m->obj[6].mov.vx = 320; m->obj[6].mov.vy = -500; m->obj[6].mov.vz = -60; GsLinkObject4((unsigned long)dop[OBJ_CH0_3],&m->obj[6].obj,0); GsInitCoordinate2(&m->obj[1].co, &m->obj[6].co); m->obj[7].mov.vx = 0; m->obj[7].mov.vy = 485; m->obj[7].mov.vz = 0; GsLinkObject4((unsigned long)dop[OBJ_CH0_4],&m->obj[7].obj,0); GsInitCoordinate2(&m->obj[6].co, &m->obj[7].co); m->obj[8].mov.vx = 0; m->obj[8].mov.vy = 445; m->obj[8].mov.vz = 0; GsLinkObject4((unsigned long)dop[OBJ_CH0_5],&m->obj[8].obj,0); GsInitCoordinate2(&m->obj[7].co, &m->obj[8].co); m->obj[9].mov.vx = -210; m->obj[9].mov.vy = 120; m->obj[9].mov.vz = 0; GsLinkObject4((unsigned long)dop[OBJ_CH0_6],&m->obj[9].obj,0); GsInitCoordinate2(&m->obj[0].co, &m->obj[9].co); m->obj[10].mov.vx = 0; m->obj[10].mov.vy = 870; m->obj[10].mov.vz = -80; GsLinkObject4((unsigned long)dop[OBJ_CH0_7],&m->obj[10].obj,0); GsInitCoordinate2(&m->obj[9].co, &m->obj[10].co); m->obj[11].mov.vx = 0; m->obj[11].mov.vy = 840; m->obj[11].mov.vz = -20; GsLinkObject4((unsigned long)dop[OBJ_CH0_8],&m->obj[11].obj,0); GsInitCoordinate2(&m->obj[10].co, &m->obj[11].co); m->obj[12].mov.vx = 210; m->obj[12].mov.vy = 120; m->obj[12].mov.vz = 0; GsLinkObject4((unsigned long)dop[OBJ_CH0_6],&m->obj[12].obj,0); GsInitCoordinate2(&m->obj[0].co, &m->obj[12].co); m->obj[13].mov.vx = 0; m->obj[13].mov.vy = 870; m->obj[13].mov.vz = -80; GsLinkObject4((unsigned long)dop[OBJ_CH0_7],&m->obj[13].obj,0); GsInitCoordinate2(&m->obj[12].co, &m->obj[13].co); m->obj[14].mov.vx = 0; m->obj[14].mov.vy = 840; m->obj[14].mov.vz = -20; GsLinkObject4((unsigned long)dop[OBJ_CH0_8],&m->obj[14].obj,0); GsInitCoordinate2(&m->obj[13].co, &m->obj[14].co); m->st = CH_STAND; SetNewMotion( m, &stand[0], 0 ); SetMdata( m, &stand[0], 0 ); m->hit_stop = 0; m->zero = -2000; m->walk_sp = 144; m->jump_sp = 265; m->turn_sp = 380; m->hit_size = 250; m->r.vx = 0; m->r.vy = 0; m->r.vz = 0; m->pl.vx = 2300; m->pl.vy = m->zero; m->pl.vz = 0; } //弱食らいモーション発生 void SetCh0JYA(MAN *p) { p->st = CH_JYA; //弱くらいモーションに移行 SetMdata( p, &dmg0[0], 0 ); SetNewMotion( p, &dmg0[0], 0 ); } //中食らいモーション発生 void SetCh0TYU(MAN *p) { p->st = CH_TYU; //中くらいモーションに移行 SetMdata( p, &dmg1[0], 0 ); SetNewMotion( p, &dmg1[0], 0 ); } //強食らいモーション発生 void SetCh0KYO(MAN *p) { p->st = CH_KYO; //強くらいモーションに移行 SetMdata( p, &dmg2[0], 0 ); SetNewMotion( p, &dmg2[0], 0 ); } //よろけ食らいモーション発生 void SetCh0YRO(MAN *p) { p->st = CH_YRO; //よろけモーションに移行 SetMdata( p, &dmg2[0], 0 ); SetNewMotion( p, &dmg2[0], 0 ); } //うかし食らいモーション発生 void SetCh0UKI(MAN *p) { p->st = CH_UKI; //うきモーションに移行 // SetMdata( p, &uki0[0], 0 ); //強制的にモーション変更すると不自然 SetNewMotion( p, &uki0[0], 0 ); }