diff --git a/effets.c b/effets.c
index 095fc3a2dca6b355642cae323c5709dafbafb463..423c3e7c5a10cf4030736ac8a985af4e8ce7dbc2 100644
--- a/effets.c
+++ b/effets.c
@@ -3,6 +3,10 @@
 Effet nouvel_effet_bloodHit(SDL_Texture **sprites, SDL_Rect pos, int angle){
   Effet e;
   e.pos = pos;
+  e.pos.x -= 8;
+  e.pos.y -= 8;
+  e.pos.w = 60;
+  e.pos.h = 60;
   e.srcrect.x = 0;
   e.srcrect.y = 0;
   e.srcrect.w = 128;
@@ -19,8 +23,8 @@ Effet nouvel_effet_bloodSplatter(SDL_Texture **sprites, SDL_Rect pos, int angle)
   e.pos = pos;
   e.pos.x -= 20;
   e.pos.y -= 20;
-  e.pos.w = 70;
-  e.pos.h = 70;
+  e.pos.w = 80;
+  e.pos.h = 80;
   e.srcrect.x = 0;
   e.srcrect.y = 0;
   e.srcrect.w = 100;
diff --git a/image.c b/image.c
index 2ccb88556f72fe87b3326882d79f17ce1f833848..b2a16619bb7a94ba90e9176617cfd04c51dc34e9 100644
--- a/image.c
+++ b/image.c
@@ -17,7 +17,6 @@ void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap,
   SDL_Rect destrect;
   int tabVal;
 
-  //affichage routes & murs
   for(int j = 0; j < 60; j++){
     for(int i = 0; i < 60; i++){
       destrect.x = i * 50 - xCamera;
@@ -94,14 +93,13 @@ void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap,
     }
   }
 
-  //voitures
   for(int j = 0; j < 60; j++){
     for(int i = 0; i < 60; i++){
       destrect.x = i * 50 - xCamera;
       destrect.y = j * 50 - yCamera;
       destrect.h = 50;
       destrect.w = 50;
-    switch(tab[60*j+i]){
+      switch(tab[60*j+i]){
       case 'P':
         destrect.w = 200;
         destrect.h = 100;
@@ -122,14 +120,49 @@ void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap,
         destrect.h = 300;
         SDL_RenderCopy(renderer, spriteMap[19], NULL, &destrect);
         break;
-
       default :
         break;
-    }
+      }
     }
   }
+  return;
+}
 
+void charger_images(SDL_Texture **sprites, SDL_Texture **spritesMap, SDL_Renderer *ecran){
+  spritesMap[0] = charger_image("sprites/map/sol.png", ecran, 0, 0, -1);
+  spritesMap[1] = charger_image("sprites/map/mur_h.png", ecran, 255, 255, 255);
+  spritesMap[2] = charger_image("sprites/map/mur_b.png", ecran, 255, 255, 255);
+  spritesMap[3] = charger_image("sprites/map/mur_g.png", ecran, 255, 255, 255);
+  spritesMap[4] = charger_image("sprites/map/mur_d.png", ecran, 255, 255, 255);
+  spritesMap[5] = charger_image("sprites/map/mur_hg.png", ecran, 255, 255, 255);
+  spritesMap[6] = charger_image("sprites/map/mur_hd.png", ecran, 255, 255, 255);
+  spritesMap[7] = charger_image("sprites/map/mur_bg.png", ecran, 255, 255, 255);
+  spritesMap[8] = charger_image("sprites/map/mur_bd.png", ecran, 255, 255, 255);
+  spritesMap[9] = charger_image("sprites/map/route_ver.png", ecran, 0, 0, -1);
+  spritesMap[10] = charger_image("sprites/map/route_hor.png", ecran, 0, 0, -1);
+  spritesMap[11] = charger_image("sprites/map/police_car.png", ecran, 0, 0, -1);
+  spritesMap[12] = charger_image("sprites/map/ambulance.png", ecran, 0, 0, -1);
+  spritesMap[13] = charger_image("sprites/map/eau.png", ecran, 0, 0, -1);
+  spritesMap[14] = charger_image("sprites/map/conteneurs.png", ecran, 0, 0, -1);
+  spritesMap[15] = charger_image("sprites/map/maison2.png", ecran, 0, 0, -1);
+  spritesMap[16] = charger_image("sprites/map/maison.png", ecran, 0, 0, -1);
+  spritesMap[17] = charger_image("sprites/map/herbe.png", ecran, 0, 0, -1);
+  spritesMap[18] = charger_image("sprites/map/maison3.png", ecran, 0, 0, -1);
+  spritesMap[19] = charger_image("sprites/map/fontaine.png", ecran, 0, 0, -1);
 
-
-  return;
+  sprites[0] = charger_image("sprites/perso/survivor_handgun.png", ecran, 255, 255, 255);
+  sprites[1] = charger_image("sprites/ennemis/zombie/move/ennemi1_move.png", ecran, 0, 0, -1);
+  sprites[2] = charger_image("sprites/ennemis/zombie/attack/ennemi1_attack.png", ecran, 0, 0, -1);
+  sprites[3] = charger_image("sprites/effets/blood/blood_hitv3.png", ecran, 0, 0, -1);
+  sprites[4] = charger_image("sprites/effets/blood/blood_splatter.png", ecran, 255, 255, 255);
+  sprites[5] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255);
+  sprites[6] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255);
+  sprites[7] = charger_image("sprites/projectiles/balle/balle_handgun.png", ecran, 255, 255, 255);
+  sprites[8] = charger_image("sprites/projectiles/balle/balle_shotgun.png", ecran, 255, 255, 255);
+  sprites[9] = charger_image("sprites/projectiles/balle/balle_rifle.png", ecran, 255, 255, 255);
+  sprites[10] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255);
+  sprites[11] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255);
+  sprites[12] = charger_image("sprites/ennemis/zombie/move/ennemi2_move.png", ecran, 0, 0, -1);
+  sprites[13] = charger_image("sprites/ennemis/zombie/attack/ennemi2_attack.png", ecran, 0, 0, -1);
+  sprites[14] = charger_image("sprites/projectiles/slime.png", ecran, 0, 0, -1);
 }
