#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
char A[4][4][7][4]={
"0000","0000","0000","0000","0000","0000","0000",
"1111","0100","0010","0110","0110","0100","0110",
"0000","0111","1110","0011","1100","1110","0110",
"0000","0000","0000","0000","0000","0000","0000"};
char far*Q[251]={104+(char far*)0xA0000000};
char E,B[256],b[256],e[256];
char C[7][4][4],D[7][4][4];
int H[7][4][4],J[9],Y[25],i[50];
int G[]={1,2,3,0};
int I[]={0,77,75,72};
int X[]={10,1,-1,0};
int L,a,g,h,v,w,x,y;
int M=9,c=3,n=48,p=6;
void Pieza(char far*F,int f){
for(v=7;v--;F+=313)
for(w=7;w--;*F++=f);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
clock_t T;
srand(time(NULL));
printf("%c[3;28f Nivel=1",27);
for(y=25;y--;Pieza(Q[g]-72,8),Q[g]+=2480)
for(x=10;x--;Q[++g]=Q[g]+=8)
if(!x||y%24<1) Pieza(Q[g]+16,8);
for(g=4;g--;e[I[g]]=g,n=0)
for(a=7;a--;)
for(v=0,y=4;y--;)
for(x=4;x--;)
if(A[g][y][a][x]=A[G[g]][x][a][3-y]-n)
C[a][g][v++]=10*y+x;
for(a=7;J[a]=a--;c=3)
do{
g=G[c];
for(x=v=4;v--;i[I[v]=C[a][c][v]]++)
if(h) i[I[v]]--;
while(x--){
H[a][c][x]=h;
while(++v<4)
!i[y=X[x]+C[a][g][v]]?B[h++]=y:i[y]--;
D[a][g=c][x]=h-n;
while(v--) i[y=I[v]]?b[n++]=y:i[y]++;
}
}while(c--);
Inicio:
printf("%c[5;28fLineas=%u",27,L);
for(n=4;n--;Pieza(Q[c]+17048,0))
if(!*Q[c=4+C[a=p][g=0][n]]) Pieza(Q[c],a+1);
else while(1) if(getch()==27) return 0;
p=rand()%7;
for(c=n=4;n--;Pieza(Q[C[p][0][n]]+17080,p+1));
do{
if(n<0) T=clock();
do if(E=kbhit()) E=getch();
while(!E&&clock()-T<M);
if(E==27&&getch()==E) return 0;;
if(y=(E=='-'&&M<10)-(E=='+'&&M>1))
printf("%c[3;35f%u",27,10-(M+=y));
h=H[a][g][x=e[E]];
n=y=D[a][g][x];
while(y--&&!*Q[I[y]=c+B[h]]) i[y]=c+b[h++];
if(y<0) for(x>2?g=G[g]:c+=X[x++];n--;)
Pieza(Q[I[n]],a+1),
Pieza(Q[i[n]],0);
}while(x);
for(n=4;n--;Y[y=(c+C[a][g][n])/10]++);
do while(Y[x=y]>8)
do for(L+=x==y,c=10*x--,n=9;n--;)
if(*Q[++c]!=J[a=*Q[c-10]]) Pieza(Q[c],J[a]);
while(Y[x+1]=Y[x]);
while(Y[--y]);
goto Inicio;
}