#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","1101100011011","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[]={0,-64,1,64,-1};
int e[256]={0,72,77,80,75};
int i[]={0,3,4,1,2};
int c=3200,g=61271,j=1,n=5,w=3200;
int E,L,M,a,d,h,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,F2){
if(K[F]<0)
if(K[v=J[F1+=w=I[i[F2]]]]>0||K[v=J[F1+w]]>1)
Figura(Q[v],14+K[v],7);
}
void Direccion(F,F1,F2){
Figura(Q[g],5+R[n],0);
Figura(Q[g],F+11,0);
R[n]=!R[n];
if(B[h]<10)
if(B[h]<5) D[n]+=H[B[h]-1][F];
else{
if(x=X[F1]-X[F2]) if(j%2&&n%2&&S[n]+1) x=-x;
if(y=Y[F1]-Y[F2]) if(j%2<1&&n>1&&S[n]+1) y=-y;
switch(B[h]){
case 5: if(F==0) D[n]=x>0?1:3;
else if(y>0) D[n]=2;
break;
case 6: if(F==1) D[n]=y>0?2:0;
else if(x<0) D[n]=3;
break;
case 7: if(F==2) D[n]=x>0?1:3;
else if(y<0) D[n]=0;
break;
case 8: if(F==3) D[n]=y>0?2:0;
else if(x>0) D[n]=1;
break;
case 9: if(x&&F%2==0) D[n]=x>0?1:3;
else if(y&&F%2) D[n]=y>0?2:0;
}}
Pildora(g,h,D[n]+1);
C[n]=h+=b[B[h+=I[D[n]+1]]];
Figura(Q[J[h]],D[n]+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,w-=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]++]=w+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]++]=w+x;
else a!=3?P[n+9][p[n+9]++]=w+x:0,
a!=4?P[n+11][p[n+11]++]=w+x:0;
}
for(y=50;y--;g-=1120)
for(h=g+5,d=c-=x=32;x--;g-=5,h+=5)
if(B[d++]=G[B[--c]=A[x][49-y]%16])
K[j]=K[j+1]=A[x][49-y]/16-3,
Q[J[c]=j]=q+g,
Q[J[d-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),d=5;--d;)
if(J[n=c+I[d]]) K[J[n]]--,
K[J[n+I[d]]]-=K[j]-1;
}
j=J[c=2527];
Inicio:
T=clock();
for(n=4;n--;)
if(!S[n]) c*=C[n]!=c,
Direccion(D[n],j,g=J[h=C[n]]),
Figura(Q[J[h]],5+R[n],n+2),
c*=C[n]!=c;
else if(S[n]<0||C[n]==c)
Direccion(D[n],416,g=J[h=C[n]]),
S[n]=B[h]/13-1;
else if(--S[n]%2){
Direccion(D[n],g=J[h=C[n]],j);
if(h==c) S[n]=-1;
else a=R[n]&&S[n]<25?7:9,
Figura(Q[J[h]],5+R[n],a);
}
while(!c) 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) Direccion(D[n],416,g=J[h=C[n]]),
S[n]+=B[h]/13;
while(clock()-T<4);
while(kbhit()) M=E=getch();
E=M;
do{
h=g=c+I[e[E]];
if(!B[h+=b[B[g]]]||c==h) E=g=E!=L?L:0;
else Figura(Q[j],g=0,0),
Pildora(j,c,e[E]),
Figura(Q[j=J[c=h]],e[L=E],14);
}while(g);
if(!E) Figura(Q[j],0,14);
if(K[j]>0)
for(a=K[j]-1,K[j]=0,d=4;d--;S[d]+=S[d]<0?0:80*a)
if(J[n=c+I[d+1]]) K[J[n]]++,
K[J[n+I[d+1]]]+=a;
goto Inicio;
}