diff --git a/Comandos/cmd.txt b/Comandos/cmd.txt
index 1796f165eb79ec21fce1ea28c1ab8ad9ebe55c95..846173b4d17666cb64e2b7a1f17eb8f3ff194e92 100644
--- a/Comandos/cmd.txt
+++ b/Comandos/cmd.txt
@@ -24,7 +24,7 @@
 25
 32
 31
-14
+2
 23
 19
 4
@@ -33,4 +33,4 @@
 30
 29
 28
-14
+22
diff --git a/colisao.h b/colisao.h
index eb9186aa582271003ffff9c913fb9a62f7840798..60603788efb5d2a914e584649b8a914849880847 100644
--- a/colisao.h
+++ b/colisao.h
@@ -36,18 +36,19 @@
 #define ICEBALLS_P_PESSOA 2
 #define FIREBALLS_P_PESSOA 2
 /* 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 300
-#define TRAP_TEMPO_PRENDENDO 30
+#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;
diff --git a/imprime.c b/imprime.c
index 827c3398ddcca301b22003de3c6c7210cd67ff91..33b3949cb0513335cbef28dd3b7f499a350de900 100644
--- a/imprime.c
+++ b/imprime.c
@@ -96,12 +96,16 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad
 		 		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.
@@ -110,12 +114,14 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad
 		 		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.
@@ -124,12 +130,14 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad
 		 		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.
@@ -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 b397dea897cbfb6d5575e7787d9cf3be0d3c3713..1c8512c112d5c8491004f7c0747141e3418c89e1 100644
--- a/keys.c
+++ b/keys.c
@@ -110,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/magia.c b/magia.c
index adfc4d4664bf77edcaa7da945f40dd6a38866789..cb5b6aec53ce62c8b06445a6d434d0d11b9f5f66 100644
--- a/magia.c
+++ b/magia.c
@@ -262,30 +262,38 @@ void usa_trap(Pessoa *p, int njogadores, Sprite s, Magias *m) {
 		}
 		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].count = TRAP_TEMPO_ARMADA;
-				m->trap[i][j].x = p[i].x;
-				m->trap[i][j].y = p[i].y;
 				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) {
-					if(i == k)
-						continue;
-
 					// Checa se algum outro jogador pisou na trap
-					if(p[i].preso <= 0 && m->trap[i][j].em_acao == false && // Confere se o jogador nao pisou em nenhum trap e se a trap nao foi pisada por outro jogador.
-					   p[i].x >= m->trap[i][j].x && p[i].x <= m->trap[i][j].x + 32 && // Colidiu no eixo X
-					   p[i].y >= m->trap[i][j].y && p[i].y <=  m->trap[i][j].y + 32) { // Colidiu no eixo Y
-						p[i].preso = TRAP_TEMPO_PRENDENDO;
+					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;
 					}
 				}
 			}
-
 		}
 	}
 }
@@ -294,6 +302,7 @@ void usa_magias(char **matriz, Pessoa *p, int njogadores, Sprite s, int *flash,
 	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 f0e84c388647cc263e7ad05b77dbd593b67b0237..7cdcb39a4b4ef8254710c093944633bf14d1ae93 100644
--- a/menu.c
+++ b/menu.c
@@ -44,7 +44,6 @@ void imprime_configs() {
     for(int i=0; i<PESSOAS; ++i) {
         al_draw_textf(Font, AMARELO_QUEIMADO, 100+x_variacao*i, 100, 0, "Jogador %d", i+1);
         imprime_char(120+x_variacao*i, 150, Pessoas[i].desx, Pessoas[i].desy, Pessoas[i].selx, Pessoas[i].sely, Sprites);
-        printf("Imprimindo time de %d = %d\n", i, Pessoas[i].time);
         al_draw_textf(Font, Color[Pessoas[i].time-1], 115+x_variacao*i, 200, 0, "Time %d", Pessoas[i].time);
         al_draw_text(Font, CINZA_ESCURO, 50+x_variacao*i, 250, 0, "Cima :");
         al_draw_text(Font, CINZA_ESCURO, 50+x_variacao*i, 270, 0, "Baixo :");