view schedule.cc @ 126:030394675d8e

succes compile
author e085768
date Thu, 30 Jun 2011 21:48:38 +0900
parents c62fec1dd2f8
children d9e3137e70a0
line wrap: on
line source

/* schedule.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "libps2.h"
#include "ps2util.h"
#include "field.h"
#include "car.h"
#include "gSprite.h"
#include "gFont.h"
#include "game.h"
#include "controler.h"
#include "camera.h"
#include "carNode.h"
#include "car.h"
#include "light.h"
#include "title_scene.h"
#include "game_time.h"
#include "schedule.h"
#include "game.h"

#include "mytype.h"
#include "linda.h"

#include "sjoy.h"

// getScreen_()関数用にインクルード
#include "Magoroku.h"

#ifdef LINDA
bool linda_update(int p, Game *game);
#else
#define linda_update(change_state, game) true
#endif

#define MAXCAR   3 // 選択可能機体
#define MAXFIELD 2 // 選択可能コース
#define MAXRAP   3 // ラップ数
#define SP_SEL_CAR    50
#define SP_SEL_COURSE 80

// controler.cより
extern SGO_PAD pad;


static void set_schedule(Game *game);
static void sche_game_init(Game *game);
//static void sche_game_wait(Game *game); //プロトタイプも消しといた
//static void sche_game_wait_ready(Game *game);
static void sche_game_opening(Game *game);
static void sche_game_select_car(Game *game);
static void sche_game_select_course(Game *game);
static void sche_game_ready(Game *game);
static void sche_game_main_init(Game *game);
static void sche_game_main_ready(Game *game);
static void sche_game_main(Game *game);
static void sche_game_main_pause(Game *game);
static void sche_game_main_goal(Game *game);
static void sche_game_main_finish(Game *game);
static void sche_game_main_finish2(Game *game);


/* timer */
static int start_time,time_count;
static int RUNNIG=0;
char raptime[10];

static int ranking = 0;
static LIGHT l;
static int i=0;

static void (*sche_func_assumption)(Game*);
static void (*sche_func)(Game*) = &sche_game_init;
static int change_state = 0;

// schedule.ccで使用してる
void linda_env_init( void );

static void
set_schedule_assumption(void (*_func)(Game*) )
{
  sche_func_assumption = _func;
  change_state = 1;
}

static void
unset_schedule()
{
  change_state = 0;
}

static void
set_schedule(Game *game)
{
  sche_func = sche_func_assumption;
  change_state = 0;
}

static void
graphic_init()
{
  printf("graphic_init()\n");
  
  gSprite_Init(); // グラフィック関連の初期化
  gFont_Init();   // フォント関連の初期化

}

static void 
play_init( Game *game )
{
  printf("play_init()\n");
  printf("game->car_id = %d\n",game->car_id);

  // ここで、car_idには1か2か3が入らんとダメ
  game->jiki = car_init(game->car_id);
  
  carNode_append(game->jiki);
  
  field_init(game->course_id);
}

// 適当に自作 :miya
void linda_env_init( void )
{
  printf("linda_env_init\n");
}

static void game_env_init ( Game *game )
{
  game->car_id      = 1;
  game->course_id   = 1;
  game->camera_type = 0;
  game->rap         = 1;
  game->jiki        = NULL;
  
  ranking = 0;

  wait_init();
  linda_env_init();
}


void
sche_game_init(Game *game)
{
  printf("sche_game_init()\n");
    
  game_env_init(game);
  graphic_init();
  camera_init();

#ifdef LINDA
  //sche_func = &sche_game_wait;
  //set_schedule_assumption(sche_game_wait);
#else
  set_schedule_assumption(sche_game_opening);
#endif
}

/**
 * 通信対戦専用
 * 全ユーザが接続するまで待つ
 * ・・・だったんだけど、現在 linda を切っているため worning が出る。
 * ので cut する。
 */

/* linda を使用しないのでカットした
   static void
   sche_game_wait(Game *game)
   {
   gFont_SetString("WAITING...", 200, 100);
   set_schedule_assumption(sche_game_wait_ready);
   }
*/


/**
 * 通信対戦専用
 * 全ユーザの接続を確認したら呼び出す
 * こいつも、linda がないので cut
*/ 
 /*
static void
sche_game_wait_ready(Game *game)
{
  gFont_SetString("CONNECT OK!!", 170, 300);
  if (game->play_id == 1) {
    gFont_SetString(" PUSH START ", 170, 400);
    if (pad.st != 1) { goto WAIT_READY; }
  }

  set_schedule_assumption(sche_game_opening);
    
 WAIT_READY:
  return;
}
*/


