main00.c 3.58 KB
/*============================================================================

		NINTENDO64 TECHNICAL SUPPORT CENTER 
		
		    NINTENDO64 SAMPLE PROGRAM 1

		Copyright (C) 1997, NINTENDO Co,Ltd.

============================================================================*/

#include <ultra64.h>
#include <PR/ramrom.h>
#include <assert.h>

#include "def.h"
#include "vram.h"
#include "segment.h"
#include "message.h"
#include "nnsched.h"
#include "main.h"
#include "audio.h"
#include "controller.h"
#include "graphic.h"


ModelMtx mtx_cont[4];


/*--------------------------
  main00 test stage

  return: next stage no
--------------------------*/
int main00(NNSched* sched)
{

  OSMesgQueue msgQ;
  OSMesg      msgbuf[MAX_MESGS];
  NNScClient client;
  u32  sndno=0;
  u32  pad_no = 0;
  u32  cnt;
  u32  controller_num;
  u32  endFlag = 0;
  /* create message queue for VI retrace */
  osCreateMesgQueue(&msgQ, msgbuf, MAX_MESGS);

  /* シーケンスプレイヤー0にシーケンス0をセット */
  auSeqPlayerSetFile(0,0);

  /* add client to shceduler */
  nnScAddClient(sched, &client, &msgQ);

  controller_num = numControllers;

  /* 変数の初期化 */
  for(cnt = 0; cnt < controller_num; cnt++){
    mtx_cont[cnt].pos_x = 80.0-cnt*80.0;
    mtx_cont[cnt].pos_y = -80.0+cnt*80.0;
    mtx_cont[cnt].pos_z = 0.0+cnt*80.0;
    mtx_cont[cnt].size =  0.3;
    mtx_cont[cnt].rot_x = 0.0;
    mtx_cont[cnt].rot_y = 0.0;
    mtx_cont[cnt].rot_z = 0.0;
  }

  /* ディスプレイリストの読み込み */
  auRomRead((u32)_contSegmentRomStart, gfx_dlist_buf[0],
	    (u32)_contSegmentRomEnd - (u32)_contSegmentRomStart);


  /* 接続されているコントローラの数だけ、コントローラを表示する */
  auSeqPlayerPlay(0);
  graphic_no = GFX_00;


  while(!endFlag){
    (void) osRecvMesg(&msgQ, NULL, OS_MESG_BLOCK);

    /* ささっているコントローラの数だけループ */
    for(pad_no = 0; pad_no < controller_num ; pad_no++){
      if(controllerdataTriger[pad_no].button & B_BUTTON){
	/* シーケンスが止まっていれば再生する */
	if(auSeqPlayerState(0) == AL_STOPPED){
	  auSeqPlayerPlay(0);
	}
      }
      /* サウンドを鳴らす */
      if(controllerdataTriger[pad_no].button & A_BUTTON){
	auSndPlay(sndno);
	sndno=(sndno++) & 0x07;
      }

      /* 十字キー上 */
      if(controllerdata_ptr[pad_no]->button & U_JPAD){
	mtx_cont[pad_no].pos_z-=1.0;
      }

      /* 十字キー下 */
      if(controllerdata_ptr[pad_no]->button & D_JPAD){
	mtx_cont[pad_no].pos_z+=1.0;
      }

      /* 十字キー左 */
      if(controllerdata_ptr[pad_no]->button & L_JPAD){
	mtx_cont[pad_no].pos_x-=1.0;
      }

      /* 十字キー右 */
      if(controllerdata_ptr[pad_no]->button & R_JPAD){
	mtx_cont[pad_no].pos_x+=1.0;
      }

      /* C-UP */
      if(controllerdata_ptr[pad_no]->button & U_CBUTTONS){
	mtx_cont[pad_no].size+=0.01;
      }

      /* C-DOWN */
      if(controllerdata_ptr[pad_no]->button & D_CBUTTONS){
	mtx_cont[pad_no].size-=0.01;
      }

      /* START BUTTON */
      if(controllerdataTriger[pad_no].button & START_BUTTON){
	  endFlag++;
      }

      /* 3Dスティック */
      mtx_cont[pad_no].rot_x += controllerdata_ptr[pad_no]->stick_y/8;
      mtx_cont[pad_no].rot_y += controllerdata_ptr[pad_no]->stick_x/8;

      /* 定常回転 */
      mtx_cont[pad_no].rot_x += 1;
      mtx_cont[pad_no].rot_y += 1;
    }

  }



  /* シーケンスの停止 */
  auSeqPlayerStop(0);
  graphic_no = GFX_NULL;

  /* グラフィックタスク・オーディオタスク終了待ち */
  while((auSeqPlayerState(0) != AL_STOPPED) || (pendingGFX != 0)){
    (void) osRecvMesg(&msgQ, NULL, OS_MESG_BLOCK);
  };

  /* remove client to shceduler */
  nnScRemoveClient(sched, &client);
  
  /* exit label */
  return MAIN_01;
}