SecondReality/HARD/BP.C
2017-09-24 01:45:36 +02:00

299 lines
6.2 KiB
C

/* parts */
char pal1[768];
int pal1colp=0;
void part1init(void)
{
int a,b,c;
if(!pal1colp) memcpy(pal,defpal,768);
for(c=(16)*3,a=0;a<64;a++)
{
b=64-a; b=b*b/64;
if(b<0) b=0; else if(b>63) b=63;
pal1[a*3+c+0]=b;
pal1[a*3+c+64*3+0]=b*2/3;
pal1[a*3+c+128*3+0]=b*1/3;
b=64-a; b=b*b/64;
if(b<0) b=0; else if(b>63) b=63;
pal1[a*3+c+1]=b;
pal1[a*3+c+64*3+1]=b*2/3;
pal1[a*3+c+128*3+1]=b*1/3;
b=64-a;
b=b*4/6;
if(b<0) b=0; else if(b>63) b=63;
pal1[a*3+c+2]=b+20;
pal1[a*3+c+64*3+2]=b*2/3+20;
pal1[a*3+c+128*3+2]=b*1/3+20;
}
waitb();
inp(0x3da);
dotsp=0;
pal1colp+=4;
}
void part1(void)
{
int a,b;
b=count-6; if(b<0) b=0; else if(b>63) b=63;
b=b*3+16*3;
pal[-3*4+pal1colp*3+1*3+0]=pal1[0*3+b+0];
pal[-3*4+pal1colp*3+1*3+1]=pal1[0*3+b+1];
pal[-3*4+pal1colp*3+1*3+2]=pal1[0*3+b+2];
pal[-3*4+pal1colp*3+2*3+0]=pal1[64*3+b+0];
pal[-3*4+pal1colp*3+2*3+1]=pal1[64*3+b+1];
pal[-3*4+pal1colp*3+2*3+2]=pal1[64*3+b+2];
pal[-3*4+pal1colp*3+3*3+0]=pal1[128*3+b+0];
pal[-3*4+pal1colp*3+3*3+1]=pal1[128*3+b+1];
pal[-3*4+pal1colp*3+3*3+2]=pal1[128*3+b+2];
b=(64-(count>64?64:count))*3+16*3;
pal[pal1colp*3+1*3+0]=pal1[0*3+b+0];
pal[pal1colp*3+1*3+1]=pal1[0*3+b+1];
pal[pal1colp*3+1*3+2]=pal1[0*3+b+2];
pal[pal1colp*3+2*3+0]=pal1[64*3+b+0];
pal[pal1colp*3+2*3+1]=pal1[64*3+b+1];
pal[pal1colp*3+2*3+2]=pal1[64*3+b+2];
pal[pal1colp*3+3*3+0]=pal1[128*3+b+0];
pal[pal1colp*3+3*3+1]=pal1[128*3+b+1];
pal[pal1colp*3+3*3+2]=pal1[128*3+b+2];
loadpal(pal,32*3);
if(count<8) for(a=0;a<2048/8;a++)
{
dotsp+=4;
switch(dotspnt[dotsp])
{
case 1 : doit1(dotspnt[dotsp+2],dotspnt[dotsp+3],3+pal1colp); break;
case 2 : doit1(dotspnt[dotsp+2],dotspnt[dotsp+3],2+pal1colp); break;
case 3 : doit1(dotspnt[dotsp+2],dotspnt[dotsp+3],1+pal1colp); break;
default : dotsp=0; break;
}
}
else if(count>=72) NEXTMODE;
}
/*################################################################*/
extern int csetmatrix(int *,long,long,long);
extern int crotlist(long *,long *);
extern int cclipedges(int *,int *,long *); // modifies given point list
extern int cprojlist(long *,long *);
extern int cdrawpolylist(int *);
extern int cmatrix_yxz(int,int,int,int *);
extern int cpolylist(int *polylist,int *polys,int *edges,long *points3);
extern int ceasypolylist(int *polylist,int *polys,long *points3);
long cubepoints[]={8,
-510,-510,-510,
410,-510,-510,
410,410,-510,
-510,410,-510,
-510,-510,410,
410,-510,410,
410,410,410,
-510,410,410
};
int cubepolys[]={
4,0x4001,3,2,1,0,
4,0x4002,4,5,6,7,
4,0x4004,0,1,5,4,
4,0x4008,1,2,6,5,
4,0x4010,2,3,7,6,
4,0x4020,3,0,4,7,
0};
int cubepolyss[]={
4,0x4040,3+8,2+8,1+8,0+8,
4,0x4040,4+8,5+8,6+8,7+8,
4,0x4040,0+8,1+8,5+8,4+8,
4,0x4040,1+8,2+8,6+8,5+8,
4,0x4040,2+8,3+8,7+8,6+8,
4,0x4040,3+8,0+8,4+8,7+8,
0};
long gridpoints[1010*3];
int polylist[256];
long points2[1010*3];
int points3[1010*8];
int rx=0,ry=0,rz=0,zp=5600;
int matrix[9];
extern char depthcol[];
void part2init(void)
{
int a,r,g,b,x,y,z,d;
for(a=0;a<3100;a++)
{
if(a<1000 || b>=3000) b=127;
else b=127-(a-1000)/32;
depthcol[a]=b;
}
memcpy(pal,defpal,768);
pal[1*3+0]=63;
pal[1*3+1]=63;
pal[1*3+2]=63;
pal[250*3+0]=0;
pal[250*3+1]=0;
pal[250*3+2]=40;
d=64;
for(a=0;a<64;a++)
{
b=a+d; if(b>63) b=63;
pal[64*3+a*3+0]=a;
b=a+20+d; if(b>63) b=63;
pal[64*3+a*3+1]=b;
b=a+40+d; if(b>63) b=63;
pal[64*3+a*3+2]=b;
if(d>0) d-=8;
}
loadpal(pal,768);
memcpy(pal2,pal,768);
a=1;
for(x=0;x<10;x++) for(y=0;y<10;y++) for(z=0;z<10;z++)
if(!x || !y || !z || x==9 || y==9 || z==9)
{
gridpoints[a++]=(x-5)*100;
gridpoints[a++]=(y-5)*100;
gridpoints[a++]=(z-5)*100;
}
gridpoints[0]=(a-1)/3;
zp=3500;
}
void part2(void)
{
int a,x,y;
if(count>=500) NEXTMODE;
if(count>500-16)
{
a=(500-16)-count;
fadepal(pal,pal2,a*16);
}
setborder(0);
cmatrix_yxz(rx,ry,rz,matrix);
csetmatrix(matrix,0,0,zp);
setborder(1);
points3[0]=0; crotprojlist(points3,gridpoints);
setborder(250);
do3dots(points3,vram);
#if 0
if(count==2)
{
FILE *f1;
f1=fopen("_grid1.tmp","wb");
for(a=0;a<points3[0];a++) if(points3[2+a*8+4]<=3000)
{
x=points3[2+a*8+0];
y=points3[2+a*8+1];
putw(x,f1);
putw(y,f1);
}
fclose(f1);
}
#endif
#if 0
for(a=0;a<1000;a++)
{
x=points3[2+a*8+0];
y=points3[2+a*8+1];
vram[x+y*320]++;
}
#endif
if(count>1)
{
rx+=9; ry+=10; rz+=11;
if(zp>2000) zp-=10;
}
setborder(255);
}
/*################################################################*/
void part3init(void)
{
int a,r,g,b;
memcpy(pal,defpal,768);
for(a=1;a<128;a++)
{
r=g=0; b=20;
if(a&0x1) { g+=20; r+=20; }
if(a&0x2) { g+=22; r+=22; }
if(a&0x4) { g+=24; r+=24; }
if(a&0x8) { g+=26; r+=26; }
if(a&0x10) { g+=28; r+=28; }
if(a&0x20) { g+=30; r+=30; }
if(a&0x40) { b=15; }
if(r>63) r=63;
if(g>63) g=63;
if(b>63) b=63;
pal2[a*3+0]=r;
pal2[a*3+1]=g;
pal2[a*3+2]=b;
}
for(a=2;a<254;a++)
{
pal[a*3+0]=0;
pal[a*3+1]=0;
pal[a*3+2]=20;
}
loadpal(pal,768);
/*
rx=0;
ry=0;
rz=0;
zp=5600;
*/
}
void part3(void)
{
int a,b,c,x,y;
int liy=80,lix=190;
static int ct2=0;
long lz,z;
if(count>=800) NEXTMODE;
if(dis_muscode(0xff)==0xff) NEXTMODE;
ct2+=4;
lix=sin1024[ct2&1023]/2+160;
liy=sin1024[(ct2+256)&1023]/2+64;
setborder(0);
cglenzinit();
cmatrix_yxz(rx,ry,rz,matrix);
csetmatrix(matrix,0,0,zp);
points2[0]=0; crotlist(points2,cubepoints);
points3[0]=0; cprojlist((long *)points3,points2);
points3[0]+=8;
for(a=0;a<8*8;a+=8)
{
x=points3[2+a+0];
y=points3[2+a+1];
z=points3[2+a+4];
z+=2000;
lz=3000+2000;
x=(long)(x-lix)*lz/(long)z+lix;
y=(long)(y-liy)*lz/(long)z+liy;
points3[8*8+2+a+0]=x;
points3[8*8+2+a+1]=y;
points3[8*8+2+a+4]=3000;
}
ceasymode(0);
cclipeasypolylist(polylist,cubepolyss,(long *)points3);
cglenzpolylist(polylist);
ceasymode(1);
cclipeasypolylist(polylist,cubepolys,(long *)points3);
cglenzpolylist(polylist);
cglenzdone();
setborder(255);
rx+=9; ry+=10; rz+=11;
if(count<20) fadepal(pal,pal2,count*16);
}