diff --git a/Comandos/cmd.txt b/Comandos/cmd.txt
index b1dcf250f9a27d8b972690706bb72e602cbd035e..846173b4d17666cb64e2b7a1f17eb8f3ff194e92 100644
--- a/Comandos/cmd.txt
+++ b/Comandos/cmd.txt
@@ -6,6 +6,7 @@
 78
 80
 77
+13
 9
 11
 12
@@ -14,6 +15,7 @@
 36
 35
 34
+14
 20
 7
 8
@@ -22,6 +24,7 @@
 25
 32
 31
+2
 23
 19
 4
@@ -30,3 +33,4 @@
 30
 29
 28
+22
diff --git a/colisao.c b/colisao.c
index f7b7e379b977e9136cd3e044ae2647096e9d53e1..87da04b9bda3140ebc38541d421f5e94b1f65b19 100644
--- a/colisao.c
+++ b/colisao.c
@@ -21,6 +21,13 @@ char** le_matriz(FILE *fp)
 	return matriz;
 }
 
+int pode_andar(int i, Pessoa *p) {
+	if(p[i].freeze <= 0 && p[i].preso <= 0) {
+		return 1;
+	}
+	return 0;
+}
+
 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.
diff --git a/colisao.h b/colisao.h
index 9b6f7bf0907d64329622e27c846e526c9d4af8ff..60603788efb5d2a914e584649b8a914849880847 100644
--- a/colisao.h
+++ b/colisao.h
@@ -30,31 +30,40 @@
 #define MAX_HP 1000
 #define MAX_ENERGY 300
 #define COMPUTADORES 1
+#define COMANDOS_POR_PERSONAGEM 9
+
+/* Defines para magias */
 #define ICEBALLS_P_PESSOA 2
 #define FIREBALLS_P_PESSOA 2
