diff Magoroku.cc @ 113:8c96cadde050

after game_team
author Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
date Thu, 09 Jun 2011 18:07:46 +0900
parents 5106d8d12ded
children 3ffda5b493c2 31dd5c07f7c1
line wrap: on
line diff
--- a/Magoroku.cc	Thu Jun 09 14:59:24 2011 +0900
+++ b/Magoroku.cc	Thu Jun 09 18:07:46 2011 +0900
@@ -1,53 +1,62 @@
+//magoroku 関係ココから
 #include "Magoroku.h"
-#include "SgoexCerium.h"
+
 #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"
+//magoroku 関係ココまで
+
+#include "SgoexCerium.h"
 #include <ctype.h>
 #include <math.h>
 #include <time.h>
 #include <SDL.h>
 #include "SDL_opengl.h"
 
-//#include "object.h"
-#include "libps2.h"
-
-#include "tree_controll.h"
+//#include "tree_controll.h"
 #include "xml.h"
 #include "profile.h"
-#include "syokika.h"
-#include "sankaku.h"
-
-//#include "sgoex.h"
-#include "controler.h"
+//#include "syokika.h"
+//#include "sankaku.h"
 
 #include "sound.h"
-#include <stdbool.h>
-#include "bom.h"
-#include "count2.h"
-#include "tokuten.h"
-#include "schedule.h"
-#include "tama.h"
-#include "debug.h"
-#include "trace.h"
+//#include "bom.h"
+//#include "count2.h"
+//#include "tokuten.h"
+//#include "tama.h"
+//#include "debug.h"
+//#include "trace.h"
 #include "LoadSprite.h"
 #include <SDL_mixer.h>
 #include "error.h"
 #include "matrix_calc.h"
 
-#include "Character.h"
-#include "Character_state.h"
-
-static int use_keybord = 0;
-// static int cdp[20] = { 16, 16, 16, 17, 18, 0 };
-static int i;
+//#include "Character.h"
+//#include "Character_state.h"
 
-static int rswait = 0;
-static int cf = 0;
-static int cc = 0;
 
-static int test_mode = 0;
-static const char *test_object  = "" ;
 
 //static SDL_Surface *screen;
 // static Uint32 background;
@@ -55,8 +64,8 @@
 
 extern void schedule();
 extern void tokuten();
-extern void padCheck();
-extern void keybord();
+extern bool padCheck(SDL_Joystick *joy);
+extern bool keybord(void);
 static int gamesyokika(int gamef);
 static int game_pause(int);
 //static char *pad_trace_file;
@@ -102,14 +111,41 @@
 }
 
 
-static int opening(int gamef);
-static int dandy_closing(int gamef);
-static int dandy_main_loop(int gamef);
-static int dandy_main_init(int gamef);
+//Magoroku の初期化など
+/* 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;
+
+// schedule.ccで使用してる
+void linda_env_init( void );
+
+
+//Magoroku の処理
+static void set_schedule(Game *game);
+static void sche_game_init(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);
+
+
 extern int init(TaskManager *manager, int argc, char *argv[]);
 extern void task_initialize();
 static void TMend(TaskManager *manager);
 
+
 //class Application の中の virtual bool app_loop( return 1 だけの関数?) を継承
 bool 
 Magoroku::app_loop(Viewer *viewer){
@@ -117,8 +153,11 @@
     return 0;
 };
 
-//ゲームの分岐に使用
-static int gamef = 0;
+//ゲームの分岐に使用(コールバック)
+//static int gamef = 0;
+static void (*sche_func_assumption)(Game*);
+static void (*sche_func)(Game*) = &sche_game_init;
+static int change_state = 0;
 
 /*
   ゲームの分岐。magoroku の schedule の処理と同等と考えてオッケーかな?
@@ -126,13 +165,7 @@
 HTaskPtr 
 Magoroku::application_task(HTaskPtr next, Viewer* viewer){
     // printf("gamef = %d\n",gamef);
-    switch (gamef) {
-    case 0:    gamef= dandy_main_init(gamef); break;
-    case 1:    gamef= gamesyokika(gamef); break;
-    case 2:    gamef= opening(gamef); break;
-    case 3:    gamef= dandy_main_loop(gamef); break;
-    case 4:    gamef= dandy_closing(gamef); break;
-    }
+    schedule(&game);
     return next;
 }; 
 
@@ -192,334 +225,397 @@
 */
 
 
