view schedule.cc @ 110:8a525ec378fc

bool.h change stdbool.h
author Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
date Thu, 09 Jun 2011 01:45:25 +0900
parents e5f2eb98b575
children 31dd5c07f7c1
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"

#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()
{
  gSprite_Init(); // グラフィック関連の初期化
  gFont_Init();   // フォント関連の初期化
}

static void 
play_init( Game *game )
{
  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)
{
  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)
{
  static int blink_count = 0;
  if (game->play_id==1){
    if (blink_count < 35) {
      gFont_SetString("PUSH START !!", 170, 380);
    }
    blink_count = (blink_count > 70) ? 0 : blink_count + 1;

    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)
{
  if (i==1){
    title_finish_call();
    i=2;
  }
  gSprite_PutSpriteEx(SP_SEL_CAR+game->car_id, 190, 200, 1.5, 1.5);
  gSprite_PutSprite(24, 460, 300);
  gSprite_PutSprite(25, 120, 300);
  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)
{
  gSprite_PutSpriteEx(SP_SEL_COURSE+game->course_id, 190, 200, 1.7, 1.8);
  gSprite_PutSprite(24, 460, 300);
  gSprite_PutSprite(25, 120, 300);

  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)
{
  static int blink_count = 0;//

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

  set_schedule_assumption(sche_game_main_init);


  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)
{
  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)
{
  /** 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);
  carNode_draw();

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

  /* スピードメーター */
  gSprite_DefSprite(23, 1, 1,(int)(106.0*(game->jiki->speed/game->jiki->speed_max)), 34);
  gSprite_PutSprite(23, 400, 400);
  /* km/h */
  gSprite_PutSprite(26, 470, 350);
  /* Rap */
  gSprite_PutSprite(27, 80, 100);

  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);
  }

}


void
sche_game_main_pause(Game *game)
{
  static int select = 0;

  field_update(game->jiki);
  carNode_draw();
      
  if (game->play_id == 1) {
    // 選択マーク 
    gSprite_PutSprite(17, 100, 190+select*100);
	
    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,game->jiki->body->transfer);
    
  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)
{
  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();
}