// // 各キャラクタ共通処理 // #include //プレステライブラリのヘッダ #include "pad.h" //パッド入力関連のdefine定義ヘッダ #include "gamemain.h" //define定義ヘッダ //人物データの設定、表示設定 void SetManData(MAN *p) { int i,ry,num; OBJ *op = &p->obj[0]; //各パーツのOBJへのポインタ VEC *v = &p->mdat.r[0];//各パーツの回転角へのポインタ SVECTOR sv; MATRIX *mat; //パーツごとの行列へのポインタ(要毎回再設定) VECTOR vec; //MAN構造体の平行移動量を代入 //p->mov.vx = p->pl.vx + p->mdat.pl.vx; //p->mov.vy = p->pl.vy + p->mdat.pl.vy; //p->v.vz = p->pl.vz + p->mdat.pl.vz; mat = &p->co.coord; //ポインタに代入 //行列のクリア(クリアしなくても正常動作する?要実験) mat->m[0][0]=4096; mat->m[0][1]=0; mat->m[0][2]=0; mat->m[1][0]=0; mat->m[1][1]=4096; mat->m[1][2]=0; mat->m[2][0]=0; mat->m[2][1]=0; mat->m[2][2]=4096; //平行移動のセット(本体の移動+体の姿勢移動を同時に足し込む) vec.vx = p->mdat.pl.vx + p->pl.vx; vec.vy = p->mdat.pl.vy + p->pl.vy; vec.vz = p->mdat.pl.vz + p->pl.vz; TransMatrix(&p->co.coord,&vec); //行列を回転(x回転とz回転は不要?) if( p->face == LEFT ) ry = 1024; else ry = 1024*3; //RotMatrixY( p->r.vy+ry, mat); //RotMatrixZ( p->r.vz, mat); //RotMatrixX( p->r.vx, mat); sv.vx = p->r.vx; sv.vy = p->r.vy+ry; sv.vz = p->r.vz; RotMatrix( &sv,mat ); //フラグのクリア p->co.flg = 0; //ゼロ番オブジェの移動、表示 //残り14個分をポインタ加算しながらループ for(i=0; i<15; i++,op++,v++) { mat = &op->co.coord; //ポインタに代入 //行列のクリア(クリアしなくても正常動作する?要実験) mat->m[0][0]=4096; mat->m[0][1]=0; mat->m[0][2]=0; mat->m[1][0]=0; mat->m[1][1]=4096; mat->m[1][2]=0; mat->m[2][0]=0; mat->m[2][1]=0; mat->m[2][2]=4096; //行列を回転 //RotMatrixY( v->vy ,mat); //RotMatrixZ( v->vz ,mat); //RotMatrixX( v->vx ,mat); sv.vx = v->vx; sv.vy = v->vy; sv.vz = v->vz; RotMatrix( &sv ,mat ); //オブジェを表示 if( p == &man[0] ) num=0; else num=1; SetManObj( op ,num); } } //モーションを設定 void SetNewMotion( MAN *p, MOVDATA *mvp, int m_no ) { int i,frame; MDATA *mp; mp = mvp[m_no].mdat; frame = mvp[m_no].frame; p->mv = mvp; p->m_no = m_no; p->m_cnt = frame; //本体平行移動量差分値の設定 if( p->face == LEFT ) { p->d_pl.vx = (mvp[m_no].px)/frame; p->d_pl.vz = (mvp[m_no].pz)/frame; } else { p->d_pl.vx = -(mvp[m_no].px)/frame; p->d_pl.vz = -(mvp[m_no].pz)/frame; } p->d_pl.vy = (mvp[m_no].py)/frame; //姿勢平行移動量差分値の設定 if( p->face == LEFT ) { p->d_dat.pl.vx = (mp->pl.vx-p->mdat.pl.vx)/frame; p->d_dat.pl.vz = (mp->pl.vz-p->mdat.pl.vz)/frame; } else { p->d_dat.pl.vx = (-mp->pl.vx-p->mdat.pl.vx)/frame; p->d_dat.pl.vz = (-mp->pl.vz-p->mdat.pl.vz)/frame; } p->d_dat.pl.vy = (mp->pl.vy-p->mdat.pl.vy)/frame; //rをポインタにした方が早い? for(i=0; i<15; i++) { p->d_dat.r[i].vx = (mp->r[i].vx - p->mdat.r[i].vx )/frame; p->d_dat.r[i].vy = (mp->r[i].vy - p->mdat.r[i].vy)/frame; p->d_dat.r[i].vz = (mp->r[i].vz - p->mdat.r[i].vz)/frame; } } //モーションを進める(終了でTRUEを返す) int MoveNextMotion( MAN *p ) { int i; p->m_cnt--; if( p->m_cnt <= 0 ) { SetMdata( p, p->mv, p->m_no ); if( p->mv[p->m_no].flg & MOV_END ) return FALSE; p->m_no++; SetNewMotion( p, p->mv, p->m_no ); } //本体平行移動量差分値の設定 p->pl.vx += p->d_pl.vx; p->pl.vy += p->d_pl.vy; p->pl.vz += p->d_pl.vz; //姿勢平行移動量差分値の増加 p->mdat.pl.vx += p->d_dat.pl.vx; p->mdat.pl.vy += p->d_dat.pl.vy; p->mdat.pl.vz += p->d_dat.pl.vz; //rをポインタにした方が早い? for(i=0; i<15; i++) { p->mdat.r[i].vx += p->d_dat.r[i].vx ; p->mdat.r[i].vy += p->d_dat.r[i].vy ; p->mdat.r[i].vz += p->d_dat.r[i].vz ; } return TRUE; } //選択したモーションに設定 void SetMdata( MAN *p, MOVDATA *mvp, int m_no ) { int i; MDATA *mp; mp = mvp[m_no].mdat; p->m_no = m_no; p->m_cnt = 0; //すでにそのモーションになっているので //姿勢平行移動量差分値の設定 if( p->face == LEFT ) { p->mdat.pl.vx = mp->pl.vx; p->mdat.pl.vz = mp->pl.vz; } else { p->mdat.pl.vx = -mp->pl.vx; p->mdat.pl.vz = -mp->pl.vz; } p->mdat.pl.vy = mp->pl.vy; //rをポインタにした方が早い? for(i=0; i<15; i++) { p->mdat.r[i].vx = mp->r[i].vx; p->mdat.r[i].vy = mp->r[i].vy; p->mdat.r[i].vz = mp->r[i].vz; } } void SetJYA(MAN *p) { switch( p->syu ) { case 0: SetCh0JYA( p ); break; case 1: SetCh1JYA( p ); break; case 2: SetCh2JYA( p ); break; case 3: SetCh3JYA( p ); break; } } void SetTYU(MAN *p) { switch( p->syu ) { case 0: SetCh0TYU( p ); break; case 1: SetCh1TYU( p ); break; case 2: SetCh2TYU( p ); break; case 3: SetCh3TYU( p ); break; } } void SetKYO(MAN *p) { switch( p->syu ) { case 0: SetCh0KYO( p ); break; case 1: SetCh1KYO( p ); break; case 2: SetCh2KYO( p ); break; case 3: SetCh3KYO( p ); break; } } void SetYRO(MAN *p) { switch( p->syu ) { case 0: SetCh0YRO( p ); break; case 1: SetCh1YRO( p ); break; case 2: SetCh2YRO( p ); break; case 3: SetCh3YRO( p ); break; } } void SetUKI(MAN *p) { switch( p->syu ) { case 0: SetCh0UKI( p ); break; case 1: SetCh1UKI( p ); break; case 2: SetCh2UKI( p ); break; case 3: SetCh3UKI( p ); break; } } short conbo_tbl[] = { 152, 140, 120, 100, 80, 70, 60, 50, 40, 30, //10 20, 20, 10, 10, 10, 10, 10, 10, 10, 10, //20 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, //30 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //40 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //50 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //60 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //70 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //80 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, //90 }; //ダメージ判定処理 int SetDmg( MAN *p, MAN *e, int num ) { int flg,i,dmg; MOVDATA *pmv,*emv; pmv = &p->mv[p->m_no]; emv = &e->mv[e->m_no]; if( pmv->flg&MOV_MUTEKI ) return HH_MUTEKI; flg = emv->hf->hit_flg; //攻撃ヒットフラグ設定 //ガード時判定(ガード状態で、ガード不可技でない場合に判定) if( (pmv->flg&MOV_GUARD) && !( flg & HF_NGD) ) { /* if( pmv->flg & MOV_SIT ) { //しゃがみガードの場合 //中段攻撃でなく、ジャンプ攻撃でもなければガード成立 if( !( flg & HF_MID) && !( flg & HF_JUMP) ) { //敵の向きに方向転換(捲り判定もしなくてはならないので未完成) if( e->face == LEFT ) p->face = RIGHT; else p->face = LEFT; p->grd_stop = emv->hf->grd_cnt; //ガード硬直時間設定 PlaySE( SE_GRD ); //指定番号のSEを鳴らす return HH_GRD; } } else { //立ちガードの場合 if( !(flg&HF_LOW) ) {//下段攻撃でなければガード成立 */ p->grd_stop = emv->hf->grd_cnt; //ガード硬直時間設定 //敵の向きに方向転換(捲り判定もしなくてはならないので未完成) if( e->face == LEFT ) p->face = RIGHT; else p->face = LEFT; PlaySE( SE_GRD ); //指定番号のSEを鳴らす SetHitMark( MK_HIT1,&p->obj[0].co.workm,5,9000 );//ヒットマークのセット SetHitMark( MK_HIT1,&p->obj[2].co.workm,5,9000 );//ヒットマークのセット SetHitMark( MK_HIT1,&p->obj[5].co.workm,5,9000 );//ヒットマークのセット SetHitMark( MK_HIT1,&p->obj[num].co.workm,5,9000 );//ヒットマークのセット i=num; i--; if( i<0 ) i=0; SetHitMark( MK_HIT1,&p->obj[i].co.workm,5,9000 );//ヒットマークのセット i=num; i++; if( i>13 ) i=13; SetHitMark( MK_HIT3,&e->obj[emv->hf->p_num].co.workm,12,3500 );//ヒットマークのセット // SetHitMark( 1,&p->obj[i].co.workm,5 );//ヒットマークのセット p->grd_flg = GRD_ON; if( !(emv->flg&MOV_JUMP) && (( flg & HF_UKI) || ( flg & HF_JYA) || (flg & HF_TYU )) ){ e->grd_stop = 15; //ヒット硬直時間設定 SetKYO(e); } return HH_GRD; // } // } } //ガードが成立しているならば、この時点でリターンしている。 //ここまで処理が来ているということは、技を食らったということになる //攻撃側の移動量修正(空中コンボが入りやすくするため) if( (emv->flg&MOV_JUMP) ) { if( (pmv->flg&MOV_JUMP) ) e->g_pl.vx -= e->g_pl.vx/8; else e->g_pl.vx -= e->g_pl.vx/32; } if( (flg&HF_HONOO) ) //炎攻撃の場合 SetHitMark( MK_BOMB0,&e->obj[emv->hf->p_num].co.workm,32,6000 );//ヒットマークのセット else if( !(flg&HF_KYO) && !(flg&HF_FUKITOBI) ) //強攻撃の場合 SetHitMark( MK_HIT0,&e->obj[emv->hf->p_num].co.workm,8,4000 );//ヒットマークのセット // SetHitMark( 3,&e->obj[emv->hf->p_num].co.workm,12 );//ヒットマークのセット // SetHitMark( 4,&e->obj[emv->hf->p_num].co.workm,32 );//ヒットマークのセット //ヒット時判定 p->grd_stop = emv->hf->hit_cnt; //ヒット硬直時間設定 p->conbo_num++; //ヒット数増加 if( mode_no == 2 ) { //ダメージ修正無し(残慮欧州性は有り) dmg = (emv->hf->damege * conbo_tbl[p->conbo_num] ) / 256 +1; if( p->hp < 68 ) dmg = dmg * (60+p->hp)/128; p->hp -= dmg+1; } else if( flg&HF_NOSYUUSEI ) { //ダメージ修正無し(残慮欧州性は有り) dmg = emv->hf->damege; if( p->hp < 68 ) dmg = dmg * (60+p->hp)/128; p->hp -= dmg+1; } else if( pmv->flg&MOV_DOWN ) { p->g_pl.vx = 0; p->g_pl.vy = -50; p->hp -= emv->hf->damege/8; //ダウン中ならダメージ1/4 } else { dmg = (emv->hf->damege * conbo_tbl[p->conbo_num] ) / 256 +1; if( p->hp < e->hp ) dmg = ( dmg * (190+(p->hp-e->hp)))/256; else dmg = ( dmg * (200+(p->hp-e->hp)*2))/256; if( p->hp < 68 ) dmg = dmg * (60+p->hp)/128; p->hp -= dmg+1; p->gage2 += dmg*16; e->gage2 += dmg*24; } if( !(pmv->flg&MOV_UKI) && !(pmv->flg&MOV_DOWN) ) p->ukemi_cnt = emv->hf->noukemi_cnt; //受け身不可時間の設定 else p->ukemi_cnt += (emv->hf->noukemi_cnt*2)/p->conbo_num;//受け身不可時間の設定 if( p->hp <= 0 ) { p->g_pl.vx = 0; p->g_pl.vy = 0; p->hp=0; } if( p->hp == 0 && !(flg&HF_NOTODOME)) p->ukemi_cnt = 999999; //受け身不可時間の設定 //ジャンプ中、浮き中でない場合の食らいモーション設定 if( (p->hp!=0) && !(pmv->flg&MOV_JUMP) && !(pmv->flg&MOV_DOWN) && !(pmv->flg&MOV_UKI) ) { p->ukemi_cnt = 0; if( flg & HF_JYA ) { //弱攻撃の場合 SetJYA(p); PlaySE( SE_JYA ); //指定番号のSEを鳴らす } else if( flg & HF_TYU ) { //中攻撃の場合 SetTYU(p); PlaySE( SE_TYU ); //指定番号のSEを鳴らす } else if( flg & HF_KYO ) { //強攻撃の場合 SetKYO(p); PlaySE( SE_KYO ); //指定番号のSEを鳴らす SetHitMark( MK_HIT4,&p->obj[num].co.workm,16,6000 );//ヒットマークのセット } else if( flg & HF_UKI || flg & HF_TYUUKI || flg & HF_FUKITOBI ) { //浮かせ技の場合 if( e->face == LEFT ) p->g_pl.vx = emv->hf->px; else p->g_pl.vx = -emv->hf->px; p->g_pl.vy = -emv->hf->py; p->pl.vy += p->g_pl.vy; p->ukemi_cnt = emv->hf->noukemi_cnt; //受け身不可時間の設定 SetUKI(p); if( flg & HF_FUKITOBI ){ SetHitMark( MK_HIT4,&p->obj[num].co.workm,16,6000 );//ヒットマークのセット PlaySE( SE_KYO ); //指定番号のSEを鳴らす } else if( flg & HF_TYUUKI ) PlaySE( SE_TYU ); //指定番号のSEを鳴らす else { SetHitMark( MK_HIT2,&e->obj[emv->hf->p_num].co.workm,12,7000 );//ヒットマークのセット PlaySE( SE_UKI ); //指定番号のSEを鳴らす } } //食らった向きに方向転換(捲り判定もしなくてはならないので未完成) if( e->face == LEFT ) p->face = RIGHT; else p->face = LEFT; } //ジャンプ中、浮き中の場合の食らいモーション設定 else { if( flg & HF_JYA ) { //弱攻撃の場合 p->g_pl.vx /= 16; if( e->face == LEFT ) p->g_pl.vx += emv->hf->px; else p->g_pl.vx -= emv->hf->px; p->g_pl.vy /= 4; p->g_pl.vy -= emv->hf->py; SetUKI(p); PlaySE( SE_JYA ); //指定番号のSEを鳴らす } else if( flg & HF_TYU ) { //中行劇の場合 p->g_pl.vx /= 16; if( e->face == LEFT ) p->g_pl.vx += emv->hf->px; else p->g_pl.vx -= emv->hf->px; p->g_pl.vy /= 4; p->g_pl.vy -= emv->hf->py; SetUKI(p); PlaySE( SE_TYU ); //指定番号のSEを鳴らす } else if( flg & HF_KYO ) { //強行劇の場合 p->g_pl.vx /= 16; if( e->face == LEFT ) p->g_pl.vx += emv->hf->px; else p->g_pl.vx -= emv->hf->px; p->g_pl.vy /= 2; p->g_pl.vy -= emv->hf->py; SetUKI(p); PlaySE( SE_KYO ); //指定番号のSEを鳴らす SetHitMark( MK_HIT4,&p->obj[num].co.workm,16,6000 );//ヒットマークのセット } else if( flg & HF_UKI || flg & HF_TYUUKI || flg & HF_FUKITOBI ) { //浮かせ技の場合 p->g_pl.vx /= 8; if( e->face == LEFT ) p->g_pl.vx += emv->hf->px; else p->g_pl.vx -= emv->hf->px; p->g_pl.vy /= 2; p->g_pl.vy -= emv->hf->py; p->pl.vy -= 200; SetUKI(p); if( flg & HF_FUKITOBI ){ SetHitMark( MK_HIT4,&p->obj[num].co.workm,16,7000 );//ヒットマークのセット SetHitMark( MK_HIT5,&e->obj[emv->hf->p_num].co.workm,16,4000 );//ヒットマークのセット PlaySE( SE_KYO ); //指定番号のSEを鳴らす } else if( flg & HF_TYUUKI ) PlaySE( SE_TYU ); //指定番号のSEを鳴らす else { SetHitMark( MK_HIT2,&e->obj[emv->hf->p_num].co.workm,12,7000 );//ヒットマークのセット PlaySE( SE_UKI ); //指定番号のSEを鳴らす } } } return HH_HIT; } //ダメージ判定処理(飛び道具など) int SetOtherDmg( MAN *p, HITDATA *hf, int num, int face ) { int i,px,py,cnt,size; int flg,dmg; MAN *e; MOVDATA *pmv; MATRIX *mat; pmv = &p->mv[p->m_no]; if( pmv->flg&MOV_MUTEKI ) return HH_MUTEKI; flg = hf->hit_flg; //攻撃ヒットフラグ設定 if( face == LEFT ) p->face = RIGHT; else p->face = LEFT; //ガード時判定(ガード状態で、ガード不可技でない場合に判定) if( (pmv->flg&MOV_GUARD) && !( flg & HF_NGD) ) { /* if( pmv->flg & MOV_SIT ) { //しゃがみガードの場合 //中段攻撃でなく、ジャンプ攻撃でもなければガード成立 if( !( flg & HF_MID) && !( flg & HF_JUMP) ) { p->grd_stop = hf->grd_cnt; //ガード硬直時間設定 PlaySE( SE_GRD ); //指定番号のSEを鳴らす return HH_GRD; } } else { //立ちガードの場合 if( !(flg&HF_LOW) ) {//下段攻撃でなければガード成立 */ if( flg & HF_GBREAK ) { PlaySE( SE_GRD ); //指定番号のSEを鳴らす //hp削り if( p == &man[0] ) e = &man[1]; else e = &man[0]; dmg = (hf->damege * conbo_tbl[p->conbo_num] ) / 256 +1; if( p->hp < e->hp ) dmg = ( dmg * (240+p->hp-e->hp))/256; else dmg = ( dmg * (240+(p->hp-e->hp)*2))/256; p->hp -= (dmg*2)/5; if( p->hp <= 0 ) { p->g_pl.vx = 0; p->g_pl.vy = 0; p->hp=1; } p->grd_stop = (hf->hit_cnt*4)/6; //ヒット硬直時間設定 p->conbo_num++; //ヒット数増加 SetHitMark( MK_HIT1,&p->obj[num].co.workm,5,9000 );//ヒットマークのセット if( !(pmv->flg&MOV_JUMP) && !(pmv->flg&MOV_DOWN) && !(pmv->flg&MOV_UKI) ) { if( flg & HF_KYO || flg & HF_FUKITOBI ) { SetKYO(p); PlaySE( SE_KYO ); } //指定番号のSEを鳴らす else { SetTYU(p); PlaySE( SE_TYU ); } return HH_GRD; } else { p->g_pl.vx /= 16; if( face == LEFT ) p->g_pl.vx += hf->px; else p->g_pl.vx -= hf->px; p->g_pl.vy /= 2; p->g_pl.vy -= hf->py; SetUKI(p); PlaySE( SE_TYU ); //指定番号のSEを鳴らす return HH_GRD; } } else { p->grd_stop = hf->grd_cnt; //ガード硬直時間設定 PlaySE( SE_GRD ); //指定番号のSEを鳴らす SetHitMark( MK_HIT1,&p->obj[num].co.workm,5 ,9000);//ヒットマークのセット p->grd_flg = GRD_OBJ; return HH_GRD; } // } // } } //ガードが成立しているならば、この時点でリターンしている。 //ここまで処理が来ているということは、技を食らったということになる //SetHitMark( 0,&e->obj[emv->hf->p_num].co,15 );//ヒットマークのセット //if( num == 0 ) SetHitMark( 0,&e->obj[emv->hf->p_num].co.coord,15 );//ヒットマークのセット //else SetHitMark( 0,&e->obj[emv->hf->p_num].co.workm,15 );//ヒットマークのセット //if( num == 0 ) SetHitMark( 0,&p->obj[num].co.coord,15 );//ヒットマークのセット //else mat = &p->obj[num].co.workm; if( (flg&HF_HONOO) ) { //炎攻撃の場合 SetHitMark( MK_BOMB0,mat,32,6000 );//ヒットマークのセット } else if( (flg&HF_BAKUHATU) ) { //炎攻撃の場合 SetHitMark( MK_BOMB0,mat,32 ,8000);//ヒットマークのセット for(i=0; i<8; i++) { px = Random( 2200,-2200 ); py = Random( 2200,-2200 ); mat->t[0] += px; mat->t[1] += py; cnt = Random( 40, 5 ); size = Random( 8000, 2500 ); SetHitMark( MK_BOMB0,mat,cnt ,size);//ヒットマークのセット mat->t[0] -= px; mat->t[1] -= py; } } else SetHitMark( MK_BOMB1,&p->obj[num].co.workm,16,5000 );//ヒットマークのセット //ヒット時判定 p->grd_stop = hf->hit_cnt; //ヒット硬直時間設定 p->conbo_num++; //ヒット数増加 if( mode_no == 2 ) { //ダメージ修正無し(残慮欧州性は有り) dmg = (hf->damege * conbo_tbl[p->conbo_num] ) / 256 +1; if( p->hp < 68 ) dmg = dmg * (60+p->hp)/128; p->hp -= dmg+1; } else if( flg&HF_NOSYUUSEI ) { //ダメージ修正無し(残慮欧州性は有り) dmg = hf->damege; if( p->hp < 68 ) dmg = dmg * (60+p->hp)/128; p->hp -= dmg+1; } else if( pmv->flg&MOV_UKI ) { p->g_pl.vx = 0; p->g_pl.vy = -20; p->hp -= hf->damege/8; //浮きならダメージ1/8 } else if( pmv->flg&MOV_DOWN ) { p->g_pl.vx = 0; p->g_pl.vy = -50; p->hp -= hf->damege/4; //ダウン中ならダメージ1/4 } else { if( p == &man[0] ) e = &man[1]; else e = &man[0]; dmg = (hf->damege * conbo_tbl[p->conbo_num] ) / 256 +1; if( p->hp < e->hp ) dmg = ( dmg * (220+p->hp-e->hp))/256; else dmg = ( dmg * (220+(p->hp-e->hp)*2))/256; p->hp -= dmg; p->gage2 -= dmg*24; e->gage2 += dmg*16; } if( p->hp <= 0 ) { p->g_pl.vx = 0; p->g_pl.vy = 0; p->hp=0; } if( !(pmv->flg&MOV_UKI) && !(pmv->flg&MOV_DOWN) ) p->ukemi_cnt = hf->noukemi_cnt; //受け身不可時間の設定 else p->ukemi_cnt += (hf->noukemi_cnt*2)/p->conbo_num;//受け身不可時間の設定 if( p->hp == 0 && !(flg&HF_NOTODOME)) p->ukemi_cnt = 999999; //受け身不可時間の設定 //ジャンプ中でなく、浮き中でもない場合の食らいモーション設定 if( (p->hp!=0) && !(pmv->flg&MOV_JUMP) && !(pmv->flg&MOV_DOWN) && !(pmv->flg&MOV_UKI) ) { p->ukemi_cnt = 0; if( flg & HF_JYA ) { //弱攻撃の場合 SetJYA(p); PlaySE( SE_JYA ); //指定番号のSEを鳴らす } else if( flg & HF_TYU ) { //中攻撃の場合 SetTYU(p); PlaySE( SE_TYU ); //指定番号のSEを鳴らす } else if( flg & HF_KYO ) { //強攻撃の場合 SetKYO(p); PlaySE( SE_KYO ); //指定番号のSEを鳴らす } else if( flg & HF_UKI || flg & HF_TYUUKI || flg & HF_FUKITOBI ) { //浮かせ技の場合 p->g_pl.vx /= 8; if( face == LEFT ) p->g_pl.vx += hf->px; else p->g_pl.vx += -hf->px; p->g_pl.vy = -hf->py; SetUKI(p); if( flg & HF_FUKITOBI ) PlaySE( SE_KYO ); //指定番号のSEを鳴らす else if( flg & HF_TYUUKI ) PlaySE( SE_TYU ); //指定番号のSEを鳴らす else PlaySE( SE_UKI ); //指定番号のSEを鳴らす } //食らった向きに方向転換(捲り判定もしなくてはならないので未完成) //if( e->face == LEFT ) p->face = RIGHT; //else p->face = LEFT; } //ジャンプ中、浮き中の場合の食らいモーション設定 else { if( flg & HF_JYA ) { //弱攻撃の場合 p->g_pl.vx /= 16; if( face == LEFT ) p->g_pl.vx += hf->px; else p->g_pl.vx -= hf->px; p->g_pl.vy /= 4; p->g_pl.vy -= hf->py; SetUKI(p); PlaySE( SE_JYA ); //指定番号のSEを鳴らす } else if( flg & HF_TYU ) { //中行劇の場合 p->g_pl.vx /= 16; if( face == LEFT ) p->g_pl.vx += hf->px; else p->g_pl.vx -= hf->px; p->g_pl.vy /= 4; p->g_pl.vy -= hf->py; SetUKI(p); PlaySE( SE_TYU ); //指定番号のSEを鳴らす } else if( flg & HF_KYO ) { //強行劇の場合 p->g_pl.vx /= 16; if( face == LEFT ) p->g_pl.vx += hf->px; else p->g_pl.vx -= hf->px; p->g_pl.vy /= 2; p->g_pl.vy -= hf->py; SetUKI(p); PlaySE( SE_BOM ); //指定番号のSEを鳴らす } else if( flg & HF_UKI || flg & HF_TYUUKI || flg & HF_FUKITOBI ) { //浮かせ技の場合 p->g_pl.vx /= 8; if( face == LEFT ) p->g_pl.vx += hf->px; else p->g_pl.vx -= hf->px; p->g_pl.vy /= 2; p->g_pl.vy -= hf->py; SetUKI(p); if( flg & HF_FUKITOBI ) PlaySE( SE_KYO ); //指定番号のSEを鳴らす else if( flg & HF_TYUUKI ) PlaySE( SE_TYU ); //指定番号のSEを鳴らす else PlaySE( SE_UKI ); //指定番号のSEを鳴らす } } return HH_HIT; } //コマンド入力判定 void GetCommand( MAN *p ) { //弱ボタン先行入力判定 if( p->LB_flg == 0 ) { //入力されていないなら if( p->trg & PADRleft ) { //トリガで判定開始 p->LB_cnt = 20; //最初の入力から20フレーム受け付け p->LB_flg = 1; } } else { p->LB_cnt--; if( p->LB_cnt < 0 ) p->LB_flg = 0; //時間切れ、振り出しに戻る } //強ボタン先行入力判定 if( p->HB_flg == 0 ) { //入力されていないなら if( p->trg & PADRdown ) { //トリガで判定開始 p->HB_cnt = 20; //最初の入力から20フレーム受け付け p->HB_flg = 1; } } else { p->HB_cnt--; //カウント減算 if( p->HB_cnt < 0 ) p->HB_flg = 0; //時間切れ、振り出しに戻る } //吹き飛ばしボタン先行入力判定 if( p->FB_flg == 0 ) { //入力されていないなら if( p->trg & PADRup ) { //トリガで判定開始 p->FB_cnt = 20; //最初の入力から20フレーム受け付け p->FB_flg = 1; } } else { p->FB_cnt--; //カウント減算 if( p->FB_cnt < 0 ) p->FB_flg = 0; //時間切れ、振り出しに戻る } //飛び道具タン先行入力判定 if( p->PB_flg == 0 ) { //入力されていないなら if( p->trg & PADRright ) { //トリガで判定開始 p->PB_cnt = 10; //最初の入力から10フレーム受け付け p->PB_flg = 1; } } else { p->PB_cnt--; //カウント減算 if( p->PB_cnt < 0 ) p->PB_flg = 0; //時間切れ、振り出しに戻る } //ガード先行入力判定 if( p->GR_flg == 0 ) { //入力されていないなら if( p->trg & PADR1 ) { //トリガで判定開始 p->GR_cnt = 6; //最初の入力から10フレーム受け付け p->GR_flg = 1; } } else { p->GR_cnt--; //カウント減算 if( p->GR_cnt < 0 ) p->GR_flg = 0; //時間切れ、振り出しに戻る } //左方向ダッシュコマンド判定 if( p->Ldash_flg == 0 ) { //入力されていないなら if( p->trg & PADLleft ) { //トリガで判定開始 p->Ldash_cnt = 20; //最初の入力から20フレーム受け付け p->Ldash_flg = 1; } } else if( p->Ldash_flg == 1 ) { //最初の入力が行われているなら p->Ldash_cnt--; if( p->Ldash_cnt < 0 ) p->Ldash_flg = 0; //時間切れ、振り出しに戻る if( p->trg & PADLleft ) { //二回目の入力が行われたなら p->Ldash_cnt = 30; //先行入力受け付けフレーム数 p->Ldash_flg = -1; //ダッシュフラグを立てる } } else if( p->Ldash_flg == COM_ON ) { //ダッシュフラグ=ONの場合 p->Ldash_cnt--; //カウント減算 if( p->Ldash_cnt < 0 ) p->Ldash_flg = 0; //時間切れ、受付終了 } else p->Ldash_flg = 0; //初期化 //右方向ダッシュコマンド判定 if( p->Rdash_flg == 0 ) { //入力されていないなら if( p->trg & PADLright ) { //トリガで判定開始 p->Rdash_cnt = 20; //最初の入力から20フレーム受け付け p->Rdash_flg = 1; } } else if( p->Rdash_flg == 1 ) { //最初の入力が行われているなら p->Rdash_cnt--; if( p->Rdash_cnt < 0 ) p->Rdash_flg = 0; //時間切れ、振り出しに戻る if( p->trg & PADLright ) { //二回目の入力が行われたなら p->Rdash_cnt = 30; //先行入力受け付けフレーム数 p->Rdash_flg = COM_ON; //ダッシュフラグを立てる } } else if( p->Rdash_flg == COM_ON ) { //ダッシュフラグ=ONの場合 p->Rdash_cnt--; //カウント減算 if( p->Rdash_cnt < 0 ) p->Rdash_flg = 0; //時間切れ、受付終了 } else p->Rdash_flg = 0; //左方向波動件コマンド判定 if( p->Lhd_flg == 0 ) { //入力されていないなら if( p->trg & PADLdown ) { //トリガで判定開始 p->Lhd_cnt = 20; //最初の入力から20フレーム受け付け p->Lhd_flg = 1; } } else if( p->Lhd_flg == 1 ) { //最初の入力が行われているなら if( !(p->cont & PADLdown) ) { p->Lhd_cnt--; if( p->Lhd_cnt < 0 ) p->Lhd_flg = 0; //時間切れ、振り出しに戻る if( p->cont & PADLleft ) { //二回目の入力が行われたなら p->Lhd_cnt = 12; //先行入力受け付けフレーム数 p->Lhd_flg = COM_ON; //左波動拳フラグを立てる } } } else if( p->Lhd_flg == COM_ON ) { //左波動件フラグ=ONの場合 p->Lhd_cnt--; //カウント減算 if( p->Lhd_cnt < 0 ) p->Lhd_flg = 0; //時間切れ、受付終了 } else p->Lhd_flg = 0; //初期化 //右方向波動件コマンド判定 if( p->Rhd_flg == 0 ) { //入力されていないなら if( p->trg & PADLdown ) { //トリガで判定開始 p->Rhd_cnt = 20; //最初の入力から20フレーム受け付け p->Rhd_flg = 1; } } else if( p->Rhd_flg == 1 ) { //最初の入力が行われているなら if( !(p->cont & PADLdown) ) { p->Rhd_cnt--; if( p->Rhd_cnt < 0 ) p->Rhd_flg = 0; //時間切れ、振り出しに戻る if( p->cont & PADLright ) { //二回目の入力が行われたなら p->Rhd_cnt = 12; //先行入力受け付けフレーム数 p->Rhd_flg = COM_ON; //右波動件フラグを立てる } } } else if( p->Rhd_flg == COM_ON ) { //右波動件フラグ=ONの場合 p->Rhd_cnt--; //カウント減算 if( p->Rhd_cnt < 0 ) p->Rhd_flg = 0; //時間切れ、受付終了 } else p->Rhd_flg = 0; //初期化 //した下コマンド判定 if( p->DD_flg == 0 ) { //入力されていないなら if( p->trg & PADLdown ) { //トリガで判定開始 p->DD_cnt = 20; //最初の入力から20フレーム受け付け p->DD_flg = 1; } } else if( p->DD_flg == 1 ) { //最初の入力が行われているなら p->DD_cnt--; if( p->DD_cnt < 0 ) p->DD_flg = 0; //時間切れ、振り出しに戻る if( p->trg & PADLdown ) { //二回目の入力が行われたなら p->DD_cnt = 20; //先行入力受け付けフレーム数 p->DD_flg = COM_ON; //右波動件フラグを立てる } } else if( p->DD_flg == COM_ON ) { //右波動件フラグ=ONの場合 p->DD_cnt--; //カウント減算 if( p->DD_cnt < 0 ) p->DD_flg = 0; //時間切れ、受付終了 } else p->DD_flg = 0; //初期化 } //壁判定(壁についていたらTRUEを返す) BOOL ChkWallHit(MAN *p) { int gx,gy; gy = GetGrandHeight(p->pl.vx); //現在の立ち位置の床の高さを求める if( p->pl.vy >= (gy + p->zero+1000) ) { //壁に当たっていたら gx = GetGrandXpoz(p->pl.vx); if( p->pl.vx < gx ) { //引数座標の床の中心x座標を求める p->pl.vx = gx - 2150; } else p->pl.vx = gx + 2150; return TRUE; } return FALSE; } //壁判定ジャンプ中バージョン(壁についていたらTRUEを返す) BOOL ChkWallHitInJump(MAN *p) { int gx,gy; gy = GetGrandHeight(p->pl.vx); //現在の立ち位置の床の高さを求める if( p->pl.vy >= (gy + p->zero+1000) ) { //壁に当たっていたら gx = GetGrandXpoz(p->pl.vx); if( p->pl.vx < gx ) { //引数座標の床の中心x座標を求める p->pl.vx = gx - 2150; } else p->pl.vx = gx + 2150; return TRUE; } return FALSE; } extern MOVDATA down0[]; //地面判定(地面についていたらTRUEを返す) BOOL ChkGrandHit(MAN *p) { MATRIX *mat; int i,px,py,cnt,size; int gy = GetGrandHeight(p->pl.vx); //現在の立ち位置の床の高さを求める if( p->pl.vy >= (gy + p->zero+1000) ) { //壁に当たっていたら ChkWallHit(p); //return FALSE; } if( p->pl.vy >= gy + p->zero ) { //地面に着いたら p->pl.vy = gy + p->zero; if( GetGrandSyu(p->pl.vx) >= 5 ) { //電ジャーゾーンで p->conbo_num++; p->hp -= (p->hp/8)+5; if( p->hp <= 0 ) { p->hp = 0; p->ukemi_cnt = 999999; }//受け身不可時間の設定 else p->ukemi_cnt = 60/p->conbo_num; p->g_pl.vx /= 2; p->g_pl.vy = -300; //p->pl.vy += p->g_pl.vy; SetMdata( p, &down0[0], 0); //瞬時に指定したポーズに強制移行 SetUKI(p); PlaySE( SE_BOM ); //指定番号のSEを鳴らす mat = &p->obj[1].co.workm; for(i=0; i<15; i++) { px = Random( 2200,-2200 ); py = Random( 2200,-2200 ); mat->t[0] += px; mat->t[1] += py; cnt = Random( 40, 5 ); size = Random( 8000, 3500 ); SetHitMark( MK_BOMB0,mat,cnt, size );//ヒットマークのセット mat->t[0] -= px; mat->t[1] -= py; } } return TRUE; } return FALSE; }