view schedule.c @ 26:4447fd650f60

*** empty log message ***
author gongo
date Sun, 05 Nov 2006 02:25:30 +0000
parents b1ba4dad7f6e
children 618f39723403
line wrap: on
line source

/*
 * $Id$
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libps2.h"
#include "ps2util.h"
#include "col.h"
#include "field.h"
#include "car.h"
#include "gSprite.h"
#include "gFont.h"
#include "game.h"
#include "controler.h"
#include "camera.h"
#include "mytype.h"
#include "light.h"
#include "title_scene.h"
#include "game_time.h"


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

extern int car_check();
/* --- controler.c --- */
extern SGO_PAD pad;
/* --- car.c --- */
extern CarPtr car_init();
extern void car_accelerate(CarPtr, int);
extern void car_swerve(CarPtr, int);
extern void car_update(CarPtr);
/* --- carNode.c */
extern void carNode_append(CarPtr);
extern void carNode_draw();
extern void carNode_destroy();
/* --- field.c --- */
extern void field_init();
extern void field_update(CarPtr);
extern void field_destroy();
/* --- mytype.c --- */
extern void wait_init();
extern Bool wait(double);
extern void time_RaceStart();
extern double time_RaceTime();
/* --- demo.c --- */
extern void demo_openFp(int);
extern void demo_closeFp();
/* --- linda.c --- */
extern void linda_jikiInfo_init();

/* 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;

void
set_schedule(void *func)
{
    game.exec = func;
}

static int
get_random()
{
    srand((unsigned)time(NULL));
    return (int)(rand()*DEMO_NUM/(1.0+RAND_MAX));
}

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

static void
play_init()
{
    game.jiki = car_init(game.car_id);
    carNode_append(game.jiki);
    field_init();
}

void sche_game_init();
static void sche_game_opening();
static void sche_game_select_car();
static void sche_game_select_course();
static void sche_game_ready();
static void sche_game_main_init();
static void sche_game_main();
static void sche_game_main_pause();
static void sche_game_main_goal();
static void sche_game_main_finish();

static void
game_env_init()
{
    game.car_id      = 1;
    game.course_id   = 1;
    game.camera_type = 0;
    game.rap         = 1;
    game.jiki        = NULL;

    ranking = 0;

    wait_init();
    linda_jikiInfo_init();
}



void
sche_game_init()
{
    game_env_init();
    graphic_init();
    camera_init();

    set_schedule(sche_game_opening);
}

void
sche_game_opening()
{
    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) {
	set_schedule(sche_game_select_car);
    }

    /*
    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()
{
    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 (pad.circle == 1) {
	set_schedule(sche_game_select_course);
    }
}

void
sche_game_select_course()
{
    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 (pad.right == 1) {
	game.course_id =
	    (game.course_id > MAXFIELD-1) ? 1 : game.course_id + 1;
    }
    if (pad.left == 1) {
	game.course_id =
	    (game.course_id < 2) ? MAXFIELD : game.course_id - 1;
    }
    if (pad.circle == 1) {
	set_schedule(sche_game_ready);
    }
}

void
sche_game_ready()
{
    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;

    if (pad.st > 0) {
	set_schedule(sche_game_main_init);
    }
    if (pad.cross > 0) {
	set_schedule(sche_game_select_car);
    }
}

void
sche_game_main_init()
{
    if (!game.jiki)
	play_init();
    RUNNIG=0;
    set_schedule(sche_game_main);
}

void
sche_game_main()
{

    /** 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(&l);
    set_light(&l);
     
    car_update(game.jiki);
    field_update(game.jiki);
    camera_update(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(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(sche_game_main_pause);
    }
}

void
sche_game_main_pause()
{
    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(sche_game_main);
	} else {
	    set_schedule(sche_game_main_finish);
	}
    }
    if (pad.st == 1) {
	set_schedule(sche_game_main);
    }
    if (pad.up == 1 || pad.down == 1) {
	select = !select;
    }
}

void
sche_game_main_goal()
{

    /** 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

    car_update(game.jiki);
    field_update(game.jiki);
    carNode_draw();
    camera_update(game.jiki->body->transfer);
    if (pad.st == 1) {
	set_schedule(sche_game_main_finish);
    }
}

void
sche_game_main_finish()
{
    gFont_SetString("GAME OVER ...", 200, 200);

    if (game.jiki) {
	field_destroy();
	carNode_destroy();
	game_env_init();
    }
    if (pad.st == 1) {
	set_schedule(sche_game_opening);
    }
}


void
schedule()
{
    game.exec();
    
    wait_sync();
    swap_dbuff();
    sjoy_poll();
    
    ps2util_sprite_Draw();
    gSprite_Draw_Reset();
    gFont_Draw_Reset();
}