#include <stdio.h>
#include <allegro.h>

int x = 2, y = 2;
int mode = 0;

void writechar(char c, int s)
{
  s = s ? 1 : 0;
  if(c == '\n') {
    text_mode(makecol(0,0,0));
    textout(screen, font, " ", x*8, y*8, 0);
    x = 2, y++;
  }
  else if(c != 0) {
    text_mode(makecol(0,0,0));
    textprintf(screen, font, x*8, y*8, makecol(0, 255, 0), "%c", c);
    x++;
  }
  text_mode(makecol(0,s*255,0));
  textout(screen, font, " ", x*8, y*8, makecol(0, (1-s)*255, 0));
  if(mode) return;
  rest(100);
  if(c == '\n') rest(200);
}

void blink(unsigned int n)
{
  register unsigned int i;
  for(i = 0; i < n; i++) {
    writechar(0, 0); rest(200);
    writechar(0, 1); rest(200);
  }
}

int main(int argc, char *argv[])
{
  FILE *f;
  int c;
  
  if(argc != 2) {
    fprintf(stderr, "Matrix-like message writer\nUsage: %s <infile>\n", argv[0]);
    return 1;
  }
  
  allegro_init();
  install_timer();
  if(set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) {
    set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
    fprintf(stderr, "Graphics mode setting error: %s\n", allegro_error);
    return 2;
  }
  
  f = fopen(argv[1], "r");
  if(f == NULL) {
    set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
    fprintf(stderr, "File opening error\n");
    return 3;
  }
  
  clear_to_color(screen, makecol(0,0,0));
  blink(6);
  
  while((c = fgetc(f)) != EOF) {
    switch(c) {
      case '@':
        blink(3);
        break;
      case '%':
        clear_to_color(screen, makecol(0,0,0));
        x = y = 2;
        break;
      case '`':
        c = fgetc(f);
        if(c == EOF) {
          allegro_exit();
          fclose(f);
          return 0;
        }
        switch(c) {
          case '0':
            mode = 0;
            break;
          case '1':
            mode = 1;
            break;
        }
        break;
      default:
        writechar(c, 1);
    }
  }
  
  writechar('\n', 1);
  rest(1000);
  
  fclose(f);
  
  allegro_exit();
  return 0;
}
END_OF_MAIN();

