diff --git a/Fase1.h b/Fase1.h index 224bb1bd4e304c5062d8b855121bbe9c43a863c5..c80fe3ca3b85ef7d024cde394b83c07f62c326fb 100644 --- a/Fase1.h +++ b/Fase1.h @@ -8,7 +8,7 @@ #include <allegro5/allegro_ttf.h> #endif -void fase1(Window win,Magia fireball[4][2],ALLEGRO_FONT *font,int explox[4][2],int exploy[4][2],Pessoa *p,Sprite s) +void fase1(Window win, Pessoa *p, Sprite s, Magias m) { int njogadores = 4; @@ -22,10 +22,10 @@ void fase1(Window win,Magia fireball[4][2],ALLEGRO_FONT *font,int explox[4][2],i for(i=0; i<njogadores; ++i) { p[i].x = 100 + 50*i; p[i].y = 200; + cor[i] = i+1; puxa[i] = false; - temneon[i] = true; flash[i] = 0; - cor[i] = i+1; + temneon[i] = true; } errext = fopen("err.txt","w"); @@ -64,7 +64,7 @@ void fase1(Window win,Magia fireball[4][2],ALLEGRO_FONT *font,int explox[4][2],i graphdeinit(win); exit(1); } else if(ev.type == ALLEGRO_EVENT_KEY_DOWN) { // Detecta se apertaram alguma tecla. - keyboard_down(ev.keyboard.keycode,puxa,flash,fireball,p); + keyboard_down(ev.keyboard.keycode,puxa,flash,p,&m); } else if(ev.type == ALLEGRO_EVENT_KEY_UP) { // Detecta se soltaram alguma tecla. keyboard_up(ev.keyboard.keycode,puxa,&sair,p); } else if (al_is_event_queue_empty(win.event_queue)) { // Nao ocorreu nenhum evento. @@ -72,7 +72,7 @@ void fase1(Window win,Magia fireball[4][2],ALLEGRO_FONT *font,int explox[4][2],i al_clear_to_color(PRETO); al_draw_bitmap(map,0,0,0); - usa_magias(matriz,fireball,p,njogadores,s,explox,exploy,flash); + usa_magias(matriz,p,njogadores,s,flash,&m); tira_neon(puxa,temneon,p); diff --git a/colisao.c b/colisao.c index 41ef49788dc30a2196e1235068d8ab92e23de168..1d6332158a05320d3980009bdcf0e3476f800c8e 100644 --- a/colisao.c +++ b/colisao.c @@ -9,12 +9,12 @@ char** le_matriz(FILE *fp) //FILE *fp = ; matriz = (char**)calloc(TAM,sizeof(char*)); - for(i=0;i<TAM;i++) + for(i=0; i<TAM; ++i) matriz[i] = (char*)calloc(TAM,sizeof(char)); - for(i=0;i<TAM;i++) + for(i=0; i<TAM; ++i) { - for(j=0;j<TAM;j++){ + for(j=0; j<TAM; ++j){ fscanf(fp,"%c",&matriz[j][i]); } fscanf(fp,"\n"); @@ -25,23 +25,23 @@ char** le_matriz(FILE *fp) int contato_proximo(int i,int j, Pessoa *p) { // I eh o char que tah realizando a acao, J eh o cara que talvez foi atacado / puxado o neon if(p[i].andou_c == 1 || (p[i].andou_b == 0 && p[i].andou_c == 0 && p[i].andou_d == 0 && p[i].andou_e == 0)) { // Olhando pra cima. - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (p[i].y-p[j].y<=24 && p[i].y-p[j].y>=0) && (p[i].x-p[j].x<=8 && p[i].x-p[j].x>=-8 ) ) ) return j; } } else if(p[i].andou_d == 1) { // Olhando pra direita. - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (p[i].y-p[j].y<=8 && p[i].y-p[j].y>=-8) && (p[i].x-p[j].x<=0 && p[i].x-p[j].x>=-32 ) ) ) return j; } } else if(p[i].andou_e == 1) { - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (p[i].y-p[j].y<=8 && p[i].y-p[j].y>=-8) && (p[i].x-p[j].x<=32 && p[i].x-p[j].x>=0 ) ) ) return j; } } if(p[i].andou_b == 1) { // Olhando pra baixo. OBS: AQUI EH MESMO IF E NAO ELSE IF?? - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (p[i].y-p[j].y<=0 && p[i].y-p[j].y>=-24) && (p[i].x-p[j].x<=8 && p[i].x-p[j].x>=-8 ) ) ) return j; } @@ -54,23 +54,23 @@ int contato_proximo_direcionado(int x,int y,int i,int j,int d, Pessoa *p) /* x e y eh a posicao de quem tah andando (ex: fireball, char), cx e cy usados pra verificar se * * bateu em algum outro char. D eh a dire�ao (0 = cima, 1 = direita, 2 = esquerda, 3 = baixo) */ if(d == 0) { // Olhando pra cima. - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (y-p[j].y<=24 && y-p[j].y>=0) && (x-p[j].x<=8 && x-p[j].x>=-8 ) ) ) return j; } } else if(d == 1) { // Olhando pra direita. - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (y-p[j].y<=8 && y-p[j].y>=-8) && (x-p[j].x<=0 && x-p[j].x>=-32 ) ) ) return j; } } else if(d == 2) { - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (y-p[j].y<=8 && y-p[j].y>=-8) && (x-p[j].x<=32 && x-p[j].x>=0 ) ) ) return j; } } if(d == 3) { // Olhando pra baixo. - for(j=0;j<4;j++) { + for(j=0; j<4; ++j) { if(j!=i && ( (y-p[j].y<=0 && y-p[j].y>=-24) && (x-p[j].x<=8 && x-p[j].x>=-8 ) ) ) return j; } @@ -88,7 +88,7 @@ int colisao_fireball(char** map,int x,int y,int d) int ym = y/4; switch(d) { case 0: // Fireball pra cima - for(i=0;i<4;i++) { + for(i=0; i<4; ++i) { if(map[xm+8+i][ym+1] == '3' || map[xm+8+i][ym+2] == '3') return 1; } @@ -171,7 +171,7 @@ X X B B B B X X */ { int i,j,coordx[5],coordy[5]; - for(i=0;i<5;i++) { + for(i=0; i<5; ++i) { coordx[i] = (p[i].x)/4; coordy[i] = (p[i].y)/4; } @@ -186,16 +186,16 @@ X X B B B B X X switch(caso) { case BAIXO: // Tentou andar pra baixo. - for(i=0;i<4;i++) // Colisoes com o mapa. + for(i=0; i<4; ++i) // Colisoes com o mapa. if((map[x+2+i][y+8] =='0')||(map[x+2+i][y+8] == '3')) return 1; - for(i=0;i<5;i++) // Colisoes com os chars. + for(i=0; i<5; ++i) // Colisoes com os chars. if(coordy[i]-4 == y && ((x==coordx[i]+3)||(x==coordx[i]+2)||(x==coordx[i]+1)||(x==coordx[i])||(x==coordx[i]-1)||(x==coordx[i]-2)||(x==coordx[i]-3))&& i!=eu) return 1; break; case ESQ: // Tentou andar pra esquerda. - for(i=0;i<4;i++) + for(i=0; i<4; ++i) if(map[x+1][y+4+i] == '3' || map[x+1][y+4+i] == '0') return 1; if(x<=0) // Nao deixa ele passar do limite esquerdo do display. @@ -203,25 +203,25 @@ X X B B B B X X return 1; } - for(i=0;i<5;i++) // Colisoes com os chars. + for(i=0; i<5; ++i) // Colisoes com os chars. if(coordx[i]+5 == x && ((y==coordy[i]+3)||(y==coordy[i]+2)||(y==coordy[i]+1)||(y==coordy[i])||(y==coordy[i]-1)||(y==coordy[i]-2)||(y==coordy[i]-3)) && i!=eu) return 1; break; case CIMA: // Tentou andar pra cima. - for(i=0;i<4;i++) + for(i=0; i<4; ++i) if(map[x+2+i][y+3] == '3' || map[x+2+i][y+3] == '0') return 1; - for(i=0;i<5;i++) // Colisoes com os chars. + for(i=0; i<5; ++i) // Colisoes com os chars. if(coordy[i]+4 == y && ((x==coordx[i]+3)||(x==coordx[i]+2)||(x==coordx[i]+1)||(x==coordx[i])||(x==coordx[i]-1)||(x==coordx[i]-2)||(x==coordx[i]-3))&& i!=eu) return 1; break; case DIR: // Tentou andar pra direita. - for(i=0;i<4;i++) + for(i=0; i<4; ++i) if(map[x+6][y+4+i] == '3' || map[x+6][y+4+i] == '0') return 1; - for(i=0;i<5;i++) // Colisoes com os chars. + for(i=0; i<5; ++i) // Colisoes com os chars. if(coordx[i]-5 == x && ((y==coordy[i]+3)||(y==coordy[i]+2)||(y==coordy[i]+1)||(y==coordy[i])||(y==coordy[i]-1)||(y==coordy[i]-2)||(y==coordy[i]-3)) && i!=eu) return 1; break; diff --git a/colisao.h b/colisao.h index f72a1a71d9a559bed55e9319ed622d65bb690d59..fb261ca9eeb6ce0eb561eade1371d15bbb4bc579 100644 --- a/colisao.h +++ b/colisao.h @@ -31,13 +31,18 @@ typedef struct Pessoa { } Pessoa; typedef struct Magia { - int dano,x,y,dist; + int dano,x,y,dist,xexpl,yexpl; bool ativa,explosao; ALLEGRO_BITMAP* sprite; int d; /* Direcao == -1 significa que nao foi calculada ainda. * 0 = cima; 1 = direita; 2 = esquerda; 3 = baixo; */ } Magia; +typedef struct Magias { + int explox[4][2], exploy[4][2]; // Selecionam a posicao da explosao no bitmap explo.bmp. + Magia fireball[4][2]; +} Magias; + typedef struct Sprite { //*tiles,*chars,*map,*frente,**neons,**fireballs,*explosion; ALLEGRO_BITMAP *tiles; // Usado pra coisas dos mapas. diff --git a/imprime.c b/imprime.c index b9541cc48ff0a7f13c817655468da47e7f3d4bcf..d06b431acdec14e72b20d9c72d8601acc6ee378f 100644 --- a/imprime.c +++ b/imprime.c @@ -18,11 +18,11 @@ void imprime_pessoa(Pessoa p) { printf("andou_b = %d, andou_c = %d, andou_d = %d, andou_e = %d\n", p.andou_b, p.andou_c, p.andou_d, p.andou_e); printf("botoes: b = %s, c = %s, d = %s, e = %s\nbotao_char: ", p.botao_b, p.botao_c, p.botao_d, p.botao_e); - /*for(int i=0; i<7; i++) { // Isso ta errado. + /*for(int i=0; i<7; ++i) { // Isso ta errado. printf("(%d): %c, ", i+1, p.botao_char[i]); }*/ printf("\nenergia: %d, correr: %d, morto: %d, dash: %d, comp: %d, time: %d\n", p.energia, p.correr, p.morto, p.dash, p.comp, p.time); - for(int i=0; i<7; i++) { + for(int i=0; i<7; ++i) { printf("(%d): %d, ", i+1, p.botao_char_int[i]); } printf("\n"); @@ -46,7 +46,7 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad { int i,j,selecx,selecy,char4; /* Calcula a posi�ao dos neons */ - for(i=0; i<njogadores; i++) { + for(i=0; i<njogadores; ++i) { p[i].xneon = p[i].x+8; p[i].yneon = p[i].y+8; } @@ -65,7 +65,7 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad } /* Tentativa de transformar tudo em um for */ - for(i=0; i<njogadores; i++) { + for(i=0; i<njogadores; ++i) { if(p[i].hp <= 0) { al_draw_bitmap(s.dead,p[i].x,p[i].y,0); continue; diff --git a/imprime.h b/imprime.h index e18911f6b010b94e7358d72ed12eb69f2ebf861e..9916ba6f492fdc750730971995db934b0e03591d 100644 --- a/imprime.h +++ b/imprime.h @@ -23,8 +23,6 @@ #define LARGURA_CHAR 32 #define ALTURA_CHAR 32 -//extern Pessoa pessoa[4]; - void imprime_pessoa(Pessoa p); void imprime_char(int cx,int cy,int a,int b,int selx,int sely,Sprite s); void imprime_neon(int x,int y,ALLEGRO_BITMAP* neon,bool temneon); diff --git a/keys.c b/keys.c index 3a70c16d60c245e03554ec968d2507c9525379e7..7ed1371afb6a7bd4b4913cb87c8cddcfd625e5eb 100644 --- a/keys.c +++ b/keys.c @@ -1,7 +1,7 @@ #include "keys.h" -void teclas_iniciais(Pessoa *pessoa) +void teclas_iniciais(Pessoa *p, FILE *errext) { /* Botoes: @@ -14,66 +14,92 @@ void teclas_iniciais(Pessoa *pessoa) [6] --> Tlep. */ - sprintf(pessoa[0].botao_char[0],"%c",'^'); - sprintf(pessoa[0].botao_char[1],"%c",'|'); - sprintf(pessoa[0].botao_char[2],"%c",'>'); - sprintf(pessoa[0].botao_char[3],"%c",'<'); - sprintf(pessoa[0].botao_char[4],"%c",ALLEGRO_KEY_RCTRL+96); - sprintf(pessoa[0].botao_char[5],"%c",ALLEGRO_KEY_ALTGR+96); + // Não sei exatamente o que faz isso. É bom dar uma olhada. + for(int i=0; i<4; ++i) { + for(int j=0; j<7; ++j) { + p[i].botao_char[j] = (char*) malloc(30 * sizeof(char)); + if(!(p[i].botao_char[j])) { + fprintf(errext,"Falha ao alocar memoria para p[%d].botao_char[%d]",i,j); + fclose(errext); + exit(1); + } + } + sprintf(p[i].botao_char[0],"%c",98); + sprintf(p[i].botao_char[1],"%c",99); + sprintf(p[i].botao_char[2],"%c",100); + sprintf(p[i].botao_char[3],"%c",101); + sprintf(p[i].botao_char[4],"%c",97); + sprintf(p[i].botao_char[5],"%c",97); + sprintf(p[i].botao_char[6],"%c",97); + p[i].nome = (char*) malloc(30*sizeof(char)); + if(!p[i].nome) { + fprintf(errext,"Falha ao alocar memoria para p[%d].nome",i); + fclose(errext); + exit(1); + } + sprintf(p[i].nome,"player %d",i+1); + } + + sprintf(p[0].botao_char[0],"%c",'^'); + sprintf(p[0].botao_char[1],"%c",'|'); + sprintf(p[0].botao_char[2],"%c",'>'); + sprintf(p[0].botao_char[3],"%c",'<'); + sprintf(p[0].botao_char[4],"%c",ALLEGRO_KEY_RCTRL+96); + sprintf(p[0].botao_char[5],"%c",ALLEGRO_KEY_ALTGR+96); - sprintf(pessoa[1].botao_char[0],"%c",ALLEGRO_KEY_I+96); - sprintf(pessoa[1].botao_char[1],"%c",ALLEGRO_KEY_K+96); - sprintf(pessoa[1].botao_char[2],"%c",ALLEGRO_KEY_L+96); - sprintf(pessoa[1].botao_char[3],"%c",ALLEGRO_KEY_J+96); - sprintf(pessoa[1].botao_char[4],"%c",ALLEGRO_KEY_U+96); - sprintf(pessoa[1].botao_char[5],"%c",ALLEGRO_KEY_O+96); + sprintf(p[1].botao_char[0],"%c",ALLEGRO_KEY_I+96); + sprintf(p[1].botao_char[1],"%c",ALLEGRO_KEY_K+96); + sprintf(p[1].botao_char[2],"%c",ALLEGRO_KEY_L+96); + sprintf(p[1].botao_char[3],"%c",ALLEGRO_KEY_J+96); + sprintf(p[1].botao_char[4],"%c",ALLEGRO_KEY_U+96); + sprintf(p[1].botao_char[5],"%c",ALLEGRO_KEY_O+96); - sprintf(pessoa[2].botao_char[0],"%c",ALLEGRO_KEY_T+96); - sprintf(pessoa[2].botao_char[1],"%c",ALLEGRO_KEY_G+96); - sprintf(pessoa[2].botao_char[2],"%c",ALLEGRO_KEY_H+96); - sprintf(pessoa[2].botao_char[3],"%c",ALLEGRO_KEY_F+96); - sprintf(pessoa[2].botao_char[4],"%c",ALLEGRO_KEY_R+96); - sprintf(pessoa[2].botao_char[5],"%c",ALLEGRO_KEY_Y+96); + sprintf(p[2].botao_char[0],"%c",ALLEGRO_KEY_T+96); + sprintf(p[2].botao_char[1],"%c",ALLEGRO_KEY_G+96); + sprintf(p[2].botao_char[2],"%c",ALLEGRO_KEY_H+96); + sprintf(p[2].botao_char[3],"%c",ALLEGRO_KEY_F+96); + sprintf(p[2].botao_char[4],"%c",ALLEGRO_KEY_R+96); + sprintf(p[2].botao_char[5],"%c",ALLEGRO_KEY_Y+96); - sprintf(pessoa[3].botao_char[0],"%c",ALLEGRO_KEY_W+96); - sprintf(pessoa[3].botao_char[1],"%c",ALLEGRO_KEY_S+96); - sprintf(pessoa[3].botao_char[2],"%c",ALLEGRO_KEY_D+96); - sprintf(pessoa[3].botao_char[3],"%c",ALLEGRO_KEY_A+96); - sprintf(pessoa[3].botao_char[4],"%c",ALLEGRO_KEY_Q+96); - sprintf(pessoa[3].botao_char[5],"%c",ALLEGRO_KEY_E+96); + sprintf(p[3].botao_char[0],"%c",ALLEGRO_KEY_W+96); + sprintf(p[3].botao_char[1],"%c",ALLEGRO_KEY_S+96); + sprintf(p[3].botao_char[2],"%c",ALLEGRO_KEY_D+96); + sprintf(p[3].botao_char[3],"%c",ALLEGRO_KEY_A+96); + sprintf(p[3].botao_char[4],"%c",ALLEGRO_KEY_Q+96); + sprintf(p[3].botao_char[5],"%c",ALLEGRO_KEY_E+96); - pessoa[0].botao_char_int[0] = ALLEGRO_KEY_UP; - pessoa[0].botao_char_int[1] = ALLEGRO_KEY_DOWN; - pessoa[0].botao_char_int[2] = ALLEGRO_KEY_RIGHT; - pessoa[0].botao_char_int[3] = ALLEGRO_KEY_LEFT; - pessoa[0].botao_char_int[4] = ALLEGRO_KEY_RCTRL; - pessoa[0].botao_char_int[5] = ALLEGRO_KEY_ALTGR; + p[0].botao_char_int[0] = ALLEGRO_KEY_UP; + p[0].botao_char_int[1] = ALLEGRO_KEY_DOWN; + p[0].botao_char_int[2] = ALLEGRO_KEY_RIGHT; + p[0].botao_char_int[3] = ALLEGRO_KEY_LEFT; + p[0].botao_char_int[4] = ALLEGRO_KEY_RCTRL; + p[0].botao_char_int[5] = ALLEGRO_KEY_ALTGR; - pessoa[1].botao_char_int[0] = ALLEGRO_KEY_I; - pessoa[1].botao_char_int[1] = ALLEGRO_KEY_K; - pessoa[1].botao_char_int[2] = ALLEGRO_KEY_L; - pessoa[1].botao_char_int[3] = ALLEGRO_KEY_J; - pessoa[1].botao_char_int[4] = ALLEGRO_KEY_U; - pessoa[1].botao_char_int[5] = ALLEGRO_KEY_O; + p[1].botao_char_int[0] = ALLEGRO_KEY_I; + p[1].botao_char_int[1] = ALLEGRO_KEY_K; + p[1].botao_char_int[2] = ALLEGRO_KEY_L; + p[1].botao_char_int[3] = ALLEGRO_KEY_J; + p[1].botao_char_int[4] = ALLEGRO_KEY_U; + p[1].botao_char_int[5] = ALLEGRO_KEY_O; - pessoa[2].botao_char_int[0] = ALLEGRO_KEY_T; - pessoa[2].botao_char_int[1] = ALLEGRO_KEY_G; - pessoa[2].botao_char_int[2] = ALLEGRO_KEY_H; - pessoa[2].botao_char_int[3] = ALLEGRO_KEY_F; - pessoa[2].botao_char_int[4] = ALLEGRO_KEY_R; - pessoa[2].botao_char_int[5] = ALLEGRO_KEY_Y; + p[2].botao_char_int[0] = ALLEGRO_KEY_T; + p[2].botao_char_int[1] = ALLEGRO_KEY_G; + p[2].botao_char_int[2] = ALLEGRO_KEY_H; + p[2].botao_char_int[3] = ALLEGRO_KEY_F; + p[2].botao_char_int[4] = ALLEGRO_KEY_R; + p[2].botao_char_int[5] = ALLEGRO_KEY_Y; - pessoa[3].botao_char_int[0] = ALLEGRO_KEY_W; - pessoa[3].botao_char_int[1] = ALLEGRO_KEY_S; - pessoa[3].botao_char_int[2] = ALLEGRO_KEY_D; - pessoa[3].botao_char_int[3] = ALLEGRO_KEY_A; - pessoa[3].botao_char_int[4] = ALLEGRO_KEY_Q; - pessoa[3].botao_char_int[5] = ALLEGRO_KEY_E; + p[3].botao_char_int[0] = ALLEGRO_KEY_W; + p[3].botao_char_int[1] = ALLEGRO_KEY_S; + p[3].botao_char_int[2] = ALLEGRO_KEY_D; + p[3].botao_char_int[3] = ALLEGRO_KEY_A; + p[3].botao_char_int[4] = ALLEGRO_KEY_Q; + p[3].botao_char_int[5] = ALLEGRO_KEY_E; return; } -void keyboard_down(int evkeyboardkeycode,bool *puxa,int *flash,Magia (*fireball)[2], Pessoa *p) +void keyboard_down(int evkeyboardkeycode,bool *puxa,int *flash, Pessoa *p, Magias *m) // Provavelmente, quando eu achei a tecla que foi apertada, posso dar um return, e melhorar a eficiencia da função. { for(int i=0; i<4; ++i) { @@ -99,18 +125,18 @@ void keyboard_down(int evkeyboardkeycode,bool *puxa,int *flash,Magia (*fireball) /* Primeiro Player */ /* Magias */ case ALLEGRO_KEY_Z: - if(fireball[0][0].ativa == true && p[0].energia >= 50 && fireball[0][1].ativa == false) { - fireball[0][1].ativa = true; - fireball[0][1].x = p[0].x; - fireball[0][1].y = p[0].y; - fireball[0][1].dist = 0; + if(m->fireball[0][0].ativa == true && p[0].energia >= 50 && m->fireball[0][1].ativa == false) { + m->fireball[0][1].ativa = true; + m->fireball[0][1].x = p[0].x; + m->fireball[0][1].y = p[0].y; + m->fireball[0][1].dist = 0; p[0].energia -= 50; } else if(p[0].energia >= 50) { - fireball[0][0].ativa = true; - fireball[0][0].x = p[0].x; - fireball[0][0].y = p[0].y; - fireball[0][0].dist = 0; + m->fireball[0][0].ativa = true; + m->fireball[0][0].x = p[0].x; + m->fireball[0][0].y = p[0].y; + m->fireball[0][0].dist = 0; p[0].energia -= 50; } /* Segundo Player */ diff --git a/keys.h b/keys.h index 9c5b015bde605da197755d84ca5664fa8620b4f3..71ab60080995544b9cb590876f5bd2e630fdfa95 100644 --- a/keys.h +++ b/keys.h @@ -16,9 +16,9 @@ //extern Pessoa pessoa[4]; -void keyboard_down(int evkeyboardkeycode,bool *puxa,int *flash,Magia (*fireball)[2], Pessoa *p); +void teclas_iniciais(Pessoa *pessoa, FILE *errext); +void keyboard_down(int evkeyboardkeycode,bool *puxa,int *flash, Pessoa *p, Magias *m); void keyboard_up(int evkeyboardkeycode,bool *puxa,bool *sair, Pessoa *p); -void teclas_iniciais(Pessoa *pessoa); /* b 2 diff --git a/magia.c b/magia.c index 26a8f85ac19a46761bf58b26bc23d4b5def80f06..2c987d2d2dc85edee1790667944a5f42e85a4a3c 100644 --- a/magia.c +++ b/magia.c @@ -1,16 +1,31 @@ #include "magia.h" +void init_magias(Magias *m) { + int i,j; + for(i=0; i<4; ++i) { + for(j=0; j<2; ++j) { + m->fireball[i][j].ativa = false; // Nao foi usada. + m->fireball[i][j].dano = 200; // Dano da tecnica. + m->fireball[i][j].explosao = false; // Nao colidiu / chegou na distancia limite. + m->fireball[i][j].dist = 0; // Nao percorreu nenhuma distancia. + m->fireball[i][j].d = -1; // Nao tem direçao. + m->explox[i][j] = 280; + m->exploy[i][j] = 220; + } + } +} + void tira_neon(bool *puxa,bool *temneon, Pessoa *p) { int i,j; - for(i=0;i<4;i++) { + for(i=0; i<4; ++i) { if(puxa[i]) { if(j = contato_proximo(i,j,p) != 5) temneon[j] = false; } } - for(i=0;i<4;i++) // Pra nao contar como se estivesse sempre tentando puxar. + for(i=0; i<4; ++i) // Pra nao contar como se estivesse sempre tentando puxar. puxa[i] = false; return ; @@ -21,7 +36,7 @@ void calcula_energia(Pessoa *p, int njogadores) int i; // Para de correr quando acaba energia. - for(i=0; i<njogadores; i++) + for(i=0; i<njogadores; ++i) if(p[i].energia <= 0) p[i].correr = 1; @@ -38,95 +53,99 @@ void calcula_energia(Pessoa *p, int njogadores) return ; } -void usa_fireball(char **matriz,Magia (*fb)[2], Pessoa *p) { +void usa_fireball(char **matriz, Pessoa *p, Magias *m) { int i,j,k; for(i=0; i<4; ++i) { - if(fb[i][0].ativa == false && fb[i][1].ativa == false) + if(m->fireball[i][0].ativa == false && m->fireball[i][1].ativa == false) break ; for(j=0; j<2; ++j) { // O mesmo player pode ter jogado duas fireballs. - if(fb[i][j].d == -1) - fb[i][j].d = calcula_direcao(p,i); /* Numeros de direçao no colisao.h */ + if(m->fireball[i][j].d == -1) + m->fireball[i][j].d = calcula_direcao(p,i); // Numeros de direçao no colisao.h for(k=0; k<4; ++k) { - if(contato_proximo_direcionado(fb[i][j].x,fb[i][j].y,i,k,fb[i][j].d,p) == k) { - //k = k; // Isso nao faz nada, tem que substituir por tirar vida de k. - p[k].hp -= fb[i][j].dano; - fb[i][j].ativa = false; - fb[i][j].explosao = true; - fb[i][j].d = -1; + if(contato_proximo_direcionado(m->fireball[i][j].x,m->fireball[i][j].y,i,k,m->fireball[i][j].d,p) == k) { + p[k].hp -= m->fireball[i][j].dano; + m->fireball[i][j].ativa = false; + m->fireball[i][j].explosao = true; + m->fireball[i][j].d = -1; } } - if(fb[i][j].ativa==true && colisao_fireball(matriz,fb[i][j].x,fb[i][j].y,fb[i][j].d) == 0) { // Nao colidiu com nenhum char, verifica se colidiu com algo do mapa. { - /*if(andou_b[i]==1){ - fb[i][j].y -= 12; - }else if(andou_d[i]==1){ - fb[i][j].x += 12; - }else if(andou_e[i]==1){ - fb[i][j].x -= 12; - }else if(andou_b[i]==1){ - fb[i][j].y += 12; - }*/ - switch(fb[i][j].d) { + if(m->fireball[i][j].ativa==true && colisao_fireball(matriz,m->fireball[i][j].x,m->fireball[i][j].y,m->fireball[i][j].d) == 0) { // Nao colidiu com nenhum char, verifica se colidiu com algo do mapa. { + // if(andou_b[i]==1){ + // m->fireball[i][j].y -= 12; + // }else if(andou_d[i]==1){ + // m->fireball[i][j].x += 12; + // }else if(andou_e[i]==1){ + // m->fireball[i][j].x -= 12; + // }else if(andou_b[i]==1){ + // m->fireball[i][j].y += 12; + // } + switch(m->fireball[i][j].d) { case 0: - fb[i][j].y -= 12; + m->fireball[i][j].y -= 12; break; case 1: - fb[i][j].x += 12; + m->fireball[i][j].x += 12; break; case 2: - fb[i][j].x -= 12; + m->fireball[i][j].x -= 12; break; case 3: - fb[i][j].y += 12; + m->fireball[i][j].y += 12; break; default: break; } - fb[i][j].dist += 12; // Dist eh usado pra limitar a distancia que a fireball vai. No caso, vai ser 300 pixels? - if(fb[i][j].dist >= 300) { - fb[i][j].ativa = false; - fb[i][j].explosao = true; - fb[i][j].d = -1; + m->fireball[i][j].dist += 12; // Dist eh usado pra limitar a distancia que a fireball vai. No caso, vai ser 300 pixels? + if(m->fireball[i][j].dist >= 300) { + m->fireball[i][j].d = -1; + m->fireball[i][j].ativa = false; + m->fireball[i][j].explosao = true; + m->fireball[i][j].xexpl = m->fireball[i][j].x; + m->fireball[i][j].yexpl = m->fireball[i][j].y; } } - else if(fb[i][j].ativa==true) { // Nao tah ativa OU colidiu. Vou considerar que eh a hipotese de ter colidido, entao passa pra falso. - fb[i][j].ativa = false; - fb[i][j].explosao = true; - fb[i][j].d = -1; + else if(m->fireball[i][j].ativa==true) { // Nao tah ativa OU colidiu. Vou considerar que eh a hipotese de ter colidido, entao passa pra falso. + m->fireball[i][j].d = -1; + m->fireball[i][j].ativa = false; + m->fireball[i][j].explosao = true; + m->fireball[i][j].xexpl = m->fireball[i][j].x; + m->fireball[i][j].yexpl = m->fireball[i][j].y; } } } } -void explosao(Pessoa *p, int njogadores, Sprite s,int explox[4][2],int exploy[4][2],Magia (*fireball)[2]) { +void explosao(Pessoa *p, int njogadores, Sprite s, Magias *m) { int i, j; - for(i=0;i<njogadores;i++) { - for(j=0;j<2;j++) { - if(fireball[i][j].ativa == true) { - al_draw_bitmap(s.fireballs[fireball[i][j].d],fireball[i][j].x,fireball[i][j].y,0); + for(i=0; i<njogadores; ++i) { + for(j=0; j<2; ++j) { + if(m->fireball[i][j].ativa == true) { + al_draw_bitmap(s.fireballs[m->fireball[i][j].d],m->fireball[i][j].x,m->fireball[i][j].y,0); } - if(fireball[i][j].explosao == true) { // Enquanto explox = 288 e exploy = 224, ele nao imprime a explosao. + if(m->fireball[i][j].explosao == true) { // Enquanto explox = 288 e exploy = 224, ele nao imprime a explosao. // Entao o esquema eh zerar eles e dai o programa começa a contagem e a impressao. - explox[i][j] = exploy[i][j] = 0; - fireball[i][j].explosao = false; + m->explox[i][j] = m->exploy[i][j] = 0; + m->fireball[i][j].explosao = false; } - if(explox[i][j] < 280 && exploy[i][j] < 220) { // Imprime a explosao. - al_draw_bitmap_region(s.explosion,explox[i][j],exploy[i][j],32,32,fireball[i][j].x,fireball[i][j].y,0); - explox[i][j] += 32; - if(explox[i][j] >= 288) { - exploy[i][j] += 32; - if(exploy[i][j] < 224) - explox[i][j] = 0; + if(m->explox[i][j] < 280 && m->exploy[i][j] < 220) { // Imprime a explosao. + //al_draw_bitmap_region(s.explosion,m->explox[i][j],m->exploy[i][j],32,32,m->fireball[i][j].x,m->fireball[i][j].y,0); + al_draw_bitmap_region(s.explosion,m->explox[i][j],m->exploy[i][j],32,32,m->fireball[i][j].xexpl,m->fireball[i][j].yexpl,0); + m->explox[i][j] += 32; + if(m->explox[i][j] >= 288) { + m->exploy[i][j] += 32; + if(m->exploy[i][j] < 224) + m->explox[i][j] = 0; } } } } } -void usa_magias(char **matriz,Magia (*fb)[2], Pessoa *p, int njogadores, Sprite s,int explox[4][2],int exploy[4][2], int *flash) +void usa_magias(char **matriz, Pessoa *p, int njogadores, Sprite s, int *flash, Magias *m) { usa_flash(p,flash,matriz); - usa_fireball(matriz, fb, p); - explosao(p,njogadores,s,explox,exploy,fb); + usa_fireball(matriz, p, m); + explosao(p,njogadores,s, m); return ; } @@ -158,12 +177,12 @@ void usa_flash(Pessoa *p,int *flash,char **matriz) pra sempre, entao pode dar um break/return (cuidar com diagonais dai!) */ int i,j; - for(i=0;i<4;i++) { + for(i=0; i<4; ++i) { if(flash[i] && p[i].energia >= 50) { flash[i] = 0; p[i].energia -= 50; /* Existem 8 casos (8 direçoes possiveis de andar, 4 sentidos e 4 diagonais). */ - for(j=0;j<19;j++) { + for(j=0; j<19; ++j) { if((p[i].andou_c) && !(p[i].andou_b) && !(p[i].andou_d) && !(p[i].andou_e)) { // Soh pra cima ( /\ ). if(colidiu(matriz,p[i].x/4,p[i].y/4,2,i,p) == 1) { p[i].y += 4; diff --git a/magia.h b/magia.h index e17c25951926d29378efc7d9f60df9ebf4c9bdf8..adb2f4f86233973c51d82fee2c9c65950b6a8f15 100644 --- a/magia.h +++ b/magia.h @@ -3,11 +3,12 @@ #include "colisao.h" +void init_magias(Magias *m); void tira_neon(bool *puxa,bool *temneon, Pessoa *p); void calcula_energia(Pessoa *p, int njogadores); -void usa_fireball(char **matriz,Magia (*fb)[2], Pessoa *p); -void explosao(Pessoa *p, int njogadores, Sprite s,int explox[4][2],int exploy[4][2],Magia (*fireball)[2]); -void usa_magias(char **matriz,Magia (*fb)[2], Pessoa *pessoas, int njogadores, Sprite s,int explox[4][2],int exploy[4][2], int *flash); +void usa_fireball(char **matriz, Pessoa *p, Magias *m); +void explosao(Pessoa *p, int njogadores, Sprite s,int explox[4][2],int exploy[4][2], Magias *m); +void usa_magias(char **matriz, Pessoa *pessoas, int njogadores, Sprite s, int *flash, Magias *m); int calcula_direcao(Pessoa *p,int i); void usa_flash(Pessoa *p,int *flash,char **matriz); diff --git a/neon.c b/neon.c index d0583126ba3bb8d38f7d76108240d723cda847b4..7a733c08f432018ec21405882090ca1a49d4f573 100644 --- a/neon.c +++ b/neon.c @@ -25,29 +25,31 @@ int main() /* Coisas relacionadas aos chars */ int i,j; /* Coisas relacionadas as tecnicas/magias */ - int explox[4][2],exploy[4][2]; + Magias m; /* Pessoas, que contem quase todos os dados (ver colisao.h) */ Pessoa *p; + /* Janela */ + Window win; + /* Arquivos */ + FILE *errext; // errext = error exit (ou saida de erros) p = (Pessoa *) malloc(sizeof(Pessoa) * NJOGADORES); for(i=0; i<NJOGADORES; ++i) { // Inicializacoes da estrutura Pessoa p[i].hp = 1000; - p[i].time = i+1; p[i].selx = 0; p[i].sely = 64; + p[i].time = i+1; p[i].correr = 1; + p[i].andou_b = 0; + p[i].andou_c = 0; + p[i].andou_d = 0; + p[i].andou_e = 0; p[i].energia = 100; - p[i].andou_b = p[i].andou_c = p[i].andou_d = p[i].andou_e = 0; } - Window win; - FILE *mapa,*errext; // errext = error exit (ou saida de erros) - /* Magias */ - Magia fireball[4][2]; - /* Inicializacao dos arquivos. */ - errext = fopen("lago.txt","w"); fclose(errext); errext = fopen("err.txt","w"); + errext = fopen("err.txt","w"); if(!errext) { puts("Error opening file."); exit(1); // Se deu erro no lugar onde vao ser anotados os erros, ferrou! @@ -59,50 +61,12 @@ int main() /* Inicializacao dos Bitmaps */ Sprite s = init_sprites(errext); - for(i=0; i<4; ++i) { - for(j=0; j<2; ++j) { - //al_convert_mask_to_alpha(fireball[i][j].sprite,al_map_rgb(255,0,255)); - fireball[i][j].ativa = false; // Nao foi usada. - fireball[i][j].dano = 200; // Dano da tecnica. - fireball[i][j].explosao = false; // Nao colidiu / chegou na distancia limite. - fireball[i][j].dist = 0; // Nao percorreu nenhuma distancia. - fireball[i][j].d = 0; // Nao tem dire�ao. - explox[i][j] = 280; - exploy[i][j] = 220; - } - } + init_magias(&m); al_register_event_source(win.event_queue, al_get_display_event_source(win.display)); - for(i=0; i<4; ++i) { - for(j=0; j<7; ++j) { - p[i].botao_char[j] = (char*) malloc(30 * sizeof(char)); - if(!(p[i].botao_char[j])) { - fprintf(errext,"Falha ao alocar memoria para p[%d].botao_char[%d]",i,j); - fclose(errext); - exit(1); - } - } - sprintf(p[i].botao_char[0],"%c",98); - sprintf(p[i].botao_char[1],"%c",99); - sprintf(p[i].botao_char[2],"%c",100); - sprintf(p[i].botao_char[3],"%c",101); - sprintf(p[i].botao_char[4],"%c",97); - sprintf(p[i].botao_char[5],"%c",97); - sprintf(p[i].botao_char[6],"%c",97); - p[i].nome = (char*) malloc(30*sizeof(char)); - if(!p[i].nome) { - fprintf(errext,"Falha ao alocar memoria para p[%d].nome",i); - fclose(errext); - exit(1); - } - sprintf(p[i].nome,"player %d",i+1); - } - - teclas_iniciais(p); + teclas_iniciais(p, errext); - ALLEGRO_FONT *font; - font = al_load_font("Fonts/fixed_font.tga", 0, 0); /* if( access( Comandos/cmd.txt, F_OK ) != -1 ) { FILE *cmd = fopen("Comandos/cmd.txt","r"); @@ -121,7 +85,7 @@ int main() /* Opera o jogo */ if(abremenu(win,p,s)==1) { - fase1(win,fireball,font,explox,exploy,p,s); + fase1(win,p,s,m); } graphdeinit(win); exit(1);