Mercurial > hg > Members > koba > t_dandy
view TaskDandy.cc @ 60:cfd42ee2ad28
change makefile, spe/task. adjust scale api. worked on ps3-ppe.
author | yutaka@localhost.localdomain |
---|---|
date | Sun, 06 Feb 2011 17:16:43 +0900 |
parents | cd05eee90279 |
children |
line wrap: on
line source
#include "Dandy.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #include <time.h> #include <SDL.h> #include "SDL_opengl.h" #include "object.h" #include "tree_controll.h" #include "xml.h" #include "profile.h" #include "syokika.h" #include "sankaku.h" #include "sgoex.h" #include "sound.h" #include "bool.h" #include "bom.h" #include "count2.h" #include "tokuten.h" #include "schedule.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" #include "property.h" #include "collision_task.h" #include "state_task.h" #include "StateList.h" #include "Cheat.h" #include "debug_db.h" extern int finish_flag; static int use_keybord = 0; //static int cdp[20] = { 16, 16, 16, 17, 18, 0 }; static int i; static int rswait = 0; static int cf = 0; static int cc = 0; extern void schedule(); extern void tokuten(); extern void Pad(); extern void keybord(); static int gamesyokika(int gamef); static int game_pause(int); static void KeyAssign(int runmode, TraceBuffPtr buff, SDL_Joystick *joy, SGO_PAD *pad); extern void task_init(); DebugDB dtable[DEFOBJ]; static int runmode = 0; static TraceBuffPtr t_buff; static TraceBuffPtr first; static char *pad_trace_file; /** * runmode: * 0 - normal game * 1 - capture mode * program will capture all pad traces on a play and * dump it into a file * 2 - trace mode * program will run with a trace file which is generated * by capture-mode */ static SDL_Joystick *joy; #define SCMP_SIZ 8 const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\ -length Number of data (default DATA_NUM (Func.h))\n\ -count Number of task (default 1)\n"; static Viewer *sgroot; TaskManager *tmanager; static int screen_w; static int screen_h; static int gamef; MainLoopPtr Dandy::init(Viewer *sgroot_, int w, int h) { screen_w = w; screen_h = h; gamef = 0; sgroot = sgroot_; tmanager = sgroot->manager; return sgroot; } Application * application() { return new Dandy(); } static void print_usage(); static int get_option(int argc, char *argv[]); static int opening(int gamef); static int dandy_closing(int gamef); static int dandy_main_loop(int gamef, HTaskPtr next); static int dandy_main_init(int gamef); extern int init(TaskManager *manager, int argc, char *argv[]); extern void task_initialize(); static void TMend(TaskManager *manager); bool Dandy::app_loop(Viewer *viewer){ // don't use allExecute return 0; }; HTaskPtr Dandy::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, next); break; case 4: gamef= dandy_closing(gamef); break; } return next; }; int TMmain(TaskManager *manager,int argc, char *argv[]) { task_init(); task_initialize(); manager->set_TMend(TMend); if (get_option(argc, argv)) { print_usage(); } return init(manager,argc, argv); } void TMend(TaskManager *manager) { printf("game end\n"); } static int light_sysswitch = 1; static int light_num = 4; static void _LightSysSwitch(Viewer *sgroot) { if (light_sysswitch == 1) { sgroot->OffLightSysSwitch(); for (int i = 0; i < light_num; i++) { SceneGraphPtr light = sgroot->getLight(i); sgroot->OnLightSwitch(i); light->xyz[0] = screen_w / 2; light->xyz[1] = screen_h / 2; light->xyz[2] = -100; } } else if (light_sysswitch == 0) { sgroot->OffLightSysSwitch(); } } static void print_usage() { printf("usage: exe_file [-h|-help|--help][-capture filename][-trace filename]\n"); } static int get_option(int argc, char *argv[]) { int i; if (argc < 2) { runmode = 0; return 0; } for (i = 0; i < argc; i++) { if (!strncmp(argv[i], "-capture", SCMP_SIZ)) { if (++i >= argc) { return 1; } printf("Start Capture mode.\n"); t_buff = (TraceBuffPtr)malloc(sizeof(TraceBuff)); t_buff->next = NULL; pad_trace_file = argv[i]; runmode = 1; return 0; } else if (!strncmp(argv[i], "-trace", SCMP_SIZ)) { if (++i >= argc) { return 1; } printf("Start Trace mode.\n"); t_buff = (TraceBuffPtr)malloc(sizeof(TraceBuff)); t_buff->next = NULL; pad_trace_file = argv[i]; runmode = 2; return 0; } else if (!strncmp(argv[i], "--help", SCMP_SIZ) || !strncmp(argv[i], "-help", SCMP_SIZ) || !strncmp(argv[i], "-h", SCMP_SIZ)) { return 1; } } return 1; } static int dandy_main_init(int gamef) { //Timeprof timeprof_move; //timeprof_move = timeprof_new(); dbg_init("/dev/stdout"); /** * timeprof があるんだけどね */ if ((runmode == 1)||(runmode ==2)) { if (!PadfileOpen(pad_trace_file)) { runmode = 0; } else if(runmode == 2) { PadfileRead(t_buff); } first = t_buff; } sgroot->createFromXMLfile("xml/character.xml"); sgroot->createFromXMLfile("xml/font.xml"); sgroot->createFromXMLfile("xml/effect.xml"); sgroot->createFromXMLfile("xml/boss.xml"); _LightSysSwitch(sgroot); 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"); srandom(SEED_VALUE); initStateList(); collision_allocate(); return 1; } SceneGraphPtr root; // extern void get_matrix(float *matrix, float *rxyz, float *txyz, float *scale, float *stack); static void flip() { CameraPtr camera = sgroot->sgroot->getCamera(); sgroot->sgroot->flip(); sgroot->sgroot->lightCalc(); root = sgroot->createSceneGraph(); root->xyz[0] = 0; root->xyz[1] = 0; root->xyz[2] = 30.0f; float scale[] = {1,1,1}; /*親の回転、座標から、子の回転、座標を算出*/ get_matrix(root->matrix, root->angle, root->xyz, camera->matrix); scale_matrix(root->matrix, scale, root->c_xyz); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ get_matrix(root->real_matrix, root->angle, root->xyz, camera->real_matrix); sgroot->setSceneData(root); } static int dandy_main_loop(int gamef, HTaskPtr next) { if ((pad[0].l1 != 0) && (pad[0].r1 != 0) && (pad[0].l2 != 0) && (pad[0].r2 != 0)) { gamef = gamesyokika(gamef); } if ((pad[0].quit != 0)||(finish_flag == 1)) { gamef = 4; } flip(); //SDL_FillRect(screen, NULL, background); schedule(); enemyfaste = count; if (jiki.bf == TRUE) { Player(0); count++; PutSprite(count, jiki.x, jiki.y, jiki.ch); } Putbom(); tokuten(); asteroidi = 0; // timeprof_begin(timeprof_move); outofwindow(); // timeprof_end(timeprof_move); //charpatern(); //bosguage(); //count++; //PutSprite(count, 0, 960 - 96, 10); /*インフレゲージ */ //count++; //PutSprite(count, 0, 0, 48); obj_draw(); gamef = game_pause(gamef); HTaskPtr state_next = create_next(); state_update(); HTaskPtr update = collision_update(); HTaskPtr reflect = collision_reflect(); collision_detect(); next->wait_for(state_next); next->wait_for(reflect); state_next->spawn(); update->spawn(); reflect->spawn(); KeyAssign(runmode, t_buff, joy, pad); filpcount++; count = 0; return gamef; } static int dandy_closing(int gamef) { if (runmode == 1) { PadfileWrite(first); PadfileClose(first); } else if (runmode == 2) { PadfileClose(first); } SDL_Event usr_event; usr_event.type = SDL_QUIT; SDL_PushEvent(&usr_event); collision_free(); //_______________________________________________ // SDL_mixerの後始末 Mix_CloseAudio(); Mix_HaltMusic(); FreeSdlMixer() ; //_______________________________________________ return 0; } static int gamesyokika(int gamef) { 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[0].up=0; pad[0].down=0; pad[0].right=0; pad[0].left=0; pad[0].st=0; pad[0].se=0; SoundStop(); SoundPlay(7); gamef = 2; flip(); return gamef; } static int opening(int gamef) { if(use_keybord == 1) { keybord(); } else { Pad(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[0].st > 1)||(runmode == 2)) { jiki.bf = TRUE; //CdPlay(1,&cdp[0],0); SoundStop(); SoundPlay(0); gamef = 3; pad[0].st = 1; } else if ((pad[0].se > 0) && (pad[0].st > 0)) { gamef = 2; } flip(); return gamef; } static int game_pause(int gamef) { if (jiki.zanki != 0 && jiki.bf != FALSE) { if (pad[0].se == 1) { //Mix_Pause(BGM); PauseSdlMixer(BGM); while(1){ if(use_keybord == 1) { keybord(); } else { Pad(joy); } if(pad[0].st == 0) continue; pad[0].up=0; pad[0].down=0; pad[0].right=0; pad[0].left=0; pad[0].se=0; pad[0].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(2, 480, 480, 110); count++; //cgcg(1); } if ((jiki.ccount > 0) && (cf == 1)) { while (1) { if (pad[0].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); if(use_keybord == 1) { keybord(); } else { Pad(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; pad[0].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; } SpriteTable sptable[DEFOBJ]; void DefSpriteEx(int number, short middlex, short middley) { sptable[number].mx = middlex; sptable[number].my = middley; } void DefSprite(int number, const char *name, float w, float h, int color, OBJECT *obj) { dtable[number].name = name; dtable[number].count = 0; SpriteTable *m = &sptable[number]; m->w = w; m->h = h; m->color = (color & 32); m->mx = w / 2; m->my = h / 2; m->tex_w = power_of_two(m->w); m->tex_h = power_of_two(m->h); m->texture = (int *)name; } static float my_scale = 5; void PutSprite(int zorder, short x, short y, int number) { SpriteTable *m = &sptable[number]; char *name = (char *) m->texture; if (!name) { // printf("PutSprite %d unknown\n",number); return; } SceneGraphPtr object = sgroot->createSceneGraph(name); object->xyz[0] = x - object->c_xyz[0]*my_scale; object->xyz[1] = y - object->c_xyz[1]*my_scale; object->xyz[2] = 0; root->addChild(object); float scale[] = {my_scale,my_scale,1}; /*親の回転、座標から、子の回転、座標を算出*/ get_matrix(object->matrix, object->angle, object->xyz, root->matrix); scale_matrix(object->matrix, scale, object->c_xyz); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ get_matrix(object->real_matrix, object->angle, object->xyz, root->real_matrix); } void PutSpriteEx(int number, int x, int y, float scalex, float scaley, float angle) { SpriteTable *m = &sptable[number]; char *name = (char *) m->texture; if (!name) { // printf("PutSpriteEx %d unknown\n",number); return; } SceneGraphPtr object = sgroot->createSceneGraph(name); object->xyz[0] = x - object->c_xyz[0]*my_scale - m->w*my_scale; object->xyz[1] = y - object->c_xyz[0]*my_scale - m->w*my_scale; object->xyz[2] = 0; object->c_xyz[0] = m->mx; object->c_xyz[1] = m->my; object->angle[3] = angle; root->addChild(object); float scale[] = {5*scalex,5*scaley,1}; /*親の回転、座標から、子の回転、座標を算出*/ get_matrix(object->matrix, object->angle, object->xyz, root->matrix); scale_matrix(object->matrix, scale, object->c_xyz); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ get_matrix(object->real_matrix, object->angle, object->xyz, root->real_matrix); } struct SGO_PAD pad[2]; /* コントローラ状態の読み込み */ void Pad(SDL_Joystick *joy) { Sint16 axis; SDL_JoystickUpdate(); if(SDL_JoystickGetButton(joy,PS2_CROSS)==SDL_PRESSED) pad[0].k0++; else pad[0].k0=0; if(SDL_JoystickGetButton(joy,PS2_CIRCLE)==SDL_PRESSED) pad[0].k1++; else pad[0].k1=0; if(SDL_JoystickGetButton(joy,PS2_SQUARE)==SDL_PRESSED) pad[0].k3++; else pad[0].k3=0; if(SDL_JoystickGetButton(joy,PS2_TRIANGLE)==SDL_PRESSED) pad[0].k4++; else pad[0].k4=0; if(SDL_JoystickGetButton(joy,PS2_L1)==SDL_PRESSED) pad[0].l1++; else pad[0].l1=0; if(SDL_JoystickGetButton(joy,PS2_R1)==SDL_PRESSED) pad[0].r1++; else pad[0].r1=0; if(SDL_JoystickGetButton(joy,PS2_L2)==SDL_PRESSED) pad[0].l2++; else pad[0].l2=0; if(SDL_JoystickGetButton(joy,PS2_R2)==SDL_PRESSED) pad[0].r2++; else pad[0].r2=0; if(SDL_JoystickGetButton(joy,PS2_START)==SDL_PRESSED) pad[0].st++; else pad[0].st=0; if(SDL_JoystickGetButton(joy,PS2_SELECT)==SDL_PRESSED) pad[0].se++; else pad[0].se=0; if(SDL_JoystickGetButton(joy,PS2_L3)==SDL_PRESSED) pad[0].l3++; else pad[0].l3=0; if(SDL_JoystickGetButton(joy,PS2_R3)==SDL_PRESSED) pad[0].r3++; else pad[0].r3=0; //x axis=SDL_JoystickGetAxis(joy,0); if(axis>=3200){ pad[0].left=0; pad[0].right++; } else if(axis<=-3200){ pad[0].right=0; pad[0].left++; } else { pad[0].right=0; pad[0].left=0; } //y axis=SDL_JoystickGetAxis(joy,1); if(axis>=3200){ pad[0].up=0; pad[0].down++; } else if(axis<=-3200){ pad[0].down=0; pad[0].up++; } else { pad[0].down=0; pad[0].up=0; } if ((pad[0].l1 != 0) && (pad[0].r1 != 0) && (pad[0].l2 != 0) && (pad[0].r2 != 0) && (pad[0].st != 0) && (pad[0].se != 0)) { pad[0].quit = 1; } else { pad[0].quit = 0; } } void keybord() { SDL_PumpEvents(); Uint8 *keys = SDL_GetKeyState(NULL); if (keys[SDLK_UP]) { pad[0].up++; } else { pad[0].up = 0; } if (keys[SDLK_DOWN]) { pad[0].down++; } else { pad[0].down = 0; } if (keys[SDLK_RIGHT]) { pad[0].right++; } else { pad[0].right = 0; } if (keys[SDLK_LEFT]) { pad[0].left++; } else { pad[0].left = 0; } if (keys[SDLK_a]) { pad[0].k0++; } else { pad[0].k0 = 0; } if (keys[SDLK_z]) { pad[0].k1++; } else { pad[0].k1 = 0; } if (keys[SDLK_s]) { pad[0].k3++; } else { pad[0].k3 = 0; } if (keys[SDLK_x]) { pad[0].k4++; } else { pad[0].k4 = 0; } if (keys[SDLK_r]) { pad[0].r2++; } else { pad[0].r2 = 0; } if (keys[SDLK_e]) { pad[0].r1++; } else { pad[0].r1 = 0; } if (keys[SDLK_w]) { pad[0].l1++; } else { pad[0].l1 = 0; } if (keys[SDLK_q]) { pad[0].l2++; } else { pad[0].l2 = 0; } // START ボタンは Return が似合う気がする //if(keys[SDLK_1]) if (keys[SDLK_RETURN]) { pad[0].st++; } else { pad[0].st = 0; } if (keys[SDLK_2]) { pad[0].se++; } else { pad[0].se = 0; } if (keys[SDLK_ESCAPE]) { pad[0].quit = 1; } if (keys[SDLK_0]) { pad[0].quit = 1; } else { pad[0].quit = 0; } } static void KeyAssign(int runmode, TraceBuffPtr buff, SDL_Joystick *joy, SGO_PAD *pad) { switch (runmode) { case 0: if (use_keybord) { keybord(); } else { Pad(joy); } break; case 1: if (use_keybord) { keybord(); } else { Pad(joy); } cheat(); t_buff = CapturePad(t_buff, pad); break; case 2: t_buff = TracePad(t_buff, pad); cheat(); break; } } /* end */