Index: proj/include/ent.h
===================================================================
--- proj/include/ent.h	(revision 230)
+++ proj/include/ent.h	(revision 231)
@@ -2,6 +2,7 @@
 #define ENT_H_INCLUDED
 
 #include "sprite.h"
+#include "list.h"
 
 void (ent_set_scale) (double n);
 void (ent_set_origin)(double x, double y);
@@ -20,6 +21,7 @@
 void (gunner_set_curr_health)       (gunner_t *p, int health);
 double  (gunner_get_x)              (const gunner_t *p);
 double  (gunner_get_y)              (const gunner_t *p);
+double  (gunner_get_angle)          (const gunner_t *p);
 int     (gunner_get_health)         (const gunner_t *p);
 int     (gunner_get_curr_health)    (const gunner_t *p);
 int16_t (gunner_get_x_screen)       (const gunner_t *p);
@@ -38,7 +40,9 @@
 int     (bullet_get_damage)  (const bullet_t *p);
 void    (bullet_set_damage)  (bullet_t *p, int damage);
 void (bullet_update_movement)(bullet_t *p);
+void (bullet_update_movement_list)(list_t *bullet_list);
 void (bullet_draw)(bullet_t *p);
+void (bullet_draw_list)(list_t *bullet_list);
 void (gunner_draw_health)(const gunner_t *p);
 
 struct map;
Index: proj/include/proj_func.h
===================================================================
--- proj/include/proj_func.h	(revision 230)
+++ proj/include/proj_func.h	(revision 231)
@@ -27,10 +27,17 @@
     uint8_t ctrl_pressed    : 1;
     uint8_t plus_pressed    : 1;
     uint8_t minus_pressed   : 1;
+    uint8_t lb_pressed      : 1;
 } keys_t;
 
-void update_mouse_position(struct packet *p);
+void update_mouse(struct packet *p);
 
+keys_t* (get_key_presses)(void);
+
+void (shoot_bullet)(const gunner_t *shooter, list_t *bullet_list);
+
+void (update_game_state)(const map_t *map, gunner_t *shooter, list_t *bullet_list);
+
 void update_scale(void);
 
 int32_t get_mouse_X(void);
Index: proj/include/proj_macros.h
===================================================================
--- proj/include/proj_macros.h	(revision 230)
+++ proj/include/proj_macros.h	(revision 231)
@@ -26,6 +26,10 @@
 #define RIGHT   1   /** @brief Moving to the right side of screen */
 #define REST    0   /** @brief Not moving */
 
+// Movement Constants
+#define SHOOTER_SPEED   5   /** @brief Shooter speed */
+#define BULLET_SPEED    8   /** @brief Bullet speet */
+
 // Extra Keys
 #define ESC_MAKE_CODE   0x01    /** @brief ESC Make Code */
 #define ESC_BREAK_CODE  0x81    /** @brief ESC Break Code */
Index: proj/include/sprite.h
===================================================================
--- proj/include/sprite.h	(revision 230)
+++ proj/include/sprite.h	(revision 231)
@@ -42,6 +42,7 @@
 
 int16_t  (sprite_get_x)(const sprite_t *p);
 int16_t  (sprite_get_y)(const sprite_t *p);
+double   (sprite_get_angle)(const sprite_t *p);
 uint16_t (sprite_get_w)(const sprite_t *p);
 uint16_t (sprite_get_h)(const sprite_t *p);
 
Index: proj/src/ent.c
===================================================================
--- proj/src/ent.c	(revision 230)
+++ proj/src/ent.c	(revision 231)
@@ -59,6 +59,7 @@
 }
 double  (gunner_get_x)              (const gunner_t *p){ return p->x; }
 double  (gunner_get_y)              (const gunner_t *p){ return p->y; }
+double  (gunner_get_angle)          (const gunner_t *p){ return sprite_get_angle(p->dude); }
 int     (gunner_get_health)         (const gunner_t *p){ return p->health; }
 int     (gunner_get_curr_health)    (const gunner_t *p){ return p->current_health; }
 int16_t (gunner_get_x_screen)       (const gunner_t *p){ return (p->x-x_origin)*scale; }
@@ -134,6 +135,18 @@
     p->x += p->vx;
     p->y += p->vy;
 }