diff --git a/image.h b/image.h
index 10b9a03303f1e7abd001c0b6d2505293bcdc8e01..4d6bb07f11f8bdc2d1f597d7c337dced589e7588 100644
--- a/image.h
+++ b/image.h
@@ -3,3 +3,4 @@
 
 SDL_Texture* charger_image(const char* fichier, SDL_Renderer* renderer, int r, int g, int b);
 void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap, int xCamera, int yCamera);
+void charger_images(SDL_Texture **sprites, SDL_Texture **spritesMap, SDL_Renderer *ecran);
diff --git a/listeB.c b/listeB.c
index 6ab6eef1eae2a0c139c556302e55ab8a9f901a06..3491f76ca4f96bfc1b906b69921ab2c5effdac81 100644
--- a/listeB.c
+++ b/listeB.c
@@ -15,51 +15,61 @@ bool est_vide_listeB(ListeB L) {
 
 
 
-ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites)
+ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Perso *joueur)
 {
   if(LB == NULL){
     return LB;
   }
 
-  incrementer_balle(&LB->data, v);
-
   SDL_Rect ballePos;
   ballePos.w = 1;
   ballePos.h = 1;
-  if(LB->data.angle >= -45 && LB->data.angle < 45){
-    ballePos.x = LB->data.ballePos.x + 50;
-    ballePos.y = LB->data.ballePos.y + 15;
-  } else if(LB->data.angle >= 45 && LB->data.angle < 135){
-    ballePos.x = LB->data.ballePos.x + 30;
-    ballePos.y = LB->data.ballePos.y + 30;
-  } else if(LB->data.angle >= -135 && LB->data.angle < -45){
-    ballePos.x = LB->data.ballePos.x + 35;
-    ballePos.y = LB->data.ballePos.y;
-  } else {
-    ballePos.x = LB->data.ballePos.x + 15;
-    ballePos.y = LB->data.ballePos.y;
-  }
 
-  if(ballePos.x < 0 || ballePos.x >= 1000 || ballePos.y <= 0 || ballePos.y >= 700
-     || detecter_collision_murs(LR, ballePos, xCamera, yCamera)){
-    LB = LB->next;
-    return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites);
-  }
+  if(LB->data.ennemi == false){
+    incrementer_balle(&LB->data, v, dxCamera, dyCamera);
+    if(LB->data.angle >= -45 && LB->data.angle < 45){
+      ballePos.x = LB->data.ballePos.x + 50;
+      ballePos.y = LB->data.ballePos.y + 15;
+    } else if(LB->data.angle >= 45 && LB->data.angle < 135){
+      ballePos.x = LB->data.ballePos.x + 30;
+      ballePos.y = LB->data.ballePos.y + 30;
+    } else if(LB->data.angle >= -135 && LB->data.angle < -45){
+      ballePos.x = LB->data.ballePos.x + 35;
+      ballePos.y = LB->data.ballePos.y;
+    } else {
+      ballePos.x = LB->data.ballePos.x + 15;
+      ballePos.y = LB->data.ballePos.y;
+    }
 
-  ballePos.w = 2;
-  ballePos.h = 2;
-  ballePos.x = LB->data.ballePos.x;
-  ballePos.y = LB->data.ballePos.y;
+    if(ballePos.x < 0 || ballePos.x >= 1000 || ballePos.y <= 0 || ballePos.y >= 700
+    || detecter_collision_murs(LR, ballePos, xCamera, yCamera)){
+      LB = LB->next;
+      return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur);
+    }
 
-  if(detecter_collision_perso(LP, LE, ballePos, LB->data.angle, LB->data.degats, xCamera, yCamera, nbTues, sprites)) {
-    LB = LB->next;
-    return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites);
+    ballePos.w = 2;
+    ballePos.h = 2;
+    ballePos.x = LB->data.ballePos.x;
+    ballePos.y = LB->data.ballePos.y;
+
+    if(detecter_collision_perso(LP, LE, ballePos, LB->data.angle, LB->data.degats, xCamera, yCamera, nbTues, sprites)) {
+      LB = LB->next;
+      return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur);
+    }
+  } else {
+    incrementer_balle(&LB->data, 4, dxCamera, dyCamera);
+    if(detecter_collision_murs(LR, LB->data.ballePos, xCamera, yCamera)){
+      LB = LB->next;
+      return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur);
+    }
+    if(detecter_collision_balle_avec_joueur(LB->data.ballePos, LB->data.degats, joueur)){
+      LB = LB->next;
+      return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur);
+    }
   }
 
-  LB->next = incrementer_balles(LB->next, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites);
+  LB->next = incrementer_balles(LB->next, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur);
   return LB;
-
-  return NULL;
 }
 
 void afficher_listeB(SDL_Renderer *renderer, ListeB L) {
@@ -70,11 +80,12 @@ void afficher_listeB(SDL_Renderer *renderer, ListeB L) {
   }
 }
 
-ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons){
+ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons, Perso *joueur){
   s_ListeP *tmp = LP;
   while(tmp != NULL){
-    if(tmp->data.tir && tmp->data.ennemi == false){
+    if(tmp->data.tir){
       int arme;
+      balle b;
       arme = tmp->data.arme;
       switch(arme){
       case 0:
@@ -101,13 +112,146 @@ ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v,
           tmp->data.tempsTirPrecedent = time;
         }
         break;
+      case -10:
+        b = nouvelle_balle(sprites[14], tmp->data.angle, 10, tmp->data.pos);
+        b.ennemi = true;
+        b.ballePos.x += 10;
+        b.ballePos.y += 10;
+        b.ballePos.w = 30;
+        b.ballePos.h = 30;
+        b.srcrect.w = 250;
+        b.srcrect.h = 251;
+        cons_listeB(&LB, b);
+        tmp->data.arme = 10;
+        tmp->data.tir = false;
+        tmp->data.image = sprites[12];
+        tmp->data.pos.w = 50;
+        tmp->data.pos.h = 50;
+        tmp->data.srcrect.w = 229;
+        tmp->data.srcrect.h = 259;
+        tmp->data.srcrect.y = 0;
+        tmp->data.yMax = 4403;
+        tmp->data.animFlip = 1;
+        tmp->data.vitesse = 2;
+      default:
+        break;
+      }
+    } else {
+      if(time > tmp->data.tempsTirPrecedent + 3000 && tmp->data.arme == 10){
+        if(tmp->data.collision == false && tmp->data.pos.x > 100 &&
+          tmp->data.pos.x < 900 && tmp->data.pos.y > 100 && tmp->data.pos.y < 600){
+          tmp->data.tir = true;
+          tmp->data.arme = 100;
+          tmp->data.vitesse = 0;
+          tmp->data.tempsTirPrecedent = time;
+        }
       }
     }
     tmp = tmp->next;
   }
+  LB = incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur);
+  return LB;
+}
+
+void animer_balles(ListeB LB){
+  while(LB != NULL){
+    if(LB->data.ennemi){
+      LB->data.srcrect.y += LB->data.srcrect.h;
+      if(LB->data.srcrect.y > 7 * LB->data.srcrect.h){
+        LB->data.srcrect.y = 0;
+      }
+    }
+    LB = LB->next;
+  }
+  return;
+}
 
-  LB = incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites);
+void animer_ennemi_2(ListeB LB, Perso *p, SDL_Texture **sprites){
 
-  return LB;
+  if(!p->tir){
+    p->srcrect.y += p->srcrect.h * p->animFlip;
+    if((p->srcrect.y >= p->yMax || p->srcrect.y < 0) && !p->tir){
+      p->animFlip = -p->animFlip;
+      p->srcrect.y += p->srcrect.h * p->animFlip;
+    }
+  } else {
+    if(p->arme == 100){
+      p->image = sprites[13];
+      p->pos.w = 60;
+      p->pos.h = 60;
+      p->srcrect.w = 318;
+      p->srcrect.h = 294;
+      p->srcrect.y = 0;
+      p->yMax = 2646;
+      p->animFlip = 1;
+      p->arme = 101;
+    } else if(p->arme == 101){
+      p->srcrect.y += p->srcrect.h;
+      if(p->srcrect.y >= p->yMax){
+        p->arme = -10;
+      }
+    }
+  }
+
+  return;
+}
+
+void animer_ennemi_1(Perso *p, Perso *joueur, SDL_Texture **sprites){
+  if(p->tir){
+    if(p->arme == -1){
+      if(p->srcrect.w != 318){
+        p->image = sprites[2];
+        p->pos.w = 60;
+        p->pos.h = 60;
+        p->srcrect.w = 318;
+        p->srcrect.h = 294;
+        p->srcrect.y = 0;
+        p->yMax = 2646;
+        p->animFlip = 1;
+      } else {
+        p->srcrect.y += p->srcrect.h * p->animFlip;
+        if(p->srcrect.y == p->srcrect.h * 6){
+          if(joueur->vie < p->degats){
+            joueur->vie = 0;
+          }else {
+            joueur->vie -= p->degats;
+          }
+        } else if(p->srcrect.y == p->yMax){
+          p->image = sprites[1];
+          p->pos.w = 50;
+          p->pos.h = 50;
+          p->srcrect.w = 229;
+          p->srcrect.h = 259;
+          p->srcrect.y = 0;
+          p->yMax = 4403;
+          p->animFlip = 1;
+          p->tir = false;
+          p->vitesse = 3;
+        }
+      }
+    }
+  } else {
+    p->srcrect.y += p->srcrect.h * p->animFlip;
+    if((p->srcrect.y >= p->yMax || p->srcrect.y < 0) && !p->tir){
+      p->animFlip = -p->animFlip;
+      p->srcrect.y += p->srcrect.h * p->animFlip;
+    }
+  }
+  return;
+}
+
+void animer_persos(ListeP L, ListeB LB, SDL_Texture **sprites, Perso *joueur){
+
+ while(L != NULL){
+  if(L->data.ennemi){
+    if(L->data.arme == -1){
+      animer_ennemi_1(&L->data, joueur, sprites);
+    } else {
+      animer_ennemi_2(LB, &L->data, sprites);
+    }
+  }
+  L = L->next;
+  }
+  return;
 }
 
diff --git a/listeB.h b/listeB.h
index a5771570897597a0901d0f8391b1e9ad827b77e1..cc0fa6ea4476558d792d6fa7850c2538c249603d 100644
--- a/listeB.h
+++ b/listeB.h
@@ -14,8 +14,11 @@ struct s_ListeB
 
 void cons_listeB(ListeB *L, balle data);
 bool est_vide_listeB(ListeB L);
-ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites);
+ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Perso *joueur);
 void afficher_listeB(SDL_Renderer *renderer, ListeB L);
-ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons);
-
+ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons, Perso *joueur);
+void animer_balles(ListeB LB);
+void animer_ennemi_1(Perso *p, Perso *joueur, SDL_Texture **sprites);
+void animer_ennemi_2(ListeB LB, Perso *p, SDL_Texture **sprites);
+void animer_persos(ListeP L, ListeB LB, SDL_Texture **sprites, Perso *joueur);
 
