// // 2D OBJECT処理 // #include //プレステライブラリのヘッダ #include "pad.h" //パッド入力関連のdefine定義ヘッダ #include "gamemain.h" //define定義ヘッダ #include "txdat.h" //txdat定義ヘッダ extern MOVDATA fire_get[]; int RdTbl[][2] = { {1,0}, {0,1}, {1,0}, {0,1}, {1,0}, {0,1}, {1,0}, {0,1}, }; //kihonnHIT TXDAT tx_flyobj0 = { // attribute, w, h,tpage, u, v, cx, cy, mx, my 0x40000000, 32, 32, 0, 32, 0, 0,487, 16, 16, /* //0111_0110 0000_0000 0000_0000 0000_0000 //32 7 0 24 0 0 16 0 0 8 0 0 sp->attribute = 0x40000000; sp->x = 32; sp->y = 0; sp->w = 32; sp->h = 32; sp->tpage = tpage[0]; sp->u = 32*1;//(i%3); sp->v = 0; sp->cx = 0; sp->cy = 487;//+(i%32); sp->mx = 16; sp->my = 16; */ }; void SetFlyObject( int syu, MATRIX *m, int flg, int face, int px,int py, int pz, int cnt, int size ) { int i; for( i=0; is3.co.coord.t[0] < cx-20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[0] > cx+20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] < -40000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] > 20000 ) fp->flg = FALSE; if( fp->cnt != 0 ) { fp->cnt--; if( fp->cnt == 0 ) fp->flg = FALSE; } } //hadou //飛び道具0の移動(cxは2キャラの中心座標、計算を一回で済ませるために引数にし、消滅判定に使用) void FlyObject0Move(FLYOBJ *fp, int cx) { int z,j,no,flg; fp->s3.co.coord.t[0] += fp->pl.vx; fp->s3.co.coord.t[1] += fp->pl.vy; fp->s3.co.coord.t[2] += fp->pl.vz; for(no=0; no<2; no++) { if(( no == 0 && !(fp->flg&FLG_2P) )) continue; if(( no == 1 && !(fp->flg&FLG_1P) )) continue; for(j=0; j<11; j++) { if( BoxCollision( &fp->s3.co.coord, 990, &man[no].obj[ ColTbl[j] ].co.workm, man[no].hit_size ) == TRUE ) { hitdata.hit_flg = HF_HI | HF_JYA | HF_NOTODOME; hitdata.px = 0; hitdata.py = 190; hitdata.hit_cnt = 25; hitdata.grd_cnt = 16; hitdata.noukemi_cnt = 8; hitdata.dmy = -1; hitdata.damege = 15; flg = SetOtherDmg( &man[no], &hitdata, j, fp->face ); if( flg == HH_GRD ) { if( (fp->flg&FLG_1P) ) fp->flg = FLG_2P; else fp->flg = FLG_1P; if( fp->face == LEFT ) fp->face = RIGHT; else fp->face = LEFT; fp->pl.vx *= -1; fp->pl.vx += fp->pl.vx/8; fp->pl.vy += Random(45,-45); } else if( flg != HH_MUTEKI ) fp->flg = FALSE; break; } } } Put3DSPRITE( &fp->s3 ); FlyObjDelChk(fp,cx); } //kidan //飛び道具1の移動(cxは2キャラの中心座標、計算を一回で済ませるために引数にし、消滅判定に使用) void FlyObject1Move(FLYOBJ *fp, int cx) { int z,j,no,flg; int x,y,deg,l; GsSPRITE *sp = &fp->s3.sp; fp->s3.co.coord.t[0] += fp->pl.vx; fp->s3.co.coord.t[1] += fp->pl.vy; // fp->s3.co.coord.t[2] += fp->pl.vz; //fp->pl.vzをフラグに使用 if( fp->pl.vz == 1 ) { //反射弾 flg = ChkWallRefrect(fp->s3.co.coord.t[0],fp->s3.co.coord.t[1]);//壁判定(反射フラグを返す) if( flg != CHK_NO ) { if( flg == CHK_WALL ) fp->pl.vx *= -1; else if( flg == CHK_GR0 ) fp->pl.vy *= -1; else { x=fp->pl.vx; y=fp->pl.vy; deg = ATAN( (long)fp->pl.vx, (long)fp->pl.vy ); j = COS(deg); if(j==0) j=1; l = x*256 / j; if( flg == CHK_GR1 ) { deg = 138-deg; deg = 138+deg; } else if( flg == CHK_GR2 ) { deg = 247-deg; deg = 247+deg; } else if( flg == CHK_GR3 ) { deg = 146-deg; deg = 146+deg; } else if( flg == CHK_GR4 ) { deg = 238-deg; deg = 238+deg; } fp->pl.vx = l*COS(deg)/256; fp->pl.vy = l*SIN(deg)/256; fp->s3.co.coord.t[1] -= 100; } } } if( fp->pl.vz == 2 ) { //非貫通弾 if( ChkWallIn(fp->s3.co.coord.t[0],fp->s3.co.coord.t[1]) == TRUE ) { PlaySE( SE_TYU ); //指定番号のSEを鳴らす SetHitMark( 1,&fp->s3.co.coord,5,9000 );//ヒットマークのセット fp->flg = FALSE; } } for(no=0; no<2; no++) { if(( no == 0 && !(fp->flg&FLG_2P) )) continue; if(( no == 1 && !(fp->flg&FLG_1P) )) continue; for(j=0; j<11; j++) { if( BoxCollision( &fp->s3.co.coord, fp->s3.size/16+120, &man[no].obj[ ColTbl[j] ].co.workm, man[no].hit_size ) == TRUE ) { if( fp->cnt == 1 || fp->s3.size < 4096 ) hitdata.hit_flg = HF_HI | HF_UKI | HF_NOTODOME | HF_HITM1; else if( fp->s3.size < 6500 ) hitdata.hit_flg = HF_HI | HF_TYU | HF_NOTODOME | HF_HONOO; else hitdata.hit_flg = HF_HI | HF_KYO | HF_NOTODOME | HF_BAKUHATU; hitdata.px = fp->s3.size*24/2048+abs(fp->pl.vx/8); hitdata.py = fp->s3.size*52/2048-fp->pl.vy/4; hitdata.hit_cnt = fp->s3.size*10/2048; hitdata.grd_cnt = 1; if( fp->cnt == 1 ) hitdata.noukemi_cnt = fp->s3.size/4096+7; else hitdata.noukemi_cnt = fp->s3.size*7/2048; hitdata.dmy = -1; if( fp->cnt == 1 ) hitdata.damege = fp->s3.size/1024; else { if( fp->s3.size < 4296 ) hitdata.damege = fp->s3.size/256; else if( fp->s3.size < 6500 ) hitdata.damege = fp->s3.size/160; else if( fp->s3.size < 9000 ) hitdata.damege = fp->s3.size/128; else hitdata.damege = fp->s3.size/104; } flg = SetOtherDmg( &man[no], &hitdata, j, fp->face ); if( flg == HH_GRD ) { if( (fp->flg&FLG_1P) ) fp->flg = FLG_2P; else fp->flg = FLG_1P; fp->flg |= FLG_NOSOUSAI; if( fp->face == LEFT ) fp->face = RIGHT; else fp->face = LEFT; fp->pl.vx *= -1; fp->pl.vx += fp->pl.vx/8; fp->pl.vy += Random(25,-25); if( man[no].cont & PADLup ) fp->pl.vy -= 185; if( man[no].cont & PADLdown ) fp->pl.vy += 185; } else if( flg != HH_MUTEKI ) fp->flg = FALSE; break; } } } Put3DSPRITE( &fp->s3 ); FlyObjDelChk(fp,cx); } //tem,honou //飛び道具2の移動(cxは2キャラの中心座標、計算を一回で済ませるために引数にし、消滅判定に使用) void FlyObject2Move(FLYOBJ *fp, int cx) { int z,j,no,flg,lp,rd; GsSPRITE *sp = &fp->s3.sp; fp->s3.co.coord.t[0] += fp->pl.vx; fp->s3.co.coord.t[1] += fp->pl.vy; fp->s3.co.coord.t[2] += fp->pl.vz; rd = Random(7,0); for(lp=0; lp<2; lp++) { no = RdTbl[rd][lp]; if(( no == 0 && !(fp->flg&FLG_2P) )) continue; if(( no == 1 && !(fp->flg&FLG_1P) )) continue; for(j=0; j<11; j++) { if( BoxCollision( &fp->s3.co.coord, fp->s3.size/4+fp->s3.size/8, &man[no].obj[ ColTbl[j] ].co.workm, man[no].hit_size ) == TRUE ) { if( fp->cnt == 1 || fp->s3.size < 4096 ) hitdata.hit_flg = HF_HI | HF_UKI| HF_NOTODOME; else if( fp->s3.size < 6500 ) hitdata.hit_flg = HF_HI | HF_TYU | HF_NOTODOME; else hitdata.hit_flg = HF_HI | HF_KYO | HF_NOTODOME; hitdata.px = fp->s3.size*20/2048+abs(fp->pl.vx/8); hitdata.py = fp->s3.size*60/2048-fp->pl.vy/4; hitdata.hit_cnt = fp->s3.size*10/2048; hitdata.grd_cnt = 5; //if( fp->cnt == 1 ) hitdata.noukemi_cnt = fp->s3.size/4096+7; //else hitdata.noukemi_cnt = fp->s3.size*7/2048; hitdata.noukemi_cnt = 4; hitdata.dmy = -1; if( fp->cnt == 1 ) hitdata.damege = fp->s3.size/1024; hitdata.damege = 1+fp->cnt; flg = SetOtherDmg( &man[no], &hitdata, j, fp->face ); if( flg == HH_GRD ) { if( (fp->flg&FLG_1P) ) fp->flg = FLG_2P; else fp->flg = FLG_1P; if( fp->face == LEFT ) fp->face = RIGHT; else fp->face = LEFT; fp->pl.vx *= -1; fp->pl.vx += fp->pl.vx/8; fp->pl.vy += Random(65,-65); } else if( flg != HH_MUTEKI ) fp->flg = FALSE; break; } } } Put3DSPRITE( &fp->s3 ); FlyObjDelChk(fp,cx); } //bakuhatu //vz!=0でダメージ半減 //飛び道具3の移動(cxは2キャラの中心座標、計算を一回で済ませるために引数にし、消滅判定に使用) void FlyObject3Move(FLYOBJ *fp, int cx) { int z,j,no,flg,lp,rd; GsSPRITE *sp = &fp->s3.sp; rd = Random(7,0); #define NOHIT 9999 if( fp->cnt>19 && fp->flg != NOHIT ) for(lp=0; lp<2; lp++) { //for(lp=0; lp<2; lp++) { no = RdTbl[rd][lp]; if(( no == 0 && !(fp->flg&FLG_2P) )) continue; if(( no == 1 && !(fp->flg&FLG_1P) )) continue; for(j=0; j<11; j++) { if( BoxCollision( &fp->s3.co.coord, fp->s3.size/4,//+fp->s3.size/8, &man[no].obj[ ColTbl[j] ].co.workm, man[no].hit_size ) == TRUE ) { if( fp->cnt == 1 || fp->s3.size < 4096 ) hitdata.hit_flg = HF_HI | HF_UKI;//| HF_NOTODOME; else if( fp->s3.size < 6500 ) hitdata.hit_flg = HF_HI | HF_TYU;// | HF_NOTODOME; else hitdata.hit_flg = HF_HI | HF_KYO; if( !(fp->flg&FLG_NGD) ) hitdata.hit_flg |= HF_NGD; hitdata.px = fp->s3.size*20/2048+abs(fp->pl.vx/8); hitdata.py = fp->s3.size*40/2048-fp->pl.vy/4; hitdata.hit_cnt = fp->s3.size*10/2048; hitdata.grd_cnt = 5; //if( fp->cnt == 1 ) hitdata.noukemi_cnt = fp->s3.size/4096+7; //else hitdata.noukemi_cnt = fp->s3.size*7/2048; hitdata.noukemi_cnt = 18; hitdata.dmy = -1; if( fp->cnt == 1 ) hitdata.damege = fp->s3.size/2048; if( fp->pl.vz == 0 ) hitdata.damege = 6+fp->cnt/8+fp->s3.size/512; else hitdata.damege = (6+fp->cnt/8+fp->s3.size/512)/30; flg = SetOtherDmg( &man[no], &hitdata, j, fp->face ); if( flg == HH_HIT || flg == HH_GRD ) { fp->flg = NOHIT; VSync(0); //VSync待ち(p59) goto jp; //man[no].pl.vy -= 120; } /* if( (fp->flg&FLG_1P) ) fp->flg = FLG_2P; else fp->flg = FLG_1P; if( fp->face == LEFT ) fp->face = RIGHT; else fp->face = LEFT; fp->pl.vx *= -1; fp->pl.vx += fp->pl.vx/8; fp->pl.vy += Random(65,-65); } //else if( flg != HH_MUTEKI ) fp->flg = FALSE; */ break; } } } jp:; Put3DSPRITE( &fp->s3 ); if( fp->s3.co.coord.t[0] < cx-20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[0] > cx+20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] < -40000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] > 20000 ) fp->flg = FALSE; if( fp->cnt != 0 ) { fp->cnt--; j=(32-fp->cnt)/4; if( j < 0 ) j=0; if( j > 6 ) j=6; SetTxDat( &fp->s3.sp, &tx_bomb0[j] ); if( fp->cnt == 0 ) fp->flg = FALSE; } } //Shadou BOMB //飛び道具4の移動(cxは2キャラの中心座標、計算を一回で済ませるために引数にし、消滅判定に使用) void FlyObject4Move(FLYOBJ *fp, int cx) { int num,z,i,j,no,flg,px,py,cnt,size,face,plx,ply; BOOL B_flg = FALSE; GsSPRITE *sp = &fp->s3.sp; MATRIX *mat; fp->s3.co.coord.t[0] += fp->pl.vx; fp->s3.co.coord.t[1] += fp->pl.vy; if( fp->pl.vz != 0 ) { fp->pl.vy += G_POINT+3; num = fp->pl.vz; } else num = 3; //fp->s3.co.coord.t[2] += fp->pl.vz; for(no=0; no<2; no++) { if(( no == 0 && !(fp->flg&FLG_2P) )) continue; if(( no == 1 && !(fp->flg&FLG_1P) )) continue; for(j=0; j<11; j++) { if( BoxCollision( &fp->s3.co.coord, fp->s3.size/4+fp->s3.size/8, &man[no].obj[ ColTbl[j] ].co.workm, man[no].hit_size ) == TRUE ) { if( fp->cnt == 1 || fp->s3.size < 4096 ) hitdata.hit_flg = HF_HI | HF_UKI;//| HF_NOTODOME; else if( fp->s3.size < 6500 ) hitdata.hit_flg = HF_HI | HF_TYU;// | HF_NOTODOME; else hitdata.hit_flg = HF_HI | HF_KYO;// | HF_NOTODOME; hitdata.px = fp->s3.size*20/2048+abs(fp->pl.vx/8); hitdata.py = fp->s3.size*60/2048-fp->pl.vy/4; hitdata.hit_cnt = fp->s3.size*10/2048; hitdata.grd_cnt = 5; //if( fp->cnt == 1 ) hitdata.noukemi_cnt = fp->s3.size/4096+7; //else hitdata.noukemi_cnt = fp->s3.size*7/2048; hitdata.noukemi_cnt = 4; hitdata.dmy = -1; hitdata.damege = (fp->cnt/4)+15; if( fp->cnt == 1 ) hitdata.damege = 0;//fp->s3.size/1024; flg = SetOtherDmg( &man[no], &hitdata, j, fp->face ); if( flg == HH_HIT || flg == HH_GRD ) { B_flg = TRUE; } break; } } } if( ChkWallIn(fp->s3.co.coord.t[0],fp->s3.co.coord.t[1]) == TRUE || B_flg == TRUE ) { mat = &fp->s3.co.coord; PlaySE( SE_BOM ); plx = 0; ply = 0; for(i=0; it[0] += plx; mat->t[1] += ply; } px = Random( 200,-200 ); py = Random( 200,-200 ); cnt = Random( 35, 5 ); size = Random( 8000, 3500 ); if( px < 0 ) face = RIGHT; else face = LEFT; SetFlyObject( 3, mat, fp->flg|FLG_NGD, face, px, 0, num, 32, size ); mat->t[0] -= plx; mat->t[1] -= ply; } fp->flg = FALSE; } Put3DSPRITE( &fp->s3 ); if( fp->s3.co.coord.t[0] < cx-20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[0] > cx+20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] < -20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] > 20000 ) fp->flg = FALSE; if( fp->cnt != 0 ) { fp->cnt--; fp->s3.size -= 10; if( fp->cnt == 0 ) fp->flg = FALSE; } } //???? //飛び道具5の移動(cxは2キャラの中心座標、計算を一回で済ませるために引数にし、消滅判定に使用) void FlyObject5Move(FLYOBJ *fp, int cx) { int z,j,no,flg; GsSPRITE *sp = &fp->s3.sp; fp->s3.co.coord.t[0] += fp->pl.vx; fp->s3.co.coord.t[1] += fp->pl.vy; fp->s3.co.coord.t[2] += fp->pl.vz; if( fp->s3.size > 800 ) { for(no=0; no<2; no++) { if(( no == 0 && !(fp->flg&FLG_2P) )) continue; if(( no == 1 && !(fp->flg&FLG_1P) )) continue; for(j=0; j<11; j++) { if( BoxCollision( &fp->s3.co.coord, fp->s3.size/8, &man[no].obj[ ColTbl[j] ].co.workm, man[no].hit_size ) == TRUE ) { if( fp->cnt == 1 || fp->s3.size < 4096 ) hitdata.hit_flg = HF_HI | HF_UKI| HF_NOTODOME; else if( fp->s3.size < 6500 ) hitdata.hit_flg = HF_HI | HF_TYU | HF_NOTODOME; else hitdata.hit_flg = HF_HI | HF_KYO | HF_HONOO ; hitdata.px = fp->s3.size*20/2048+abs(fp->pl.vx/8); hitdata.py = fp->s3.size*60/2048-fp->pl.vy/4; hitdata.hit_cnt = fp->s3.size*10/2048; hitdata.grd_cnt = 5; //if( fp->cnt == 1 ) hitdata.noukemi_cnt = fp->s3.size/4096+7; //else hitdata.noukemi_cnt = fp->s3.size*7/2048; hitdata.noukemi_cnt = 4; hitdata.dmy = -1; if( fp->cnt == 1 ) hitdata.damege = fp->s3.size/1024; hitdata.damege = fp->s3.size/512; flg = SetOtherDmg( &man[no], &hitdata, j, fp->face ); if( flg == HH_GRD ) { if( (fp->flg&FLG_1P) ) fp->flg = FLG_2P; else fp->flg = FLG_1P; if( fp->face == LEFT ) fp->face = RIGHT; else fp->face = LEFT; fp->pl.vx *= -1; fp->pl.vx += fp->pl.vx/8; fp->pl.vy += Random(65,-65); } else if( flg != HH_MUTEKI ) fp->flg = FALSE; break; } } } } Put3DSPRITE( &fp->s3 ); fp->cnt--; if( fp->cnt < 0 ) { fp->cnt = 0; fp->s3.size -= 250; if( fp->s3.size < 0 ) fp->flg = FALSE; } if( fp->s3.co.coord.t[0] < cx-20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[0] > cx+20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] < -20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] > 20000 ) fp->flg = FALSE; if( fp->cnt != 0 ) { fp->cnt--; fp->s3.size -= 10; if( fp->cnt == 0 ) fp->flg = FALSE; } } //KidanMISS //飛び道具6の移動(cxは2キャラの中心座標、計算を一回で済ませるために引数にし、消滅判定に使用) void FlyObject6Move(FLYOBJ *fp, int cx) { int z,j,no,flg; GsSPRITE *sp = &fp->s3.sp; #define NOHIT 9999 if( fp->cnt>5 && fp->flg != NOHIT ) for(no=0; no<2; no++) { if(( no == 0 && !(fp->flg&FLG_2P) )) continue; if(( no == 1 && !(fp->flg&FLG_1P) )) continue; for(j=0; j<11; j++) { if( BoxCollision( &fp->s3.co.coord, fp->s3.size/8,//+fp->s3.size/8, &man[no].obj[ ColTbl[j] ].co.workm, man[no].hit_size ) == TRUE ) { if( fp->cnt == 1 || fp->s3.size < 4096 ) hitdata.hit_flg = HF_HI | HF_UKI;//| HF_NOTODOME; else if( fp->s3.size < 6500 ) hitdata.hit_flg = HF_HI | HF_TYU;// | HF_NOTODOME; else hitdata.hit_flg = HF_HI | HF_KYO; if( !(fp->flg&FLG_NGD) ) hitdata.hit_flg |= HF_NGD; hitdata.px = fp->s3.size*20/2048+abs(fp->pl.vx/8); hitdata.py = fp->s3.size*40/2048-fp->pl.vy/4; hitdata.hit_cnt = fp->s3.size*10/2048; hitdata.grd_cnt = 5; //if( fp->cnt == 1 ) hitdata.noukemi_cnt = fp->s3.size/4096+7; //else hitdata.noukemi_cnt = fp->s3.size*7/2048; hitdata.noukemi_cnt = 8; hitdata.dmy = -1; if( fp->cnt == 1 ) hitdata.damege = fp->s3.size/2048; hitdata.damege = 4; flg = SetOtherDmg( &man[no], &hitdata, j, fp->face ); if( flg == HH_HIT || flg == HH_GRD ) { fp->flg = NOHIT; VSync(0); //VSync待ち(p59) goto jp; } break; } } } jp:; Put3DSPRITE( &fp->s3 ); if( fp->s3.co.coord.t[0] < cx-20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[0] > cx+20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] < -20000 ) fp->flg = FALSE; if( fp->s3.co.coord.t[1] > 20000 ) fp->flg = FALSE; if( fp->cnt != 0 ) { fp->cnt--; j=(16-fp->cnt)/4; if( j < 0 ) j=0; if( j > 2 ) j=2; SetTxDat( &fp->s3.sp, &tx_bombMiss[j] ); if( fp->cnt == 0 ) fp->flg = FALSE; } } MATRIX gMat; void PutFlyObject() { int i,j; int cx,fsize,asize; FLYOBJ *fp,*ap; cx = (man[0].pl.vx+man[1].pl.vx)/2; fp = &fly[0]; for( i=0; iflg != FALSE ) { //先にSOUSAI判定 ap = fp; for( j=i; jflg != FALSE ) { if( !(fp->flg&FLG_NOSOUSAI || ap->flg&FLG_NOSOUSAI) && (fp->flg&3) != (ap->flg&3) ) { if( BoxCollision( &fp->s3.co.coord, fp->s3.size/4, &ap->s3.co.coord, ap->s3.size/4 ) == TRUE ) { PlaySE( SE_BOM ); //指定番号のSEを鳴らす fsize = (fp->s3.size/1024); asize = (ap->s3.size/1024); fp->s3.co.coord.t[0] -= fp->pl.vx*2; fp->s3.co.coord.t[1] -= fp->pl.vy*2; fp->s3.co.coord.t[2] -= fp->pl.vz*2; ap->s3.co.coord.t[0] -= fp->pl.vx*2; ap->s3.co.coord.t[1] -= fp->pl.vy*2; ap->s3.co.coord.t[2] -= fp->pl.vz*2; if( fsize == asize ) { gMat.t[0] = fp->s3.co.coord.t[0] + ap->s3.co.coord.t[0]; gMat.t[1] = fp->s3.co.coord.t[1] + ap->s3.co.coord.t[1]; gMat.t[2] = fp->s3.co.coord.t[2] + ap->s3.co.coord.t[2]; fp->flg = FALSE; ap->flg = FALSE; SetHitMark( 4,&fp->s3.co.coord,32,5000 );//ヒットマークのセット SetHitMark( 4,&ap->s3.co.coord,32,5000 );//ヒットマークのセット if( fp->s3.size > 5000 ) { for(i=0; i<6; i++) { gMat.t[0] += Random( 2200,-2200 ); gMat.t[1] += Random( 2200,-2200 ); gMat.t[2] += Random( 2200,-2200 ); SetHitMark( 4,&gMat,Random( 40, 5 ), Random( 3000, 1500 )); } } } else if( fsize > asize ) { SetHitMark( 4,&ap->s3.co.coord,32,5000 );//ヒットマークのセット ap->flg = FALSE; } else { SetHitMark( 4,&fp->s3.co.coord,32,5000 );//ヒットマークのセット fp->flg = FALSE; } } } } } switch( fp->syu ) { case 0: FlyObject0Move( fp, cx ); break; case 1: FlyObject1Move( fp, cx ); break; case 2: FlyObject2Move( fp, cx ); break; case 3: FlyObject3Move( fp, cx ); break; case 4: FlyObject4Move( fp, cx ); break; case 5: FlyObject5Move( fp, cx ); break; case 6: FlyObject6Move( fp, cx ); break; } } } } void InitFlyObj() { int i,j; FLYOBJ *fp; fp = &fly[0]; for( i=0; iflg = FALSE; } } //kihonnHIT TXDAT tx_hitmark0 = { // attribute, w, h,tpage, u, v, cx, cy, mx, my 0x40000000, 32, 32, 0, 0, 0, 0,486, 16, 16, }; //MARU TXDAT tx_hitmark1 = { // attribute, w, h,tpage, u, v, cx, cy, mx, my 0x40000000, 32, 32, 0, 64, 0, 0,488, 16, 16, }; //par ANIME TXDAT tx_hitmark2[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 0,128, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 32,128, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 64,128, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 96,128, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 0,160, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 32,160, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 64,160, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 96,160, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 0,192, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 32,192, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 64,192, 0,489, 16, 12, }, { 0x40000000, 32, 32, 0, 96,192, 0,489, 16, 1e2, }, }; //ITIKAWA ANIME TXDAT tx_hitmark3[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 96, 0, 0,491, 16, 16, }, { 0x40000000, 32, 32, 0,128, 0, 0,491, 16, 16, }, { 0x40000000, 32, 32, 0,160, 0, 0,491, 16, 16, }, { 0x40000000, 32, 32, 0, 96, 32, 0,491, 16, 16, }, { 0x40000000, 32, 32, 0,128, 32, 0,491, 16, 16, }, { 0x40000000, 32, 32, 0,160, 32, 0,491, 16, 16, }, }; //HIT_H TXDAT tx_hitmark4[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 0, 0, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 0, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 64, 0, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 96, 0, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,128, 0, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,160, 0, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,192, 0, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,224, 0, 0,493, 16, 16, }, }; //BOM_L TXDAT tx_bomb1[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 0, 32, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 32, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 64, 32, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 96, 32, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,128, 32, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,160, 32, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,192, 32, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,224, 32, 0,493, 16, 16, }, }; //HIT_L TXDAT tx_hitmark5[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 0, 64, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 64, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 64, 64, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 96, 64, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,128, 64, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,160, 64, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,192, 64, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,224, 64, 0,493, 16, 16, }, }; //KEMURI TXDAT tx_kemuri[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 0, 96, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 96, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 64, 96, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0, 96, 96, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,128, 96, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,160, 96, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,192, 96, 0,493, 16, 16, }, { 0x40000000, 32, 32, 0,224, 96, 0,493, 16, 16, }, }; TXDAT tx_bomb0[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 0, 64, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 64, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 64, 64, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 96, 64, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 0, 96, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 96, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 64, 96, 0,492, 16, 16, }, }; TXDAT tx_bombMiss[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 32, 32, 0, 0, 64, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 64, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 32, 96, 0,492, 16, 16, }, { 0x40000000, 32, 32, 0, 64, 96, 0,492, 16, 16, }, }; TXDAT tx_yuki0[] = { // attribute, w, h,tpage, u, v, cx, cy, mx, my { 0x40000000, 8, 8, 0, 64, 32, 0,495, 4, 4, }, { 0x40000000, 8, 8, 0, 72, 32, 0,495, 4, 4, }, { 0x40000000, 8, 8, 0, 80, 32, 0,495, 4, 4, }, { 0x40000000, 8, 8, 0, 88, 32, 0,495, 4, 4, }, }; extern TXDAT tx_number[]; void SetHitMark( int syu, MATRIX *m, int cnt ,int size ) { GsSPRITE *sp; int i; for( i=0; i cy ) yuki[i].flg = FALSE; Put3DSPRITE( &yuki[i].s3 ); } } } void PutHitMark() { int i,j; //GsSPRITE *sp; for( i=0; i 11 ) j=11; SetTxDat( &mark[i].s3.sp, &tx_hitmark2[j] ); mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; //mark[i].s3.size -= 800; } if( mark[i].syu == MK_HIT3 ) { j=(12-mark[i].cnt)/2; if( j < 0 ) j=0; if( j > 5 ) j=5; SetTxDat( &mark[i].s3.sp, &tx_hitmark3[j] ); mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; } if( mark[i].syu == MK_HIT4 ) { j=(16-mark[i].cnt)/2; if( j < 0 ) j=0; if( j > 7 ) j=7; SetTxDat( &mark[i].s3.sp, &tx_hitmark4[j] ); mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; } if( mark[i].syu == MK_HIT5 ) { j=(16-mark[i].cnt)/2; if( j < 0 ) j=0; if( j > 7 ) j=7; SetTxDat( &mark[i].s3.sp, &tx_hitmark5[j] ); mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; } if( mark[i].syu == MK_BOMB0 ) { j=(32-mark[i].cnt)/4; if( j < 0 ) j=0; if( j > 6 ) j=6; SetTxDat( &mark[i].s3.sp, &tx_bomb0[j] ); mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; } if( mark[i].syu == MK_BOMB1 ) { j=(16-mark[i].cnt)/2; if( j < 0 ) j=0; if( j > 7 ) j=7; SetTxDat( &mark[i].s3.sp, &tx_bomb1[j] ); mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; } if( mark[i].syu == MK_KEMURI ) { j=(16-mark[i].cnt)/2; if( j < 0 ) j=0; if( j > 7 ) j=7; SetTxDat( &mark[i].s3.sp, &tx_kemuri[j] ); mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; } if( mark[i].syu == MK_FLYOBJ ) { mark[i].cnt--; if( mark[i].cnt == 0 ) mark[i].flg = FALSE; } if( mark[i].syu == MK_NUM ) { mark[i].flg = FALSE; } Put3DSPRITE( &mark[i].s3 ); } } } void SetOther( int syu, int vx, int vy, int vz, int rx, int ry, int rz, int dat1,int dat2, int dat3, int dat4, int dat5 ) { int i; for( i=0; iukemi_cnt != 0 ) return FALSE; if( p->mv[p->m_no].flg&MOV_MUTEKI ) return FALSE; if( p->throw_flg == THROW_ON || p->throw_flg == THROW_DMG ) return FALSE; if( //( ((abs(p->pl.vx-e->pl.vx)>3000)&&(p->trg & PADLdown) ) || (p->trg & PADRup) //) && ( !(p->mv[p->m_no].flg&MOV_DMG) && !(p->mv[p->m_no].flg&MOV_UKI)) ) { if( !(p->cont&PADRright) ) return TRUE; } if( (p->trg&PADRup)//&&(p->cont & PADLdown) || (p->mv[p->m_no].flg & MOV_GET) ) { return TRUE; } return FALSE; } //other0(tem)の移動 //dat1..回転角 //dat2..重力移動量 //dat3..カウンタ void Other0Move(OTHER *op) { int px,py,pz,gy,face; MATRIX *mat; mat = &op->obj.co.coord; //ポインタに代入 op->dat3--; if( op->dat3 < 0 ) { op->dat3 = 5; px = 130*SIN( op->r.vy/16 )/256; py = 0; pz = 130*COS( op->r.vy/16 )/256; mat->t[0] += 1300*SIN( op->r.vy/16 )/256; mat->t[1] -= 1600; mat->t[2] += 1300*COS( op->r.vy/16 )/256; if( px < 0 ) face = RIGHT; else face = LEFT; SetFlyObject( 2, mat,FLG_ALL , face, px, py, pz, 20, 3000 ); } //行列のクリア(クリアしなくても正常動作する?要実験) /*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; */ *mat = GsIDMATRIX; RotMatrix( &op->r ,mat ); op->r.vy += 4096/(64*4); gy = GetGrandHeight(op->obj.mov.vx);//現在の立ち位置の床の高さを求める if( op->obj.mov.vy < gy ) { op->dat2 += G_POINT; op->obj.mov.vy += op->dat2; } else { op->obj.mov.vy = gy; op->dat2 = 0; } SetObj( &op->obj ); } void ObjHitGrand( OTHER *op ) { static int sub_y[] = { 0,300,0,100,300 ,0,0,0,0}; int gx,gy; gy = GetGrandHeight(op->obj.mov.vx)-sub_y[op->syu];//現在の立ち位置の床の高さを求める if( op->obj.mov.vy > gy+900 ) { //壁判定 gx = GetGrandXpoz(op->obj.mov.vx); if( op->obj.mov.vx < (gx-1500) ) { //引数座標の床の中心x座標を求める op->obj.mov.vx = gx - 2050; } else if( op->obj.mov.vx > (gx+1500) ) { //引数座標の床の中心x座標を求める op->obj.mov.vx = gx + 2050; } op->dat3 /= 2; op->dat3 *= -1; } else if( op->obj.mov.vy <= gy ) {//浮いている場合 if( op->syu == 2 ) op->dat2 += G_POINT; else op->dat2 += G_POINT-2; op->obj.mov.vx += op->dat3; op->obj.mov.vy += op->dat2; op->obj.mov.vz = 0; } else { //地面に落ちた場合 if( op->dat1 == -1 ) { //通常時なら跳ね返り op->obj.mov.vy = gy; op->obj.mov.vz = 0; if( op->syu == 4 ) { op->dat2 /= 2; op->dat2 *= -1; op->dat3 /= 2; op->dat3 += op->dat3/2; op->dat5 = 0; } else if( op->syu == 2 ) { op->dat2 /= 4; op->dat2 -= op->dat2/4; op->dat2 *= -1; op->dat3 /= 2; op->dat5 = 0; } else { op->dat2 /= 4; op->dat2 *= -1; op->dat3 /= 2; op->dat5 = 0; } /* FntPrint("d2=%d\n",op->dat2); if( op->dat2 <=0 && op->dat2 > -3 ) { FntPrint("JIMENN\n"); op->dat7 = TRUE; } else op->dat7 = FALSE; */ } else { //攻撃時なら攻撃判定焼失 if( op->dat5 == 0 ) { //1バウンド目なら op->dat5 = -1; } else if( op->dat5 == -1 ) { //1バウンド目なら op->dat5 = -2; } else op->dat1 = -1; // op->obj.mov.vy = gy-1500; op->obj.mov.vy = gy; op->dat2 /= 2; op->dat2 *= -1; op->dat3 /= 2; } } //if( op->obj.mov.vy > gy ) op->obj.mov.vy = gy; } //FIreGun //dat1..フラグ -1..所有無し 0or1..所有中 2or3..攻撃中 //dat2..重力移動量 //dat3..横移動量 //dat4..残エネルギーflg( -1でこわれかけ ) //dat5..バウンドフラグ //dat7..jimenn フラグ void Other1Move(OTHER *op) { int px,py,pz,gx,gy,cnt,size,face,no,i,width; MATRIX *mat; mat = &op->obj.co.coord; //ポインタに代入 if( op->dat1 == -1 || op->dat1 >= 2) { //所有されていない場合 if( op->dat1 == -1 ) { //拾える状態なら for(no=1; no>=0; no-- ) { //拾い判定 if( man[no].hold != HOLD_NO ) continue; if( GetChk(&man[no])==TRUE ){ // if( (man[no].trg&PADRup)&&(man[no].cont & PADLdown) || // (man[no].mv[man[no].m_no].flg & MOV_GET) ) { if( (man[no].mv[man[no].m_no].flg&MOV_GUARD) ) width = 1400; else width = 700; if( BoxCollision( &op->obj.co.coord, width, &man[no].obj[ 0 ].co.workm, 1300 ) == TRUE ) { GsInitCoordinate2(&man[no].obj[8].co,&op->obj.co); op->dat1 = no; man[no].hold = HOLD_FIREGUN; man[no].hold_pt = op; #define CH_GET 6 SetNewMotion( &man[no], &fire_get[0], 1 ); man[no].st = CH_GET; op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } // } } } op->r.vx = 0; op->r.vy += 4096/(64*4); op->r.vz = 0; } else { //攻撃判定を持ているなら攻撃判定 if( op->dat1 == 2 ) no = 1; else no = 0; if( BoxCollision( &op->obj.co.coord, 900, &man[no].obj[ 0 ].co.workm, 900 ) == TRUE ) { hitdata.hit_flg = HF_MID | HF_TYUUKI ; if( op->dat4 == -1 ) hitdata.hit_flg |= HF_GBREAK;// | HF_NOTODOME; else hitdata.hit_flg |= HF_NOTODOME; hitdata.px = 30; hitdata.py = 110-op->dat2/4; hitdata.hit_cnt = 32; hitdata.grd_cnt = 20; hitdata.noukemi_cnt = 22; hitdata.dmy = -1; hitdata.damege = 24; if( op->dat3 < 0 ) face = RIGHT; else face = LEFT; if( SetOtherDmg( &man[no], &hitdata, 1, face ) != HH_MUTEKI ) { if( op->dat4 == -1 ) { PlaySE( SE_BOM ); for(i=0; i<10; i++) { px = Random( 2200,-2200 ); py = Random( 2200,-2200 ); mat->t[0] += px; mat->t[1] += py; cnt = Random( 40, 5 ); size = Random( 5000, 1500 ); SetHitMark( MK_BOMB0,mat,cnt, size );//ヒットマークのセット mat->t[0] -= px; mat->t[1] -= py; } for(i=0; i<13; i++) { mat->t[0] += Random( 700,-700 ); mat->t[2] += Random( 600,-600 ); px = Random( 200,-200 ); py = Random( 200,-200 ); cnt = Random( 25, 5 ); size = Random( 5000, 1500 ); if( px < 0 ) face = RIGHT; else face = LEFT; SetFlyObject( 2, mat, FLG_ALL, face, px, py, 0, cnt, size ); } op->flg = FALSE; } op->dat1 = -1; op->dat2 -= 200; op->dat3 /= 4; op->dat3 *= -1; } } } ObjHitGrand( op ); } else { //所有されている場合 op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } //行列のクリア(クリアしなくても正常動作する?要実験) /*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; */ *mat = GsIDMATRIX; RotMatrix( &op->r ,mat ); SetObj( &op->obj ); } //BOX //dat1..フラグ -1..所有無し 0or1..所有中 2or3..攻撃中 //dat2..重力移動量 //dat3..横移動量 //dat4..残エネルギー void Other2Move(OTHER *op) { int px,py,pz,gx,gy,face,no,width; MATRIX *mat; mat = &op->obj.co.coord; //ポインタに代入 if( op->dat1 == -1 || op->dat1 >= 2) { //所有されていない場合 if( op->dat1 == -1 ) { //拾える状態なら for(no=1; no>=0; no-- ) { //拾い判定 if( man[no].hold != HOLD_NO ) continue; if( GetChk(&man[no])==TRUE ){ // if( man[no].cont & PADLdown ) { if( (man[no].mv[man[no].m_no].flg&MOV_GUARD) ) width = 1500; else width = 900; if( BoxCollision( &op->obj.co.coord, width, &man[no].obj[ 0 ].co.workm, 1400 ) == TRUE ) { GsInitCoordinate2(&man[no].obj[8].co,&op->obj.co); op->dat1 = no; man[no].hold = HOLD_BOX; man[no].hold_pt = op; #define CH_GET 6 SetNewMotion( &man[no], &fire_get[0], 1 ); man[no].st = CH_GET; op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } // } } } op->r.vx = 0; op->r.vy += 4096/(64*4); op->r.vz = 0; } else { //攻撃判定を持ているなら攻撃判定 if( op->dat1 == 2 ) no = 1; else no = 0; if( BoxCollision( &op->obj.co.coord,800, &man[no].obj[ 0 ].co.workm, 700 ) == TRUE ) { hitdata.hit_flg = HF_MID | HF_FUKITOBI | HF_GBREAK;// | HF_NOTODOME; hitdata.px = 80; hitdata.py = 180-op->dat2/4; hitdata.hit_cnt = 32; hitdata.grd_cnt = 29; hitdata.noukemi_cnt = 38; hitdata.dmy = -1; hitdata.damege = 34; if( op->dat3 < 0 ) face = RIGHT; else face = LEFT; if( SetOtherDmg( &man[no], &hitdata, 1, face ) != HH_MUTEKI ) { op->dat1 = -1; op->dat2 -= 200; op->dat3 /= 4; op->dat3 *= -1; } } } ObjHitGrand( op ); } else { //所有されている場合 op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } //行列のクリア(クリアしなくても正常動作する?要実験) /* 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; */ *mat = GsIDMATRIX; RotMatrix( &op->r ,mat ); SetObj( &op->obj ); } //BOOM //dat1..フラグ -1..所有無し 0or1..所有中 2or3..攻撃中 //dat2..重力移動量 //dat3..横移動量 //dat4..かえりち //dat8..超業フラグ //dat9..NOHIT_cnt void Other3Move(OTHER *op) { int px,py,pz,gx,gy,face,no,width; MATRIX *mat; mat = &op->obj.co.coord; //ポインタに代入 if( op->dat8 > 0 ) { anten_flg = ANTEN_YUKA; op->dat8--; } if( op->dat1 == -1 || op->dat1 >= 2) { //所有されていない場合 if( op->dat1 == -1 ) { //拾える状態なら for(no=1; no>=0; no-- ) { //拾い判定 if( man[no].hold != HOLD_NO ) continue; if( GetChk(&man[no])==TRUE ){ // if( (man[no].trg&PADRup)&&(man[no].cont & PADLdown) || // (man[no].mv[man[no].m_no].flg & MOV_GET) ) { if( (man[no].mv[man[no].m_no].flg&MOV_GUARD) ) width = 1800; else width = 1000; if( BoxCollision( &op->obj.co.coord, width, &man[no].obj[ 0 ].co.workm, 1200 ) == TRUE ) { GsInitCoordinate2(&man[no].obj[8].co,&op->obj.co); op->dat1 = no; man[no].hold = HOLD_BOOM; man[no].hold_pt = op; #define CH_GET 6 SetNewMotion( &man[no], &fire_get[0], 1 ); man[no].st = CH_GET; op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } // } } } op->r.vx = 0; op->r.vy += 4096/(64*4); op->r.vz = 0; } else if( op->dat1 < 4 ) { //攻撃判定を持ているなら攻撃判定 if( op->dat1 == 2 ) no = 1; else no = 0; if( BoxCollision( &op->obj.co.coord, 800, &man[no].obj[ 0 ].co.workm, 700 ) == TRUE ) { hitdata.hit_flg = HF_MID | HF_UKI;// | HF_NOTODOME; hitdata.px = 80; hitdata.py = 180-op->dat2/4; hitdata.hit_cnt = 32; hitdata.grd_cnt = 20; hitdata.noukemi_cnt = 38; hitdata.dmy = -1; if( op->dat8 > 0 ) hitdata.damege = 45; else hitdata.damege = 25; if( op->dat3 < 0 ) face = RIGHT; else face = LEFT; if( SetOtherDmg( &man[no], &hitdata, 1, face ) != HH_MUTEKI ) { if( op->dat8 <= 0 ) { op->dat1 = 4+(1-no); op->dat2 += 10; op->dat3 /= 2; op->dat3 *= -1; op->dat4 = 100; } } } } if( op->dat1 != -1 && op->dat4 > 20 ) { //きゃっち if( op->dat1 == 2 || op->dat1 == 4 ) no = 0; else no = 1; if( man[no].throw_flg == THROW_NO && man[no].hold_pt == NULL && man[no].ukemi_cnt < 9999) { if( BoxCollision( &op->obj.co.coord, 1000, &man[no].obj[ 2 ].co.workm, 900 ) == TRUE ) { PlaySE( SE_GRD ); //指定番号のSEを鳴らす GsInitCoordinate2(&man[no].obj[8].co,&op->obj.co); op->dat1 = no; man[no].hold = HOLD_BOOM; man[no].hold_pt = op; #define CH_STAND 7 #define CH_JUMP 11 #define CH_JUMP2 12 if( man[no].mv[man[no].m_no].flg&MOV_JUMP ) man[no].st = CH_JUMP; else man[no].st = CH_STAND; op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } } } gy = GetGrandHeight(op->obj.mov.vx);//現在の立ち位置の床の高さを求める if( op->obj.mov.vy > gy+900 ) { //壁判定 gx = GetGrandXpoz(op->obj.mov.vx); if( op->obj.mov.vx < (gx-1500) ) { //引数座標の床の中心x座標を求める op->obj.mov.vx = gx - 2050; } else if( op->obj.mov.vx > (gx+1500) ) { //引数座標の床の中心x座標を求める op->obj.mov.vx = gx + 2050; } op->dat3 /= 2; op->dat3 *= -1; } else if( op->obj.mov.vy <= gy || op->dat8 > 0 ) {//浮いている場合 if( op->obj.mov.vy > gy ) op->obj.mov.vy = gy; if( op->dat5 == RIGHT || op->dat5 == LEFT ) { op->dat4++; op->r.vx += 3; op->r.vy = 0; op->r.vz += 200; if( op->dat1 == 2 || op->dat1 == 4 ) no = 0; else no = 1; op->dat6 = man[no].pl.vx; op->dat7 = man[no].pl.vy-100; if( (op->dat5 == LEFT && op->dat6 < op->obj.mov.vx)||( op->dat5 == RIGHT && op->dat6 > op->obj.mov.vx )) { if( op->dat4 < 35 ) op->dat2 -= 6;//op->dat4; if( op->obj.mov.vy < op->dat7 ) op->dat2 -= 2;//op->dat4 / 8; else op->dat2 -= 11;//op->dat4 / 3; if( op->obj.mov.vx < op->dat6 ) op->dat3 += 5;//(op->dat4/4); else op->dat3 -= 5;//(op->dat4/4); } } op->dat2 += G_POINT-5; op->obj.mov.vx += op->dat3; op->obj.mov.vy += op->dat2; op->obj.mov.vz = 0; } else { //地面に落ちた場合 op->dat4 = 0; op->dat5 = -1; if( op->dat1 == -1 ) { //通常時なら跳ね返り op->obj.mov.vy = gy; op->obj.mov.vz = 0; op->dat2 /= 4; op->dat2 *= -1; op->dat3 /= 2; } else { //攻撃時なら攻撃判定焼失 op->dat1 = -1; op->obj.mov.vy = gy; op->dat2 /= 2; op->dat2 *= -1; op->dat3 /= 2; } } } else { //所有されている場合 op->dat8 = 0; op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } //行列のクリア(クリアしなくても正常動作する?要実験) /*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; */ *mat = GsIDMATRIX; RotMatrix( &op->r ,mat ); SetObj( &op->obj ); } //Grenade //dat1..フラグ -1..所有無し 0or1..所有中 2or3..攻撃中 //dat2..重力移動量 //dat3..横移動量 //dat4..残COUNT( -1でこわれかけ ) //dat5..バウンドフラグ //FIreGun //dat1..フラグ -1..所有無し 0or1..所有中 2or3..攻撃中 //dat2..重力移動量 //dat3..横移動量 //dat4..残エネルギーflg( -1でこわれかけ ) //dat5..バウンドフラグ void Other4Move(OTHER *op) { int px,py,pz,gx,gy,cnt,size,face,no,i,width; MATRIX *mat; if( !(op->dat1 == 0 || op->dat1 == 1) ) mat = &op->obj.co.coord; //ポインタに代入 else mat = &op->obj.co.workm; //ポインタに代入 if( op->dat4 != 0 ) { op->dat4--; mat->t[1] -= 600; i = op->dat4 / COUNT_SPPED + 1; if( i<0) i=0; if( i>9) i=9; SetHitMark( MK_NUM,mat,i, 3896 );//ヒットマークのセット mat->t[1] += 600; if( op->dat4 == 1 ) { PlaySE( SE_BOM ); for(i=0; i<16; i++) { px = Random( 5300,-5300 ); py = Random( 5300,-5300 ); mat->t[0] += px; mat->t[1] += py; cnt = Random( 35, 5 ); size = Random( 19000, 5500 ); if( px < 0 ) face = RIGHT; else face = LEFT; SetFlyObject( 3, mat, FLG_ALL, face, 0, 0, 0, 32, size ); mat->t[0] -= px; mat->t[1] -= py; } op->flg = FALSE; } } mat = &op->obj.co.coord; //ポインタに代入 if( op->dat1 == -1 || op->dat1 >= 2) { //所有されていない場合 if( op->dat1 == -1 ) { //拾える状態なら for(no=1; no>=0; no-- ) { //拾い判定 if( man[no].hold != HOLD_NO ) continue; if( GetChk(&man[no])==TRUE ){ // if( (man[no].trg&PADRup)&&(man[no].cont & PADLdown) || // (man[no].mv[man[no].m_no].flg & MOV_GET) ) { if( (man[no].mv[man[no].m_no].flg&MOV_GUARD) ) width = 1400; else width = 900; if( BoxCollision( &op->obj.co.coord, width, &man[no].obj[ 0 ].co.workm, 1100 ) == TRUE ) { if( op->dat4 == 0 ) op->dat4 = 9*COUNT_SPPED; GsInitCoordinate2(&man[no].obj[8].co,&op->obj.co); op->dat1 = no; man[no].hold = HOLD_GRE; man[no].hold_pt = op; #define CH_GET 6 SetNewMotion( &man[no], &fire_get[0], 1 ); man[no].st = CH_GET; op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } // } } } op->r.vx = 0; op->r.vy += 4096/(64*4); op->r.vz = 0; } else { //攻撃判定を持ているなら攻撃判定 if( op->dat1 == 2 ) no = 1; else no = 0; if( BoxCollision( &op->obj.co.coord, 900, &man[no].obj[ 0 ].co.workm, 1000 ) == TRUE ) { hitdata.hit_flg = HF_MID | HF_TYUUKI ; if( op->dat4 == -1 ) hitdata.hit_flg |= HF_GBREAK;// | HF_NOTODOME; else hitdata.hit_flg |= HF_NOTODOME; hitdata.px = 30; hitdata.py = 110-op->dat2/4; hitdata.hit_cnt = 32; hitdata.grd_cnt = 20; hitdata.noukemi_cnt = 22; hitdata.dmy = -1; hitdata.damege = 26; if( op->dat3 < 0 ) face = RIGHT; else face = LEFT; if( SetOtherDmg( &man[no], &hitdata, 1, face ) != HH_MUTEKI ) { if( op->dat4 < 2*COUNT_SPPED ) op->dat4 = 2; op->dat1 = -1; op->dat2 -= 200; op->dat3 /= 4; op->dat3 *= -1; } } } ObjHitGrand( op ); } else { //所有されている場合 op->r.vx = 0; op->r.vy = -1024; op->r.vz = 1024; op->obj.mov.vx = -50; op->obj.mov.vy = 350; op->obj.mov.vz = 200; } //行列のクリア(クリアしなくても正常動作する?要実験) *mat = GsIDMATRIX; RotMatrix( &op->r ,mat ); SetObj( &op->obj ); } void PutOther() { int i,j; int cx; for( i=0; i