+
+void (bullet_update_movement_list)(list_t *bullet_list){
+    if (bullet_list == NULL) return;
+    if (list_size(bullet_list) == 0) return;
+
+    list_node_t *it = list_begin(bullet_list);
+    while (it != list_end(bullet_list)) {
+        bullet_update_movement(*(bullet_t**)list_node_val(it));
+        it = list_node_next(it);
+    }
+}
+
 void (bullet_draw)(bullet_t *p){
     const int16_t x_screen = bullet_get_x_screen(p);
     const int16_t y_screen = bullet_get_y_screen(p);
@@ -142,6 +155,17 @@
     sprite_draw     (p->b);
 }
 
+void (bullet_draw_list)(list_t *bullet_list) {
+    if (bullet_list == NULL) return;
+    if (list_size(bullet_list) == 0) return;
+
+    list_node_t *it = list_begin(bullet_list);
+    while (it != list_end(bullet_list)) {
+        bullet_draw(*(bullet_t**)list_node_val(it));
+        it = list_node_next(it);
+    }
+}
+
 struct map{
     basic_sprite_t *bsp_background;
     sprite_t *background;
Index: proj/src/graph.c
===================================================================
--- proj/src/graph.c	(revision 230)
+++ proj/src/graph.c	(revision 231)
@@ -363,6 +363,7 @@
 void (sprite_set_scale) (sprite_t *p, double scale          ){ p->scale = scale; }
 int16_t  (sprite_get_x)(const sprite_t *p){ return p->x; }
 int16_t  (sprite_get_y)(const sprite_t *p){ return p->y; }
+double   (sprite_get_angle)(const sprite_t *p){ return p->theta; }
 uint16_t (sprite_get_w)(const sprite_t *p){ return basic_sprite_get_w(p->bsp); }
 uint16_t (sprite_get_h)(const sprite_t *p){ return basic_sprite_get_h(p->bsp); }
 void (sprite_src2pic)(const sprite_t *p, int16_t x, int16_t y, int16_t *u, int16_t *v){
Index: proj/src/proj.c
===================================================================
--- proj/src/proj.c	(revision 230)
+++ proj/src/proj.c	(revision 231)
@@ -23,7 +23,7 @@
 #include "shooter.h"
 #include "pistol.h"
 #include "nothing.h"
-#include "bullet.h"
+//#include "bullet.h"
 #include "map1.h"
 
 #include "list.h"
@@ -143,14 +143,18 @@
         gunner_set_pos(shooter1, 75, 75);
 
         gunner_t *shooter2 = gunner_ctor(bsp_shooter, bsp_nothing);
-        gunner_set_pos(shooter2, -50, -50);
+        gunner_set_pos(shooter2, 775, 75);
 
-        bullet_t *bullet = bullet_ctor(get_bullet(), 400.0, 400.0, 2.0, -1.0);
+        //bullet_t *bullet = bullet_ctor(get_bullet(), 400.0, 400.0, 2.0, -1.0);
 
+        list_t *bullet_list = list_ctor();
+
         ent_set_origin(gunner_get_x(shooter1)-ent_get_XLength()/2.0,
                        gunner_get_y(shooter1)-ent_get_YLength()/2.0);
 
         uint32_t refresh_count_value = sys_hz() / REFRESH_RATE;
+
+        uint8_t last_lb = 0;
     #endif
 
     /// loop stuff
@@ -180,15 +184,16 @@
                                 if (no_interrupts % refresh_count_value == 0) {
                                     update_movement(map1, shooter1);
                                     //bullet_update_movement(bullet);
+                                    update_game_state(map1, shooter2, bullet_list);
 
                                     if(map_collides_gunner(map1, shooter1)){
                                         printf("COLLIDING\n");
                                     }
 
-                                    if (gunner_collides_bullet(shooter1, bullet)) {
+                                    /*if (gunner_collides_bullet(shooter1, bullet)) {
                                         printf("Bullet Collide with Shooter\n");
                                         gunner_set_curr_health(shooter1, gunner_get_curr_health(shooter1) - bullet_get_damage(bullet));
-                                    }
+                                    }*/
 
                                     update_scale();
 
@@ -205,7 +210,7 @@
                                     map_draw   (map1);
                                     gunner_draw(shooter2);
                                     gunner_draw(shooter1);
-                                    bullet_draw(bullet);
+                                    bullet_draw_list(bullet_list);
 
                                     t = clock()-t; //printf("%d\n", (t*1000)/CLOCKS_PER_SEC);
 
@@ -216,9 +221,15 @@
                             if (i == 12) {
                                 if (counter_mouse_ih >= 3) {
                                     struct packet pp = mouse_parse_packet(packet_mouse_ih);
-                                    update_mouse_position(&pp);
+                                    update_mouse(&pp);
                                     //printf("X: %d Y: %d\n", get_mouse_X(), get_mouse_Y());
                                     counter_mouse_ih = 0;
+
+                                    if (last_lb ^ get_key_presses()->lb_pressed && get_key_presses()->lb_pressed) {
+                                        shoot_bullet(shooter1, bullet_list);
+                                    }
+
+                                    last_lb = get_key_presses()->lb_pressed;
                                 }
                             }
                             #endif
@@ -237,7 +248,12 @@
     #ifdef TELMO
         gunner_dtor(shooter1); shooter1 = NULL;
         gunner_dtor(shooter2); shooter2 = NULL;
-        bullet_dtor(bullet); bullet = NULL;
+
+        while(list_size(bullet_list) > 0){
+            bullet_t *p = (bullet_t*)list_erase(bullet_list, list_begin(bullet_list));
+            free(p);
+        }
+        if(list_dtor(bullet_list)) printf("COULD NOT DESTRUCT BULLET LIST\n");
     #endif
 
     basic_sprite_dtor      (bsp_crosshair); bsp_crosshair = NULL;
Index: proj/src/proj_func.c
===================================================================
--- proj/src/proj_func.c	(revision 230)
+++ proj/src/proj_func.c	(revision 231)
@@ -9,6 +9,8 @@
 #include "proj_macros.h"
 #include "utils.h"
 #include "ent.h"
+#include "fast_math.h"
+#include "bullet.h"
 
 #include "kbc_macros.h"
 
@@ -51,20 +53,55 @@
 }
 
 void update_movement(const map_t *map, gunner_t *p) {
-    static const int speed = 5;
     double x = gunner_get_x(p);
     double y = gunner_get_y(p);
-    gunner_set_pos(p, x + speed * hor_mov, y);
+    gunner_set_pos(p, x + SHOOTER_SPEED * hor_mov, y);
     if (map_collides_gunner(map, p)) {
         gunner_set_pos(p, x, y);
     }
     x = gunner_get_x(p);
-    gunner_set_pos(p, x, y + speed * ver_mov);
+    gunner_set_pos(p, x, y + SHOOTER_SPEED * ver_mov);
     if (map_collides_gunner(map, p)) {
         gunner_set_pos(p, x, y);
     }
 }
 
+void (shoot_bullet)(const gunner_t *shooter, list_t *bullet_list) {
+    double angle = gunner_get_angle(shooter);
+    double vx = -BULLET_SPEED * fm_sin(angle);
+    double vy = -BULLET_SPEED * fm_cos(angle);
+    bullet_t *bullet = bullet_ctor(get_bullet(), gunner_get_x(shooter), gunner_get_y(shooter), vx, vy);
+    list_insert(bullet_list, list_end(bullet_list), bullet);
+}
+
+void (update_game_state)(const map_t *map, gunner_t *shooter, list_t *bullet_list) {
+
+    bullet_update_movement_list(bullet_list);
+
+    list_node_t *it = list_begin(bullet_list);
+    while (it != list_end(bullet_list)) {
+        bullet_t *bullet = *(bullet_t**)list_node_val(it);
+        if (map_collides_bullet(map, bullet)) {
+            list_node_t *aux = list_node_next(it);
+            bullet = (bullet_t*)list_erase(bullet_list, it);
+            free(bullet);
+            it = aux;
+            continue;
+        }
+
+        if (gunner_collides_bullet(shooter, bullet)) {
+            list_node_t *aux = list_node_next(it);
+            bullet = (bullet_t*)list_erase(bullet_list, it);
+            gunner_set_curr_health(shooter, gunner_get_curr_health(shooter) - bullet_get_damage(bullet));
+            free(bullet);
+            it = aux;
+            continue;
+        }
+
+        it = list_node_next(it);
+    }
+}
+
 void update_scale(void) {
     static uint8_t last_plus = 0, last_minus = 0;
     if (key_presses.ctrl_pressed) {
@@ -88,14 +125,20 @@
 
 static int32_t mouse_x = 0, mouse_y = 0;
 
-void update_mouse_position(struct packet *p) {
+void (update_mouse)(struct packet *p) {
     mouse_x = max(0, mouse_x + p->delta_x);
     mouse_x = min(mouse_x, graph_get_XRes() - 1);
 
     mouse_y = max(0, mouse_y - p->delta_y);
     mouse_y = min(mouse_y, graph_get_YRes() - 1);
+
+    key_presses.lb_pressed = p->lb;
 }
 
+keys_t* (get_key_presses)(void) {
+    return &key_presses;
+}
+
 int32_t get_mouse_X(void) { return mouse_x; }
 
 int32_t get_mouse_Y(void) { return mouse_y; }
