//DosDraw  by Jocke "Firetech" Andersson, written 5-7/9-2004.
//Licence: GNU GPL.

#include <iostream>
#include <iomanip>
#include <stdio>
#include <conio>
#include "..\pause.h"
using namespace std;

char vers[] = "1.4.2.9";

char screen[76][21],flin[] = "##############################################################################\n",drwchr = '+';
int x,y;

void clean_draw(bool clear = true)
{
  if (clear) {
    for (int l=0;l <= 20;l++) {
      for (int c=0;c <= 75;c++) {
        screen[c][l] = ' ';
      }
    }
    x = 0;
    y = 0;
    screen[0][0] = drwchr;
  }
  system("CLS");
  cout << flin;
  for (int l=0;l <= 20;l++) {
    cout << "#";
    for (int c=0;c <= 75;c++) {
      cout << screen[c][l];
    }
    cout << "#" << endl;
  }
  cout << flin;
  cout << "X: " << x << ", Y: " << y << endl;
}

void save(char filename[256])
{
  char ovr;
  bool cont;
  FILE * ofile;
  ofile = fopen(filename,"rt");
  if (ofile != NULL) {
    cont = true;
    cout << "File exists!";
    while (cont) {
      cout << " Want to overwrite? (Y/N)";
      ovr = tolower(getch());
      if ((ovr == 'n') || (ovr == 'y')) {
        cont = false;
      } else {
        cout << endl << "Invalid answer!";
      }
    }
  }
  fclose(ofile);
  if (ovr == 'n') return;
  ofile = fopen(filename,"w+t");
  fprintf(ofile,flin);
  for (int l=0;l <= 20;l++) {
    fprintf(ofile,"#");
    for (int c=0;c <= 75;c++) {
      fputc(screen[c][l],ofile);
    }
    fprintf(ofile,"#\n");
  }
  fprintf(ofile,flin);
  fclose(ofile);
}

void showhelp(bool startup = false)
{
  system("CLS");
  if (startup) {
    cout << "Welcome to DosDraw" << endl << "==================";
  } else {
    cout << "DosDraw Help" << endl << "============";
  }
  cout << endl << endl;
  cout << "Keys" << endl << "----" << endl;
  cout << "Arrows\t:Draw (Move character)" << endl << "  C\t:Clear" << endl << "  R\t:Redraw screen" << endl << "  S\t:Save to file" << endl;
  cout << "  D\t:Set drawing character" << endl << "  A\t:About" << endl << "  H\t:Show this help" << endl << "  X\t:Exit";
  cout << endl << endl;
  pause();
}

void showabout(bool shutdown = false)
{
  system("CLS");
  if (shutdown) {
    cout << "Thanks for using DosDraw" << endl << "========================";
  } else {
    cout << "About DosDraw" << endl << "=============";
  }
  cout << endl << endl << "Powered by CrowD " << vers << endl;
  cout << "\t(c) 2004 Jocke \"Firetech\" Andersson" << endl << endl;
  pause();
}

void main(void)
{
  char inchr[2], fname[256];
  bool cont = true,draw;
  int pil;
  showhelp(true);
  clean_draw();
  while (cont) {
    draw = false;
    switch (tolower(getch())) {
      case 0:
        switch(getch()) {
          case 72:
            y--;
            break;
          case 80:
            y++;
            break;
          case 75:
            x--;
            break;
          case 77:
            x++;
            break;
          default:
            break;
        }
        draw = true;
        break;
      case 'c':
        clean_draw(true);
        break;
      case 'r':
        clean_draw(false);
        break;
      case 's':
        system("CLS");
        cout << "Filename should be including full (existing) path, else it will be saved in the" << endl;
        cout << "same folder as the application, and max 255 characters." << endl << "Recommended file type: \".txt\"." << endl;
        cout << endl << "Save to: ";
        cin.getline(fname,256);
        save(fname);
        clean_draw(false);
        break;
      case 'd':
        system("CLS");
        cout << "Enter new drawing character. The default is \"+\"." << endl;
        cout << "This value cannot be empty or \"#\". For erasing, use \" \" (Space)." << endl;
        do {
          cout << "New drawing character: ";
          cin.getline(inchr,2);
          drwchr = inchr[0];
        } while (drwchr == '#');
        clean_draw(false);
        break;
      case 'a':
        showabout();
        clean_draw(false);
        break;
      case 'h':
        showhelp();
        clean_draw(false);
        break;
      case 'x':
        showabout(true);
        cont = false;
        break;
      default:
        break;
    }
    if (draw) {
      if (y <= -1) {
        y = 0;
      } else if (y >= 21) {
        y = 20;
      }
      if (x <= -1) {
        x = 0;
      } else if (x >= 76) {
        x = 75;
      }
      if (screen[x][y] != drwchr) {
        screen[x][y] = drwchr;
        gotoxy(x + 2,y + 2);
        cout << screen[x][y];
      }
      gotoxy(1,24);
      cout << "X: " << x << ", Y: " << y << "  " << endl;
    }
  }
}