-#define COMANDOS_POR_PERSONAGEM 8
-
+/* Defines para traps */
+#define TRAP_ENERGIA 50
+#define TRAP_P_PESSOA 3
+#define TRAP_SPRITE_WIDTH 32
+#define TRAP_SPRITE_HEIGHT 32
+#define TRAP_TEMPO_ARMADA 10000
+#define TRAP_TEMPO_PRENDENDO 150
 /* Defines para flash */
 #define FLASH_SPRITE_WIDTH 22
 #define FLASH_SPRITE_HEIGHT 22
 #define MAX_FLASH_POSSIVEL 5
 
 typedef struct Pessoa {
-	int x,y,desx,desy,selx,sely,hp; // Desx e desy escolhem o char na imagem; Selx e sely escolhem qual sprite do char (olhando pra cima,esq,...)
+	int x, y, desx, desy, selx, sely, hp, d; // Desx e desy escolhem o char na imagem; Selx e sely escolhem qual sprite do char (olhando pra cima,esq,...)
 	int xneon,yneon;
 	int andou_b,andou_c,andou_d,andou_e;
 	char *botao_b, *botao_c, *botao_d, *botao_e;
 	char *nome,*ataque;
-	char *botao_char[8];
+	char *botao_char[COMANDOS_POR_PERSONAGEM];
 	int energia,correr,morto,dash;
 	int comp;
-	int botao_char_int[8],time;
+	int botao_char_int[COMANDOS_POR_PERSONAGEM],time;
 	int freeze; // Congelado não pode usar magias nem andar. Freeze <= 0 -> não está mais congelado. Freeze > 0, congelado.
+	int preso; // Preso não pode andar, mas pode usar magias. Preso <= 0, não está preso. Preso > 0, está preso.
 } Pessoa;
 
 typedef struct Magia {
 	int dano, x, y, dist, xsprite, ysprite, xexpl, yexpl, energia, count;
-	bool ativa, explosao;
+	bool ativa, explosao, em_acao;
 	ALLEGRO_BITMAP* sprite;
 	int d; /* Direcao == -1 significa que nao foi calculada ainda.
 				  * 0 = cima; 1 = direita; 2 = esquerda; 3 = baixo; */
@@ -65,6 +74,7 @@ typedef struct Magias {
 	Magia fireball[PESSOAS][FIREBALLS_P_PESSOA];
 	Magia iceball[PESSOAS][ICEBALLS_P_PESSOA];
 	Magia flash[PESSOAS][MAX_FLASH_POSSIVEL];
+	Magia trap[PESSOAS][TRAP_P_PESSOA];
 } Magias;
 
 typedef struct Sprite {
@@ -72,7 +82,7 @@ typedef struct Sprite {
 	ALLEGRO_BITMAP **fireballs, *explosion; // Sprite da bola de fogo (cima, dir, esq, baixo) + explosao da fireball.
 	ALLEGRO_BITMAP **iceballs, *gelos; // Sprite da bola de fogo (cima, dir, esq, baixo) + explosao da fireball.
 	ALLEGRO_BITMAP **neons; // Todos os neons (4 cores, na sequencia: amarelo - azul - verde - vermelho)
-	ALLEGRO_BITMAP *animacao_flash;
+	ALLEGRO_BITMAP *animacao_flash, *trap;
 	ALLEGRO_BITMAP *bar, *healthbar, *energybar, *frente;
 	ALLEGRO_BITMAP *chars, *dead, *chars_congelados;
 } Sprite;
@@ -136,6 +146,7 @@ private:
 
 char** le_matriz(FILE *fp);
 bool colisao(int,int,char**,int);
+int pode_andar(int i, Pessoa *p);
 int colidiu(char** map,int x,int y,int caso,int eu, Pessoa *p);
 int colisao_fireball(char** m,int x,int y,int d);
 int contato_proximo(int i,int j, Pessoa *p);
diff --git a/grafico.c b/grafico.c
index 690b23531b3c6a180d147551181e91576f9ea148..b95268cce745fe24a30bf9c6361940b0184b4b48 100644
--- a/grafico.c
+++ b/grafico.c
@@ -151,6 +151,13 @@ Sprite init_sprites(FILE *errext) {
         exit(1);
     }
 
+    s.trap = al_load_bitmap("Imgs/trap.bmp");
+    if(!(s.trap)) {
+        fprintf(errext,"Falha ao abrir a imagem trap.");
+        fclose(errext);
+        exit(1);
+    }
+
     s.neons[0] = al_load_bitmap("Imgs/neonamarelo.bmp");
     if(!s.neons[0]) {
         fprintf(errext,"Falha ao abrir a imagem s.neons[0].");
@@ -237,6 +244,7 @@ Sprite init_sprites(FILE *errext) {
 
     al_convert_mask_to_alpha(s.bar,al_map_rgb(255,0,255));
     al_convert_mask_to_alpha(s.dead,al_map_rgb(255,0,255));
+    al_convert_mask_to_alpha(s.trap,al_map_rgb(255,0,255));
     al_convert_mask_to_alpha(s.tiles,al_map_rgb(255,0,255));
     al_convert_mask_to_alpha(s.chars,al_map_rgb(255,0,255));
     al_convert_mask_to_alpha(s.explosion,al_map_rgb(255,0,255));
diff --git a/imprime.c b/imprime.c
index 55992497f53fc62cb24c398f8288207b8fb3ee2b..33b3949cb0513335cbef28dd3b7f499a350de900 100644
--- a/imprime.c
+++ b/imprime.c
@@ -91,49 +91,57 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad
 
 	 	if((p[i].andou_b) == 1) {
 	 		//if(!(colidiu(matriz,p[i].x/4,p[i].y/4,BAIXO,i,p) == 1)) {
-	 		if(!(colidiu(matriz,p[i].x/4,p[i].y/4,BAIXO,i,p) == 1) && p[i].freeze <= 0) {
+	 		if(!(colidiu(matriz,p[i].x/4,p[i].y/4,BAIXO,i,p) == 1) && pode_andar(i, p)) {
 		 		p[i].y += 4 * p[i].correr;
 		 		p[i].yneon += 4 * p[i].correr;
 	 		}
 	        p[i].sely = 0 + 128*char4;
-			if(!(p[i].andou_e) && !(p[i].andou_d) && !(p[i].andou_c))
+			if(!(p[i].andou_e) && !(p[i].andou_d) && !(p[i].andou_c)) {
 				if(p[i].freeze <= 0) {
 					imprime_char(p[i].x,p[i].y,p[i].desx,p[i].desy,p[i].selx,p[i].sely,s);
+					p[i].d = 3;
 				} else {
 					imprime_char_congelado(p[i].x,p[i].y,p[i].desx,p[i].desy,p[i].selx,p[i].sely,s);
 				}
+				p[i].d = BAIXO;
+			}
+
 	    }
 	    if((p[i].andou_e) == 1) {
 	        // if(!(colidiu(matriz,p[i].x/4,p[i].y/4,ESQ,i,p) == 1)) { // O 1(um) tah ali porque eh o caso de andar pra esquerda.
-	        if(!(colidiu(matriz,p[i].x/4,p[i].y/4,ESQ,i,p) == 1) && p[i].freeze <= 0) { // O 1(um) tah ali porque eh o caso de andar pra esquerda.
+	        if(!(colidiu(matriz,p[i].x/4,p[i].y/4,ESQ,i,p) == 1) && pode_andar(i, p)) { // O 1(um) tah ali porque eh o caso de andar pra esquerda.
 			    p[i].x -= 4 * p[i].correr;
 		 		p[i].xneon -= 4 * p[i].correr;
 	        }
 	        p[i].sely = 32 + 128*char4;
-	        if(!(p[i].andou_d) && !(p[i].andou_c))
+	        if(!(p[i].andou_d) && !(p[i].andou_c)) {
 	         	if(p[i].freeze <= 0) {
 	         		imprime_char(p[i].x,p[i].y,p[i].desx,p[i].desy,p[i].selx,p[i].sely,s);
 	         	} else {
 	         		imprime_char_congelado(p[i].x,p[i].y,p[i].desx,p[i].desy,p[i].selx,p[i].sely,s);
 	         	}
+				p[i].d = ESQ;
+	         }
 	    }
 	    if((p[i].andou_d) == 1) {
 	        // if(!(colidiu(matriz,p[i].x/4,p[i].y/4,DIR,i,p) == 1)) { // O 3(tres) tah ali porque eh o caso de andar pra direita.
-	        if(!(colidiu(matriz,p[i].x/4,p[i].y/4,DIR,i,p) == 1) && p[i].freeze <= 0) { // O 3(tres) tah ali porque eh o caso de andar pra direita.
+	        if(!(colidiu(matriz,p[i].x/4,p[i].y/4,DIR,i,p) == 1) && pode_andar(i, p)) { // O 3(tres) tah ali porque eh o caso de andar pra direita.
 		        p[i].x += 4 * p[i].correr;
 		 		p[i].xneon += 4 * p[i].correr;
 			}
 	        p[i].sely = 64 + 128*char4;
-	        if(!(p[i].andou_c))
+	        if(!(p[i].andou_c)) {
 	            if(p[i].freeze <= 0) {
 	            	imprime_char(p[i].x,p[i].y,p[i].desx,p[i].desy,p[i].selx,p[i].sely,s);
 	            } else {
 	            	imprime_char_congelado(p[i].x,p[i].y,p[i].desx,p[i].desy,p[i].selx,p[i].sely,s);
 	            }
+				p[i].d = DIR;
+			}
 	    }
 	    if((p[i].andou_c) == 1) {
 	        // if(!(colidiu(matriz,p[i].x/4,p[i].y/4,CIMA,i,p) == 1)) { // O 2(dois) tah ali porque eh o caso de andar pra cima.
-	        if(!(colidiu(matriz,p[i].x/4,p[i].y/4,CIMA,i,p) == 1) && p[i].freeze <= 0) { // O 2(dois) tah ali porque eh o caso de andar pra cima.
+	        if(!(colidiu(matriz,p[i].x/4,p[i].y/4,CIMA,i,p) == 1) && pode_andar(i, p)) { // O 2(dois) tah ali porque eh o caso de andar pra cima.
 		        p[i].y -= 4 * p[i].correr;
 		 		p[i].yneon -= 4 * p[i].correr;
 	        }
@@ -143,6 +151,7 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad
 	        } else {
 	        	imprime_char_congelado(p[i].x,p[i].y,p[i].desx,p[i].desy,p[i].selx,p[i].sely,s);
 	        }
+			p[i].d = CIMA;
        		imprime_neon(p[i].xneon,p[i].yneon,s.neons[i],temneon[i]);
 	    }
 	    if((p[i].andou_b != 1) && (p[i].andou_c != 1) && (p[i].andou_d != 1) && (p[i].andou_e != 1)) { // Nao andou.
@@ -152,6 +161,7 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad
 				imprime_char_congelado(p[i].x,p[i].y,p[i].desx,p[i].desy,32,96,s);
 			}
 			imprime_neon(p[i].xneon,p[i].yneon,s.neons[p[i].time-1],temneon[i]);
+			p[i].d = BAIXO;
 	    }
 	}
 
diff --git a/keys.c b/keys.c
index 173dfcccfb7d0c9a9620c1f513297ac4fd9e4be3..1c8512c112d5c8491004f7c0747141e3418c89e1 100644
--- a/keys.c
+++ b/keys.c
@@ -1,14 +1,5 @@
 #include "keys.h"
 
-#define UP 0
-#define DOWN 1
-#define RIGHT 2
-#define LEFT 3
-#define CORRE 4
-#define PUXAR 5
-#define FLASH 6
-#define ICEBALL 7
-
 void teclas_iniciais(Pessoa *p)
 {
 	/*
@@ -44,6 +35,7 @@ void teclas_iniciais(Pessoa *p)
 	p[0].botao_char_int[PUXAR] = ALLEGRO_KEY_HOME;
 	p[0].botao_char_int[FLASH] = ALLEGRO_KEY_PGUP;
 	p[0].botao_char_int[ICEBALL] = ALLEGRO_KEY_DELETE;
+	p[0].botao_char_int[TRAP] = ALLEGRO_KEY_M;
 
 	p[1].botao_char_int[UP] = ALLEGRO_KEY_I;
 	p[1].botao_char_int[DOWN] = ALLEGRO_KEY_K;
@@ -53,6 +45,7 @@ void teclas_iniciais(Pessoa *p)
 	p[1].botao_char_int[PUXAR] = ALLEGRO_KEY_9;
 	p[1].botao_char_int[FLASH] = ALLEGRO_KEY_8;
 	p[1].botao_char_int[ICEBALL] = ALLEGRO_KEY_7;
+	p[1].botao_char_int[TRAP] = ALLEGRO_KEY_N;
 
 	p[2].botao_char_int[UP] = ALLEGRO_KEY_T;
 	p[2].botao_char_int[DOWN] = ALLEGRO_KEY_G;
@@ -62,6 +55,7 @@ void teclas_iniciais(Pessoa *p)
 	p[2].botao_char_int[PUXAR] = ALLEGRO_KEY_Y;
 	p[2].botao_char_int[FLASH] = ALLEGRO_KEY_5;
 	p[2].botao_char_int[ICEBALL] = ALLEGRO_KEY_4;
+	p[2].botao_char_int[TRAP] = ALLEGRO_KEY_N;
 
 	p[3].botao_char_int[UP] = ALLEGRO_KEY_W;
 	p[3].botao_char_int[DOWN] = ALLEGRO_KEY_S;
@@ -71,6 +65,7 @@ void teclas_iniciais(Pessoa *p)
 	p[3].botao_char_int[PUXAR] = ALLEGRO_KEY_3;
 	p[3].botao_char_int[FLASH] = ALLEGRO_KEY_2;
 	p[3].botao_char_int[ICEBALL] = ALLEGRO_KEY_1;
+	p[3].botao_char_int[TRAP] = ALLEGRO_KEY_N;
 
 	return;
 }
@@ -115,6 +110,14 @@ void keyboard_down(int evkeyboardkeycode,bool *puxa,int *flash, Pessoa *p, Magia
         		m->iceball[i][0].dist = 0;
         		p[i].energia -= 50;
         	}
+		} else if(evkeyboardkeycode == p[i].botao_char_int[TRAP]) {
+			for(int j=0; j<TRAP_P_PESSOA; ++j) {
+				if(!m->trap[i][j].ativa && p[i].energia >= TRAP_ENERGIA && m->trap[i][j].count <= 0 && p[i].freeze <= 0) {
+					m->trap[i][j].ativa = true;
+					p[i].energia -= TRAP_ENERGIA;
+					break;
+				}
+			}
 		}
 	}/*
 	switch(evkeyboardkeycode) {
diff --git a/keys.h b/keys.h
index 5c26ebb4eec8e4cd82fb11934c5ba7f15ad6266d..7c34cd6baa2b8531cf66a37cdd21ab449931edbd 100644
--- a/keys.h
+++ b/keys.h
@@ -14,6 +14,16 @@
 #include <allegro5/allegro_primitives.h>
 #include <allegro5/allegro_ttf.h>
 
+#define UP 0
+#define DOWN 1
+#define RIGHT 2
+#define LEFT 3
+#define CORRE 4
+#define PUXAR 5
+#define FLASH 6
+#define ICEBALL 7
+#define TRAP 8
+
 void teclas_iniciais(Pessoa *pessoa);
 void keyboard_down(int evkeyboardkeycode,bool *puxa,int *flash, Pessoa *p, Magias *m, int njogadores);
 void keyboard_up(int evkeyboardkeycode,bool *puxa,bool *sair, Pessoa *p, int njogadores);
diff --git a/magia.c b/magia.c
index 18302ac033b5865fc7d291280bcefa07441d5d20..cb5b6aec53ce62c8b06445a6d434d0d11b9f5f66 100644
--- a/magia.c
+++ b/magia.c
@@ -21,7 +21,7 @@ void init_magias(Magias *m, int njogadores) {
 	*/
 	for(i=0; i<njogadores; ++i) {
 		/* Inicializa iceball. */
-		for(j=0; j<2; ++j) {
+		for(j=0; j<ICEBALLS_P_PESSOA; ++j) {
 			m->iceball[i][j].ativa = false; // Nao foi usada.
 			m->iceball[i][j].dano = 25; // Dano da tecnica.
 			m->iceball[i][j].explosao = false; // Nao colidiu / chegou na distancia limite.
@@ -35,6 +35,11 @@ void init_magias(Magias *m, int njogadores) {
 			m->flash[i][j].count = 0;
 			m->flash[i][j].xsprite = 88;
 		}
+		/* Inicializa trap. */
+		for(j=0; j<TRAP_P_PESSOA; ++j) {
+			m->trap[i][j].ativa = false; // Nao foi usada.
+			m->trap[i][j].count = 0; // Duração
+		}
 	}
 }
 
@@ -249,10 +254,55 @@ void animacao_flash(Pessoa *p, int njogadores, Sprite s, Magias *m) {
 	}
 }
 
+void usa_trap(Pessoa *p, int njogadores, Sprite s, Magias *m) {
+	int i, j, k;
+	for(i=0; i<njogadores; ++i) {
+		if(p[i].preso > 0) {
+			--(p[i].preso);
+		}
+		for(j=0; j<TRAP_P_PESSOA; ++j) {
+			if(m->trap[i][j].ativa == true) { // Enquanto xsprite = 88, ele nao imprime a animacao. Quando xprite = 0, ele comeca a animacao.
+				if(p[i].d == CIMA) {
+					m->trap[i][j].x = p[i].x;
+					m->trap[i][j].y = p[i].y+16;
+				} else if(p[i].d == ESQ) {
+					m->trap[i][j].x = p[i].x-16;
+					m->trap[i][j].y = p[i].y;
+				} else if(p[i].d == DIR) {
+					m->trap[i][j].x = p[i].x+16;
+					m->trap[i][j].y = p[i].y;
+				} else {
+					m->trap[i][j].x = p[i].x;
+					m->trap[i][j].y = p[i].y-16;
+				}
+				m->trap[i][j].ativa = false;
+				m->trap[i][j].em_acao = false;
+				m->trap[i][j].count = TRAP_TEMPO_ARMADA;
+			}
+			if(m->trap[i][j].count > 0) { // Imprime a animação.
+				al_draw_bitmap_region(s.trap,0,0,TRAP_SPRITE_WIDTH,TRAP_SPRITE_HEIGHT,m->trap[i][j].x,m->trap[i][j].y,0);
+				--(m->trap[i][j].count);
+				for(k=0; k<njogadores; ++k) {
+					// Checa se algum outro jogador pisou na trap
+					if(i != k && m->trap[i][j].em_acao == false && // Confere se a trap nao foi pisada por outro jogador e se nao eh o proprio jogador que a colocou.
+					   p[k].x >= m->trap[i][j].x - 12 && p[k].x <= m->trap[i][j].x + 0 && // Colidiu no eixo X
+					   p[k].y >= m->trap[i][j].y - 16 && p[k].y <=  m->trap[i][j].y + 0) { // Colidiu no eixo Y e nao eh quem colocou a trap
+
+						p[k].preso = (p[k].preso >= TRAP_TEMPO_PRENDENDO) ? p[k].preso : TRAP_TEMPO_PRENDENDO; // max{ Tempo que estaria preso, Tempo que a trap prende}
+						m->trap[i][j].count = TRAP_TEMPO_PRENDENDO;
+						m->trap[i][j].em_acao = true;
+					}
+				}
+			}
+		}
+	}
+}
+
 void usa_magias(char **matriz, Pessoa *p, int njogadores, Sprite s, int *flash, Magias *m) {
 	usa_flash(p, flash, matriz, njogadores, m);
 	animacao_flash(p, njogadores, s, m);
 	usa_iceball(matriz, p, m, s, njogadores);
+	usa_trap(p, njogadores, s, m);
 	// usa_fireball(matriz, p, m, njogadores);
 	// explosao(p, njogadores, s, m);
 	return ;
diff --git a/menu.c b/menu.c
index 8682435b198bb0332eebd801fcf73a05dd3f3ac7..7cdcb39a4b4ef8254710c093944633bf14d1ae93 100644
--- a/menu.c
+++ b/menu.c
@@ -53,8 +53,9 @@ void imprime_configs() {
         al_draw_text(Font, CINZA_ESCURO, 50+x_variacao*i, 350, 0, "Puxar :");
         al_draw_text(Font, CINZA_ESCURO, 50+x_variacao*i, 370, 0, "Flash :");
         al_draw_text(Font, CINZA_ESCURO, 50+x_variacao*i, 390, 0, "Iceball :");
+        al_draw_text(Font, CINZA_ESCURO, 50+x_variacao*i, 410, 0, "Trap :");
 
-        al_draw_rounded_rectangle(40+x_variacao*i, 85, 245+x_variacao*i, 415, 1, 1, CINZA_CLARO, 2);
+        al_draw_rounded_rectangle(40+x_variacao*i, 85, 245+x_variacao*i, 435, 1, 1, CINZA_CLARO, 2);
     }
 
     al_draw_text(Font, AMBAR, 350, 600, 0, "Salvar mantem as configuracoes entre execucoes do jogo.");
@@ -113,7 +114,7 @@ void set_buttons(Botoes botoes[BOTOES_SEL_PERSONAGEM_TOTAL]) {
 /* Muda o texto dos botoes para as letras que representam as teclas dos jogadores. */
     for(int i=0; i<PESSOAS; ++i) {
         for(int j=0; j<COMANDOS_POR_PERSONAGEM; ++j) {
-            botoes[17+i*COMANDOS_POR_PERSONAGEM+j].set_text(al_keycode_to_name(Pessoas[i].botao_char_int[j]));
+            botoes[16+i*COMANDOS_POR_PERSONAGEM+j].set_text(al_keycode_to_name(Pessoas[i].botao_char_int[j]));
         }
     }
 }
@@ -163,28 +164,28 @@ int selecao_personagem(void *) {
 
     for(i=0; i<PESSOAS; ++i) {
         param[0] = i;
-        /* Botoes para selecionar personagens. */
+        /* Botoes (indices 0-7) para selecionar personagens. */
         botoes[2*i  ].set_button("<", x_inicial[0] + i*x_variacao, 160, char_prev, (void*) param, sizeof(int)) ;
         botoes[2*i+1].set_button(">", x_inicial[1] + i*x_variacao, 160, char_next, (void*) param, sizeof(int)) ;
-        /* Botoes para selecionar times. */
+        /* Botoes (indices 8-15) para selecionar times. */
         botoes[2*i+8].set_button("<", x_inicial[0] + i*x_variacao, 200, team_prev, (void*) param, sizeof(int)) ;
         botoes[2*i+9].set_button(">", x_inicial[1] + i*x_variacao, 200, team_next, (void*) param, sizeof(int)) ;
     }
-    /* Botao para voltar para o menu inicial. */
-    param[0] = 1;
-    botoes[16].set_button("Voltar", 50, 500, return_int, (void*) param, sizeof(int));
-    /* Botoes para selecionar as teclas que executam os comandos de cada personagem. */
+    /* Botoes (indices 16-51) para selecionar as teclas que executam os comandos de cada personagem. */
     for(i=0; i<PESSOAS; ++i) {
         for(j=0; j<COMANDOS_POR_PERSONAGEM; ++j) {
             param[0] = i;
             param[1] = j;
-            botoes[17+i*COMANDOS_POR_PERSONAGEM+j].set_button("", 145+250*i, 250+20*j, set_next_key, (void*) param, sizeof(int) * 2);
+            botoes[16+i*COMANDOS_POR_PERSONAGEM+j].set_button("", 145+250*i, 250+20*j, set_next_key, (void*) param, sizeof(int) * 2);
         }
     }
+    /* Botao para voltar para o menu inicial. */
+    param[0] = 1;
+    botoes[PESSOAS_E_COMANDOS+0].set_button("Voltar", 50, 500, return_int, (void*) param, sizeof(int));
     /* Botoes pra selecionar numero de jogadores - se adicionar mais comandos, tem que mudar esses índices! */
-    botoes[49].set_button("<", 510, 50, num_jogadores_dec, NULL, 0);
-    botoes[50].set_button(">", 540, 50, num_jogadores_inc, NULL, 0);
-    botoes[51].set_button("Salvar", 729, 500, salvar_configs, NULL, 0);
+    botoes[PESSOAS_E_COMANDOS+1].set_button("<", 510, 50, num_jogadores_dec, NULL, 0);
+    botoes[PESSOAS_E_COMANDOS+2].set_button(">", 540, 50, num_jogadores_inc, NULL, 0);
+    botoes[PESSOAS_E_COMANDOS+3].set_button("Salvar", 729, 500, salvar_configs, NULL, 0);
 
     set_buttons(botoes);
     imprime_menu(botoes, BOTOES_SEL_PERSONAGEM_TOTAL, mx, my, -1);
diff --git a/menu.h b/menu.h
index fc041844597166fe24415e42ee63a831d87d7211..b88b3bd78d84dbcf6223d84f64b08345f2b2e564 100644
--- a/menu.h
+++ b/menu.h
@@ -22,7 +22,7 @@ int menu_principal(Window win,Pessoa *p,Sprite s,int *num_jogadores, int vencedo
 #define BOTOES_SEL_N_JOGADORES 2
 #define OUTROS_BOTOES 2 // voltar e salvar
 //#define COMANDOS_POR_PERSONAGEM é definido no colisao.h
-
+#define PESSOAS_E_COMANDOS BOTOES_SEL_PERSONAGEM + BOTOES_SEL_TIME + COMANDOS_POR_PERSONAGEM * PESSOAS
 // 16 pra selecionar, 1 pra voltar, 28 teclas (7 pra cada jogador, 4 jogadores), 2 pra selec. nº jogadores -> Total = 47.
 #define BOTOES_SEL_PERSONAGEM_TOTAL BOTOES_SEL_PERSONAGEM + BOTOES_SEL_TIME + OUTROS_BOTOES + PESSOAS*COMANDOS_POR_PERSONAGEM + BOTOES_SEL_N_JOGADORES
 
diff --git a/neon.c b/neon.c
index 150ba2dbe5a3d7bbeaa3373f91930a3c7566e37e..a0667edd88a62ccdf1f835a61296fc1444455749 100644
--- a/neon.c
+++ b/neon.c
@@ -3,18 +3,6 @@
 #include "Fase1.h"
 #include <math.h>
 
-/*
-Problemas:
-1- Bola de fogo n�o explode.
-2- Barra de HP / Energia - OK.
-3- Cor do neon quando parado - Xunxo.
-4- Neon se movendo quando colide - OK.
-5- Personagens todos iguais.
-6- Bola de fogo nao da dano - OK.
-7- Nao armazena comandos.
-8- Usa fireball quando explosao ta ativa - explosao acompanha a fireball.
-*/
-
 #define CONT 2
 #define CONTEXPLO 9
 #define TAM 1000
@@ -47,6 +35,7 @@ int main()
 		p[i].selx = 0;
 		p[i].sely = 64;
 		p[i].time = i+1;
+		p[i].preso = 0;
 		p[i].correr = 1;
 		p[i].andou_b = 0;
 		p[i].andou_c = 0;