view Dandy.cc @ 10:a6dc38328741

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 08 Dec 2010 00:07:08 +0900
parents c88a4f98b5ef
children 5d2d9369052a
line wrap: on
line source

#include "Dandy.h"


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;

static    int screen_w;
static    int screen_h;

MainLoopPtr
Dandy::init(Viewer *sgroot_, int w, int h)
{
    screen_w = w;
    screen_h = h;
    sgroot = sgroot_;
    return sgroot;
}

Application *
application() {
    return new Dandy();
}


static int dandy_closing(int gamef);
static int dandy_main_loop(int gamef);
static int dandy_main_init(int gamef);

bool 
Dandy::app_loop(Viewer *viewer){
    // don't use allExecute
    return 0;
};

HTaskPtr 
Dandy::application_task(HTaskPtr next, Viewer* viewer){
    int gamef = 0;

    switch (gamef) {
    case 0:    gamef= dandy_main_init(gamef); break;
    case 1:    gamef= dandy_main_loop(gamef); break;
    case 2:    gamef= dandy_closing(gamef); break;
    }
    return next;
}; 



extern int init(TaskManager *manager, int argc, char *argv[]);
extern void task_initialize();
static void TMend(TaskManager *manager);

static void
task_init() 
{
}

int
TMmain(TaskManager *manager,int argc, char *argv[])
{
    task_init();
    task_initialize();
    manager->set_TMend(TMend);

    return init(manager,argc, argv);
}

void
TMend(TaskManager *manager)
{
    printf("game end\n");
}


#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 "Character.h"
#include "Character_state.h"

int gamef = 0;
int use_keybord = 0;
int cdp[20] = { 16, 16, 16, 17, 18, 0 };
int d, i;

int rswait = 0;
int cf = 0;
int cc = 0;

//static SDL_Surface *screen;
static Uint32 background;
// static char *pad_trace_file;

extern void schedule();
extern void tokuten();
extern void Pad();
extern void keybord();
static void gamesyokika(SDL_Joystick *joy);
static void opening(SDL_Joystick *joy);
static void game_pause(SDL_Joystick *joy);
//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
 */
int runmode;

SDL_Joystick *joy;

static int 
dandy_main_init(int gamef)
{
    //Timeprof timeprof_move;
    //timeprof_move = timeprof_new();
    dbg_init("/dev/stdout");

    /**
     * timeprof があるんだけどね
     */

    sgroot->createFromXMLfile("xml/character.xml");
    sgroot->createFromXMLfile("xml/font.xml");
    sgroot->createFromXMLfile("xml/effect.xml");
    sgroot->createFromXMLfile("xml/boss.xml");


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

    opening(joy);

    __debug("openingがよびだされました\n");

    /**
     * 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)
{
	sgroot->sgroot->flip();
	sgroot->sgroot->lightCalc();
	

	if ((pad[0].l1 != 0) && (pad[0].r1 != 0) &&
	    (pad[0].l2 != 0) && (pad[0].r2 != 0)) {
	    gamesyokika(joy);
	}

	if (pad[0].quit != 0) {
	    gamef = 2;
	}

	//SDL_FillRect(screen, NULL, background);
	glClear( GL_COLOR_BUFFER_BIT);		
    
	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();
	game_pause(joy);

	if (use_keybord) {
	    keybord();
	} else {
	    Pad(joy);
	}

	count = 0;
	return gamef;
}

static int
dandy_closing(int gamef)
{

    //_______________________________________________
    // SDL_mixerの後始末
    Mix_CloseAudio();
    Mix_HaltMusic();
    FreeSdlMixer() ;
    //_______________________________________________
    return 0;
}


static void
gamesyokika(SDL_Joystick *joy)
{
    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;
    opening(joy);
}

static void
opening(SDL_Joystick *joy)
{
    //for (i = 0; i < 300; i++) {
    //};

    SoundStop();
    SoundPlay(7);

    while (1) {
	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) {
	    jiki.bf = TRUE;
	    
	    //CdPlay(1,&cdp[0],0);                                          
	    SoundStop();
	    SoundPlay(0);

	    gamef = 1;
	    pad[0].st = 1;
	    return;
	}
	if ((pad[0].se > 0) && (pad[0].st > 0)) {
	    gamef = 0;
	    break;
	}
    }
}

static void
game_pause(SDL_Joystick *joy)
{
    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);

		Pad(joy);
		SDL_GL_SwapBuffers( );
	    }
	}
	if (rswait > 60 * 6) {
	    cf = 0;
	    rswait = 0;
	    gamesyokika(joy);
	}
	rswait++;
	count++;
	//cgcg(1);
	PutSprite(1, 480, 480, 19);
	return;
    }
    if (jiki.bf == FALSE) {
    f:
	if (rswait < 80) {
	    rswait++;
	    return;
	} 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;
	    // sb_size = -1;                                                    
	}
    }
}


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)
{
    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(sptable[number].w);
    m->tex_h = power_of_two(sptable[number].h);
    //texMinX[number] = 0.0f;
    //texMinY[number] = 0.0f;
    //texMaxX[number] = (GLfloat)sptable[number].w / sptable[number].tex_w;
    //texMaxY[number] = (GLfloat)sptable[number].h / sptable[number].tex_h;  
    // printf("texMaxX = %f, w = %d, tex_w = %d\n", texMaxX[number], sptable[number].w, sptable[number].tex_w);
    m->texture = (int *)name;

}

void
PutSprite(int zorder, short x, short y, int number)
{
    SpriteTable *m = &sptable[number];
    char *name = (char *) m->texture;
    SceneGraphPtr object = sgroot->createSceneGraph(name);
    object->xyz[0] = x + screen_w /2;
    object->xyz[1] = y + screen_h /2;
    object->xyz[2] = -100;
}

void
PutSpriteEx(int number, int x, int y, float scalex, float scaley, float angle)
{
    SpriteTable *m = &sptable[number];
    char *name = (char *) m->texture;
    SceneGraphPtr object = sgroot->createSceneGraph(name);
    object->xyz[0] = x + screen_w /2;
    object->xyz[1] = y + screen_h /2;
    object->xyz[2] = -100;
}


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]) {
	SDL_Quit();
	exit(1);
	//pad[0].st = 1;
	//pad[0].se = 1;
    }

    if (keys[SDLK_0]) {
	pad[0].quit = 1;
    } else {
	pad[0].quit = 0;
    }
}


/* end */