#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<curses.h>
#include"io.h"
#include"fejs.h"
#include"object.h"
#include"level.h"

int alvl=0,x=0,y=0;

void
c_move(int dx, int dy) {
  int mx=x+dx,my=y+dy;
  if (mx>=0 && mx<80 && my>=0 && my<20) {x=mx;y=my;}
}

int
main() {
  FILE *f;
  tlevel *lvl=malloc(pre_levels*sizeof(tlevel));
  memcpy(lvl,pre_lvl,pre_levels*sizeof(tlevel));
  pinit();
  
  while (1) {
    int k,xx,yy,ll; char s[256];
    level_paint(&lvl[alvl],1);
    sprintf(s,"level %d",alvl); pputstr(0,0,s,0);
    move(y+sy,x+sx); refresh(); k=getch();
    switch(k) {
      case 'q'      :
      case '\033'   : pdone(); return 0;
      case KEY_LEFT : c_move(-1, 0); break;
      case KEY_RIGHT: c_move(1, 0); break;
      case KEY_UP   : c_move(0, -1); break;
      case KEY_DOWN : c_move(0, 1); break;
      case KEY_HOME : c_move(-1, -1); break;
      case KEY_END  : c_move(-1, 1); break;
      case KEY_NPAGE: c_move(1, 1); break;
      case KEY_PPAGE: c_move(1, -1); break;
      case '.'      : lvl[alvl].m[y][x].t=C_FLOOR; c_move(1, 0); break;
      case '#'      : lvl[alvl].m[y][x].t=C_WALL; c_move(1, 0); break;
      case '<'      : lvl[alvl].m[y][x].t=C_HIGH; c_move(1, 0); break;
      case '>'      : lvl[alvl].m[y][x].t=C_DOWN; c_move(1, 0); break;
      case '~'      : lvl[alvl].m[y][x].t=C_WATER; c_move(1, 0); break;
      case '+'      : lvl[alvl].m[y][x].t=C_CDOOR; c_move(1, 0); break;
      case '/'      : lvl[alvl].m[y][x].t=C_ODOOR; c_move(1, 0); break;
      case 'd'      : if (alvl<pre_levels-1) alvl++; break;
      case 'u'      : if (alvl>0) alvl--; break;
      case 'a'      : alvl=pre_levels; pre_levels++; lvl=realloc(lvl,pre_levels*sizeof(tlevel));
		      level_make_clean(&lvl[alvl]); break;
      case 's'      : f=fopen("levels.c","w");
		      fprintf(f,"#include\"level.h\"\n\nint pre_levels=%d;\n\ntlevel pre_lvl[%d] =\n{\n",
			        pre_levels,pre_levels);
		      for (ll=0;ll<pre_levels;ll++) {
			fprintf(f,"\t{%d,%d,\n\t\t{\n",lvl[ll].h,lvl[ll].w);
		        for (yy=0;yy<20;yy++) {
			  fprintf(f,"\t\t\t{\n");
			  for (xx=0;xx<80;xx++) {
			    fprintf(f,"\t\t\t\t{%d,%d,%d,%d,%d,NULL},\n",lvl[ll].m[yy][xx].t,lvl[ll].m[yy][xx].f,lvl[ll].m[yy][xx].k,lvl[ll].m[yy][xx].i,lvl[ll].m[yy][xx].l);
			  }
			  fprintf(f,"\t\t\t},\n");
		        }
			fprintf(f,"\t\t},\n\t},\n");
		      }
		      fprintf(f,"};\n");
		      fclose(f);
		      break;
    }
  }
  return 0;
}
