#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 J[3200],B[3200],b[14];
int K[650],X[650],Y[650];
int R[4],S[4],P[20][143],p[20];
int C[]={1371,1380,1627,1636};
int D[]={3,1,3,1};
int G[]={0,2,1,4,3,5,8,7,6,9,10,12,11,13};
int H[][4]={1,0,0,-1,3,1,0,0,0,-1,1,0,0,0,-1,-3};
int I[]={-64,1,64,-1};
int e[256]={0,72,77,80,75};
int c=3200,d=61271,h=3200,j=1,n=5;
int E,L,M,a,v,x,y;
void Figura(char far*F,char F1,char F2){
for(v=p[F1];v--;*(F+P[F1][v])=F2);
}
void Pildora(F,F1){
if(K[J[F]]<0)
if(K[v=J[F-=I[F1]]]>0||K[v=J[F-I[F1]]]>1)
Figura(Q[v],14+K[v],7);
}
void Desvios(F,F1){
if(x=X[F]-X[F1]) if(j%2&&n%2&&S[n]+1) x=-x;
if(y=Y[F]-Y[F1]) if(j%2<1&&n>1&&S[n]+1) y=-y;
switch(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;
}
}
void Fantasma(F,F1){
d=D[n];
Figura(q=Q[J[h=C[n]]],5+R[n],0);
Figura(q,d+11,0);
R[n]=!R[n];
a=B[h];
if (a<5) d+=H[a-1][d];
else if(a<10) Desvios(J[F],J[F1]);
Pildora(h,D[n]=d);
C[n]=h+=b[B[h+=I[d]]];
Figura(q=Q[J[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--;v+=320,h-=320)
for(x=13;x--;)
for(n=5;n--;)
if(a=Pieza[y][n][x]-48)
switch(n){
case 0:
P[0][p[0]++]=P[a][p[a]++]=v+x;
P[a+2][p[a+2]++]=h+x;
break;
case 1:
P[a+1][p[a+1]++]=v+x;
P[a+3][p[a+3]++]=v+12-x;
break;
case 4:
if(a<2) P[15][p[15]++]=v+x;
P[16][p[16]++]=v+x;
break;
default:
if(a<2) P[n+3][p[n+3]++]=h+x;
else a!=3?P[n+9][p[n+9]++]=h+x:0,
a!=4?P[n+11][p[n+11]++]=h+x:0;
}
for(y=50;y--;d-=1120)
for(h=d+5,a=c-=x=32;x--;d-=5,h+=5)
if(B[a++]=G[B[--c]=A[x][49-y]%16])
K[j]=K[j+1]=A[x][49-y]/16-3,
Q[J[c]=j]=q+d,
Q[J[a-1]=j+1]=q+h,
Y[j]=Y[j+1]=y,
X[j++]=x,
X[j++]=63-x;
for(c=3200;c--;)
if(j=J[c]){
for(q=Q[j]-321,y=12;y--;q+=305)
for(x=15;x--;*q++-=*q==1);
if(K[j]>0)
for(Figura(Q[j],14+K[j],7),n=4;n--;)
if(J[h=c+I[n]]) K[J[h]]--,
K[J[h+I[n]]]-=K[j]-1;
}
j=J[c=2527];
Inicio:
T=clock();
for(n=4;n--;)
if(!S[n]) j*=C[n]!=c,
Fantasma(c,C[n]),
Figura(q,5+R[n],n+2),
j*=C[n]!=c;
else if(S[n]<0||C[n]==c) Fantasma(1120,C[n]),
S[n]=B[h]/13-1;
else{
if(--S[n]%2<1) continue;
Fantasma(C[n],c);
if(h==c) S[n]=-1;
else Figura(q,5+R[n],R[n]&&S[n]<25?7:9);
}
while(!j) if(getch()==27) return 0;
while(clock()-T<3);
if(E) Figura(Q[j],e[E]+6,14);
for(n=4;n--;)
if(S[n]<0) Fantasma(1120,C[n]),
S[n]+=B[h]/13;
while(clock()-T<4);
while(kbhit()) M=E=getch();
E=M;
do{
h=e[E]?c+I[e[E]-1]:c;
if(!B[h+=b[B[h]]]||c==h) E=a=E!=L?L:0;
else Figura(Q[j],a=0,0),
Pildora(c,e[L=E]-1);
}while(a);
Figura(Q[j=J[c=E?h:c]],e[E],14);
if(K[j]>0)
for(a=K[j]-1,K[j]=0,n=4;n--;S[n]+=S[n]<0?0:80*a)
if(J[h=c+I[n]]) K[J[h]]++,
K[J[h+I[n]]]+=a;
goto Inicio;
}