/********************************* GM35 格闘ゲームメインプログラム 制作開始:97/10/2 *********************************/ #include //プレステライブラリのヘッダ #include "pad.h" //パッド入力関連のdefine定義ヘッダ #include "adr.h" //データアドレスヘッダ #include "gamemain.h" //define定義ヘッダ #include "txdat.h" //txdat定義ヘッダ //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // グローバル変数  // ※注 リファレンスマニュアルに記載されているページ数を(p10)などと記述 // 構造体はすべてlibps.hで宣言されている //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //−−−−−−システム系グローバル変数−−−−−−−−−− GsOT Wot[2],*WotPt; //ダブルバッファ分のオーダリングテーブルヘッダ2個(p14)とそれへのポインタ GsOT_TAG zsorttable[2][1< 255) x-=256; return( (long)sint[x] ); } long COS(int x) { while( x < 0) x+=256; while( x > 255) x-=256; return( (long)cost[x] ); } int ATAN(long dx,long dy) { if(dx == 0) { if(dy > 0) return(64); else { if(dy == 0) return(0); return(192); } } if(dy == 0) { if(dx > 0) return(0); else return(128); } if( abs(dx) == abs(dy) ) { if( dx < 0 ) { if( dy < 0 ) return (160); else return (96); } else { if( dy < 0 ) return (224); else return (32); } } if( dy > 0 ) { if( dx > 0 ) { if(abs(dx) > abs(dy)) { //1 return( atan_tbl[ abs(dy)*256 / abs(dx) ] ); } else { //2 return( 64 - atan_tbl[ abs(dx)*256 / abs(dy) ] ); } } else { if(abs(dx) > abs(dy)) { //4 return( 128-atan_tbl[ abs(dy)*256 / abs(dx) ] ); } else { //3 return( 64 + atan_tbl[ abs(dx)*256 / abs(dy) ] ); } } } else { if( dx > 0 ) { if(abs(dx) > abs(dy)) { //8 return( 256-atan_tbl[ abs(dy)*256 / abs(dx) ] ); } else { //7 return( 192 + atan_tbl[ abs(dx)*256 / abs(dy) ] ); } } else { if(abs(dx) > abs(dy)) { //5 return( 128+atan_tbl[ abs(dy)*256 / abs(dx) ] ); } else { //6 return( 192 - atan_tbl[ abs(dx)*256 / abs(dy) ] ); } } } } // コントローラ状態の読み込み void PadRead() { man[0].cont = ~(*(bb0+3) | *(bb0+2) << 8 | *(bb1+3) << 16 | *(bb1+2) << 24); man[0].b_trg = man[0].cont ^ man[0].b_cont; man[0].trg = man[0].cont & man[0].b_trg; man[0].b_cont = man[0].cont; man[1].cont = ~(*(bb1+3) | *(bb1+2) << 8 | *(bb0+3) << 16 | *(bb0+2) << 24); man[1].b_trg = man[1].cont ^ man[1].b_cont; man[1].trg = man[1].cont & man[1].b_trg; man[1].b_cont = man[1].cont; } // テクスチャー読み込み u_short load_texture(u_long *addr,GsIMAGE *tim) { RECT rect1; /* TIMデータの情報を得る */ GsGetTimInfo(addr+1, tim); /* ファイルヘッダを飛ばして渡す */ /* ピクセルデータをVRAMへ送る */ rect1.x = tim->px; rect1.y = tim->py; rect1.w = tim->pw; rect1.h = tim->ph; LoadImage(&rect1,tim->pixel); DrawSync(0); /* CLUTがある場合はVRAMへ送る */ if((tim->pmode>>3)&0x01) { rect1.x = tim->cx; rect1.y = tim->cy; rect1.w = tim->cw; rect1.h = tim->ch; LoadImage(&rect1,tim->clut); DrawSync(0); } return( GetTPage(tim->pmode, 0, tim->px, tim->py) ); } //デフォルトのサウンドをロードする int NYReadDefaultVAB(int vabid) { int i, ret; int cnt; u_char status; u_long *vh, *vb; CdlFILE cdlvb, cdlvh; for(i=0 ; i<10 ; ++i){ if(CdSearchFile(&cdlvh, VH_NAME) != 0) break; } vh = (u_long*)malloc(cdlvh.size); if(!vh) return -1; for(i=0 ; i<10 ; ++i){ if(CdSearchFile(&cdlvb, VB_NAME) != 0) break; } vb = (u_long*)malloc(cdlvb.size); // vb = 0x80090000; if(!vb) return -1; for(i=0 ; i<10 ; ++i){ CdReadFile(VH_NAME, vh, 0); while((cnt = CdReadSync(1, 0)) > 0) VSync(0); if(cnt == 0) break; } printf("vh Done\n"); for(i=0 ; i<10 ; ++i){ CdReadFile(VB_NAME, vb, 0); while((cnt = CdReadSync(1, 0)) > 0) VSync(0); if(cnt == 0) break; } printf("vb Done\n"); ret = SsVabTransfer((u_char *)vh, (u_char *)vb, vabid, 1); // free(vb); return ret; return 0; } int NYReadVAB(int vabid, u_long *vh, u_long *vb) { return SsVabTransfer((u_char *)vh, (u_char *)vb, vabid, 1); } // SOUND SET void InitBGM() { int i; seq[0] = SsSeqOpen( (u_long *)SEQ0_ADDR, vab0 ); seq[1] = SsSeqOpen( (u_long *)SEQ1_ADDR, vab0 ); seq[2] = SsSeqOpen( (u_long *)SEQ2_ADDR, vab0 ); /* seq[3] = SsSeqOpen( (u_long *)SEQ3_ADDR, vab0 ); seq[4] = SsSeqOpen( (u_long *)SEQ4_ADDR, vab0 ); seq[5] = SsSeqOpen( (u_long *)SEQ5_ADDR, vab0 ); seq[6] = SsSeqOpen( (u_long *)SEQ6_ADDR, vab0 ); seq[7] = SsSeqOpen( (u_long *)SEQ7_ADDR, vab0 ); seq[8] = SsSeqOpen( (u_long *)SEQ8_ADDR, vab0 ); */ SsSeqSetVol( seq[0],90,90); SsSeqSetVol( seq[1],60,60); SsSeqSetVol( seq[2],60,60); /* SsSeqSetVol( seq[3],60,60); SsSeqSetVol( seq[4],60,60); SsSeqSetVol( seq[5],60,60); SsSeqSetVol( seq[6],60,60); SsSeqSetVol( seq[7],60,60); SsSeqSetVol( seq[8],60,60); */ printf("seq ok.\n",seq); SsSetMVol (127, 127); //SsSetMVol (97, 97); } void StartBGM(int no) { bgm_no = no; SsSeqPlay( seq[bgm_no],SSPLAY_PLAY,SSPLAY_INFINITY ); } void StopBGM() { SsSeqStop( seq[bgm_no]); } void InitSE() { int i; if( (vab0 = NYReadDefaultVAB(-1) ) == -1) printf("vab0 mem error.\n"); vab1 = NYReadVAB(-1, (u_long *)VH_ADDR, (u_long *)VB_ADDR ); } void PlaySE( int n ) { switch( n ) { case SE_GRD: SsUtKeyOn( vab1, 0, GR_TONE, GR_NOTE, 0, GR_VOL, GR_VOL ); break; case SE_JYA: SsUtKeyOn( vab1, 0, L_TONE, L_NOTE, 0, L_VOL, L_VOL ); break; case SE_TYU: SsUtKeyOn( vab1, 0, L_TONE, L_NOTE, 0, L_VOL, L_VOL ); break; case SE_KYO: SsUtKeyOn( vab1, 0, H_TONE, H_NOTE, 0, H_VOL, H_VOL ); break; case SE_UKI: SsUtKeyOn( vab1, 0, U_TONE, U_NOTE, 0, U_VOL, U_VOL ); break; case SE_BOM: SsUtKeyOn( vab1, 0, BOM_TONE, BOM_NOTE, 0, BOM_VOL, BOM_VOL ); break; } } //オブジェクトを表示可能状態に設定する void SetObj(OBJ *op) { //これ以上オブジェクトが表示できないときにはリターン if( Objnum == OBJ_MAX ) return; //Set translation : 平行移動をクリアする(もしかして不要?) op->co.coord.t[0] = 0; op->co.coord.t[1] = 0; op->co.coord.t[2] = 0; //平行移動のセット TransMatrix(&op->co.coord,&op->mov); op->obj.coord2 = &op->co; //??????? //op->obj.attribute = 0x000000ff; op->obj.attribute = 0x00000000; //変更フラグをクリア(これをやらないとGsGetLw()、GsGetLs()で誤動作が起こる) op->obj.coord2->flg = 0; //あいている番号のオブジェクトに割付 object[Objnum] = &op->obj; //使用オブジェクト番号のインクリメント Objnum++; } //オブジェクトを表示可能状態に設定する void SetManObj(OBJ *op,int num) { //これ以上オブジェクトが表示できないときにはリターン if( ManObjnum[num] == MANOBJ_MAX ) return; //Set translation : 平行移動をクリアする(もしかして不要?) op->co.coord.t[0] = 0; op->co.coord.t[1] = 0; op->co.coord.t[2] = 0; //平行移動のセット TransMatrix(&op->co.coord,&op->mov); op->obj.coord2 = &op->co; //??????? op->obj.attribute = 0; //変更フラグをクリア(これをやらないとGsGetLw()、GsGetLs()で誤動作が起こる) op->obj.coord2->flg = 0; //あいている番号のオブジェクトに割付 manobj[num][ManObjnum[num]] = &op->obj; //使用オブジェクト番号のインクリメント ManObjnum[num]++; } //視点設定関数 void SetView(int vmode) { int lx,ly,lg; // view.vrx = (man[0].pl.vx+man[1].pl.vx) / 2; // view.vry = (man[0].pl.vy+man[1].pl.vy) / 2; // view.vrz = (man[0].pl.vz+man[1].pl.vz) / 2; if( man[0].throw_flg != THROW_NO || man[1].throw_flg != THROW_NO ) { view.vrx = (man[0].co.workm.t[0]+man[1].co.workm.t[0]) / 2; view.vry = (man[0].co.workm.t[1]+man[1].co.workm.t[1]) / 2; view.vrz = (man[0].co.workm.t[2]+man[1].co.workm.t[2]) / 2; lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy); if( man[0].throw_flg == THROW_ON ) view.vpx = view.vrx-10000; else view.vpx = view.vrx+10000; view.vpy = view.vry-3600; view.vpz = 4000; view.rz = 0; /* view.vrx = (man[0].co.workm.t[0]+man[1].co.workm.t[0]) / 2; view.vry = (man[0].co.workm.t[1]+man[1].co.workm.t[1]) / 2; view.vrz = (man[0].co.workm.t[2]+man[1].co.workm.t[2]) / 2; lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy)+4000; lg = man[0].pl.vy+2000; if( lg > man[1].pl.vy+2000 ) lg = man[1].pl.vy+2000; view.vpx = view.vrx/2; view.vpy = view.vry-1600; view.vpz = +1500+lx+lx/2-lg/2+ly/2; if( view.vpz < 10000 ) view.vpz = 10000; view.rz = 0; */ put_view.vrx = view.vrx; put_view.vry = view.vry; put_view.vrz = view.vrz; put_view.vpx += (view.vpx-put_view.vpx)/16; put_view.vpy += (view.vpy-put_view.vpy)/32; put_view.vpz += (view.vpz-put_view.vpz)/32; GsSetRefView2(&put_view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) return; } view.vrx = (man[0].pl.vx+man[1].pl.vx) / 2; view.vry = (man[0].pl.vy+man[1].pl.vy) / 2; view.vrz = (man[0].pl.vz+man[1].pl.vz) / 2; if( ringout_flg != 0 ) { if( view.vry > -2000 ) view.vry = -2000; } if( vmode == VIEW_NOMAL ) { //view.vry = -1600+(man[0].pl.vy+man[1].pl.vy) / 8; lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy)+4000; lg = man[0].pl.vy+2000; if( lg > man[1].pl.vy+2000 ) lg = man[1].pl.vy+2000; view.vpx = view.vrx/2+view.vrx/4; view.vpy = view.vry-1600; view.vpz = +2000+lx+lx/2-lg/2+ly/2; if( view.vpz < 10000 ) view.vpz = 10000; view.rz = 0; if( ringout_flg != 0 ) { put_view.vrx += (view.vrx-put_view.vrx)/8; put_view.vry += (view.vry-put_view.vry)/8; put_view.vrz += (view.vrz-put_view.vrz)/8; put_view.vpx += (view.vpx-put_view.vpx)/16; put_view.vpy += (view.vpy-put_view.vpy)/16; put_view.vpz += (view.vpz-put_view.vpz)/16; } else { put_view.vrx = view.vrx; put_view.vry = view.vry; put_view.vrz = view.vrz; put_view.vpx += (view.vpx-put_view.vpx)/8; put_view.vpy += (view.vpy-put_view.vpy)/8; put_view.vpz += (view.vpz-put_view.vpz)/8; } GsSetRefView2(&put_view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) } else if( vmode == VIEW_NOMAL2 ) { lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy)+4000; lg = man[0].pl.vy+2000; if( lg > man[1].pl.vy+2000 ) lg = man[1].pl.vy+2000; //FntPrint("lg=%d",lg); view.vpx = view.vrx; view.vpy = view.vry-600; view.vpz = 500+lx+lx/2-lg/2+ly/2; view.rz = 0; put_view.vrx = view.vrx; put_view.vry = view.vry; put_view.vrz = view.vrz; put_view.vpx += (view.vpx-put_view.vpx)/8; put_view.vpy += (view.vpy-put_view.vpy)/8; put_view.vpz += (view.vpz-put_view.vpz)/8; GsSetRefView2(&put_view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) /* lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy)-4000; lg = man[0].pl.vy-man[1].pl.vy; if( lg < 0 ) lg *= -1; view.vpx = view.vrx; view.vpy = view.vry-1900; view.vpz = 8000+lx+lx/2-ly/2+lg/2; if( view.vpz < 12000 ) view.vpz = 12000; view.rz = 0; GsSetRefView2(&view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) */ } else if( vmode == VIEW_SIDE ) { view.vry = (man[0].pl.vy + man[1].pl.vy)/2+1500; lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy)+4000; lg = man[0].pl.vy+2000; if( lg > man[1].pl.vy+2000 ) lg = man[1].pl.vy+2000; view.vpx = view.vrx; view.vpy = view.vry; view.vpz = 8000+lx+lx/4-ly/2-lg; if( view.vpz < 12000 ) view.vpz = 12000; view.rz = 0; GsSetRefView2(&view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) } else if( vmode == VIEW_UP ) { lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy); view.vpx = view.vrx; view.vpy = view.vry/4-lx-ly/2-5000-1900; view.vpz = 0; view.rz = 180*4096; GsSetRefView2(&view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) } else if( vmode == VIEW_FRONT ) { lx = abs(man[0].pl.vx - man[1].pl.vx); ly = abs(man[0].pl.vy + man[1].pl.vy); view.vpx = view.vrx-10000; view.vpy = view.vry-1600; view.vpz = 0; view.rz = 0; GsSetRefView2(&view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) } else if( vmode == VIEW_SELECT ) { view.vrx = 0; view.vry = -1900; view.vrz = 0; view.vpx = -13000; view.vpy = -2800; view.vpz = 0; view.rz = 0; GsSetRefView2(&view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) } } void Put3DSPRITE( SPRITE3D *s3 ) { int z; GsGetLs(&s3->co,tmpls); //ローカル->スクリーンへの座標変換(p137) z = tmpls->t[2]; if( z < 0 ) return; if( z == 0 ) z++; s3->sp.x = tmpls->t[0] * PROJECTION / z; s3->sp.y = tmpls->t[1] * PROJECTION / z; s3->sp.scalex = s3->sp.scaley = s3->size * 25000 / z; GsSortSprite(&s3->sp, WotPt, 0); s3->co.flg = 0; } void PutSPRITE( GsSPRITE *sp ) { GsSortSprite(sp, WotPt, 0); } //3Dおぶじぇくとのあたり判定 //3Dおぶじぇくとのあたり判定(z判定ない) BOOL BoxCollision( MATRIX *mat1,int size1,MATRIX *mat2,int size2 ) { int i; u_long size = size1+size2; i = mat1->t[0] - mat2->t[0]; i += size; if( (u_long)i < 2*size ) { i = mat1->t[1] - mat2->t[1]; i += size; if( (u_long)i < 2*size ) { i = mat1->t[2] - mat2->t[2]; i += i/8; size -= 100; i += size; if( (u_long)i < 2*size ) { return( TRUE ); } } } return(FALSE); } //3Dおぶじぇくとのあたり判定(z判定ない) BOOL BoxCollisionNoZ( MATRIX *mat1,int size1,MATRIX *mat2,int size2 ) { int i; u_long size = size1+size2; i = mat1->t[0] - mat2->t[0]; i += size; if( (u_long)i < 2*size ) { i = mat1->t[1] - mat2->t[1]; i += size; if( (u_long)i < 2*size ) { i = mat1->t[2] - mat2->t[2]; size += 200; i += size; if( (u_long)i < 2*size ) { return( TRUE ); } } } return(FALSE); } //引数座標の床の高さを求める int GetGrandHeight(int x) { int num,gx,gy; num = bg.width-(2000+2000*bg.width-x)/4000; if( num < 0 || num >= bg.width ) return YUKA_NO; if( bg.pt[num].syu == 0 || bg.pt[num].syu >= 5 ) return bg.pt[num].op.mov.vy; else if( bg.pt[num].syu == 1 ) { gx = GetGrandXpoz(x) - 2000; return bg.pt[num].op.mov.vy -800 - ((gx-x)*800)/4000; } else if( bg.pt[num].syu == 2 ) { gx = GetGrandXpoz(x) - 2000; return bg.pt[num].op.mov.vy + ((gx-x)*800)/4000; } else if( bg.pt[num].syu == 3 ) { gx = GetGrandXpoz(x) - 2000; return bg.pt[num].op.mov.vy -1600 - ((gx-x)*1600)/4000; } else if( bg.pt[num].syu == 4 ) { gx = GetGrandXpoz(x) - 2000; return bg.pt[num].op.mov.vy + ((gx-x)*1600)/4000; } return bg.pt[num].op.mov.vy; } //引数座標の床の中心x座標を求める int GetGrandXpoz(int x) { int i; i = bg.width-(2000+2000*bg.width-x)/4000; return 4000*i-2000*bg.width; } //引数座標の床のSYUを求める int GetGrandSyu(int x) { int i; i = bg.width-(2000+2000*bg.width-x)/4000; return bg.pt[i].syu; } //壁判定(壁の中ならTRUEを返す) BOOL ChkWallIn(int px,int py) { int gy = GetGrandHeight(px); //現在の立ち位置の床の高さを求める if( py >= gy ) { //壁に当たっていたら return TRUE; } return FALSE; } //壁判定(壁の中ならTRUEを返す) BOOL ChkWallRefrect(int px,int py) { int num; int gy; num = bg.width-(2000+2000*bg.width-px)/4000; if( num < 0 || num >= bg.width ) return FALSE; gy = GetGrandHeight(px); //現在の立ち位置の床の高さを求める if( py >= gy ) { //壁に当たっていたら if( py >= (gy+1000) ) { //壁に当たっていたら return CHK_WALL; } switch( bg.pt[num].syu ){ case 0: return CHK_GR0; case 1: return CHK_GR1; case 2: return CHK_GR2; case 3: return CHK_GR3; case 4: return CHK_GR4; } } return CHK_NO; } //hp表示 void PutHp() { int i,r,b; for(i=0; i GAGE_MAX ) man[0].gage2 = GAGE_MAX; if( man[0].gage2 >= 0 ) { box[0].x = -6-140; box[0].y = -100+12; box[0].w = man[0].gage2*(MAX_HP-2)/GAGE_MAX; box[0].h = 3; if( man[0].gage2 >= GAGE_MAX ) { box[0].r = 160; box[0].g = 255; box[0].b = 0; } else { box[0].r = 0; box[0].g = 125; box[0].b = 0; } GsSortBoxFill( &box[0], &Wot[outbuf_idx], 0 ); } if( man[1].gage2 > GAGE_MAX ) man[1].gage2 = GAGE_MAX; if( man[1].gage2 >= 0 ) { box[1].x = 10; box[1].y = -100+12; box[1].w = man[1].gage2*(MAX_HP-2)/GAGE_MAX; box[1].h = 3; if( man[1].gage2 >= GAGE_MAX ) { box[1].r = 160; box[1].g = 255; box[1].b = 0; } else { box[1].r = 0; box[1].g = 125; box[1].b = 0; } GsSortBoxFill( &box[1], &Wot[outbuf_idx], 0 ); } if( man[0].gage > GAGE_MAX ) man[0].gage = GAGE_MAX; if( man[0].gage >= 0 ) { box[0].x = -10-140; box[0].y = 103; box[0].w = man[0].gage/100; box[0].h = 4; box[0].r = 200; box[0].g = 255; box[0].b = 0; GsSortBoxFill( &box[0], &Wot[outbuf_idx], 0 ); } if( man[1].gage > GAGE_MAX ) man[1].gage = GAGE_MAX; if( man[1].gage >= 0 ) { box[1].x = 10+45; box[1].y = 103; box[1].w = man[1].gage/100+1; box[1].h = 4; box[1].r = 200; box[1].g = 255; box[1].b = 0; GsSortBoxFill( &box[1], &Wot[outbuf_idx], 0 ); } box[0].x = -10-140; box[0].y = 103; box[0].w = GAGE_MAX/100; box[0].h = 4; if( man[0].gage < -100 ) { r = 160+man[0].gage/20; b = -man[0].gage/2+30; if( b > 255 ) b=255; } else { r = 160; b = 0; } box[0].r = r; box[0].g = 0; box[0].b = b; box[1].x = 10+45; box[1].y = 103; box[1].w = GAGE_MAX/100; box[1].h = 4; if( man[1].gage < -100 ) { r = 160+man[1].gage/20; b = -man[1].gage/2+30; if( b > 255 ) b=255; } else { r = 160; b = 0; } box[1].r = r; box[1].g = 0; box[1].b = b; GsSortBoxFill( &box[0], &Wot[outbuf_idx], 0 ); GsSortBoxFill( &box[1], &Wot[outbuf_idx], 0 ); GsSortSprite(&gage1p, WotPt, 0); GsSortSprite(&gage2p, WotPt, 0); } void SetTxDat( GsSPRITE *sp, TXDAT *tp ) { sp->attribute = tp->attribute; sp->w = tp->w; sp->h = tp->h; sp->tpage = tp->tpage; sp->u = tp->u; sp->v = tp->v; sp->cx = tp->cx; sp->cy = tp->cy; sp->mx = tp->mx; sp->my = tp->my; } void AntenCopy() { GsSPRITE *sp; int i,j,anten_num1,anten_num2; if( anten_flg != ANTEN_NO ) { if( anten_flg == ANTEN_KAGAMI ) { anten_num1 = 0x60; anten_num2 = 0x60; j = Random(2,-2); for(i=0; i<3; i++) { sp = &vram_bg[i]; //sp->attribute = 0x0b000000; sp->x = -160+i*128+j;//96+40; sp->y = -120-8;//+30; // sp->scalex = 3072; // sp->scaley = 3072; } } else { anten_num1 = 0x7f; anten_num2 = 0x80; if( anten_bak == ANTEN_KAGAMI ) { for(i=0; i<3; i++) { sp = &vram_bg[i]; //sp->attribute = 0x0b000000; sp->x = -160+i*128;//96+40; sp->y = -120;//+30; // sp->scalex = 3072; // sp->scaley = 3072; } } } for(i=0;i<3;i++) { if( outbuf_idx == 0 ) vram_bg[i].r = vram_bg[i].g = vram_bg[i].b = anten_num1; else vram_bg[i].r = vram_bg[i].g = vram_bg[i].b = anten_num2; GsSortSprite(&vram_bg[i], WotPt, 8192*2-1); } } else { GsSortSprite(&game_bg0, WotPt, 8192*2-1); GsSortSprite(&game_bg1, WotPt, 8192*2-1); } } void PalleteAnime() { static short bom_pal; static int bompal_cnt=0,bompal_flg=FALSE; static RECT rec = { 15,483,1,1 }; if( bompal_flg == TRUE ) { bompal_cnt++; if( bompal_cnt > 63) { bompal_cnt = 63; bompal_flg = FALSE; } } else { bompal_cnt--; if( bompal_cnt < 10) { bompal_cnt = 10; bompal_flg = TRUE; } } bom_pal = bompal_cnt/2; LoadImage(&rec,(u_long*)&bom_pal); } //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− // メインプログラム //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− //メイン関数 main() { int i,j; //汎用 int vc1,vc2,vc3,vc4,v_count=0; //vsync count GsDOBJ2 *op; //ループ時にポインタとして使用 short light_r1=0x0d,light_g1=0x0d,light_b1=0x0d; short light_ar1=512,light_ag1=512,light_ab1=512; short light_r2=0x0d,light_g2=0x0d,light_b2=0x0d,light_cnt1=0,light_cnt2 = 0; short light_ar2=512,light_ag2=512,light_ab2=512; BOOL light_flg = FALSE; RECT rec,vram; rec.x=640; rec.y=0; rec.w=320; rec.h=240; vram.x = 0; vram.y = 0; vram.w = 320; vram.h = 240; //テンポラリをスクラッチパッドに確保 tmpls = (MATRIX *)0x1f800000; tmplw = (MATRIX *)(0x1f800000+sizeof(MATRIX)); vc1=0;vc2=0;vc3=0;vc4=0; Objnum = 0; //Objnum初期設定(Init_all()関数で行うべきか?) LoopCnt=0; printf("go.\n"); /* フォントの設定 */ FntLoad(960, 256); /* 基本フォントパターンをフレームバッファにロード */ //FntLoad(0, 0); /* 基本フォントパターンをフレームバッファにロード */ FntOpen(16-160, 32-120-8, 256, 200, 0, 512); /* フォントの表示位置の設定 */ //FntLoad( 960, 256); //FntOpen( 64, 32, 256, 200, 0, 512); //初期化処理 InitGame(); printf("init ok.\n"); while(1) { if( v_count > 1000 ) v_count = 0; if( vc1 > 1000 ) vc1 = 0; if( vc2 > 1000 ) vc2 = 0; if( vc3 > 1000 ) vc3 = 0; if( vc4 > 1000 ) vc4 = 0; vc4 = vc4-vc3; vc3 = vc3-vc2; vc2 = vc2-vc1; //FntPrint("Vcnt=%4d %4d %4d %4d %4d\n",v_count,vc1,vc2,vc3,vc4); PadRead(); if(MainLoop()==0) { //オブジェクトの移動(メインルーチンへ) StopBGM(); DrawSync(0); // 描画の終了待ち VSync(0); DrawSync(0); // 描画の終了待ち VSync(0);return(0); //終了コード(0)がリターンされると終了処理 } vc1 = VSync(1); //VSync待ち(p59) SetView(vmode); //視点移動関数 outbuf_idx=GsGetActiveBuff(); //現在表示中のバッファを取得 GsSetWorkBase((PACKET *)(PacketArea[outbuf_idx])); //描画命令の格納アドレスを指定(p151) //少しでも高速化するためにポインタに代入 WotPt = &Wot[outbuf_idx]; GsClearOt(0,0,WotPt); //オーダリングテーブルの初期化 vc2 = VSync(1); //VSync待ち(p59) //if( man[0].cont & PADR1 ) man[0].light_flg |= LIGHT_B; //if( man[0].cont & PADL1 ) man[0].light_flg |= LIGHT_R; //if( man[1].cont & PADR1 ) man[1].light_flg |= LIGHT_B; //if( man[1].cont & PADL1 ) man[1].light_flg |= LIGHT_R; if( light_flg == TRUE ) { light_flg = FALSE; } SetLight( bg_no ) ; //op=object[0]; //GsGetLws(op->coord2,tmplw, tmpls); // ライトマトリックスをGTEにセットする //GsGetLs(op->coord2,&tmpls); //ローカル->スクリーンへの座標変換(p137) //GsSetLightMatrix(tmplw); //光源計算用の行列をGTEに登録(p144) for(i=0;icoord2,tmplw, tmpls); // ライトマトリックスをGTEにセットする //GsGetLs(op->coord2,tmpls); //ローカル->スクリーンへの座標変換(p137) GsSetLightMatrix(tmplw); //光源計算用の行列をGTEに登録(p144) GsSetLsMatrix(tmpls); //ローカルスクリーンマトリックスを設定(p143) //オブジェクトをOTに登録 GsSortObject4(op,WotPt,14-OT_LENGTH,getScratchAddr(0)); op++; } Objnum=0; if( man[0].light_flg == LIGHT_OFF ) { if( light_cnt1 > 0 ) { light_flg= TRUE; light_cnt1--; man[0].light_flg = LIGHT_FADE; light_r1 += (0x0d-light_r1)/8; light_ar1 += (AMBIENT-light_ar1)/8; light_g1 += (0x0d-light_g1)/8; light_ag1 += (AMBIENT-light_ag1)/8; light_b1 += (0x0d-light_b1)/8; light_ab1 += (AMBIENT-light_ab1)/8; } else SetLight( bg_no ) ; } if( man[0].light_flg != LIGHT_OFF ) { if( man[0].light_flg != LIGHT_FADE ) light_cnt1 = 10; light_flg = TRUE; if( man[0].light_flg & LIGHT_R ) { light_r1 += (0xff-light_r1)/4; light_ar1 += (4096-light_ar1)/4; } if( man[0].light_flg & LIGHT_G ) { light_g1 += (0xff-light_g1)/4; light_ag1 += (4096-light_ag1)/4; } if( man[0].light_flg & LIGHT_B ) { light_b1 += (0xff-light_b1)/4; light_ab1 += (4096-light_ab1)/4; } pslt[0].r=light_r1; pslt[0].g=light_g1; pslt[0].b=light_b1; //光源色設定 GsSetFlatLight(0,&pslt[0]); //平行光源の設定(p129) GsSetAmbient(light_ar1,light_ag1,light_ab1); //アンビエントの設定 man[0].light_flg = LIGHT_OFF; } //1p表示 for(i=0;icoord2,tmplw, tmpls); // ライトマトリックスをGTEにセットする //GsGetLs(op->coord2,&tmpls); //ローカル->スクリーンへの座標変換(p137) GsSetLightMatrix(tmplw); //光源計算用の行列をGTEに登録(p144) GsSetLsMatrix(tmpls); //ローカルスクリーンマトリックスを設定(p143) //オブジェクトをOTに登録 GsSortObject4(op,WotPt,14-OT_LENGTH,getScratchAddr(0)); op++; } ManObjnum[0]=0; if( man[1].light_flg == LIGHT_OFF ) { if( light_cnt2 > 0 ) { light_flg = TRUE; light_cnt2--; man[1].light_flg = LIGHT_FADE; light_r2 += (0x0d-light_r2)/8; light_ar2 += (AMBIENT-light_ar2)/8; light_g2 += (0x0d-light_g2)/8; light_ag2 += (AMBIENT-light_ag2)/8; light_b2 += (0x0d-light_b2)/8; light_ab2 += (AMBIENT-light_ab2)/8; } else SetLight( bg_no ) ; } if( man[1].light_flg != LIGHT_OFF ) { light_flg = TRUE; if( man[1].light_flg != LIGHT_FADE ) light_cnt2 = 10; if( man[1].light_flg & LIGHT_R ) { light_r2 += (0xff-light_r2)/4; light_ar2 += (4096-light_ar2)/4; } if( man[1].light_flg & LIGHT_G ) { light_g2 += (0xff-light_g2)/4; light_ag2 += (4096-light_ag2)/4; } if( man[1].light_flg & LIGHT_B ) { light_b2 += (0xff-light_b2)/4; light_ab2 += (4096-light_ab2)/4; } pslt[0].r=light_r2; pslt[0].g=light_g2; pslt[0].b=light_b2; //光源色設定 GsSetFlatLight(0,&pslt[0]); //平行光源の設定(p129) GsSetAmbient(light_ar2,light_ag2,light_ab2); //アンビエントの設定 man[1].light_flg = LIGHT_OFF; } else { if( light_flg == TRUE ) { SetLight( bg_no ) ; } } //2p表示 for(i=0;icoord2,tmplw, tmpls); // ライトマトリックスをGTEにセットする //GsGetLs(op->coord2,&tmpls); //ローカル->スクリーンへの座標変換(p137) GsSetLightMatrix(tmplw); //光源計算用の行列をGTEに登録(p144) GsSetLsMatrix(tmpls); //ローカルスクリーンマトリックスを設定(p143) //オブジェクトをOTに登録 GsSortObject4(op,WotPt,14-OT_LENGTH,getScratchAddr(0)); op++; } ManObjnum[1]=0; PalleteAnime(); if( mode_no == 2 ) { if( win_num > 9 ) GsSortSprite(&sp_num10, WotPt, 0); GsSortSprite(&sp_num1, WotPt, 0); GsSortSprite(&sp_win, WotPt, 0); } if( stage_no == STAGE_TITLE ) { GsIMAGE tim; load_texture( (u_long *)BG4_ADDR, &tim); box[0].x = -160; box[0].y = -120; box[0].w = 320; box[0].h = 240; box[0].r = 0; box[0].g = 0; box[0].b = 0; GsSortBoxFill( &box[0], &Wot[outbuf_idx], 1<r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; } /* スプライトの初期化 */ for (i = 0; i < YUKI_MAX; i++, sp++) { yuki[i].flg = FALSE; sp = &yuki[i].s3.sp; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; } /* スプライトの初期化 */ for (i = 0; i < FLY_MAX; i++, sp++) { fly[i].flg = FALSE; sp = &fly[i].s3.sp; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; } //printf("SP init_start\n"); sp = &game_bg0; //sp->attribute = 0x0000_0000 71000000; sp->attribute = 0x70000000; sp->x = -160; sp->y = -120; sp->w = 256; sp->h = 240; sp->tpage = bg_tpage; sp->u = 0; sp->v = 0; sp->cx = 0; sp->cy = 485;//+(i%32); sp->r = sp->g = sp->b = 0x40; sp->mx = 0; sp->my = 0; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; sp = &game_bg1; //sp->attribute = 0x71000000; sp->attribute = 0x70000000; sp->x = -160+256; sp->y = -120; sp->w = 320-256; sp->h = 240; sp->tpage = bg_tpage+1; sp->u = 0; sp->v = 0; sp->cx = 0; sp->cy = 485;//+(i%32); sp->r = sp->g = sp->b = 0x40; sp->mx = 0; sp->my = 0; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; //printf("SP init_ok\n"); for(i=0; i<3; i++) { sp = &vram_bg[i]; //sp->attribute = 0x0000_0011_0000_0000_ sp->attribute = 0x0b000000; sp->x = -160+i*128; sp->y = -120; sp->w = 128; sp->h = 240; sp->tpage = 10+i*2; sp->u = 0; sp->v = 0; sp->cx = 0; sp->cy = 0; sp->r = sp->g = sp->b = 0x7e; sp->mx = 0; sp->my = 0; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; } sp->w = 64; sp = &sp_select; SetTxDat( sp, &tx_select[0] ); sp->x = 0; sp->y = -80; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE*2; sp->scaley = ONE*2; sp->rotate = 0; sp = &gage1p; SetTxDat( sp, &tx_gage[0] ); sp->x = -160+10; sp->y = -104; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; sp = &gage2p; SetTxDat( sp, &tx_gage[0] ); sp->x = 160-144-10; sp->y = -104; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; sp = &sp_win; SetTxDat( sp, &tx_win[0] ); sp->x = 32; sp->y = 105; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; sp = &sp_num10; sp->x = -8; sp->y = 100; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; sp = &sp_num1; sp->x = 8; sp->y = 100; sp->r = sp->g = sp->b = 0x80; sp->scalex = ONE; sp->scaley = ONE; sp->rotate = 0; } //視点初期化関数 void InitView() { GsSetProjection(PROJECTION); //(p127) view.vpx = 0; view.vpy = 0; view.vpz = 8000; /* 視点 */ view.vrx = 0; view.vry = 0; view.vrz = 0; /* 注視点 */ view.rz = 0; view.super = WORLD; GsSetRefView2(&view); //視点の設定、変化するなら毎フレーム呼ぶ必要あり(p124) put_view.vpz = 100000; } //光源初期化関数 void InitLight() { pslt[0].vx = -30; pslt[0].vy= 80; pslt[0].vz= -100; //光源方向ベクトル設定 pslt[0].r=0xa0; pslt[0].g=0xa0; pslt[0].b=0xa0; //光源色設定 GsSetFlatLight(0,&pslt[0]); //平行光源の設定(p129) pslt[1].vx = 0; pslt[1].vy= 0; pslt[1].vz= 100; pslt[1].r=0x80; pslt[1].g=0x80; pslt[1].b=0xe0; GsSetFlatLight(1,&pslt[1]); pslt[1].vx = -20; pslt[1].vy= 20; pslt[1].vz= -100; pslt[1].r=0x60; pslt[1].g=0x60; pslt[1].b=0x60; GsSetFlatLight(2,&pslt[1]); GsSetAmbient(512,512,512); //アンビエントの設定 GsSetLightMode(0); //光源モードの指定(0:normal 1:FOG ON) } //モデリングデータの読み込み void InitModelCh0() { dop[OBJ_CH0_0]=(u_long *)OP0_0ADDR; dop[OBJ_CH0_0]++; GsMapModelingData(dop[OBJ_CH0_0]); dop[OBJ_CH0_0]++; dop[OBJ_CH0_0]++; dop[OBJ_CH0_1]=(u_long *)OP0_1ADDR; dop[OBJ_CH0_1]++; GsMapModelingData(dop[OBJ_CH0_1]); dop[OBJ_CH0_1]++; dop[OBJ_CH0_1]++; dop[OBJ_CH0_2]=(u_long *)OP0_2ADDR; dop[OBJ_CH0_2]++; GsMapModelingData(dop[OBJ_CH0_2]); dop[OBJ_CH0_2]++; dop[OBJ_CH0_2]++; dop[OBJ_CH0_3]=(u_long *)OP0_3ADDR; dop[OBJ_CH0_3]++; GsMapModelingData(dop[OBJ_CH0_3]); dop[OBJ_CH0_3]++; dop[OBJ_CH0_3]++; dop[OBJ_CH0_4]=(u_long *)OP0_4ADDR; dop[OBJ_CH0_4]++; GsMapModelingData(dop[OBJ_CH0_4]); dop[OBJ_CH0_4]++; dop[OBJ_CH0_4]++; dop[OBJ_CH0_5]=(u_long *)OP0_5ADDR; dop[OBJ_CH0_5]++; GsMapModelingData(dop[OBJ_CH0_5]); dop[OBJ_CH0_5]++; dop[OBJ_CH0_5]++; dop[OBJ_CH0_6]=(u_long *)OP0_6ADDR; dop[OBJ_CH0_6]++; GsMapModelingData(dop[OBJ_CH0_6]); dop[OBJ_CH0_6]++; dop[OBJ_CH0_6]++; dop[OBJ_CH0_7]=(u_long *)OP0_7ADDR; dop[OBJ_CH0_7]++; GsMapModelingData(dop[OBJ_CH0_7]); dop[OBJ_CH0_7]++; dop[OBJ_CH0_7]++; dop[OBJ_CH0_8]=(u_long *)OP0_8ADDR; dop[OBJ_CH0_8]++; GsMapModelingData(dop[OBJ_CH0_8]); dop[OBJ_CH0_8]++; dop[OBJ_CH0_8]++; } //モデリングデータの読み込み void InitModelCh1() { dop[OBJ_CH1_0]=(u_long *)OP1_0ADDR; dop[OBJ_CH1_0]++; GsMapModelingData(dop[OBJ_CH1_0]); dop[OBJ_CH1_0]++; dop[OBJ_CH1_0]++; dop[OBJ_CH1_1]=(u_long *)OP1_1ADDR; dop[OBJ_CH1_1]++; GsMapModelingData(dop[OBJ_CH1_1]); dop[OBJ_CH1_1]++; dop[OBJ_CH1_1]++; dop[OBJ_CH1_2]=(u_long *)OP1_2ADDR; dop[OBJ_CH1_2]++; GsMapModelingData(dop[OBJ_CH1_2]); dop[OBJ_CH1_2]++; dop[OBJ_CH1_2]++; dop[OBJ_CH1_3]=(u_long *)OP1_3ADDR; dop[OBJ_CH1_3]++; GsMapModelingData(dop[OBJ_CH1_3]); dop[OBJ_CH1_3]++; dop[OBJ_CH1_3]++; dop[OBJ_CH1_4]=(u_long *)OP1_4ADDR; dop[OBJ_CH1_4]++; GsMapModelingData(dop[OBJ_CH1_4]); dop[OBJ_CH1_4]++; dop[OBJ_CH1_4]++; dop[OBJ_CH1_5]=(u_long *)OP1_5ADDR; dop[OBJ_CH1_5]++; GsMapModelingData(dop[OBJ_CH1_5]); dop[OBJ_CH1_5]++; dop[OBJ_CH1_5]++; dop[OBJ_CH1_6]=(u_long *)OP1_6ADDR; dop[OBJ_CH1_6]++; GsMapModelingData(dop[OBJ_CH1_6]); dop[OBJ_CH1_6]++; dop[OBJ_CH1_6]++; dop[OBJ_CH1_7]=(u_long *)OP1_7ADDR; dop[OBJ_CH1_7]++; GsMapModelingData(dop[OBJ_CH1_7]); dop[OBJ_CH1_7]++; dop[OBJ_CH1_7]++; dop[OBJ_CH1_8]=(u_long *)OP1_8ADDR; dop[OBJ_CH1_8]++; GsMapModelingData(dop[OBJ_CH1_8]); dop[OBJ_CH1_8]++; dop[OBJ_CH1_8]++; } //モデリングデータの読み込み void InitModelCh2() { dop[OBJ_CH2_0]=(u_long *)OP2_0ADDR; dop[OBJ_CH2_0]++; GsMapModelingData(dop[OBJ_CH2_0]); dop[OBJ_CH2_0]++; dop[OBJ_CH2_0]++; dop[OBJ_CH2_1]=(u_long *)OP2_1ADDR; dop[OBJ_CH2_1]++; GsMapModelingData(dop[OBJ_CH2_1]); dop[OBJ_CH2_1]++; dop[OBJ_CH2_1]++; dop[OBJ_CH2_2]=(u_long *)OP2_2ADDR; dop[OBJ_CH2_2]++; GsMapModelingData(dop[OBJ_CH2_2]); dop[OBJ_CH2_2]++; dop[OBJ_CH2_2]++; dop[OBJ_CH2_3]=(u_long *)OP2_3ADDR; dop[OBJ_CH2_3]++; GsMapModelingData(dop[OBJ_CH2_3]); dop[OBJ_CH2_3]++; dop[OBJ_CH2_3]++; dop[OBJ_CH2_4]=(u_long *)OP2_4ADDR; dop[OBJ_CH2_4]++; GsMapModelingData(dop[OBJ_CH2_4]); dop[OBJ_CH2_4]++; dop[OBJ_CH2_4]++; dop[OBJ_CH2_5]=(u_long *)OP2_5ADDR; dop[OBJ_CH2_5]++; GsMapModelingData(dop[OBJ_CH2_5]); dop[OBJ_CH2_5]++; dop[OBJ_CH2_5]++; dop[OBJ_CH2_6]=(u_long *)OP2_6ADDR; dop[OBJ_CH2_6]++; GsMapModelingData(dop[OBJ_CH2_6]); dop[OBJ_CH2_6]++; dop[OBJ_CH2_6]++; dop[OBJ_CH2_7]=(u_long *)OP2_7ADDR; dop[OBJ_CH2_7]++; GsMapModelingData(dop[OBJ_CH2_7]); dop[OBJ_CH2_7]++; dop[OBJ_CH2_7]++; dop[OBJ_CH2_8]=(u_long *)OP2_8ADDR; dop[OBJ_CH2_8]++; GsMapModelingData(dop[OBJ_CH2_8]); dop[OBJ_CH2_8]++; dop[OBJ_CH2_8]++; } //モデリングデータの読み込み void InitModelCh3() { dop[OBJ_CH3_0]=(u_long *)OP3_0ADDR; dop[OBJ_CH3_0]++; GsMapModelingData(dop[OBJ_CH3_0]); dop[OBJ_CH3_0]++; dop[OBJ_CH3_0]++; dop[OBJ_CH3_1]=(u_long *)OP3_1ADDR; dop[OBJ_CH3_1]++; GsMapModelingData(dop[OBJ_CH3_1]); dop[OBJ_CH3_1]++; dop[OBJ_CH3_1]++; dop[OBJ_CH3_2]=(u_long *)OP3_2ADDR; dop[OBJ_CH3_2]++; GsMapModelingData(dop[OBJ_CH3_2]); dop[OBJ_CH3_2]++; dop[OBJ_CH3_2]++; dop[OBJ_CH3_3]=(u_long *)OP3_3ADDR; dop[OBJ_CH3_3]++; GsMapModelingData(dop[OBJ_CH3_3]); dop[OBJ_CH3_3]++; dop[OBJ_CH3_3]++; dop[OBJ_CH3_4]=(u_long *)OP3_4ADDR; dop[OBJ_CH3_4]++; GsMapModelingData(dop[OBJ_CH3_4]); dop[OBJ_CH3_4]++; dop[OBJ_CH3_4]++; dop[OBJ_CH3_5]=(u_long *)OP3_5ADDR; dop[OBJ_CH3_5]++; GsMapModelingData(dop[OBJ_CH3_5]); dop[OBJ_CH3_5]++; dop[OBJ_CH3_5]++; dop[OBJ_CH3_6]=(u_long *)OP3_6ADDR; dop[OBJ_CH3_6]++; GsMapModelingData(dop[OBJ_CH3_6]); dop[OBJ_CH3_6]++; dop[OBJ_CH3_6]++; dop[OBJ_CH3_7]=(u_long *)OP3_7ADDR; dop[OBJ_CH3_7]++; GsMapModelingData(dop[OBJ_CH3_7]); dop[OBJ_CH3_7]++; dop[OBJ_CH3_7]++; dop[OBJ_CH3_8]=(u_long *)OP3_8ADDR; dop[OBJ_CH3_8]++; GsMapModelingData(dop[OBJ_CH3_8]); dop[OBJ_CH3_8]++; // dop[OBJ_CH3_8]++; while(0); dop[OBJ_CH3_8]++; } //モデリングデータの読み込み void InitModel() { GsDOBJ2 *objp; int i; InitModelCh0(); InitModelCh1(); InitModelCh2(); InitModelCh3(); dop[OBJ_BG0_0]=(u_long *)YUKA0_ADDR; dop[OBJ_BG0_0]++; GsMapModelingData(dop[OBJ_BG0_0]); dop[OBJ_BG0_0]++; dop[OBJ_BG0_0]++; dop[OBJ_BG0_1]=(u_long *)YUKA1_ADDR; dop[OBJ_BG0_1]++; GsMapModelingData(dop[OBJ_BG0_1]); dop[OBJ_BG0_1]++; dop[OBJ_BG0_1]++; dop[OBJ_BG0_2]=(u_long *)YUKA2_ADDR; dop[OBJ_BG0_2]++; GsMapModelingData(dop[OBJ_BG0_2]); dop[OBJ_BG0_2]++; dop[OBJ_BG0_2]++; dop[OBJ_BG0_3]=(u_long *)YUKA3_ADDR; dop[OBJ_BG0_3]++; GsMapModelingData(dop[OBJ_BG0_3]); dop[OBJ_BG0_3]++; dop[OBJ_BG0_3]++; dop[OBJ_BG0_4]=(u_long *)YUKA4_ADDR; dop[OBJ_BG0_4]++; GsMapModelingData(dop[OBJ_BG0_4]); dop[OBJ_BG0_4]++; dop[OBJ_BG0_4]++; dop[OBJ_BG0_5]=(u_long *)YUKA5_ADDR; dop[OBJ_BG0_5]++; GsMapModelingData(dop[OBJ_BG0_5]); dop[OBJ_BG0_5]++; dop[OBJ_BG0_5]++; dop[OBJ_KAGE0]=(u_long *)KAGE_ADDR; dop[OBJ_KAGE0]++; GsMapModelingData(dop[OBJ_KAGE0]); dop[OBJ_KAGE0]++; dop[OBJ_KAGE0]++; dop[OBJ_TEM0]=(u_long *)TEM0_ADDR; dop[OBJ_TEM0]++; GsMapModelingData(dop[OBJ_TEM0]); dop[OBJ_TEM0]++; dop[OBJ_TEM0]++; dop[OBJ_FIREGUN]=(u_long *)FIREGUN_ADDR; dop[OBJ_FIREGUN]++; GsMapModelingData(dop[OBJ_FIREGUN]); dop[OBJ_FIREGUN]++; dop[OBJ_FIREGUN]++; dop[OBJ_BOX]=(u_long *)BOX_ADDR; dop[OBJ_BOX]++; GsMapModelingData(dop[OBJ_BOX]); dop[OBJ_BOX]++; dop[OBJ_BOX]++; dop[OBJ_BOOM]=(u_long *)BOOM_ADDR; dop[OBJ_BOOM]++; GsMapModelingData(dop[OBJ_BOOM]); dop[OBJ_BOOM]++; dop[OBJ_BOOM]++; dop[OBJ_GRE]=(u_long *)GRE_ADDR; dop[OBJ_GRE]++; GsMapModelingData(dop[OBJ_GRE]); dop[OBJ_GRE]++; dop[OBJ_GRE]++; } void SetChar( MAN *m ) { switch( m->syu ) { case 0: SetCh0Coord(m); break; case 1: SetCh1Coord(m); break; case 2: SetCh2Coord(m); break; case 3: SetCh3Coord(m); break; } } //座標データの設定 void InitCoord() { int i,j; MAN *m; BOOL flg = FALSE; for(i=0; i MAX_HP ) man[0].hp = MAX_HP; man[1].max_hp = man[1].hp = MAX_HP; man[1].gage = GAGE_MAX/4; man[1].gage2 = 0; } } /* //人物構造体 typedef struct { OBJ obj[15]; //表示用のオブジェクト構造体 MDATA mdat; //現在のモーションデータ MDATA d_dat; //モーションデータ増分値 SVECTOR d_pl; //モーションによる平行移動量増分値(パンチによる前進などに使用) SVECTOR g_pl; //重力による平行移動量増分値(ジャンプ時などに使用) GsCOORDINATE2 co; //オブジェクトの座標変換行列構造体 VECTOR pl; //キャラの平行移動量 SVECTOR r; //キャラの方向 MOVDATA *mv; //現在の動作データへのポインタ int m_no; //現在のモーション番号 int m_cnt; //次モーションまでのカウント int face; //プレイヤーの向き(LEFT,RIGHT) int st; //プレーヤーの状態フラグ int hit_stop; //ヒット硬直時間 int grd_stop; //ガード硬直時間(食らい硬直時間にも使用) int ukemi_cnt; //受け身不可時間 BOOL hit_flg; //現モーションで技がヒットしたか BOOL conbo_num; //食らった連続ヒット数 int syu; //キャラ種類(0−2) int zero; //地面に立っているときの高さ int walk_sp; //移動速度 int jump_sp; //ジャンプ初速 int turn_sp; //回転速度(もしかして不要?) int hit_size; //食らい判定の大きさ int hold; //もっているあいてむ  OTHER *hold_pt; //もっているあいてむpointer int max_hp,hp; //最大体力、残り体力 int c_hp; //conbo体力 int gage; //飛び道具ゲージ long cont,trg,b_trg,b_cont; //コントローラーデータ int LB_flg,HB_flg,FB_flg,PB_flg; int LB_cnt,HB_cnt,FB_cnt,PB_cnt; //弱、強ボタン判定用 int Ldash_flg,Rdash_flg; //ダッシュコマンド判定 int Ldash_cnt,Rdash_cnt; int Lhd_flg,Rhd_flg; //波動件コマンド判定 int Lhd_cnt,Rhd_cnt; int DD_flg,DU_flg; //下下、し田植えコマンド判定 int DD_cnt,DU_cnt; int throw_flg; //なげフラグ int throw_syu; //なげフラグ int throw_distance; //なげ間合い OBJ kage; //影表示のオブジェクト構造体 int dat1,dat2,dat3,dat4,dat5; //汎用フラグ } MAN; */ void Collision( MAN *pl, MAN *en ) { int i,j; if( pl->mv[pl->m_no].hf != NULL ) { //プレイヤー1の攻撃判定が発生していて、 if( pl->hit_flg == HH_NO ) { //現モーション中に攻撃が当たっていないなら //上段すかしなら判定しない if( !((en->mv[en->m_no].flg & MOV_SIT) && (pl->mv[pl->m_no].hf->hit_flg & HF_HI_S)) ) { if( !(en->mv[en->m_no].flg & MOV_MUTEKI) ) { for(i=0; i<11; i++) { if( BoxCollisionNoZ( &pl->obj[ pl->mv[pl->m_no].hf->p_num ].co.workm, pl->mv[pl->m_no].hf->xsize, &en->obj[ ColTbl[i] ].co.workm, en->hit_size ) == TRUE ) { //ダメージ判定をキャラ種類に応じて実行 pl->hit_stop = pl->mv[pl->m_no].hf->hit_stop; en->hit_stop = 5; /*if( pl->mv[pl->m_no].flg & MOV_JUMP ) { pl->hit_stop = 9; en->hit_stop = 5; } else { pl->hit_stop = 5; en->hit_stop = 5; }*/ pl->hit_flg = SetDmg( en, pl, ColTbl[i] ); break; } } } } } } } int ManColTbl[] = { 0,1,2,10 }; BOOL ManCollision( MAN *pl, MAN *en ) { int i,j; for(i=0; i<4; i++) { for(j=0; j<4; j++) { if( BoxCollision( &pl->obj[ ManColTbl[j] ].co.workm, pl->hit_size, &en->obj[ ManColTbl[i] ].co.workm, en->hit_size ) == TRUE ) { return(TRUE); } } } return(FALSE); } void ManHit() { int cx,dx; static int vx0=0,vx1=0; //1フレーム前の位置関係 //人間同士のあたり判定 if( ManCollision( &man[0], &man[1] ) == TRUE ) { if( vx0 < vx1 ) { if( man[0].pl.vx+460 > man[1].pl.vx ) { cx = (vx0+vx1)/2; man[0].pl.vx = cx-860; man[1].pl.vx = cx+860; } else { man[0].pl.vx -= 100; man[1].pl.vx += 100; } } else { if( man[1].pl.vx+460 > man[0].pl.vx ) { cx = (vx0+vx1)/2; man[1].pl.vx = cx-860; man[0].pl.vx = cx+860; } else { man[1].pl.vx -= 100; man[0].pl.vx += 100; } } } vx0 = man[0].pl.vx; vx1 = man[1].pl.vx; //離れすぎないように調整 dx = abs(man[0].pl.vx-man[1].pl.vx); if( dx > X_MAX ) { cx = (man[0].pl.vx + man[1].pl.vx)/2; if( man[0].pl.vx > man[1].pl.vx ) { man[0].pl.vx = cx + X_MAX/2; man[1].pl.vx = cx - X_MAX/2; } else { man[1].pl.vx = cx + X_MAX/2; man[0].pl.vx = cx - X_MAX/2; } } } //各キャラ固有移動 void ManMove(MAN *p, MAN *e) { //ゲージ増加 if( p->hp < e->hp ) { p->gage += (e->hp-p->hp)/12; p->gage2+=3; } p->gage2+=1; if( p->gage2 < 0 ) p->gage2 = 0; if( p->gage2 > GAGE_MAX ) p->gage2 = GAGE_MAX; //ぶきもちのばあい if( p->hold == HOLD_FIREGUN || p->hold == HOLD_BOX || p->hold == HOLD_GRE) { ChFireMove( p, e ); return; } else if( p->hold == HOLD_BOOM ) { ChBoomMove( p, e ); return; } //なげ中の場合 if( p->throw_flg == THROW_ON ) { switch( p->throw_syu ) { case 0: ChThrow0( p, e ); break; case 3: ChThrow3( p, e ); break; } return; } if( p->throw_flg == THROW_DMG ) { switch( p->throw_syu ) { case 0: ChThrowDmg0( p, e ); break; case 3: ChThrowDmg3( p, e ); break; } return; } if( p->syu == 0 ) { Ch0Move( p, e ); } else if( p->syu == 1 ) { Ch1Move( p, e ); } else if( p->syu == 2 ) { Ch2Move( p, e ); } else if( p->syu == 3 ) { Ch3Move( p, e ); } } void SelectChar() { int i; static BOOL flg = FALSE,st_flg[2],bg_bak=-1,cnt[2],crt_bg; static ch1,ch2;//込むの伽羅蹴っていよう static start_cnt = 30,mode2_cnt; MAN *m = &man[0]; SetTxDat( &sp_num10, &tx_number[win_num/10] ); SetTxDat( &sp_num1, &tx_number[win_num%10] ); exit_flg = TRUE; if( man[0].trg & PADRup || man[1].trg & PADRup ) { flg = FALSE; PlaySE( SE_UKI ); //指定番号のSEを鳴らす stage_no = STAGE_TITLE; } if( flg == FALSE ) { mode2_cnt = 60; start_cnt = 50; ch1 = Random( 10,4 ); VSync(Random( 5,2 )); ch2 = Random( 10,4 ); bg.width = 14; for(i=0; itrg = 0; if( ch1 > 0 ) { m->trg |= PADLup; ch1--; } else if( ch1 > -4 ) { ch1--; } if( ch1 == -4 ) { m->trg |= PADRdown; ch1--; } } } if( mode_no == MODE_COM || mode_no == MODE_SURVIVAL || mode_no == MODE_WATCH ) { if( i==1 ) { m->trg = 0; if( ch2 > 0 ) { m->trg |= PADLup; ch2--; } else if( ch2 > -4 ) { ch2--; } if( ch2 == -4 ) { m->trg |= PADRdown; ch2--; } } } } m->face = RIGHT; m->r.vy = 0; // if( m->trg & PADL1 ) crt_bg--; // if( m->trg & PADR1 ) crt_bg++; if( crt_bg > 10 ) crt_bg = -1; if( crt_bg < -1 ) crt_bg = 10; if( m->trg & PADstart ) { start_cnt = 10; st_flg[0] = TRUE; st_flg[1] = TRUE; PlaySE( SE_JYA ); } if( m->trg & m->trg & PADRleft && st_flg[i] == TRUE ) { st_flg[i] = FALSE; PlaySE( SE_GRD ); } //指定番号のSEを鳴らす //けっていしたばあい へんこうふか if( cnt[i] > 0 ) cnt[i]--; if( cnt[i] > 0 || st_flg[i] == TRUE ) continue; if( m->trg & PADLup || m->trg & PADLleft ) { m->syu--; } if( m->trg & PADLdown || m->trg & PADLright ) { m->syu++; } if( m->syu > 3 ) m->syu = 0; if( m->syu < 0 ) m->syu = 3; if( m->trg & PADLdown || m->trg & PADLup || m->trg & PADLright|| m->trg & PADLleft ) { SetChar( m ); } if( m->trg & PADRright|| m->trg & PADRdown|| m->trg & PADRup ) { PlaySE( SE_JYA ); //指定番号のSEを鳴らす st_flg[i] = TRUE; } } if( st_flg[0] == TRUE && st_flg[1] == TRUE ) { start_cnt--; } if( start_cnt < 0 ) { bg_bak = crt_bg; if( crt_bg == -1 ){ // while( bg_bak != bg_no ) { crt_bg = Random(10,0); // while ( bg_no > 10 ) bg_no -= 10; // } } bg_no = crt_bg; flg = FALSE; SetChar( &man[0] ); SetChar( &man[1] ); StartGame(); stage_no = STAGE_FIGHT0; vmode = VIEW_NOMAL; opn_cnt = 0; end_cnt = 0; yuki_cnt = 0; round = 0; win1 = win2 = 0; if( mode_no == MODE_WATCH ) man[0].com_flg = TRUE; else man[0].com_flg = FALSE; if( mode_no == MODE_COM || mode_no == MODE_SURVIVAL || mode_no == MODE_WATCH ) man[1].com_flg = TRUE; else man[1].com_flg = FALSE; return; } man[0].pl.vx = 0; man[0].pl.vz = 1500; man[1].pl.vx = 0; man[1].pl.vz = -1500; man[0].cont = man[0].trg = 0; man[1].cont = man[1].trg = 0; if( st_flg[0] == FALSE ) ManMove(&man[0], &man[1]); else SetManData( &man[0] ); //この関数で人間のすべてのパーツが表示される if( st_flg[1] == FALSE ) ManMove(&man[1], &man[0]); else SetManData( &man[1] ); //この関数で人間のすべてのパーツが表示される if( mode_no != 2 || win_num == 0 ) { man[0].gage = GAGE_MAX/4; man[0].gage2 = 0; } man[1].gage = GAGE_MAX/4; man[1].gage2 = 0; // FntPrint("PL1:%d PL2:%d BG:%d(%d)",man[0].syu,man[1].syu, crt_bg,bg_no); } void MoveBG() { static BOOL bg_flg = FALSE; static int bg_flg2 = 0; if( bg_no != 3 ) yuki_cnt = 0; switch( bg_no ) { case 0: /* if( bg_flg == TRUE ) { bg.pt[3].height += 100; bg.pt[3].op.mov.vy += 100; } else { bg.pt[3].height -= 100; bg.pt[3].op.mov.vy -= 100; } bg.pt[10].height = 50000; bg.pt[10].op.mov.vy = 50000; if( bg.pt[3].height < -7000) bg_flg = TRUE; if( bg.pt[3].height > 2000) bg_flg = FALSE; */ if( Random( 10000,0 ) < 1 ) { SetOther( Random(4,2),Random(9500,-9500),-20000,0, 0,0,0, -1,-200,-Random(150,-150),0,0); } bg.pt[0].height = -15000; bg.pt[0].op.mov.vy = -15000; bg.pt[1].height = -15000; bg.pt[1].op.mov.vy = -15000; bg.pt[27].height = -15000; bg.pt[27].op.mov.vy = -15000; bg.pt[26].height = -15000; bg.pt[26].op.mov.vy = -15000; break; case 1: if( Random( 14000,0 ) < 2 ) { SetOther( Random(4,2),Random(9500,-9500),-20000,0, 0,0,0, -1,-200,-Random(150,-150),0,0); } if( bg_flg == TRUE ) { bg.pt[8].height += 100; bg.pt[8].op.mov.vy += 100; } else { bg.pt[8].height -= 45; bg.pt[8].op.mov.vy -= 45; } if( bg.pt[8].height < -9200) bg_flg = TRUE; if( bg.pt[8].height > -2400) bg_flg = FALSE; break; case 2: if( Random( 12000,0 ) < 3 ) { SetOther( Random(4,2),Random(9500,-9500),-20000,0, 0,0,0, -1,-200,-Random(150,-150),0,0); } if( bg_flg == TRUE ) { bg.pt[7].height += 100; bg.pt[7].op.mov.vy += 100; bg.pt[0].height += 100; bg.pt[0].op.mov.vy += 100; } else { bg.pt[7].height -= 100; bg.pt[7].op.mov.vy -= 100; bg.pt[0].height -= 100; bg.pt[0].op.mov.vy -= 100; } if( bg.pt[7].height < -8800) bg_flg = TRUE; if( bg.pt[7].height > -2500) bg_flg = FALSE; break; case 3: yuki_cnt++; yuki_flg = TRUE; if( Random( 25000,0 ) < yuki_cnt ) { int cx,cy; MATRIX mat; cx = (man[0].pl.vx+man[1].pl.vx)/2; cy = (man[0].pl.vy+man[1].pl.vy)/2; mat.t[0] = cx+Random( 9000, -9000 );//-5000; mat.t[1] = cy-7500; mat.t[2] = Random( 22000,-11000 ); SetYuki( &mat,5 ,3000);//ヒットマークのセット } break; case 4: if( Random( 16000,0 ) < 2 ) { SetOther( Random(4,2),Random(9500,-9500),-20000,0, 0,0,0, -1,-200,-Random(150,-150),0,0); } if( Random( 120000,0 ) < 130 ) { SetOther( 4,Random(5500,-5500),-20000,0, 0,0,0, -1,-200,-Random(150,-150),0,0); } break; case 5: if( bg_flg2 < 0 ) { bg_flg2++; if( bg_flg2 >= 0 ) bg_flg2 = 250; if( bg.pt[6].height < 2600) { bg.pt[6].height += 100; bg.pt[6].op.mov.vy += 100; } else { bg.pt[6].height = 2600; bg.pt[6].op.mov.vy = 2600; } } else { bg_flg2--; if( bg_flg2 <= 0 ) { bg_flg2 = -450; } if( bg.pt[6].height > -10200) { bg.pt[6].height -= 100; bg.pt[6].op.mov.vy -= 100; } else { bg.pt[6].height = -10200; bg.pt[6].op.mov.vy = -10200; } } break; case 6: if( bg_flg2 < 0 ) { bg_flg2++; if( bg_flg2 >= 0 ) bg_flg2 = 220; if( bg.pt[10].height < -3000) { bg.pt[10].height += 100; bg.pt[10].op.mov.vy += 100; } else { bg.pt[10].height = -3000; bg.pt[10].op.mov.vy = -3000; } } else { bg_flg2--; if( bg_flg2 <= 0 ) { bg_flg2 = -300; } if( bg.pt[10].height > -10200) { bg.pt[10].height -= 100; bg.pt[10].op.mov.vy -= 100; } else { bg.pt[10].height = -10200; bg.pt[10].op.mov.vy = -10200; } } break; case 7: if( Random( 12000,0 ) < 2 ) { SetOther( Random(4,2),Random(9500,-9500),-20000,0, 0,0,0, -1,-200,-Random(150,-150),0,0); } if( bg_flg2 < 0 ) { bg_flg2++; if( bg_flg2 >= 0 ) bg_flg2 = 250; if( bg.pt[9].height < -3400) { // bg.pt[8].height += 100; // bg.pt[8].op.mov.vy += 100; bg.pt[9].height += 100; bg.pt[9].op.mov.vy += 100; } else { // bg.pt[8].height = -3400; // bg.pt[8].op.mov.vy = -3400; bg.pt[9].height = -3400; bg.pt[9].op.mov.vy = -3400; } } else { bg_flg2--; if( bg_flg2 <= 0 ) { bg_flg2 = -250; } if( bg.pt[9].height > -10200) { bg.pt[9].height -= 100; bg.pt[9].op.mov.vy -= 100; // bg.pt[8].height -= 100; // bg.pt[8].op.mov.vy -= 100; } else { // bg.pt[8].height = -10200; // bg.pt[8].op.mov.vy = -10200; bg.pt[9].height = -10200; bg.pt[9].op.mov.vy = -10200; } } break; case 8: if( Random( 12000,0 ) < 10 ) { SetOther( 4,Random(9500,-9500),-20000,0, 0,0,0, -1,-200,-Random(150,-150),0,0); } if( bg_flg == TRUE ) { bg.pt[4].height += 150; bg.pt[4].op.mov.vy += 150; } else { bg.pt[4].height -= 5; bg.pt[4].op.mov.vy -= 5; } if( bg.pt[4].height > 2600) bg_flg = FALSE; if( bg.pt[4].height < -8400) bg_flg = TRUE; if( bg_flg2 < 0 ) { bg_flg2++; if( bg_flg2 >= 0 ) bg_flg2 = 250; if( bg.pt[10].height < -600) { bg.pt[10].height += 100; bg.pt[10].op.mov.vy += 100; } else { bg.pt[10].height = -600; bg.pt[10].op.mov.vy = -600; } } else { bg_flg2--; if( bg_flg2 <= 0 ) { bg_flg2 = -250; } if( bg.pt[10].height > -10200) { bg.pt[10].height -= 100; bg.pt[10].op.mov.vy -= 100; } else { bg.pt[10].height = -10200; bg.pt[10].op.mov.vy = -10200; } } break; } } //いろいろ処理 void Setiing() { int i; //if( man[0].trg & PADL1 ) man[0].hp /= 2; //if( man[1].trg & PADL1 ) man[1].hp /= 2; if( man[0].pl.vy > Y_MAX ) { man[0].pl.vy = Y_MAX; ringout_flg |= FLG_1P; if( down1p != 1 ) win2++; down1p=1;} if( man[1].pl.vy > Y_MAX ) { man[1].pl.vy = Y_MAX; ringout_flg |= FLG_2P; if( down2p != 1 ) win1++; down2p=1;} if( ringout_flg != ringout_bak ) { ringout_bak = ringout_flg; PlaySE( SE_KYO ); //指定番号のSEを鳴らす if( ((ringout_flg&FLG_1P)&&down2p == 1 ) || //ダブルKO ((ringout_flg&FLG_2P)&&down1p == 1 ) ) { //ダブルKO win1--; win2--; ko_flg = 170; SetMoji(4,0,0,155); SetMoji(3,0,-20,155); } else { //落ちてまだ表示されていないなら if( ko_flg == 9999 ) { ko_flg = 170; SetMoji(4,0,0,145); } } } if( down1p == 0 ) { if( (man[0].hp == 0 && man[0].ukemi_cnt > 10000) ) { down1p = 1; win2++; if( down2p == 1 ) { //ダブルKO win1--; win2--; PlaySE( SE_KYO ); //指定番号のSEを鳴らす ko_flg = 130; SetMoji(3,0,-40,145); SetMoji(0,0,0,145); } else { //普通のKO PlaySE( SE_KYO ); //指定番号のSEを鳴らす ko_flg = 200; SetMoji(0,0,0,105); } } } if( down2p == 0 ) { if( (man[1].hp == 0 && man[1].ukemi_cnt > 10000) ) { down2p = 1; win1++; if( down1p == 1 ) { //ダブルKO win1--; win2--; PlaySE( SE_KYO ); //指定番号のSEを鳴らす ko_flg = 130; SetMoji(3,0,-40,145); SetMoji(0,0,0,145); } else { //普通のKO PlaySE( SE_KYO ); //指定番号のSEを鳴らす ko_flg = 200; SetMoji(0,0,0,105); } } } if( ko_flg != 9999 ) { if( ko_flg < 16 ) VSync(0); //VSync待ち(p59) if( ko_flg > 0 ) ko_flg--; if( ko_flg == 0 ) end_flg = TRUE; } //プレイヤーを強制的にまわす /* if( man[0].cont & PADR2 ) man[0].r.vy -= 10; if( man[0].cont & PADL2 ) man[0].r.vy += 10; if( man[1].cont & PADR2 ) man[1].r.vy -= 10; if( man[1].cont & PADL2 ) man[1].r.vy += 10; */ //影表示 for(i=0; i<2; i++) { man[i].kage.mov.vx = man[i].obj[0].co.workm.t[0]; man[i].kage.mov.vy = GetGrandHeight(man[i].kage.mov.vx); man[i].kage.mov.vz = man[i].obj[0].co.workm.t[2]; SetObj( &man[i].kage ); } } void RoundStart() { int i; //Round N if( opn_cnt == 8 ) { SetMoji(1,-20,-30,125); SetMoji(8+round,64,-30,125); } //Fight if( opn_cnt == 8+60 ){ SetMoji(2,0,5,65); } if( opn_cnt > 5 && opn_cnt < 65) { for(i=0;i<2;i++) { man[i].cont &= ~(PADRleft|PADRdown|PADLup); man[i].trg &= ~(PADRleft|PADRdown|PADLup); if( man[i].hold == HOLD_NO ) { man[i].cont &= ~(PADRright); man[i].trg &= ~(PADRright); } else { man[i].cont &= ~(PADRup); man[i].trg &= ~(PADRup); } } } else { man[0].conbo_num = 0; man[1].conbo_num = 0; man[0].cont = man[0].trg = 0; man[1].cont = man[1].trg = 0; } if( man[0].throw_flg == THROW_NO && man[1].throw_flg == THROW_NO ) { ManHit(); //あたり判定、離れ過ぎ調整など } if( (ringout_flg&FLG_1P) == 0 ) ManMove( &man[0], &man[1] ); //各キャラ固有移動 if( (ringout_flg&FLG_2P) == 0 ) ManMove( &man[1], &man[0] ); //各キャラ固有移動 if( LoopCnt&1) { Collision( &man[0], &man[1] ); Collision( &man[1], &man[0] ); } else { Collision( &man[1], &man[0] ); Collision( &man[0], &man[1] ); } } /////////////////////////////////////// // 'PlayStation Library' // // File: PSUtil.c // Author: Kazunori Tamaki // Tab: 4 // Date: 1998/03/21 /////////////////////////////////////// // 画面をセーブする void StoreScreen(u_long *saddr, int x, int y, int w, int h) { RECT rect; /* TIM のヘッダを作る */ *(saddr+0) = 0x00000010; /* ID */ *(saddr+1) = 0x00000002; /* FLAG(15bit Direct,No Clut) */ *(saddr+2) = (w*h/2+3)*4; /* pixel bnum */ *(saddr+3) = ((0 & 0xffff) << 16) | (640 & 0xffff); /* pixel DX,DY */ *(saddr+4) = ((h & 0xffff) << 16) | (w & 0xffff); /* pixel W,H */ rect.x = x; rect.y = y; rect.w = w; rect.h = h; DrawSync(0); StoreImage(&rect, saddr+5); /* 画面のイメージを メモリに転送する */ printf("Press [F10][F4] for dsave.\n"); printf2("Dsave[0]: filename %08x %x\n", saddr, (w*h/2+5)*4); DrawSync(0); VSync(0); } //ここで各オブジェクトをを動かす(事実上のmain) int MainLoop() { static int no=0,xyz=0,flg=0,m_mode=0,af=0; int cx,cy,i,select=0,plus; static int BG = TRUE; static int kinema_no = -1; //疑似インバースキネマてぃくすパーツ番号 static VEC kinema_crd; //疑似インバースキネマてぃくす基準座標 VEC *r; MATRIX mat; /* //画面撮影 if( man[1].trg & PADselect ) StoreScreen((u_long*)GRA1_ADDR, 0, 0, 320, 240); */ if( (man[0].cont&PADstart) && ( man[0].cont&PADselect ) ) return 0; //終了処理 if( stage_no == STAGE_TITLE ) { if( PutTitle() == 0 ) return 0; return 1; } else if( stage_no == STAGE_SELECT ) { SelectChar(); return 1; } if( mode_no == MODE_WATCH ) { exit_flg = TRUE; if( man[0].trg & PADRup || man[1].trg & PADRup ) { flg = FALSE; PlaySE( SE_UKI ); //指定番号のSEを鳴らす stage_no = STAGE_TITLE; } } else exit_flg = FALSE; if( end_flg == TRUE ) { //if( down1p == 0 && down2p == 1 ) win1++; //if( down1p == 1 && down2p == 0 ) win2++; if( mode_no == 2 ) { if( win1==1 ) { win_num++; stage_no = STAGE_SELECT; } else { SetMoji(17,0,5,165); //GAMEOVER end_cnt++; if( end_cnt > 165 ) { stage_no = STAGE_TITLE; return 1; } } } else { if( (win1>=2 || win2>=2) && win1!=win2 ) stage_no = STAGE_SELECT; else { round++; if( round > 8 ) round = 8; SetChar( &man[0] ); SetChar( &man[1] ); StartGame(); stage_no = STAGE_FIGHT0; vmode = VIEW_NOMAL; opn_cnt = 0; end_cnt = 0; return 1; } } } //モード変更 if( man[0].trg & PADstart ) flg++; if( flg > 4) flg=0; if( man[0].trg & PADselect ) flg--; if( flg < 0) flg=4; if( man[1].trg & PADstart ) vmode++; if( vmode > 4) vmode=0; if( man[1].trg & PADselect ) m_mode++; if( m_mode > 3) m_mode=0; //いろいろ処理 Setiing(); if( flg != 0 ){ FntPrint("bx=%5d by=%5d bz=%5d\n",man[0].mdat.pl.vx,man[0].mdat.pl.vy,man[0].mdat.pl.vz); } if( flg != 0 && flg != 2 ) { r = &man[0].mdat.r[0]; for(i=0;i<15;i++) { FntPrint("n=%2d x=%5d y=%5d z=%5d\n",i,r[i].vx,r[i].vy,r[i].vz); } } if( opn_cnt < 70 ) { opn_cnt++; RoundStart(); man[0].conbo_num = 0; man[1].conbo_num = 0; } else if( flg == 0 || flg == 1 ) { //通常ゲームの場合 SetHitNum( 0,man[0].conbo_num); SetHitNum( 1,man[1].conbo_num); kinema_no = -1; //座標固定モード解除(デバッグ用) if( man[0].throw_flg == THROW_NO && man[1].throw_flg == THROW_NO ) { ManHit(); //あたり判定、離れ過ぎ調整など } /* if( man[0].trg == PADL2 ) { if( man[0].com_flg == TRUE ) man[0].com_flg = FALSE; else man[0].com_flg = TRUE; } if( man[1].trg == PADL2 ) { if( man[1].com_flg == TRUE ) man[1].com_flg = FALSE; else man[1].com_flg = TRUE; } */ if( man[0].com_flg == TRUE )//&& !((ringout_flg&FLG_2P)==0) ) ComMove( &man[0], &man[1] ); if( man[1].com_flg == TRUE )//&& !((ringout_flg&FLG_1P)==0) ) ComMove( &man[1], &man[0] ); if( (ringout_flg&FLG_1P) == 0 ) ManMove( &man[0], &man[1] ); //各キャラ固有移動 if( (ringout_flg&FLG_2P) == 0 ) ManMove( &man[1], &man[0] ); //各キャラ固有移動 if( LoopCnt&1) { Collision( &man[0], &man[1] ); Collision( &man[1], &man[0] ); } else { Collision( &man[1], &man[0] ); Collision( &man[0], &man[1] ); } if( man[0].throw_flg == THROW_PUT ) { //if( !(man[1].mv[man[1].m_no].flg&MOV_NOTHROW) && if( (man[1].mv[man[1].m_no].flg&MOV_THROW) && abs(man[0].pl.vx-man[1].pl.vx) < man[0].throw_distance && abs(man[0].pl.vy-man[1].pl.vy) < 2000 ) { man[0].throw_flg = THROW_ON; man[1].throw_flg = THROW_DMG; man[1].throw_syu = man[0].throw_syu; } else man[0].throw_flg = FALSE; } if( man[1].throw_flg == THROW_PUT ) { // if( !(man[0].mv[man[0].m_no].flg&MOV_NOTHROW) && if( (man[0].mv[man[0].m_no].flg&MOV_THROW) && abs(man[1].pl.vx-man[0].pl.vx) < man[1].throw_distance && abs(man[1].pl.vy-man[0].pl.vy) < 2000 ) { man[1].throw_flg = THROW_ON; man[0].throw_flg = THROW_DMG; man[0].throw_syu = man[1].throw_syu; } else man[1].throw_flg = FALSE; } } else if( flg > 1 ) { //モーションエディットモードの場合 FntPrint("num=%d xyz=%d md=%d ry = %d\n",no,xyz,m_mode,man[0].r.vy); if( man[1].trg & PADRleft ) { //床表示ONOFF if( BG == TRUE ) BG = FALSE; else BG = TRUE; } if( kinema_no == -1 ) { //座標固定モードに入っていないなら if( man[1].trg & PADRright ) { //疑似インバースキネマてぃくす処理開始 kinema_no = no; //kinema_crd.vx = man[0].obj[no].co.workm.t[0]; //kinema_crd.vy = man[0].obj[no].co.workm.t[1]; //kinema_crd.vz = man[0].obj[no].co.workm.t[2]; } } else { //座標固定モードの場合 FntPrint("Kotei [%d] x=%d y=%d z=%d \n",kinema_no,man[0].obj[kinema_no].co.workm.t[0],man[0].obj[kinema_no].co.workm.t[1],man[0].obj[kinema_no].co.workm.t[2]); //man[0].mdat.pl.vx += kinema_crd.vx - man[0].obj[kinema_no].co.workm.t[0]; //man[0].mdat.pl.vy += kinema_crd.vy - man[0].obj[kinema_no].co.workm.t[1]; //man[0].mdat.pl.vz += kinema_crd.vz - man[0].obj[kinema_no].co.workm.t[2]; if( man[1].trg & PADRright ) kinema_no=-1; //疑似インバースキネマてぃくす処理終了 } if( m_mode == 0 ) { //モード0の場合 //平行移動 if( man[1].cont & PADLup ) man[0].mdat.pl.vy-=5; if( man[1].cont & PADLdown ) man[0].mdat.pl.vy+=5; if( man[1].cont & PADLleft ) man[0].mdat.pl.vx+=5; if( man[1].cont & PADLright ) man[0].mdat.pl.vx-=5; if( man[1].cont & PADRup ) man[0].mdat.pl.vz+=5; if( man[1].cont & PADRdown ) man[0].mdat.pl.vz-=5; if( man[0].trg & PADLup ) no--; if( man[0].trg & PADLdown ) no++; if( man[0].trg & PADLleft ) xyz--; if( man[0].trg & PADLright ) xyz++; if( no<0 ) no=14; if( no>14 ) no=0; if( xyz < 0 ) xyz = 2; if( xyz > 2 ) xyz = 0; plus=0; if( man[0].cont & PADRup ) plus=-10; if( man[0].cont & PADRdown ) plus=10; r = &man[0].mdat.r[0]; switch(xyz) { case 0: r[no].vx += plus; break; case 1: r[no].vy += plus; break; case 2: r[no].vz += plus; break; } } else { //モード1の場合 //平行移動 if( man[1].cont & PADLup ) man[0].mdat.pl.vy-=5; if( man[1].cont & PADLdown ) man[0].mdat.pl.vy+=5; if( man[1].cont & PADLleft ) man[0].mdat.pl.vx+=5; if( man[1].cont & PADLright ) man[0].mdat.pl.vx-=5; if( man[1].cont & PADRup ) man[0].mdat.pl.vz+=5; if( man[1].cont & PADRdown ) man[0].mdat.pl.vz-=5; if( man[0].trg & PADLup ) no--; if( man[0].trg & PADLdown ) no++; if( no<0 ) no=14; if( no>14 ) no=0; plus=0; r = &man[0].mdat.r[0]; if( man[0].cont & PADRup ) r[no].vx -= 10; if( man[0].cont & PADRdown ) r[no].vx += 10; if( man[0].cont & PADRleft ) r[no].vy -= 10; if( man[0].cont & PADRright ) r[no].vy += 10; if( man[0].cont & PADL1 ) r[no].vz -= 10; if( man[0].cont & PADR1 ) r[no].vz += 10; } if( flg != 3 ) SetManData( &man[0] ); } //その他物体表示 PutOther(); MoveBG(); if( anten_cnt == 0 && anten_flg == ANTEN_NO) { // if( man[1].trg & PADselect ) af++; if( af > ANTEN_KAGAMI ) af=ANTEN_NO; anten_flg = af; } if( BG == TRUE && anten_flg!=ANTEN_ON ) { //床表示 cx = (man[0].obj[1].co.workm.t[0]+man[1].obj[1].co.workm.t[0])/2; i=0; while( bg.pt[i].op.co.coord.t[0] < cx-19000 ) i++; for(; i cx+19000 ) break; SetObj( &bg.pt[i].op ); } } if( flg == 1 ) VSync(0); //VSync待ち(p59) return 1; }