#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char A[][50]={
"00000000000000000000000000000000000000000000000000",
"00000000000000000000000000<00000000000000000000000",
"00000000000000000000000000:00000000000000000000000",
"00D:J:A000D::Z::A000000000:000000000D:J:H::Z::A000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00J000J000J00000J000000000:000000000J000J00000J000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00:000:000:00000:000000000:000000000:000:00000:000",
"00J000G:J:B00000J000000000:000000000J000J00000J000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00J000J000000000J000000000:000000000J000J00000J000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00:000:000000000:000000000:000000000:000:00000:000",
"00J000C:J:H:J:J:I:J:J:J:J:I:J:J:J:J:F:J:I:J:J:E000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00J0000000J00000J000000000:0000000000000J00000J000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00:0000000:00000:000000000:0000000000000:00000:000",
"00J000D:J:E00000G:::8:::::6:::::1000D:J:E00000J000",
"00:000:000:00000:000:00000000000:000:000:00000:000",
"00:000:000:00000:000:00000000000:000:000:00000:000",
"00J000J000J00000J000:00000000000:000J000J00000J000",
"00:000:000:00000:000:0004:::1000:000:000:00000:000",
"00:000:000:00000:000:000:000:000:000:000:00000:000",
"00G:J:B000G:J:J:B000:000:000:0007:::B000G:J:J:B000",
"00:0000000:000000000:000:000:000:0000000:000000000",
"00:0000000:000000000:000:000:000:0000000:000000000",
"00J0000000J000000000:000:000:000:0000000J000000000",
"00:0000000:000000000:000=0003:::20000000:000000000"};
char pieza[][5][13]={
"0000111110000","0000111110000","0000111110000","0000111110000","0000000000000",
"0011111111100","0011111111100","0011111111100","0011111111100","0000000000000",
"0111117111110","0111111111110","0113311133110","0112211122110","0000222220000",
"0111117111110","0111111117770","0123321233210","0144331443310","0002222222000",
"1111177711111","1111117777777","0124421244210","0144331443310","0022211122200",
"1111177711111","1117777777777","1114411144111","1112211122111","0022111112200",
"1111777771111","1111117777777","1111111111111","1111111111111","0022211122200",
"0111777771110","0111111117770","1111111111111","1111111111111","0002222222000",
"0117777777110","0111111111110","1111111111111","1111111111111","0000222220000",
"0017777777100","0011111111100","1101110111011","0111011101110","0000000000000",
"0000777770000","0000111110000","1000100010001","0010001000100","0000000000000"};
char far*Q[650],far*q=(char far*)0xA0000000;
int K[][4]={1,0,0,-1,3,1,0,0,0,-1,1,0,0,0,-1,-3};
int G[]={0,2,1,4,3,5,8,7,6,9,10,12,11,13};
int C[]={1371,1380,1627,1636};
int e[256]={0,72,77,80,75};
int I[]={-64,1,64,-1};
int D[]={3,1,3,1};
int H[3200],P[20][143];
int R[4],S[4],b[14],p[20];
int B[650],J[650],X[650],Y[650];
int c=3200,d=61271,h=3200,j=1,n=5;
int E,L,N,a,m,v,w,x,y;
void figura(int F,char F1,char F2){
for(q=Q[F],v=p[F1];v--;)
*(q+P[F1][v])=F2;
}
void pildora(F,F1){
if(J[H[F]]<0)
if(J[v=H[F-=I[F1]]]>0||J[v=H[F-I[F1]]]>1)
figura(v,J[v]+14,7);
}
void fantasma(F,F1){
d=D[n];
figura(a=H[h],R[n]+5,0);
figura(a,d+11,0);
R[n]=!R[n];
if(B[a]<10)
if(B[a]<5) d+=K[B[a]-1][d];
else{
x=X[F]-X[H[F1]];
if(x&&n%2&&j%2&&S[n]+1) x=-x;
y=Y[F]-Y[H[F1]];
if(y&&n>1&&j%2<1&&S[n]+1) y=-y;
switch(B[a]){
case 5: if(d==0) d=x>0?1:3;
else if(y>0) d=2;
break;
case 6: if(d==1) d=y>0?2:0;
else if(x<0) d=3;
break;
case 7: if(d==2) d=x>0?1:3;
else if(y<0) d=0;
break;
case 8: if(d==3) d=y>0?2:0;
else if(x>0) d=1;
break;
case 9: if(x&&d%2==0) d=x>0?1:3;
else if(y&&d%2) d=y>0?2:0;
}
}
pildora(h,D[n]=d);
C[n]=h+=b[B[H[h+=I[d]]]];
figura(a=H[h],d+11,15);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
textcolor(BLUE);
clrscr();
clock_t T;
b[11]-=b[12]=61;
while(e[e[--n]]=n) e[n]=0;
for(y=11;y--;w+=320,h-=320)
for(x=13;x--;)
for(n=5;n--;)
if(v=pieza[y][n][x]-48)
switch(n){
case 0: P[0][p[0]++]=P[v][p[v]++]=w+x;
P[v+2][p[v+2]++]=h+x;
break;
case 1: P[v+1][p[v+1]++]=w+x;
P[v+3][p[v+3]++]=w+12-x;
break;
case 4: if(v<2) P[15][p[15]++]=w+x;
P[16][p[16]++]=w+x;
break;
default: if(v<2) P[n+3][p[n+3]++]=h+x;
else v!=3?P[n+9][p[n+9]++]=h+x:0,
v!=4?P[n+11][p[n+11]++]=h+x:0;
}
for(y=50;y--;d-=1120)
for(h=d+5,v=c-=x=32;x--;c--,v++,d-=5,h+=5)
if(B[j]=A[x][49-y]%16)
J[j]=J[j+1]=A[x][49-y]/16-3,
Q[H[c-1]=j]=q+d,
Q[H[v]=j+1]=q+h,
B[j+1]=G[B[j]],
Y[j]=Y[j+1]=y,
X[j++]=x,
X[j++]=63-x;
for(c=3200;c--;)
if(j=H[c]){
for(q=Q[j]-321,y=12;y--;q+=305)
for(x=15;x--;*q++-=*q==1);
if(J[j]>0)
for(figura(j,J[j]+14,7),n=4;n--;)
if(H[h=c+I[n]]) J[H[h+I[n]]]-=J[j]-1,
J[H[h]]--;
}
j=H[c=2527];
Inicio:
if(!m--) m=3;
while(clock()-T<2);
T=clock();
for(n=4;n--;)
if(h=w=C[n])
switch(S[n]){
case -1: fantasma(416,h);
S[n]+=B[a]>12;
break;
case 0: if(m%2==n%2) fantasma(j,h),
figura(a,R[n]+5,n+2);
while(h==c||w==c)
if(getch()==27) return 0;
break;
default: if(m==n) fantasma(H[h],c),
v=--S[n]<12&&R[n]?7:9,
figura(a,R[n]+5,v);
if(h==c||w==c) S[n]=-1;
}
if(m%2){
while(kbhit()) N=E=getch();
E=N;
do{
h=e[E]?c+I[e[E]-1]:c;
if(!H[h+=b[B[H[h]]]]||h==c)
E=w=E!=L?L:0;
else figura(j,w=0,0),
pildora(c,e[L=E]-1);
}while(w);
figura(j=H[c=E?h:c],e[E],14);
v=J[j]-1;
if(v>=0)
for(J[j]=0,n=4;n--;S[n]+=S[n]<0?0:40*v)
if(H[h=c+I[n]]) J[H[h+I[n]]]+=v,
J[H[h]]++;
}
else if(E) figura(j,e[E]+6,14);
goto Inicio;
}