wm: dino

Download patch

ref: 80efdd120f2b5feed3aeb46dd212521230d5f1dc
author: nima <nima@wm>
date: Fri Aug 4 14:28:56 EDT 2023

"uploaded

--- /dev/null
+++ b/.gdb_history
@@ -1,0 +1,29 @@
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+backtrace 
+r
+backtrace 
+r
+print cursor 
+print fbuffer_size 
+print fbuffer
+print max_x
+print max_y
+r
+r
+r
--- /dev/null
+++ b/README
@@ -1,0 +1,18 @@
+what we need to do now is
+make some trees
+and move them towards the dinasour
+the dinasour doesnt have to move that would be too complicated 
+we can have shape* trees[4] for example
+and print one like tree[i % 4]
+and we also probably have to add a x and y membes to the shape struct
+and um, yeah
+think about 
+how to print trees at a certain coordinate 
+hint: we only need a x coordinate!
+
+learn about collisions, once internet comes back, you can watch old tetris
+
+
+This is also a good starting point for the ncurses gmae engine
+for example, we learned that we can represent animated entities as a circular linked list
+of sprites! :)
--- /dev/null
+++ b/dino.c
@@ -1,0 +1,390 @@
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <time.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <local/colors.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+
+#define DINASOUR_HEIGHT 15
+#define DINASOUR_WIDTH 15
+#define SUN_HEIGHT 5
+#define SUN_WIDTH 5
+#define DELAY 60000
+#define TREE_HEIGHT 7
+#define TREE_WIDTH 7
+void die(const char *msg) {
+  perror(msg);
+  exit(EXIT_FAILURE);
+}
+char *colors[] = {
+
+    // black_fg,
+    red_fg,
+    // green_fg ,
+    yellow_fg,
+    // blue_fg   ,
+    // magenta_fg,
+    // cyan_fg   ,
+    // white_fg  ,
+};
+
+char *fbuffer = NULL; // should be point_t* buffer
+uint64_t fbuffer_size = 0;
+static volatile int cursor = 0;
+int max_y;
+int max_x;
+static volatile bool resize = false;
+typedef struct {
+  bool *matrix;
+  int height;
+  int width;
+  int x;
+  int y;
+  bool visible;
+} shape_t;
+// a hash tables suits better no?
+// keys will be memory address of shapes.
+// and vals will be the number of times they collided
+// and um, we also need to store coordinates of collisions?
+// maybe we can use an observer pattern here!\
+// each shape subscribes to collisions,...
+typedef struct collision_t {
+  shape_t *shape;
+  struct collision_t *next;
+} collision_t;
+
+typedef struct {
+  char *escapes;
+  char charachter;
+  // collision_t collisions; // it's actually better to have a global collisions
+  // (hash table or linked list and update it every tflush()).
+  int x;
+  int y;
+  bool written;
+} point_t;
+void alloc_fbuf();
+
+void gotoxy(int x, int y) {
+  if (x >= max_x || y >= max_y)
+    return;
+  int new_cursor = (max_x * y) + x;
+  cursor = (max_x * y) + x;
+}
+void _gotoxy(int x, int y) { printf("%c[%d;%df", 0x1B, y, x); }
+void max_xy(int signo) {
+  (void)signo;
+  struct winsize w;
+  ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
+
+  max_x = w.ws_col;
+  max_y = w.ws_row;
+  resize = true;
+  // alloc_fbuf();
+}
+
+void tprint(const char c) {
+  if (cursor >= fbuffer_size || cursor < 0)
+    return;
+  fbuffer[cursor++] = c;
+}
+
+
+void draw_line(point_t a, point_t b) {
+  // int slope = (a.y - b.y) / (a.x - b.x);
+  int dy = b.y - a.y;
+  int dx = b.x - a.x;
+
+  while (true) {
+    int newx = a.x + dx;
+    int newy = a.y + dy;
+
+    if (newx == b.x && newy == b.y)
+      break;
+    gotoxy(a.x + dx, a.y + dy);
+    tprint('*');
+  }
+}
+
+void draw_shape(shape_t *shape, const char *color) {
+  if (shape->visible) { // FIXME : idk why this happens.
+    return;
+  }
+  bool print_newline = false;
+  // gotoxy(shape->x, shape->y);
+
+  for (int i = 0; i < shape->height; i++) {
+    gotoxy(shape->x, shape->y + i);
+    for (int j = 0; j < shape->width; j++) {
+      if (shape->matrix[i * shape->height + j]) {
+        print_newline = true;
+        // printf("%s%s%s", inverse_off ,  color, " " reset );
+        tprint('*');
+      } else {
+        // printf(" ");
+        tprint(' ');
+      }
+    }
+    if (print_newline)
+      printf("\r");
+    // fbuffer[cursor] = '\n'
+    tprint('\n');
+  }
+}
+
+shape_t *init_shape(int width, int height) {
+  shape_t *ret = calloc(width * height, sizeof(bool));
+  return ret;
+}
+
+void free_shape(shape_t *shape) { free(shape); }
+
+void tflush() {
+  for (uint64_t row = 0; row < max_y; ++row) {
+    printf("\n");
+    for (uint64_t col = 0; col < max_x; ++col) {
+      if (fbuffer[row * max_x + col] == '*') {
+        _gotoxy(col, row);
+        // printf("%s%s %s",inverse, colors[rand() %
+        // sizeof(colors)/sizeof(*colors)], reset);
+        printf("%s%c%s", reset inverse, /*fbuffer[row * max_x + col]*/ ' ',
+               reset);
+
+      } else
+        printf(reset " " reset);
+    }
+  }
+  // write(STDOUT_FILENO, fbuffer, max_x * max_y); // drawing will be very
+  // smooth this way.
+}
+
+void alloc_fbuf() {
+  if (max_x * max_y > fbuffer_size) {
+    fbuffer_size = max_y * max_x; //* sizeof(char);
+    fbuffer = realloc(fbuffer, fbuffer_size);
+    assert(fbuffer);
+  }
+}
+
+bool dinasour_frame1[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame2[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame3[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+};
+
+bool tree_1[TREE_WIDTH][TREE_HEIGHT] = {
+    {1, 1, 1, 0, 0, 1, 1}, {1, 0, 1, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 1},
+    {0, 1, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 1, 0, 0}, {0, 0, 1, 0, 1, 0, 0},
+    {0, 0, 1, 1, 1, 0, 0},
+};
+
+void clear_screen() {
+  memset(fbuffer, 0, fbuffer_size);
+  printf("\033c");
+}
+
+int main(int argc, char *argv[]) {
+  max_xy(0);
+  alloc_fbuf();
+  shape_t dinasour_f1 = {.matrix = &dinasour_frame1[0][0],
+                         .width = DINASOUR_WIDTH,
+                         .height = DINASOUR_HEIGHT,
+                         .x = 10,
+                         .y = 10};
+
+  shape_t dinasour_f2 = {.matrix = &dinasour_frame2[0][0],
+                         .height = DINASOUR_HEIGHT,
+                         .width = DINASOUR_WIDTH,
+                         .x = 10,
+                         .y = 10};
+
+  shape_t dinasour_f3 = {
+      .matrix = &dinasour_frame3[0][0],
+      .height = DINASOUR_HEIGHT,
+      .width = DINASOUR_WIDTH,
+      .x = 10,
+      .y = 10,
+  };
+
+  shape_t dinasour2_f1 = {.matrix = &dinasour_frame1[0][0],
+                          .width = DINASOUR_WIDTH,
+                          .height = DINASOUR_HEIGHT,
+                          .x = 10,
+                          .y = 10,
+                          .visible = true};
+
+  shape_t dinasour2_f2 = {.matrix = &dinasour_frame2[0][0],
+                          .height = DINASOUR_HEIGHT,
+                          .width = DINASOUR_WIDTH,
+                          .x = 10,
+                          .y = 10,
+                          .visible = true};
+
+  shape_t dinasour2_f3 = {.matrix = &dinasour_frame3[0][0],
+                          .height = DINASOUR_HEIGHT,
+                          .width = DINASOUR_WIDTH,
+                          .x = 10,
+                          .y = 10 + DINASOUR_HEIGHT + 2,
+                          .visible = true};
+
+  bool sun_matrix[SUN_HEIGHT][SUN_WIDTH] = {
+      {0, 0, 1, 0, 0}, {0, 1, 0, 1, 0}, {1, 0, 0, 0, 1},
+      {0, 1, 0, 1, 0}, {0, 0, 1, 0, 0},
+  };
+  shape_t sun = {.matrix = &sun_matrix[0][0],
+                 .height = SUN_HEIGHT,
+                 .width = SUN_WIDTH,
+                 .x = (float)max_x / 2,
+                 .y = 10};
+  shape_t tree = {.matrix = &tree_1[0][0],
+                  .height = TREE_HEIGHT,
+                  .width = TREE_WIDTH,
+                  .x = 50,
+                  .y = 10 + DINASOUR_HEIGHT - TREE_HEIGHT};
+  struct sigaction sa;
+  sa.sa_handler = max_xy;
+  sa.sa_flags = 0;
+  sigemptyset(&sa.sa_mask);
+  // sigaction(SIGWINCH, &sa, NULL);
+
+  int randx = 0;
+  int randy = 0;
+  clear_screen();
+  shape_t *arr[3] = {&dinasour_f1, &dinasour_f2, &dinasour_f3};
+  shape_t *arr2[3] = {&dinasour2_f1, &dinasour2_f2, &dinasour2_f3};
+  unsigned int index = 0;
+  srand(time(NULL));
+  unsigned int t = 1;
+
+  shape_t *current_tree = malloc(sizeof(shape_t));
+  assert(current_tree);
+  current_tree = malloc(sizeof(shape_t));
+  current_tree->matrix = &tree_1[0][0];
+  current_tree->x = max_x;
+  current_tree->y = 10 + DINASOUR_HEIGHT - TREE_HEIGHT;
+  current_tree->height = TREE_HEIGHT;
+  current_tree->width = TREE_WIDTH;
+  current_tree->visible = false;
+  shape_t *next_tree = NULL;
+  while (true) {
+    shape_t *ptr = arr[++index % 3];
+    draw_shape(ptr, white_bg);
+    if (current_tree)
+      draw_shape(current_tree, white_bg);
+    if (next_tree) {
+      draw_shape(next_tree, white_bg);
+    }
+
+    // printf("\nptr->x = %d, ptr->y = %d\n", ptr->x, ptr->y);
+    // printf("max_x = %d, max_y = %d\n", max_x, max_y);
+    // printf("fbuffer = %#X, fbuffer_size=%PRlu64\n", (unsigned int)fbuffer,
+    // fbuffer_size); printf("fbuffer = %#X, fbuffer_size=%llu, cursor = %d\n",
+    // fbuffer, fbuffer_size, cursor); draw_shape(&sun, yellow_bg);
+    // draw_shape(ptr2, yellow_bg);
+    tflush();
+    usleep(DELAY);
+    /*for (int i = 0; i < 3; ++i) {
+
+      arr[i]->x = (arr[i]->x + rand()) % max_x;
+      arr2[i]->x = (arr[i]->x + rand()) % max_x;
+      //arr[i]->y = (arr[i]->x - 1) % (max_y - DINASOUR_HEIGHT);
+      arr[i]->y = rand() % (max_y - DINASOUR_HEIGHT);
+
+          arr2[i]->x = (arr[i]->x + rand()) % (max_x - DINASOUR_HEIGHT);
+          arr2[i]->y = (arr[i]->y + rand()) % (max_y - DINASOUR_HEIGHT);
+        } */
+
+    /*for (int i = 0; i < 3; i++) {
+            arr[i]->x = (arr[i]->x + 1) % max_x;
+    }*/
+    if (next_tree)
+      --next_tree->x;
+    if (current_tree && --current_tree->x == max_x / 2) {
+      // tree.visible = true;
+      // free(current_tree);
+      // current_tree = NULL;
+      // current_tree = next_tree;
+      next_tree = malloc(sizeof(shape_t));
+      assert(next_tree);
+      next_tree->matrix = &tree_1[0][0];
+      next_tree->x = max_x - TREE_WIDTH;
+      next_tree->y = 10 + DINASOUR_HEIGHT - TREE_HEIGHT;
+      next_tree->height = TREE_HEIGHT;
+      next_tree->width = TREE_WIDTH;
+      next_tree->visible = false;
+      
+    }
+    if (current_tree && current_tree->x == 10) {
+      free(current_tree);
+      current_tree = next_tree;
+      next_tree = NULL;
+    }
+
+    // collisions();
+    assert(cursor <= fbuffer_size + 1);
+    /*if (resize) {
+      alloc_fbuf();
+      resize = false;
+    }*/
+    clear_screen();
+  }
+  
+  free(fbuffer);
+  return 0;
+}
--- /dev/null
+++ b/dino.c~
@@ -1,0 +1,389 @@
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <time.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <local/colors.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+
+#define DINASOUR_HEIGHT 15
+#define DINASOUR_WIDTH 15
+#define SUN_HEIGHT 5
+#define SUN_WIDTH 5
+#define DELAY 60000
+#define TREE_HEIGHT 7
+#define TREE_WIDTH 7
+void die(const char *msg) {
+  perror(msg);
+  exit(EXIT_FAILURE);
+}
+char *colors[] = {
+
+    // black_fg,
+    red_fg,
+    // green_fg ,
+    yellow_fg,
+    // blue_fg   ,
+    // magenta_fg,
+    // cyan_fg   ,
+    // white_fg  ,
+};
+
+char *fbuffer = NULL; // should be point_t* buffer
+uint64_t fbuffer_size = 0;
+static volatile int cursor = 0;
+int max_y;
+int max_x;
+static volatile bool resize = false;
+typedef struct {
+  bool *matrix;
+  int height;
+  int width;
+  int x;
+  int y;
+  bool visible;
+} shape_t;
+// a hash tables suits better no?
+// keys will be memory address of shapes.
+// and vals will be the number of times they collided
+// and um, we also need to store coordinates of collisions?
+// maybe we can use an observer pattern here!\
+// each shape subscribes to collisions,...
+typedef struct collision_t {
+  shape_t *shape;
+  struct collision_t *next;
+} collision_t;
+
+typedef struct {
+  char *escapes;
+  char charachter;
+  // collision_t collisions; // it's actually better to have a global collisions
+  // (hash table or linked list and update it every tflush()).
+  int x;
+  int y;
+  bool written;
+} point_t;
+void alloc_fbuf();
+
+void gotoxy(int x, int y) {
+  if (x >= max_x || y >= max_y)
+    return;
+  int new_cursor = (max_x * y) + x;
+  cursor = (max_x * y) + x;
+}
+void _gotoxy(int x, int y) { printf("%c[%d;%df", 0x1B, y, x); }
+void max_xy(int signo) {
+  (void)signo;
+  struct winsize w;
+  ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
+
+  max_x = w.ws_col;
+  max_y = w.ws_row;
+  resize = true;
+  // alloc_fbuf();
+}
+
+void tprint(const char c) {
+  if (cursor >= fbuffer_size || cursor < 0)
+    return;
+  fbuffer[cursor++] = c;
+}
+
+
+void draw_line(point_t a, point_t b) {
+  // int slope = (a.y - b.y) / (a.x - b.x);
+  int dy = b.y - a.y;
+  int dx = b.x - a.x;
+
+  while (true) {
+    int newx = a.x + dx;
+    int newy = a.y + dy;
+
+    if (newx == b.x && newy == b.y)
+      break;
+    gotoxy(a.x + dx, a.y + dy);
+    tprint('*');
+  }
+}
+
+void draw_shape(shape_t *shape, const char *color) {
+  if (shape->visible) { // FIXME : idk why this happens.
+    return;
+  }
+  bool print_newline = false;
+  // gotoxy(shape->x, shape->y);
+
+  for (int i = 0; i < shape->height; i++) {
+    gotoxy(shape->x, shape->y + i);
+    for (int j = 0; j < shape->width; j++) {
+      if (shape->matrix[i * shape->height + j]) {
+        print_newline = true;
+        // printf("%s%s%s", inverse_off ,  color, " " reset );
+        tprint('*');
+      } else {
+        // printf(" ");
+        tprint(' ');
+      }
+    }
+    if (print_newline)
+      printf("\r");
+    // fbuffer[cursor] = '\n'
+    tprint('\n');
+  }
+}
+
+shape_t *init_shape(int width, int height) {
+  shape_t *ret = calloc(width * height, sizeof(bool));
+  return ret;
+}
+
+void free_shape(shape_t *shape) { free(shape); }
+
+void tflush() {
+  for (uint64_t row = 0; row < max_y; ++row) {
+    printf("\n");
+    for (uint64_t col = 0; col < max_x; ++col) {
+      if (fbuffer[row * max_x + col] == '*') {
+        _gotoxy(col, row);
+        // printf("%s%s %s",inverse, colors[rand() %
+        // sizeof(colors)/sizeof(*colors)], reset);
+        printf("%s%c%s", reset inverse, /*fbuffer[row * max_x + col]*/ ' ',
+               reset);
+
+      } else
+        printf(reset " " reset);
+    }
+  }
+  // write(STDOUT_FILENO, fbuffer, max_x * max_y); // drawing will be very
+  // smooth this way.
+}
+
+void alloc_fbuf() {
+  if (max_x * max_y > fbuffer_size) {
+    fbuffer_size = max_y * max_x; //* sizeof(char);
+    fbuffer = realloc(fbuffer, fbuffer_size);
+    assert(fbuffer);
+  }
+}
+
+bool dinasour_frame1[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame2[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame3[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+};
+
+bool tree_1[TREE_WIDTH][TREE_HEIGHT] = {
+    {1, 1, 1, 0, 0, 1, 1}, {1, 0, 1, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 1},
+    {0, 1, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 1, 0, 0}, {0, 0, 1, 0, 1, 0, 0},
+    {0, 0, 1, 1, 1, 0, 0},
+};
+
+void clear_screen() {
+  memset(fbuffer, 0, fbuffer_size);
+  printf("\033c");
+}
+
+int main(int argc, char *argv[]) {
+  max_xy(0);
+  alloc_fbuf();
+  shape_t dinasour_f1 = {.matrix = &dinasour_frame1[0][0],
+                         .width = DINASOUR_WIDTH,
+                         .height = DINASOUR_HEIGHT,
+                         .x = 10,
+                         .y = 10};
+
+  shape_t dinasour_f2 = {.matrix = &dinasour_frame2[0][0],
+                         .height = DINASOUR_HEIGHT,
+                         .width = DINASOUR_WIDTH,
+                         .x = 10,
+                         .y = 10};
+
+  shape_t dinasour_f3 = {
+      .matrix = &dinasour_frame3[0][0],
+      .height = DINASOUR_HEIGHT,
+      .width = DINASOUR_WIDTH,
+      .x = 10,
+      .y = 10,
+  };
+
+  shape_t dinasour2_f1 = {.matrix = &dinasour_frame1[0][0],
+                          .width = DINASOUR_WIDTH,
+                          .height = DINASOUR_HEIGHT,
+                          .x = 10,
+                          .y = 10,
+                          .visible = true};
+
+  shape_t dinasour2_f2 = {.matrix = &dinasour_frame2[0][0],
+                          .height = DINASOUR_HEIGHT,
+                          .width = DINASOUR_WIDTH,
+                          .x = 10,
+                          .y = 10,
+                          .visible = true};
+
+  shape_t dinasour2_f3 = {.matrix = &dinasour_frame3[0][0],
+                          .height = DINASOUR_HEIGHT,
+                          .width = DINASOUR_WIDTH,
+                          .x = 10,
+                          .y = 10 + DINASOUR_HEIGHT + 2,
+                          .visible = true};
+
+  bool sun_matrix[SUN_HEIGHT][SUN_WIDTH] = {
+      {0, 0, 1, 0, 0}, {0, 1, 0, 1, 0}, {1, 0, 0, 0, 1},
+      {0, 1, 0, 1, 0}, {0, 0, 1, 0, 0},
+  };
+  shape_t sun = {.matrix = &sun_matrix[0][0],
+                 .height = SUN_HEIGHT,
+                 .width = SUN_WIDTH,
+                 .x = (float)max_x / 2,
+                 .y = 10};
+  shape_t tree = {.matrix = &tree_1[0][0],
+                  .height = TREE_HEIGHT,
+                  .width = TREE_WIDTH,
+                  .x = 50,
+                  .y = 10 + DINASOUR_HEIGHT - TREE_HEIGHT};
+  struct sigaction sa;
+  sa.sa_handler = max_xy;
+  sa.sa_flags = 0;
+  sigemptyset(&sa.sa_mask);
+  // sigaction(SIGWINCH, &sa, NULL);
+
+  int randx = 0;
+  int randy = 0;
+  clear_screen();
+  shape_t *arr[3] = {&dinasour_f1, &dinasour_f2, &dinasour_f3};
+  shape_t *arr2[3] = {&dinasour2_f1, &dinasour2_f2, &dinasour2_f3};
+  unsigned int index = 0;
+  srand(time(NULL));
+  unsigned int t = 1;
+
+  shape_t *current_tree = malloc(sizeof(shape_t));
+  assert(current_tree);
+  current_tree = malloc(sizeof(shape_t));
+  current_tree->matrix = &tree_1[0][0];
+  current_tree->x = max_x;
+  current_tree->y = 10 + DINASOUR_HEIGHT - TREE_HEIGHT;
+  current_tree->height = TREE_HEIGHT;
+  current_tree->width = TREE_WIDTH;
+  current_tree->visible = false;
+  shape_t *next_tree = NULL;
+  while (true) {
+    shape_t *ptr = arr[++index % 3];
+    draw_shape(ptr, white_bg);
+    if (current_tree)
+      draw_shape(current_tree, white_bg);
+    if (next_tree) {
+      draw_shape(next_tree, white_bg);
+    }
+
+    // printf("\nptr->x = %d, ptr->y = %d\n", ptr->x, ptr->y);
+    // printf("max_x = %d, max_y = %d\n", max_x, max_y);
+    // printf("fbuffer = %#X, fbuffer_size=%PRlu64\n", (unsigned int)fbuffer,
+    // fbuffer_size); printf("fbuffer = %#X, fbuffer_size=%llu, cursor = %d\n",
+    // fbuffer, fbuffer_size, cursor); draw_shape(&sun, yellow_bg);
+    // draw_shape(ptr2, yellow_bg);
+    tflush();
+    usleep(DELAY);
+    /*for (int i = 0; i < 3; ++i) {
+
+      arr[i]->x = (arr[i]->x + rand()) % max_x;
+      arr2[i]->x = (arr[i]->x + rand()) % max_x;
+      //arr[i]->y = (arr[i]->x - 1) % (max_y - DINASOUR_HEIGHT);
+      arr[i]->y = rand() % (max_y - DINASOUR_HEIGHT);
+
+          arr2[i]->x = (arr[i]->x + rand()) % (max_x - DINASOUR_HEIGHT);
+          arr2[i]->y = (arr[i]->y + rand()) % (max_y - DINASOUR_HEIGHT);
+        } */
+
+    /*for (int i = 0; i < 3; i++) {
+            arr[i]->x = (arr[i]->x + 1) % max_x;
+    }*/
+    if (next_tree)
+      --next_tree->x;
+    if (current_tree && --current_tree->x == max_x / 2) {
+      // tree.visible = true;
+      // free(current_tree);
+      // current_tree = NULL;
+      // current_tree = next_tree;
+      next_tree = malloc(sizeof(shape_t));
+      assert(next_tree);
+      next_tree->matrix = &tree_1[0][0];
+      next_tree->x = max_x - TREE_WIDTH;
+      next_tree->y = 10 + DINASOUR_HEIGHT - TREE_HEIGHT;
+      next_tree->height = TREE_HEIGHT;
+      next_tree->width = TREE_WIDTH;
+      next_tree->visible = false;
+    }
+    if (current_tree && current_tree->x == 10) {
+      free(current_tree);
+      current_tree = next_tree;
+      next_tree = NULL;
+    }
+
+    // collisions();
+    assert(cursor <= fbuffer_size + 1);
+    /*if (resize) {
+      alloc_fbuf();
+      resize = false;
+    }*/
+    clear_screen();
+  }
+
+  free(fbuffer);
+  return 0;
+}
--- /dev/null
+++ b/graph.c
@@ -1,0 +1,335 @@
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <time.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <local/colors.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+
+#define DINASOUR_HEIGHT 15
+#define DINASOUR_WIDTH 15
+#define SUN_HEIGHT 5
+#define SUN_WIDTH 5
+#define DELAY 10000
+
+void die(const char *msg) {
+  perror(msg);
+  exit(EXIT_FAILURE);
+}
+
+char *fbuffer = NULL; // should be point_t* buffer
+uint64_t fbuffer_size = 0;
+static volatile int cursor = 0;
+int max_y;
+int max_x;
+static volatile bool resize = false;
+typedef struct {
+  bool *matrix;
+  int height;
+  int width;
+  int x;
+  int y;
+} shape_t;
+// a hash tables suits better no?
+// keys will be memory address of shapes.
+// and vals will be the number of times they collided
+// and um, we also need to store coordinates of collisions?
+// maybe we can use an observer pattern here!\
+// each shape subscribes to collisions,...
+typedef struct collision_t {
+  shape_t *shape;
+  struct collision_t *next;
+} collision_t;
+
+typedef struct {
+  char *escapes;
+  char charachter;
+  // collision_t collisions; // it's actually better to have a global collisions
+  // (hash table or linked list and update it every tflush()).
+  int x;
+  int y;
+  bool written;
+} point_t;
+
+
+
+
+
+
+char *colors[] = {
+
+black_fg,  
+red_fg, 	  
+green_fg , 
+yellow_fg ,
+blue_fg   ,
+magenta_fg,
+cyan_fg   ,
+white_fg  ,
+};
+
+
+
+
+
+
+void alloc_fbuf();
+void tflush();
+void gotoxy(int x, int y) {
+  if (x >= max_x || y >= max_y)
+    return;
+  int new_cursor = (max_x * y) + x;
+  cursor = (max_x * y) + x;
+}
+void _gotoxy(int x, int y) { printf("%c[%d;%df", 0x1B, y, x); }
+void max_xy(int signo) {
+  (void)signo;
+  struct winsize w;
+  ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
+
+  max_x = w.ws_col;
+  max_y = w.ws_row;
+  resize = true;
+  // alloc_fbuf();
+}
+
+void tprint(const char c) {
+  if (cursor >= fbuffer_size || cursor < 0)
+    return;
+  fbuffer[cursor++] = c;
+}
+
+void draw_line(point_t a, point_t b) {
+  int slope = (b.y - a.y) / (b.x - a.x);
+  while (true) {
+    a.x++;
+    a.y += slope;
+    if (a.x == b.x || a.y == b.y)
+      break;
+    // printf("newx = %d, newy = %d\n", a.x, a.y);
+    for (int i = 0; i < slope; i++) {
+      gotoxy(a.x, a.y + i);
+      tprint('*');
+    }
+    // gotoxy(a.x, a.y);
+    // tprint('*');
+    tflush();
+  }
+}
+
+void draw_shape(shape_t *shape, const char *color) {
+  bool print_newline = false;
+  // gotoxy(shape->x, shape->y);
+
+  for (int i = 0; i < shape->height; i++) {
+    gotoxy(shape->x, shape->y + i);
+    for (int j = 0; j < shape->width; j++) {
+      if (shape->matrix[i * shape->height + j]) {
+        print_newline = true;
+        // printf("%s%s%s", inverse_off ,  color, " " reset );
+        tprint('*');
+      } else {
+        // printf(" ");
+        tprint(' ');
+      }
+    }
+    if (print_newline)
+      printf("\r");
+    // fbuffer[cursor] = '\n'
+    tprint('\n');
+  }
+}
+
+shape_t *init_shape(int width, int height) {
+  shape_t *ret = calloc(width * height, sizeof(bool));
+  return ret;
+}
+
+void free_shape(shape_t *shape) { free(shape); }
+
+void tflush() {
+  for (uint64_t row = 0; row < max_y; ++row) {
+    printf("\n");
+    for (uint64_t col = 0; col < max_x; ++col) {
+      if (fbuffer[row * max_x + col] == '*') {
+        _gotoxy(col, row);
+        printf("%s%s%c%s", inverse, colors[rand() % sizeof(colors)/sizeof(*colors)],  /*fbuffer[row * max_x + col]*/ ' ',
+               reset);
+
+      } else
+        printf(reset " " reset);
+    }
+  }
+  // write(STDOUT_FILENO, fbuffer, max_x * max_y); // drawing will be very
+  // smooth this way.
+}
+
+void alloc_fbuf() {
+  if (max_x * max_y > fbuffer_size) {
+    fbuffer_size = max_y * max_x; //* sizeof(char);
+    fbuffer = realloc(fbuffer, fbuffer_size);
+    assert(fbuffer);
+  }
+}
+
+bool dinasour_frame1[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame2[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame3[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+};
+
+void clear_screen() {
+  memset(fbuffer, 0, fbuffer_size);
+  printf("\033c");
+}
+
+int main(int argc, char *argv[]) {
+  max_xy(0);
+  alloc_fbuf();
+  shape_t dinasour_f1 = {.matrix = &dinasour_frame1[0][0],
+                         .width = DINASOUR_WIDTH,
+                         .height = DINASOUR_HEIGHT,
+                         .x = max_x / 2,
+                         .y = max_y / 2};
+
+  shape_t dinasour_f2 = {.matrix = &dinasour_frame2[0][0],
+                         .height = DINASOUR_HEIGHT,
+                         .width = DINASOUR_WIDTH,
+                         .x = max_x/2,
+                         .y = max_y/2};
+
+  shape_t dinasour_f3 = {
+      .matrix = &dinasour_frame3[0][0],
+      .height = DINASOUR_HEIGHT,
+      .width = DINASOUR_WIDTH,
+      .x = max_x/2,
+      .y = max_y/2,
+  };
+
+  shape_t dinasour2_f1 = {.matrix = &dinasour_frame1[0][0],
+                          .width = DINASOUR_WIDTH,
+                          .height = DINASOUR_HEIGHT,
+                          .x = 10,
+                          .y = 10};
+
+  shape_t dinasour2_f2 = {.matrix = &dinasour_frame2[0][0],
+                          .height = DINASOUR_HEIGHT,
+                          .width = DINASOUR_WIDTH,
+                          .x = 10,
+                          .y = 10};
+
+  shape_t dinasour2_f3 = {
+      .matrix = &dinasour_frame3[0][0],
+      .height = DINASOUR_HEIGHT,
+      .width = DINASOUR_WIDTH,
+      .x = 10,
+      .y = 10 + DINASOUR_HEIGHT + 2,
+  };
+
+  bool sun_matrix[SUN_HEIGHT][SUN_WIDTH] = {
+      {0, 0, 1, 0, 0}, {0, 1, 0, 1, 0}, {1, 0, 0, 0, 1},
+      {0, 1, 0, 1, 0}, {0, 0, 1, 0, 0},
+  };
+  shape_t sun = {.matrix = &sun_matrix[0][0],
+                 .height = SUN_HEIGHT,
+                 .width = SUN_WIDTH,
+                 .x = (float)max_x / 2,
+                 .y = 10};
+
+  struct sigaction sa;
+  sa.sa_handler = max_xy;
+  sa.sa_flags = 0;
+  sigemptyset(&sa.sa_mask);
+  sigaction(SIGWINCH, &sa, NULL);
+
+  int randx = 0;
+  int randy = 0;
+  clear_screen();
+  shape_t *arr[3] = {&dinasour_f1, &dinasour_f2, &dinasour_f3};
+  shape_t *arr2[3] = {&dinasour2_f1, &dinasour2_f2, &dinasour2_f3};
+  unsigned int index = 0;
+  srand(time(NULL));
+  unsigned int t = 1;
+
+  while (true) {
+	  //clear_screen();
+	  /*for (int y = 0; y < max_y; ++y) {
+		  for (int x = 0; x < max_x; ++x) {
+			  //gotoxy(x, y);
+			  //tprint('*');
+
+		  }
+	  }*/
+	  tflush();
+	  //usleep(DELAY);
+	  if (resize) { 
+		  alloc_fbuf();
+		  clear_screen();
+		  resize = false;
+	  }
+	  draw_shape(arr[index], white_fg);
+	  for (int i = 0; i < 3; ++i) {
+		  arr[index]->x = max_x/2;
+		  arr[index]->y = max_y/2;
+	  }
+	  index = (index + 1) % 3;
+  }
+  free(fbuffer);
+  return 0;
+}
--- /dev/null
+++ b/maxy.c
@@ -1,0 +1,24 @@
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <time.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <local/colors.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+
+int main()   
+{
+	struct winsize w;
+  ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
+
+	printf("x=%d, y=%d\n", w.ws_col, w.ws_row);
+}
--- /dev/null
+++ b/rand.c
@@ -1,0 +1,339 @@
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <time.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <local/colors.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+
+
+#define DINASOUR_HEIGHT 15
+#define DINASOUR_WIDTH 15
+#define SUN_HEIGHT 5
+#define SUN_WIDTH 5
+#define DELAY 10000
+
+void die(const char *msg) {
+  perror(msg);
+  exit(EXIT_FAILURE);
+}
+char *colors[] = {
+
+//black_fg,  
+red_fg, 	  
+//green_fg , 
+yellow_fg ,
+//blue_fg   ,
+//magenta_fg,
+//cyan_fg   ,
+//white_fg  ,
+};
+
+char *fbuffer = NULL; // should be point_t* buffer
+uint64_t fbuffer_size = 0;
+static volatile int cursor = 0;
+int max_y;
+int max_x;
+static volatile bool resize = false;
+typedef struct {
+  bool *matrix;
+  int height;
+  int width;
+  int x;
+  int y;
+} shape_t;
+// a hash tables suits better no?
+// keys will be memory address of shapes.
+// and vals will be the number of times they collided
+// and um, we also need to store coordinates of collisions?
+// maybe we can use an observer pattern here!\
+// each shape subscribes to collisions,...
+typedef struct collision_t {
+  shape_t *shape;
+  struct collision_t *next;
+} collision_t;
+
+typedef struct {
+  char *escapes;
+  char charachter;
+  // collision_t collisions; // it's actually better to have a global collisions
+  // (hash table or linked list and update it every tflush()).
+  int x;
+  int y;
+  bool written;
+} point_t;
+void alloc_fbuf();
+
+void gotoxy(int x, int y) {
+  if (x >= max_x || y >= max_y)
+    return;
+  int new_cursor = (max_x * y) + x;
+  cursor = (max_x * y) + x;
+}
+void _gotoxy(int x, int y) { printf("%c[%d;%df", 0x1B, y, x); }
+void max_xy(int signo) {
+  (void)signo;
+  struct winsize w;
+  ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
+
+  max_x = w.ws_col;
+  max_y = w.ws_row;
+  resize = true;
+  //alloc_fbuf();
+}
+
+void tprint(const char c) { 
+	if (cursor >= fbuffer_size || cursor < 0)
+		return;
+	fbuffer[cursor++] = c; 
+}
+
+void draw_line(point_t a, point_t b) {
+	//int slope = (a.y - b.y) / (a.x - b.x);
+	int dy = b.y - a.y;
+	int dx = b.x - a.x;
+
+	while (true) {
+		int newx = a.x + dx;
+		int newy = a.y + dy;
+
+		if (newx == b.x && newy == b.y)
+			break;
+		gotoxy(a.x + dx, a.y + dy);
+		tprint('*');
+	}
+}
+
+void draw_shape(shape_t *shape, const char *color) {
+  bool print_newline = false;
+  // gotoxy(shape->x, shape->y);
+
+  for (int i = 0; i < shape->height; i++) {
+    gotoxy(shape->x, shape->y + i);
+    for (int j = 0; j < shape->width; j++) {
+      if (shape->matrix[i * shape->height + j]) {
+        print_newline = true;
+        // printf("%s%s%s", inverse_off ,  color, " " reset );
+        tprint('*');
+      } else {
+        // printf(" ");
+        tprint(' ');
+      }
+    }
+    if (print_newline)
+      printf("\r");
+    // fbuffer[cursor] = '\n'
+    tprint('\n');
+  }
+}
+
+shape_t *init_shape(int width, int height) {
+  shape_t *ret = calloc(width * height, sizeof(bool));
+  return ret;
+}
+
+void free_shape(shape_t *shape) { free(shape); }
+
+void tflush() {
+  for (uint64_t row = 0; row < max_y; ++row) {
+    printf("\n");
+    for (uint64_t col = 0; col < max_x; ++col) {
+		if (fbuffer[row * max_x + col] == '*') {
+      		_gotoxy(col, row);
+			printf("%s%s %s",inverse, colors[rand() % sizeof(colors)/sizeof(*colors)], reset);
+			//printf("%s%c%s", reset inverse, /*fbuffer[row * max_x + col]*/ ' ', reset);
+		
+		}
+		else
+  			printf(reset " " reset);
+    }
+  }
+	//write(STDOUT_FILENO, fbuffer, max_x * max_y); // drawing will be very smooth this way.
+	
+}
+
+void alloc_fbuf() {
+  if (max_x * max_y > fbuffer_size) {
+    fbuffer_size = max_y * max_x; //* sizeof(char);
+    fbuffer = realloc(fbuffer, fbuffer_size);
+    assert(fbuffer);
+  }
+}
+
+bool dinasour_frame1[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame2[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
+};
+
+bool dinasour_frame3[DINASOUR_WIDTH][DINASOUR_HEIGHT] = {
+    {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0},
+    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0},
+    {1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
+    {1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0},
+    {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0},
+    {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+    {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
+};
+
+void clear_screen() {
+  memset(fbuffer, 0, fbuffer_size);
+  printf("\033c");
+}
+
+int main(int argc, char *argv[]) {
+  max_xy(0);
+  alloc_fbuf();
+  shape_t dinasour_f1 = {.matrix = &dinasour_frame1[0][0],
+                         .width = DINASOUR_WIDTH,
+                         .height = DINASOUR_HEIGHT,
+                         .x = 10,
+                         .y = 10};
+
+  shape_t dinasour_f2 = {.matrix = &dinasour_frame2[0][0],
+                         .height = DINASOUR_HEIGHT,
+                         .width = DINASOUR_WIDTH,
+                         .x = 10,
+                         .y = 10};
+
+  shape_t dinasour_f3 = {
+      .matrix = &dinasour_frame3[0][0],
+      .height = DINASOUR_HEIGHT,
+      .width = DINASOUR_WIDTH,
+      .x = 10,
+      .y = 10,
+  };
+
+  shape_t dinasour2_f1 = {.matrix = &dinasour_frame1[0][0],
+                          .width = DINASOUR_WIDTH,
+                          .height = DINASOUR_HEIGHT,
+                          .x = 10,
+                          .y = 10 };
+
+  shape_t dinasour2_f2 = {.matrix = &dinasour_frame2[0][0],
+                          .height = DINASOUR_HEIGHT,
+                          .width = DINASOUR_WIDTH,
+                          .x = 10,
+                          .y = 10}; 
+
+  shape_t dinasour2_f3 = {
+      .matrix = &dinasour_frame3[0][0],
+      .height = DINASOUR_HEIGHT,
+      .width = DINASOUR_WIDTH,
+      .x = 10,
+      .y = 10 + DINASOUR_HEIGHT + 2,
+  };
+
+  bool sun_matrix[SUN_HEIGHT][SUN_WIDTH] = {
+      {0, 0, 1, 0, 0}, {0, 1, 0, 1, 0}, {1, 0, 0, 0, 1},
+      {0, 1, 0, 1, 0}, {0, 0, 1, 0, 0},
+  };
+  shape_t sun = {.matrix = &sun_matrix[0][0],
+                 .height = SUN_HEIGHT,
+                 .width = SUN_WIDTH,
+                 .x = (float)max_x / 2,
+                 .y = 10};
+
+  struct sigaction sa;
+  sa.sa_handler = max_xy;
+  sa.sa_flags = 0;
+  sigemptyset(&sa.sa_mask);
+  sigaction(SIGWINCH, &sa, NULL);
+
+  int randx  =0 ;
+  int randy  =0 ;
+  clear_screen();
+  shape_t *arr[3] = {&dinasour_f1, &dinasour_f2, &dinasour_f3};
+  shape_t *arr2[3] = {&dinasour2_f1, &dinasour2_f2, &dinasour2_f3};
+  unsigned int index = 0;
+  srand(time(NULL));
+  unsigned int t = 1;
+  
+
+
+  while (true) {
+    shape_t *ptr = arr[index % 3];
+    shape_t *ptr2 = arr2[index % 3];
+    draw_shape(ptr, white_bg);
+    //printf("\nptr->x = %d, ptr->y = %d\n", ptr->x, ptr->y);
+    //printf("max_x = %d, max_y = %d\n", max_x, max_y);
+    //printf("fbuffer = %#X, fbuffer_size=%PRlu64\n", (unsigned int)fbuffer, fbuffer_size);
+    //printf("fbuffer = %#X, fbuffer_size=%llu, cursor = %d\n", fbuffer, fbuffer_size, cursor);
+     //draw_shape(&sun, yellow_bg);
+    draw_shape(ptr2, yellow_bg);
+    tflush();
+    //usleep(DELAY);
+
+
+    for (int i = 0; i < 3; ++i) {
+
+      arr[i]->x = (arr[i]->x + 3) % max_x;
+      //arr[i]->y = (arr[i]->x - 1) % (max_y - DINASOUR_HEIGHT);
+      arr[i]->y = rand() % (max_y - DINASOUR_HEIGHT);
+
+	  //arr2[i]->x = (arr[i]->x - 10) % max_x;
+	  //arr2[i]->y = (arr[i]->y - 10) % max_y;
+    }
+
+	index++;
+    if (sun.y + sun.height >= max_y)
+      sun.y = 0;
+    sun.y += 1;
+    // collisions();
+	if (resize) {
+		alloc_fbuf();
+		resize = false;
+	}
+	//if (arr[index]->x >= max_x)
+    //	clear_screen();
+  }
+  
+  free(fbuffer);
+  return 0;
+}