diff --git a/listeP.c b/listeP.c
index 9811d014456c8749f93d079e43c57c3af1f116dc..eea9df744402c9050441e58fc053c4d30f5791d9 100644
--- a/listeP.c
+++ b/listeP.c
@@ -142,9 +142,7 @@ bool detecter_collision_perso(ListeP L, ListeE *LE, SDL_Rect rect, int angle, in
 }
 
 void detecter_collision_avec_joueur(Perso *p, Perso *joueur){
-
   int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2;
-
   ax1 = p->pos.x;
   ax2 = p->pos.x + p->pos.w ;
   bx1 = joueur->pos.x + round(0.24 * joueur->pos.w);
@@ -163,25 +161,37 @@ void detecter_collision_avec_joueur(Perso *p, Perso *joueur){
 }
 
 
-void animer_persos(ListeP L, SDL_Texture **sprites, Perso *joueur){
-
- while(L != NULL){
-  if(L->data.ennemi){
-    animer_perso(&L->data, joueur, sprites);
-  }
-  L = L->next;
+void charger_vague_ennemis(SDL_Renderer *renderer, bool *b, int *vaguesEnnemis, int vagueNum, int xCamera, int yCamera, ListeP *LP, ListeR LR,SDL_Texture **sprites){
+    if(vaguesEnnemis[vagueNum] > 0){
+      cons_listeP(LP, nouvel_ennemi_1(renderer, LR, sprites, xCamera, yCamera));
+      int nb = rand()%4 + 1;
+      if(nb == 1){
+        cons_listeP(LP, nouvel_ennemi_2(renderer, LR, sprites, xCamera, yCamera));
+      }
+      vaguesEnnemis[vagueNum] -= 1;
+  } else {
+    *b = true;
   }
   return;
 }
 
+bool detecter_collision_balle_avec_joueur(SDL_Rect pos, int degats, Perso *joueur){
+  int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2;
+  ax1 = pos.x;
+  ax2 = pos.x + pos.w ;
+  bx1 = joueur->pos.x + round(0.24 * joueur->pos.w);
+  bx2 = joueur->pos.x + round(0.75 * joueur->pos.w);
+  ay1 = pos.y;
+  ay2 = pos.y + pos.h;
+  by1 = joueur->pos.y;
+  by2 = joueur->pos.y + joueur->pos.h;
 
-void charger_vague_ennemis(SDL_Renderer *renderer, bool *b, int *vaguesEnnemis, int vagueNum, int xCamera, int yCamera, ListeP *LP, ListeR LR,SDL_Texture **sprites){
-  if(vaguesEnnemis[vagueNum] > 0){
-    cons_listeP(LP, nouvel_ennemi_1(renderer, LR, sprites, xCamera, yCamera));
-    vaguesEnnemis[vagueNum] -= 1;
-  } else {
-    *b = true;
+  if(ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1){
+    joueur->vie -= degats;
+    return true;
   }
-  return;
+  return false;
 }
 
+
+
diff --git a/listeP.h b/listeP.h
index 24b17b8217a4e12c8bdbbf09f8ddaa45f12ecade..c9bcf8bb610dec99076f48693a3b9958c59a3f80 100644
--- a/listeP.h
+++ b/listeP.h
@@ -22,6 +22,5 @@ void deplacement_ennemi(Perso *p, ListeR LR, Perso *joueur, int xCamera, int yCa
 void deplacement_ennemis(ListeP LP, ListeR LR, ListeE *LE, SDL_Texture **sprites, int xCamera, int yCamera, int dxCamera, int dyCamera);
 bool detecter_collision_perso(ListeP L, ListeE *LE, SDL_Rect rect, int angle, int degats, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites);
 void detecter_collision_avec_joueur(Perso *p, Perso *joueur);
-void animer_persos(ListeP L, SDL_Texture **sprites, Perso *joueur);
 void charger_vague_ennemis(SDL_Renderer *renderer, bool *b, int *vaguesEnnemis, int vagueNum,int xCamera, int yCamera, ListeP *LP, ListeR LR, SDL_Texture **sprites);
-
+bool detecter_collision_balle_avec_joueur(SDL_Rect pos, int degats, Perso *joueur);
diff --git a/listeR.c b/listeR.c
index 1bba4c355f148529581f6a120a11b14a7cb39f8e..d355ccfb706e5fb28866c71ebbb90108933c8f0b 100644
--- a/listeR.c
+++ b/listeR.c
@@ -149,14 +149,19 @@ void charger_niveau(char *tab, ListeR *L){
         break;
       case 'L':
         rect.x = i * 50 + 30;
-        rect.y = j * 50 + 215;
-        rect.h = 360;
-        rect.w = 210;
-        cons_listeR(L, rect);
-        rect.x = i * 50 + 205 ;
-        rect.y = j * 50 + 40;
-        rect.h = 425;
-        rect.w = 570;
+        rect.y = j * 50 + 213;
+        rect.h = 362;
+        rect.w = 167;
+        cons_listeR(L, rect);
+        rect.x = i * 50 + 200;
+        rect.y = j * 50 + 463;
+        rect.h = 94;
+        rect.w = 47;
+        cons_listeR(L, rect);
+        rect.x = i * 50 + 200 ;
+        rect.y = j * 50 + 44;
+        rect.h = 417;
+        rect.w = 574;
         cons_listeR(L, rect);
         break;
       case 'F':
diff --git a/main.c b/main.c
index 0bca69802305b8d1c6c934c2a24baa81bc0ad029..38f63ddd821085eeb520ec45da4fc88f821d2dd8 100644
--- a/main.c
+++ b/main.c
@@ -1,7 +1,7 @@
 #include "image.h"
 #include "listeB.h"
 #include "SDL2/SDL_ttf.h"
-
+#include <string.h>
 
 int main(int argc, char *argv[])
 {
@@ -10,9 +10,9 @@ int main(int argc, char *argv[])
     SDL_Window *fenetre;
     SDL_Event evenements;
     SDL_Renderer *ecran;
-    SDL_Texture *sprites[12], *spritesMap[20];
+    SDL_Texture *sprites[15], *spritesMap[20];
     float mouseX, mouseY;
-    int vitesse, vagueNum, nbTues = 0, arme, tempsActuel, tempsPrecedent, tempsActuelTir, tempsActuelVague, tempsPrecedentVague,
+    int vitesse, vagueNum, nbTues, arme, tempsPrecedent, tempsPrecedentTexte, tempsActuelTir, tempsActuelVague, tempsPrecedentVague,
         tempsActuelAnim, tempsPrecedentAnim, xCamera, yCamera, dxCamera, dyCamera, vaguesEnnemis[100];
     char map[62][60];
     ListeB ballesTirees;
@@ -22,112 +22,64 @@ int main(int argc, char *argv[])
     Perso p, *joueur_ptr;
     Mix_Music *musique;
     Mix_Chunk *sons[3];
+    TTF_Font *police;
+
+
 
 
-    //Initialisation SDL
-    if(SDL_Init(SDL_INIT_EVERYTHING))
-    {
+    if(SDL_Init(SDL_INIT_EVERYTHING)){
       printf("Erreur d'initialisation de la SDL %s", SDL_GetError());
       SDL_Quit();
       return EXIT_FAILURE;
     }
 
-
-    if(Mix_OpenAudio(44100, AUDIO_S16, 1, 4096) < 0)
-    {
+    if(Mix_OpenAudio(44100, AUDIO_S16, 1, 4096) < 0){
       printf("Erreur d'initialisation de la SDL %s", Mix_GetError() );
       SDL_Quit();
       return EXIT_FAILURE;
     }
 
-    if(TTF_Init() == -1)
-    {
+    if(TTF_Init() == -1){
     fprintf(stderr, "Erreur d'initialisation de TTF_Init : %s\n", TTF_GetError());
     return (EXIT_FAILURE);
     }
 
-    //Cr�ation fen�tre
-    fenetre = SDL_CreateWindow("gameName", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 700, SDL_WINDOW_RESIZABLE);
-    if(fenetre == NULL)
-    {
+    fenetre = SDL_CreateWindow("Shooter Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 700, SDL_WINDOW_RESIZABLE);
+    if(fenetre == NULL){
       printf("Erreur d'initialisation de la fenetre %s", SDL_GetError());
       return EXIT_FAILURE;
     }
 
-    //Cr�ation renderer
     ecran = SDL_CreateRenderer(fenetre, -1, SDL_RENDERER_ACCELERATED);
 
-    //Initialisation texte
+    charger_images(&sprites[0], &spritesMap[0], ecran);
+
+    musique = NULL;
+    charger_sons(&musique, &sons[0]);
+
     SDL_Color couleur = {255, 20, 20};
-    SDL_Rect postext;
-    postext.x = 810;
-    postext.y = 0;
-    postext.w = 180;
-    postext.h = 50;
     SDL_Rect postext2;
-    postext2.x = 0;
+    postext2.x = 810;
     postext2.y = 0;
-    postext2.w = 150;
+    postext2.w = 180;
     postext2.h = 50;
+    SDL_Rect postext1;
+    postext1.x = 0;
+    postext1.y = 0;
+    postext1.w = 150;
+    postext1.h = 50;
     SDL_Rect postext3;
-    postext3.x = 370;
-    postext3.y = 350;
-    postext3.w = 300;
-    postext3.h = 100;
-    TTF_Font *police =  NULL;
-    police = TTF_OpenFont("RAVIE.ttf", 100);
-    if(police == NULL)
-        return false;
+    postext3.x = 810;
+    postext3.y = 50;
+    postext3.w = 180;
+    postext3.h = 50;
+    police = NULL;
+    police = TTF_OpenFont("police.otf", 100);
 
     SDL_Surface *pSurf;
     SDL_Texture *text;
-    SDL_Surface *pSurf2;
     SDL_Texture *text2;
-
-
-
-
-    //Chargement images
-    //Murs + Sols
-    spritesMap[0] = charger_image("sprites/map/sol.png", ecran, 0, 0, -1);
-    spritesMap[1] = charger_image("sprites/map/mur_h.png", ecran, 255, 255, 255);
-    spritesMap[2] = charger_image("sprites/map/mur_b.png", ecran, 255, 255, 255);
-    spritesMap[3] = charger_image("sprites/map/mur_g.png", ecran, 255, 255, 255);
-    spritesMap[4] = charger_image("sprites/map/mur_d.png", ecran, 255, 255, 255);
-    spritesMap[5] = charger_image("sprites/map/mur_hg.png", ecran, 255, 255, 255);
-    spritesMap[6] = charger_image("sprites/map/mur_hd.png", ecran, 255, 255, 255);
-    spritesMap[7] = charger_image("sprites/map/mur_bg.png", ecran, 255, 255, 255);
-    spritesMap[8] = charger_image("sprites/map/mur_bd.png", ecran, 255, 255, 255);
-    spritesMap[9] = charger_image("sprites/map/route_ver.png", ecran, 0, 0, -1);
-    spritesMap[10] = charger_image("sprites/map/route_hor.png", ecran, 0, 0, -1);
-    spritesMap[11] = charger_image("sprites/map/police_car.png", ecran, 0, 0, -1);
-    spritesMap[12] = charger_image("sprites/map/ambulance.png", ecran, 0, 0, -1);
-    spritesMap[13] = charger_image("sprites/map/eau.png", ecran, 0, 0, -1);
-    spritesMap[14] = charger_image("sprites/map/conteneurs.png", ecran, 0, 0, -1);
-    spritesMap[15] = charger_image("sprites/map/maison2.png", ecran, 0, 0, -1);
-    spritesMap[16] = charger_image("sprites/map/maison.png", ecran, 0, 0, -1);
-    spritesMap[17] = charger_image("sprites/map/herbe.png", ecran, 0, 0, -1);
-    spritesMap[18] = charger_image("sprites/map/maison3.png", ecran, 0, 0, -1);
-    spritesMap[19] = charger_image("sprites/map/fontaine.png", ecran, 0, 0, -1);
-
-    //Personnages + Effets
-    sprites[0] = charger_image("sprites/perso/survivor_handgun.png", ecran, 255, 255, 255);
-    sprites[1] = charger_image("sprites/ennemis/zombie/move/zombie_moveV2.png", ecran, 0, 0, -1);
-    sprites[2] = charger_image("sprites/ennemis/zombie/attack/zombie_attack.png", ecran, 0, 0, -1);
-    sprites[3] = charger_image("sprites/effets/blood/blood_hitv3.png", ecran, 0, 0, -1);
-    sprites[4] = charger_image("sprites/effets/blood/blood_splatter.png", ecran, 255, 255, 255);
-    sprites[5] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255);
-    sprites[6] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255);
-    sprites[7] = charger_image("sprites/projectiles/balle/balle_handgun.png", ecran, 255, 255, 255);
-    sprites[8] = charger_image("sprites/projectiles/balle/balle_shotgun.png", ecran, 255, 255, 255);
-    sprites[9] = charger_image("sprites/projectiles/balle/balle_rifle.png", ecran, 255, 255, 255);
-    sprites[10] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255);
-    sprites[11] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255);
-
-    //Sons
-    musique = NULL;
-
-    charger_sons(&musique, &sons[0]);
+    SDL_Texture *text3;
 
     exit = false;
 
@@ -142,9 +94,9 @@ int main(int argc, char *argv[])
       vagueNum = 0;
       nbTues = 0;
       arme = 0;
-      tempsActuel = 0;
       tempsPrecedent = 0;
       tempsActuelTir = 0;
+      tempsPrecedentTexte = 0;
       tempsActuelVague = 0;
       tempsPrecedentVague = 0;
       tempsActuelAnim = 0;
@@ -154,11 +106,16 @@ int main(int argc, char *argv[])
       dxCamera = 0;
       dyCamera = 0;
 
+
       mursListe = NULL;
       ballesTirees = NULL;
       effetsListe = NULL;
       persosListe = NULL;
       joueur_ptr = NULL;
+      pSurf = NULL;
+      text = NULL;
+      text2 = NULL;
+      text3 = NULL;
 
       charger_niveau(map[0], &mursListe);
 
@@ -168,12 +125,9 @@ int main(int argc, char *argv[])
       charger_vagues_ennemis(vaguesEnnemis);
 
 
-      //Boucle de jeu
       while(!gameover)
       {
-        tempsActuel = SDL_GetTicks();
-        if (tempsActuel > tempsPrecedent + 16) {
-          //D�tection �v�nements
+        if (SDL_GetTicks() > tempsPrecedent + 16) {
           while(SDL_PollEvent(&evenements))
           {
             switch(evenements.type)
@@ -252,7 +206,6 @@ int main(int argc, char *argv[])
             }
 
 
-
           joueur_ptr = joueur(persosListe);
           if(joueur_ptr != NULL){
             if(switchArme){
@@ -267,55 +220,56 @@ int main(int argc, char *argv[])
 
 
           tempsActuelAnim = SDL_GetTicks();
-          if(tempsActuelAnim > tempsPrecedentAnim + 40 ){
-            animer_persos(persosListe, sprites, joueur_ptr);
+          if(tempsActuelAnim > tempsPrecedentAnim + 40){
+            animer_balles(ballesTirees);
+            animer_persos(persosListe, ballesTirees, sprites, joueur_ptr);
             animer_effets(effetsListe);
             tempsPrecedentAnim = tempsActuelAnim;
           }
 
-          //D�tection mort joueur
           if(joueur_ptr->vie <= 0){
-            SDL_Surface *pSurf3 = TTF_RenderText_Blended(police, "GameOver", couleur);
-            SDL_Texture *text3 = SDL_CreateTextureFromSurface(ecran, pSurf3);
-            SDL_RenderCopy(ecran, text3, NULL, &postext3);
             gameover = true;
           }
-          else{
-            char sc[10];
-            char score[] = "Score : ";
-            char pv[10];
-            char vie[] = "Vie : ";
-            sprintf(sc, "%d", nbTues);
-            strcat(score, sc);
-            sprintf(pv, "%d", joueur_ptr->vie);
-            strcat(vie, pv);
-            pSurf = TTF_RenderText_Blended(police, score, couleur); ////
-            text = SDL_CreateTextureFromSurface(ecran, pSurf);
-            pSurf2 = TTF_RenderText_Blended(police, vie, couleur);
-            text2 = SDL_CreateTextureFromSurface(ecran, pSurf2);
 
+          if(SDL_GetTicks() > tempsPrecedentTexte + 500){
+            char sc[11];
+            char pv[11];
+            char ma[11];
+            sc[0] = '\0';
+            pv[0] = '\0';
+            ma[0] = '\0';
+            sprintf(sc, "Score : %d", nbTues);
+            sprintf(pv, "Vie : %d", joueur_ptr->vie);
+            sprintf(ma, "Manche : %d", vagueNum + 1);
+            pSurf = TTF_RenderText_Blended(police, sc, couleur);
+            text = SDL_CreateTextureFromSurface(ecran, pSurf);
+            SDL_FreeSurface(pSurf);
+            pSurf = TTF_RenderText_Blended(police, pv, couleur);
+            text2 = SDL_CreateTextureFromSurface(ecran, pSurf);
+            SDL_FreeSurface(pSurf);
+            pSurf = TTF_RenderText_Blended(police, ma, couleur);
+            text3 = SDL_CreateTextureFromSurface(ecran, pSurf);
+            SDL_FreeSurface(pSurf);
+            tempsPrecedentTexte = SDL_GetTicks();
           }
 
-          //D�placement/angle de tir ennemis
           deplacement_ennemis(persosListe, mursListe, &effetsListe, sprites, xCamera, yCamera, dxCamera, dyCamera);
 
-          //Tir
           tempsActuelTir = SDL_GetTicks();
-          ballesTirees = tir_update(ballesTirees, persosListe, mursListe, &effetsListe, tempsActuelTir, vitesse, xCamera, yCamera, &nbTues, sprites, &sons[0]);
-
+          ballesTirees = tir_update(ballesTirees, persosListe, mursListe, &effetsListe, tempsActuelTir, vitesse, xCamera, yCamera, dxCamera, dyCamera, &nbTues, sprites, &sons[0], joueur_ptr);
 
 
-          //Affichage
           SDL_RenderClear(ecran);
           afficher_niveau(map[0], ecran, spritesMap, xCamera, yCamera);
           afficher_listeE(ecran, effetsListe, dxCamera, dyCamera);
           afficher_listeP(ecran, persosListe);
           afficher_listeB(ecran, ballesTirees);
-          SDL_RenderCopy(ecran, text, NULL, &postext);
-          SDL_RenderCopy(ecran, text2, NULL, &postext2);
+          SDL_RenderCopy(ecran, text, NULL, &postext2);
+          SDL_RenderCopy(ecran, text2, NULL, &postext1);
+          SDL_RenderCopy(ecran, text3, NULL, &postext3);
           SDL_RenderPresent(ecran);
 
-          tempsPrecedent = tempsActuel;
+          tempsPrecedent = SDL_GetTicks();
         }
       }
 
@@ -324,7 +278,6 @@ int main(int argc, char *argv[])
 
     }
 
-    //Nettoyage
     SDL_DestroyWindow(fenetre);
     SDL_DestroyRenderer(ecran);
     Mix_FreeMusic(musique);
diff --git a/personnage.c b/personnage.c
index 821a78ce827a593351b1b89a6be51c0c8bf1ec38..ac18e74a9ca624682230e11b7b5f999eca519e10 100644
--- a/personnage.c
+++ b/personnage.c
@@ -14,7 +14,7 @@ Perso nouveau_joueur(SDL_Renderer *renderer, SDL_Texture **sprites){
   p.srcrect.w = 395;
   p.srcrect.h = 151;
   p.angle = 0;
-  p.vie = 20;
+  p.vie = 100;
   p.vitesse = 4;
   p.yMax = 0;
   p.arme = 0;
@@ -60,6 +60,16 @@ Perso nouvel_ennemi_1(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites,
   return p;
 }
 
+Perso nouvel_ennemi_2(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites, int xCamera, int yCamera){
+  Perso p;
+  p = nouvel_ennemi_1(renderer, LR, sprites, xCamera, yCamera);
+  p.vie = 50;
+  p.vitesse = 3;
+  p.image = sprites[12];
+  p.arme = 10;
+  return p;
+}
+
 void afficher_perso(SDL_Renderer *renderer, Perso p) {
   SDL_RenderCopyEx(renderer, p.image, &p.srcrect, &p.pos, p.angle, NULL, SDL_FLIP_NONE);
   return;
@@ -69,7 +79,7 @@ void afficher_perso(SDL_Renderer *renderer, Perso p) {
 void charger_vagues_ennemis(int *tab){
   int n = 1;
   for(int j = 1; j < 101; j++){
-    if(j%5 == 0 ){
+    if(j%4 == 0 ){
       n += 1;
     }
     tab[j-1] = j * n;
@@ -153,51 +163,6 @@ void angle_ennemi(Perso *p){
   return;
 }
 
-void animer_perso(Perso *p, Perso *joueur, SDL_Texture **sprites){
-  if(p->tir){
-    if(p->srcrect.w != 318){
-      p->image = sprites[2];
-      p->pos.w = 60;
-      p->pos.h = 60;
-      p->srcrect.w = 318;
-      p->srcrect.h = 294;
-      p->srcrect.y = 0;
-      p->yMax = 2646;
-      p->animFlip = 1;
-    } else {
-      p->srcrect.y += p->srcrect.h * p->animFlip;
-      if(p->srcrect.y == p->srcrect.h * 6){
-        if(joueur->vie < p->degats){
-          joueur->vie = 0;
-        }else {
-          joueur->vie -= p->degats;
-        }
-      } else if(p->srcrect.y == p->yMax){
-        p->image = sprites[1];
-        p->pos.w = 50;
-        p->pos.h = 50;
-        p->srcrect.w = 229;
-        p->srcrect.h = 259;
-        p->srcrect.y = 0;
-        p->yMax = 4403;
-        p->animFlip = 1;
-        p->tir = false;
-        p->vitesse = 2;
-      }
-    }
-
-  }
-
-  else {
-    p->srcrect.y += p->srcrect.h * p->animFlip;
-    if((p->srcrect.y >= p->yMax || p->srcrect.y < 0) && !p->tir){
-      p->animFlip = -p->animFlip;
-      p->srcrect.y += p->srcrect.h * p->animFlip;
-    }
-  }
-  return;
-}
-
 
 void detecter_collision_murs_ennemis(ListeR L, Perso *p, int xCamera, int yCamera){
   int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2;
diff --git a/personnage.h b/personnage.h
index ee5c867631e0e064f1cfe78ede803134f59f3041..9c338af665bd818a13879321229965482bb0bfcd 100644
--- a/personnage.h
+++ b/personnage.h
@@ -29,11 +29,11 @@ struct s_Personnage
 
 Perso nouveau_joueur(SDL_Renderer *renderer, SDL_Texture **sprites);
 Perso nouvel_ennemi_1(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites, int xCamera, int yCamera);
+Perso nouvel_ennemi_2(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites, int xCamera, int yCamera);
 void afficher_perso(SDL_Renderer *renderer, Perso p);
 void charger_vagues_ennemis(int *tab);
 void deplacement_joueur(Perso *p, ListeR L, int *xCamera, int *yCamera, int *dxCamera, int *dyCamera);
 void angle_ennemi(Perso *p);
 void angle_joueur(Perso *p, float mouseX, float mouseY);
-void animer_perso(Perso *p, Perso *joueur, SDL_Texture **sprites);
 void detecter_collision_murs_ennemis(ListeR L, Perso *p, int xCamera, int yCamera);
 void changer_arme_joueur(Perso *p, int arme, SDL_Texture **sprites);
diff --git a/police.otf b/police.otf
new file mode 100644
index 0000000000000000000000000000000000000000..39f43e2515ecec2267aed8dd0f28d4c35b2ee0e2
Binary files /dev/null and b/police.otf differ
diff --git a/projectile.c b/projectile.c
index 19322075397e9f49a57e96dae9eae770003e89ff..bc2d1da3e6353f2e98c3e59acba79dfb25916cea 100644
--- a/projectile.c
+++ b/projectile.c
@@ -9,17 +9,31 @@ balle nouvelle_balle(SDL_Texture *image, float angle, int degats, SDL_Rect perso
   b.image = image;
   b.ballePos = persoPos;
   b.degats = degats;
+  b.ennemi = false;
+  b.srcrect.x = 0;
+  b.srcrect.y = 0;
+  b.srcrect.w = persoPos.w;
+  b.srcrect.h = persoPos.h;
   return b;
 }
 
-void incrementer_balle(balle *b, int v){
+void incrementer_balle(balle *b, int v, int dxCamera, int dyCamera){
   b->ballePos.x += round(cos(b->angle * PI / 180) * v);
   b->ballePos.y += round(sin(b->angle * PI / 180) * v);
+  if(b->ennemi){
+    b->ballePos.x -= dxCamera;
+    b->ballePos.y -= dyCamera;
+  }
+  return;
 }
 
 
 void afficher_balle(SDL_Renderer *renderer, balle b){
-  SDL_RenderCopyEx(renderer, b.image, NULL, &b.ballePos, b.angle, NULL, SDL_FLIP_NONE);
+  if(b.ennemi){
+    SDL_RenderCopyEx(renderer, b.image, &b.srcrect, &b.ballePos, b.angle + 90, NULL, SDL_FLIP_NONE);
+  } else {
+    SDL_RenderCopyEx(renderer, b.image, &b.srcrect, &b.ballePos, b.angle, NULL, SDL_FLIP_NONE);
+  }
 }
 
 
diff --git a/projectile.h b/projectile.h
index d3cc41cde2f7046d071ce7f6e36ab703d7d4ff55..441274ded78fcb5f585308b22f15ba6ad5ad5c0b 100644
--- a/projectile.h
+++ b/projectile.h
@@ -10,14 +10,15 @@
 typedef struct s_Balle balle, s_Balle;
 struct s_Balle
 {
-    SDL_Rect ballePos;
+    SDL_Rect ballePos, srcrect;
     float angle;
     SDL_Texture *image;
     bool collision;
+    bool ennemi;
     int degats;
 };
 
 balle nouvelle_balle(SDL_Texture *image, float angle, int degats, SDL_Rect persoPos);
-void incrementer_balle(balle *b, int vitesse);
+void incrementer_balle(balle *b, int vitesse, int dxCamera, int dyCamera);
 void afficher_balle(SDL_Renderer *renderer, balle b);
 
diff --git a/sprites/ennemis/zombie/attack/zombie_attack.png b/sprites/ennemis/zombie/attack/ennemi1_attack.png
similarity index 100%
rename from sprites/ennemis/zombie/attack/zombie_attack.png
rename to sprites/ennemis/zombie/attack/ennemi1_attack.png
diff --git a/sprites/ennemis/zombie/attack/ennemi2_attack.png b/sprites/ennemis/zombie/attack/ennemi2_attack.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbb2bd57b44763e7a214b9e64a22552547aa7a7a
Binary files /dev/null and b/sprites/ennemis/zombie/attack/ennemi2_attack.png differ
diff --git a/sprites/ennemis/zombie/move/zombie_moveV2.png b/sprites/ennemis/zombie/move/ennemi1_move.png
similarity index 100%
rename from sprites/ennemis/zombie/move/zombie_moveV2.png
rename to sprites/ennemis/zombie/move/ennemi1_move.png
diff --git a/sprites/ennemis/zombie/move/ennemi2_move.png b/sprites/ennemis/zombie/move/ennemi2_move.png
new file mode 100644
index 0000000000000000000000000000000000000000..924bb92e2a7ae406a7a44916ea74cc6e0cf0b32e
Binary files /dev/null and b/sprites/ennemis/zombie/move/ennemi2_move.png differ
diff --git a/sprites/projectiles/slime.png b/sprites/projectiles/slime.png
new file mode 100644
index 0000000000000000000000000000000000000000..d38e889f7017f2a6f6ca8a55fccc814c7487f5bc
Binary files /dev/null and b/sprites/projectiles/slime.png differ