-/*
-  初期化の処理
-  初期化成功で return 1 だから、次の処理にいくっぽい
-*/
-static int 
-dandy_main_init(int gamef)
-{
-    //Timeprof timeprof_move;
-    //timeprof_move = timeprof_new();
-    dbg_init("/dev/stdout");
-
-    /**
-     * timeprof があるんだけどね
-     */
-    //xml file 読み込む
-    droot->createFromXMLfile("xml/character.xml");
-    droot->createFromXMLfile("xml/font.xml");
-    droot->createFromXMLfile("xml/effect.xml");
-    droot->createFromXMLfile("xml/boss.xml");
-
-    LightSysSwitch(droot);
-
-
-    init_sprite(0,0,0,0);
-
-    __debug("syokikaが呼びだされました\n");
-    joy=SDL_JoystickOpen(0);
-    if(!joy) {
-	fprintf(stderr,"failed to open joystick 0\n");
-	use_keybord = 1;
-    }
-
-    /**
-     * sound.c に移しました
-     * 代わりに InitSdlMixer(void); を使います。
-     * まあ中身一緒なんだけどね
-     */
-    /**
-      if (Mix_OpenAudio(MIX_DEFAULT_FREQUENCY,MIX_DEFAULT_FORMAT,2,1024) < 0) {
-        fprintf(stderr,"failed to initialize SDL_mixer.\n");
-        SDL_Quit();
-        exit(-1);
-      }
-    */
-
-    // SDL_mixer とかいろいろ初期化
-    // もし Init に失敗したら
-    // 以後の Mixer 関連の関数を呼び出しても
-    // 中では何も行われないとかいう小細工を入れました。
-    InitSdlMixer();
-
-    // 音楽ファイルの読み込み
-    LoadSdlMixer();
-
-    // ボリューム調整
-    InitVolume();
-	
-    // 音出しテスト
-    PlaySdlMixer(-1, BGM);
-
-    if(!(init_chara_list(1024))){
-	__debug("failed to init_chara_list\n");
-    }
-
-    __debug("finished init_chara_list\n");
-
-    return 1;
-}
-
-
-//メインループ
-static int
-dandy_main_loop(int gamef)
-{
-	
-
-	if ((pad.l1 != 0) && (pad.r1 != 0) &&
-	    (pad.l2 != 0) && (pad.r2 != 0)) {
-	    gamef = gamesyokika(gamef);
-	}
-
-	if (pad.se != 0) {
-	    gamef = 4;
-	}
-	flip();
-
-	//SDL_FillRect(screen, NULL, background);
-    
-	schedule();
-	enemyfaste = count;
-    
-	// timeprof_begin(timeprof_move);
-	//Move(); //enemy move
-	collision_detect();
-	outofwindow();
-	// timeprof_end(timeprof_move);
-	state_update();
-	asteroidi = 0;
-	//charpatern();
-	//bosguage();
-
-	if (jiki.bf == true) {
-	    Player(0);
-	    count++;
-	    PutSprite(count, jiki.x, jiki.y, jiki.ch);
-	}
-
-	Putbom();
-	tokuten();
-    
-	count++;
-	//PutSprite(count, 0, 960 - 96, 10);
-	/*インフレゲージ */
-	count++;
-	//PutSprite(count, 0, 0, 48);
-
-	obj_draw();
-	gamef = game_pause(gamef);
-
-	if (use_keybord) {
-	    keybord();
-	} else {
-	    padCheck(joy);
-	}
-	filpcount++;
-	count = 0;
-
-	return gamef;
-}
-
-static int
-dandy_closing(int gamef)
-{
-
-    //_______________________________________________
-    // SDL_mixerの後始末
-    Mix_CloseAudio();
-    Mix_HaltMusic();
-    FreeSdlMixer() ;
-    //_______________________________________________
-    return 0;
-}
 
 
-static int
-gamesyokika(int gamef)
+static void
+set_schedule(Game *game)
 {
-    laser_lv3[0].r = 62;
-    laser_lv3[0].r = 62;
-    for (i = 0; i < 3; i++) {
-	tlv3[i].y = -1;
-    }
-    filpcount = 0;
-    stage = 0;
-    //for (i = 0; i < 300; i++)
-    //enemy[i].f = false;
-    jiki.zanki = 3;
-    jiki.x = 60;
-    jiki.y = 200;
-    jiki.ch = 3;
-    jiki.point = 0;
-    jiki.bf = false;
-    jiki.muteki = 120;
-    enemycount = 0;
-    lg.stg = 4096;
-    pg.stg = 4096;
-    infg.stg = 0;
-    infg_level = 0;
-    //kyeenemyno = -1;
-    fastebos = 0;
-    jiki.ccount = 99;
-    p_extend = 200000;
-    pad.up=0;
-    pad.down=0;
-    pad.right=0;
-    pad.left=0;
-    pad.st=0;
-    pad.se=0;
-
-    SoundStop();
-    SoundPlay(7);
-    gamef =  2;
-    flip();  
-    return gamef;
+  sche_func = sche_func_assumption;
+  change_state = 0;
 }
 