void
sche_game_opening(Game *game)
{
  printf("sche_game_opening\n");
  
  static int blink_count = 0;

  // 試しブレンダーで作ったタイトルを表示してみたひ
  gSprite_PutSprite(TITLE, 600, 100, -500);

  //ここを現在通らないらしい。
  if (game->play_id==1){
    if (blink_count < 35) {
      gFont_SetString("PUSH START !!", 170, 380);
    }
    blink_count = (blink_count > 70) ? 0 : blink_count + 1;

    printf("pad.st = %d\n",pad.st);
    if (pad.st != 1) { goto OPENING; }
  }

  /*処理をいったんifの外へ。これを見る限り、キー入力自体はokぽい
    printf("pad.st = %d\n",pad.st);
    if (pad.st != 1) { goto OPENING; }
  */


  set_schedule_assumption(sche_game_select_car);

 OPENING:
  return;


  if (game->play_id == 1) {
    if (title_scene() < 0){
    }
  } else if (game->play_id == 2) {
    if (i==0){
      title_init_call();
      i=1;
    }
  }

}

void
sche_game_select_car(Game *game)
{
  printf("sche_game_select_car()\n");

  if (i==1){
    title_finish_call();
    i=2;
  }

  gSprite_PutSpriteEx(SP_SEL_CAR+game->car_id, 600, 200, TEST_Z_GRID,1.5, 1.5, 0.0);
  gSprite_PutSprite(R_ARROW, 750, 200, TEST_Z_GRID);
  gSprite_PutSprite(L_ARROW, 450, 200, TEST_Z_GRID);

  gFont_SetString("SELECT CAR", 180, 50);

  if (pad.right == 1) {
    game->car_id =
      (game->car_id > MAXCAR-1) ? 1 : game->car_id + 1;
  }
  
  if (pad.left == 1) {
    game->car_id =
      (game->car_id < 2) ? MAXCAR : game->car_id - 1;
  }


  if (game->play_id == 1)
    if (pad.circle != 1) { goto SELECT_CAR; } 

  set_schedule_assumption(sche_game_select_course);

 SELECT_CAR:
  return;
}

void
sche_game_select_course(Game *game)
{
  printf("sche_game_select_course()\n");
  gSprite_PutSpriteEx(SP_SEL_COURSE+game->course_id, 600, 200, TEST_Z_GRID ,1.7, 1.8, 0.0);
  gSprite_PutSprite(R_ARROW, 750, 200, TEST_Z_GRID);
  gSprite_PutSprite(L_ARROW, 450, 200, TEST_Z_GRID);

  gFont_SetString("SELECT COURSE", 150, 50);

  if (game->play_id == 1) {
    if (pad.right == 1) {
      game->course_id =
	(game->course_id > MAXFIELD-1) ? 1 : game->course_id + 1;
      goto SELECT_COURSE;
    }
    if (pad.left == 1) {
      game->course_id =
	(game->course_id < 2) ? MAXFIELD : game->course_id - 1;
      goto SELECT_COURSE;
    }

    if (pad.circle != 1) { goto SELECT_COURSE; }
  }

  set_schedule_assumption(sche_game_ready);

 SELECT_COURSE:
  return;
}

void
sche_game_ready(Game *game)
{
  printf("sche_game_ready()\n");
  static int blink_count = 0;//

  int tesX = 200;
  
  // PLAYER_1 or PLAYER_2 
  gSprite_PutSprite(27+game->play_id, 265 + tesX, 10, TEST_Z_GRID - 300);
  
  gSprite_PutSpriteEx(SP_SEL_CAR+game->car_id, 50 + tesX, 120, TEST_Z_GRID - 300, 1.5, 1.5 , 0.0);
  gSprite_PutSpriteEx(SP_SEL_COURSE+game->course_id, 340 + tesX, 120, TEST_Z_GRID - 300, 1.7, 1.8 , 0.0);
    
  /* 点滅 */
  if (blink_count < 35) {
    gFont_SetString("GAME START !!", 170, 380);
  }
  blink_count = (blink_count > 70) ? 0 : blink_count + 1;

  if (pad.st == 1) {
    set_schedule_assumption(sche_game_main_init);
  }
  if (pad.cross > 0) {
    set_schedule_assumption(sche_game_select_car);
  }
}

void
sche_game_main_init(Game *game)
{
  printf("sche_game_main_init()\n");
  if (!game->jiki){
    play_init(game);
  }

  RUNNIG=0;

  set_schedule_assumption(sche_game_main_ready);
}

static void
sche_game_main_ready(Game *game)
{
  gFont_SetString("Loading....", 180, 100);
  set_schedule_assumption(sche_game_main);
}

