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