-static int
-opening(int gamef)
+static void
+graphic_init()
 {
-    if(use_keybord == 1) {
-	keybord();
-    } else {
-	padCheck(joy);
-    }
-
-    count = 1;
-
-    PutSprite(count, 700, 480, 53); //  put `push start' string on screen.  
-    count++;
-    PutSprite(count, 224, 776, 119); //  put `super dandy'                   
-    count++;
-    //    PutSprite(count, 200, 64, 190);
-    //    PutSpriteEx(count, 8192, 8192, 0);
-    PutSpriteEx(190, 800, 264, 2, 2, 5);
-    count++;
-    PutSprite(count, 396, 432, 191);
-    //PutSpriteEx(count, 8192, 8192, 0);
-    count++;
-    PutSprite(count, 640, 640, 192);
-    //PutSpriteEx(count, 8192, 8192, 0);
-
-    if (pad.st > 1) {
-	jiki.bf = true;
-	
-	//CdPlay(1,&cdp[0],0);                                          
-	SoundStop();
-	SoundPlay(0);
-
-	gamef = 3;
-	pad.st = 1;
-    } else if ((pad.se > 0) && (pad.st > 0)) {
-	gamef = 2;
-    }
-    flip();  
-    return gamef;
+  gSprite_Init(); // グラフィック関連の初期化
+  gFont_Init();   // フォント関連の初期化
 }
 
-static int
-game_pause(int gamef)
+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 )
 {
-    gamef = 3;
-    if (jiki.zanki != 0 && jiki.bf != false) {
-	if (pad.se == 1) {
-	    //Mix_Pause(BGM);
-	    PauseSdlMixer(BGM);
-	    while(1){
-		if(use_keybord == 1) {
-		    keybord();
-		} else {
-		    padCheck(joy);
-		}
-		if(pad.st == 0)
-		    continue;
-		pad.up=0;
-		pad.down=0;
-		pad.right=0;
-		pad.left=0;
-		pad.se=0;
-		pad.st=0;
-		//Mix_Resume(BGM);
-		ResumeSdlMixer(BGM);
-		break;
-	    }
-	}
-    }
-    if (jiki.zanki == 0) {
-	//     RECT *recp;                                                      
-	if ((jiki.ccount > 0) && (cf == 0)) {
-	    cf = 1;
-	    count++;
-	    //cgcg(2);
-	    PutSprite(count, 480, 480, 110);
-	    count++;
-	    //cgcg(1);
-	}
-	if ((jiki.ccount > 0) && (cf == 1)) {
-	  //スタートを押すまでココで止まり続けるから、これは最初のスタート画面か?
-	    while (1) {
-		if (pad.st > 0) {
-		    cf = 0;
-		    jiki.ccount--;
-		    jiki.zanki = 3;
-		    enemycount++;
-		    cc = 0;
-		    for (i = 0; i < 4; i++) {
-			clear_result[i] = 0;
-		    }
-		    goto f;
-		}
-		cc++;
-		if (29 - cc / 60 < 20) {
-		    cc = 0;
-		    cf = 3;
-		    break;
-		}
-		SDL_Delay(100);
-		PutSprite(1, 640, 640, 29 - CC / 60);
-		//      	PutSpriteEx(1, 409 * ((cc % 60) + 1), 409 * ((cc % 60) + 1), 0);
-		
-		padCheck(joy);
-		flip();  // THIS IS NOT CORRECT
-	    }
-	}
-	IF (rswait > 60 * 6) {
-	    cf = 0;
-	    rswait = 0;
-	    gamef = gamesyokika(gamef);
-	}
-	rswait++;
-	count++;
-	//cgcg(1);
-	PutSprite(1, 480, 480, 19);
-	return gamef;
-    }
-    if (jiki.bf == false) {
-    f:
-	if (rswait < 80) {
-	    rswait++;
-	    return gamef;
-	} else {
-	    rswait = 0;
-	    jiki.x = 60;
-	    jiki.y = 200;
-	    jiki.bf = true;
+  printf("linda_env_init\n");
+}
 
-	    pad.st = 0;
-	    lg.stg = 4096;
-	    pg.stg = 4096;
-	    laser_lv3[0].r = 62;
-	    tlv3[0].r = 0;
-	    tlv3[0].y = -1;
-	    return gamef;
-	    // sb_size = -1;                                                    
-	}
-    }
-    return gamef;
+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();
 }
 
 
 
-/* end */
+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)
+{
+  //flip
+  
+  /** 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);
+  }
+  
+  //S-dandy の obj てきな
+}
+
+
+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);
+  }
+
+}