static void
sche_game_main(Game *game)
{
  printf("sche_game_main()\n");
  
  /** begin: dispaly RAP TIME **/
  if(RUNNIG==0){
    start_time = game_time_get_msec();
    RUNNIG=1;
  }

  time_count = game_time_get_msec() - start_time;
  game_time_set_raptime(raptime,time_count);
  gFont_SetString("TIME",300,20);
  gFont_SetString(raptime,400,20);
  /** end: dispaly RAP TIME **/

  // light_init と init_lightの書き間違え?
  init_light(&l);
  set_light(&l);
    
  car_id_update(game, game->jiki);

  field_update(game->jiki);

  //camera_update(game,game->jiki->body->transfer);
  camera_update(game, &(game->jiki->body->matrix) );

  carNode_draw();

  gFont_SetStringInt(game->rap, 50, 100);

  /* スピードメーター */
  //gSprite_DefSprite(SP_METER, 1, 1,(int)(106.0*(game->jiki->speed/game->jiki->speed_max)), 34);

  // とりあえずコンパイル通すためにコメント。あとで調べましょう
  //  gSprite_DefSprite(SP_METER, "name", (float)(106.0*(game->jiki->speed/game->jiki->speed_max)), 34.0, 100);

  gSprite_PutSprite(SP_METER, 400, 400, TEST_Z_GRID);
  
  /* km/h */
  gSprite_PutSprite(KM, 470, 350, TEST_Z_GRID);

  /* Rap */
  gSprite_PutSprite(RAP, 80, 100, TEST_Z_GRID);

  if (game->rap > MAXRAP) {
    ranking = 1;
    set_schedule_assumption(sche_game_main_goal);
  }

  gFont_SetStringInt((int)(100.0*game->jiki->speed), 380, 350);
  
  if ((pad.right > 0) && ((game->jiki->speed != 0) || (pad.circle > 0))) {
    car_swerve(game->jiki, 1);
  }
  if ((pad.left > 0) && ((game->jiki->speed != 0) || (pad.circle > 0))) {
    car_swerve(game->jiki, -1);
  }
  if (pad.circle > 0) {
    car_accelerate(game->jiki, 1);
  }
  if (pad.cross > 0) {
    car_accelerate(game->jiki, -1);
  }

  if (pad.r1 == 1) {
    game->camera_type = !game->camera_type;
  }
  if (pad.st == 1) {
    set_schedule_assumption(sche_game_main_pause);
  }

  //S-dandy の obj てきな
}


void
sche_game_main_pause(Game *game)
{
  printf("sche_game_main_pause\n");
  
  static int select = 0;

  field_update(game->jiki);
  carNode_draw();
      
  if (game->play_id == 1) {
    // 選択マーク 
    gSprite_PutSprite(17, 100, 190+select*100, TEST_Z_GRID);
	
    gFont_SetString("BACK TO GAME", 200, 200);
    gFont_SetString("GO TO TITLE",  200, 300);
  } else {
    gFont_SetString("Pause ...", 200, 200);
  }

    
  if (pad.circle == 1) {
    if (select == 0) {
      set_schedule_assumption(sche_game_main);
    } else {
      set_schedule_assumption(sche_game_main_finish);
    }
  } else if (pad.st == 1) {
    set_schedule_assumption(sche_game_main);
  } else if (pad.up == 1 || pad.down == 1) {
    select = !select;
  }
}


void
sche_game_main_goal(Game *game)
{
  /** dispaly TOTAL TIME **/ 
  game_time_set_raptime(raptime,time_count);

  gFont_SetString("TOTAL TIME",150,20);
  gFont_SetString(raptime,400,20);
  gFont_SetString("GOAL !!", 220, 150);

#ifdef LINDA
  if (ranking == 1)
    gFont_SetString("You WIN!!", 200, 250);
  else
    gFont_SetString("You Lose...", 200, 250);
#endif


  // 宣言では引数が二つだったから、第一引数に game を入れてみた
  car_update(game, game->jiki);
  field_update(game->jiki);
  carNode_draw();
  camera_update( game, (FMATRIX)(game->jiki->body->matrix) );

  if (pad.st == 1) {
    set_schedule_assumption(sche_game_main_finish);
  }
}

void
sche_game_main_finish(Game *game)
{
  field_destroy();
  carNode_destroy();
  game_env_init(game);

  set_schedule_assumption(sche_game_main_finish2);
}

void
sche_game_main_finish2(Game *game)
{
  gFont_SetString("GAME OVER ...", 200, 200);
  
  if (pad.st == 1) {
    set_schedule_assumption(sche_game_opening);
  }

}

// 適当に作りました
void wait_sync(Game *game)
{
  printf("wait_sync\n");
}

// 適当に
void swap_dbuff()
{
  printf("swap_dbuff()\n");
}

void
schedule(Game *game)
{
  flip();
  printf("----------------------\n");
  printf("schedule()\n");

  sche_func(game);

  if (linda_update(change_state, game) == true){
    set_schedule(game);
  }
  else{
    unset_schedule();
  }

  wait_sync(game);
  swap_dbuff();
  sjoy_poll();
    
  ps2util_sprite_Draw();
  gSprite_Draw_Reset();
  gFont_Draw_Reset();

  // ここにgSprite_Init()があるのって良いのかな?
  // gSprite_Init();
}