#include #include #include #include "..\dis\dis.h" extern char lensex0[]; extern char lensex1[]; extern char lensex2[]; extern char lensex3[]; extern char lensex4[]; extern char lensexp[]; extern char lensexb[]; #define noSAVEPATH #ifdef SAVEPATH FILE *fp; int pathstart2; #else int *pathdata1; int *pathdata2; char pathdata[13000]; #endif char *vram=(char *)0xA0000000L; int *lens1,*lens2,*lens3,*lens4; extern char *back; char *fade,*fade2; extern char *rotpic; extern char *rotpic90; int lenswid,lenshig,lensxs,lensys; char palette[768]; char *shiftstatus=(char *)0x0417; int waitb() { if(dis_indemo()) { return(dis_waitb()); } if(*shiftstatus&16) setborder(0); while(!(inp(0x3da)&8)); while((inp(0x3da)&8)); if(*shiftstatus&16) setborder(24); return(1); } void drawlens(int x0,int y0) { int y,ys,ye; long int u1,u2; u1=(x0-lensxs)+(long)(y0-lensys)*320L; u2=(x0-lensxs)+(long)(y0+lensys-1)*320L; ys=lenshig/2; ye=lenshig-1; for(y=0;y=0 && u1<=64000) { dorow(lens1,(unsigned)u1,y,0x40); dorow2(lens2,(unsigned)u1,y,0x80); dorow2(lens3,(unsigned)u1,y,0xC0); dorow3(lens4,(unsigned)u1,y,0); } u1+=320; if(u2>=0 && u2<=64000) { dorow(lens1,(unsigned)u2,ye-y,0x40); dorow2(lens2,(unsigned)u2,ye-y,0x80); dorow2(lens3,(unsigned)u2,ye-y,0xC0); dorow3(lens4,(unsigned)u2,ye-y,0); } u2-=320; } } void setvmode(int m) { _asm mov ax,m _asm int 10h } int firfade1[200]; int firfade2[200]; int firfade1a[200]; int firfade2a[200]; void part1(void) { int x,y,xa,ya; int a,r,g,b,c,i; int frame=0; char *cp,*dp; frame=0; for(b=0;b<200;b++) { a=b; firfade1a[b]=(19+a/5+4)&(~7); firfade2a[b]=(-(19+(199-a)/5+4))&(~7); firfade1[b]=170*64+(100-b)*50; firfade2[b]=170*64+(100-b)*50; } if(dis_musplus>-30) while(!dis_exit() && dis_musplus()<-6) ; dis_waitb(); dis_setmframe(0); while(!dis_exit() && frame<300) { if(frame<80) { a=frame*2; for(c=0;c<6;c++) { cp=vram; dp=back; for(y=0;y<200;y++) { x=firfade1[y]>>6; cp[x]=dp[x]; x=firfade2[y]>>6; cp[x]=dp[x]; firfade1[y]+=firfade1a[y]; firfade2[y]+=firfade2a[y]; cp+=320; dp+=320; } } } a=waitb(); frame+=a; } } void part2(void) { int firstbounce=1; int x,y,xa,ya; int a,r,g,b,c,i; int frame=0,uframe=0; char *cp,*dp; x=65*64; y=-50*64; xa=ya=64; uframe=frame=0; while(!dis_exit() && uframe<715) { if(uframe<96) { a=(uframe-32)/2; if(a<0) a=0; setpalarea(fade2+a*3*192,64,192); } #ifdef SAVEPATH putw(x/64,fp); putw(y/64,fp); drawlens(x/64,y/64); x+=xa; y+=ya; if(x>256*64 || x<60*64) xa=-xa; if(y>150*64 && frame<600) { y-=ya; if(firstbounce) { ya=-ya*2/3; firstbounce=0; } else ya=-ya*9/10; } ya+=2; #else x=pathdata1[frame*2+0]; y=pathdata1[frame*2+1]; drawlens(x,y); #endif a=waitb(); uframe+=a; if(a>3) a=3; frame+=a; } while(!dis_exit() && uframe<720) { uframe+=waitb(); } } void part3(void) { int x,y,xa,ya; int a,r,g,b,c,i; int frame=0; char *cp,*dp; rotpic90=back; for(x=0;x<256;x++) { for(y=0;y<256;y++) { rotpic90[x+y*256]=rotpic[y+(255-x)*256]; } } waitb(); setpalarea(fade+64*64*3,0,64); inittwk(); { double d1,d2,d3,scale,scaleb,scalea; int flag=1; d1=0; d2=0.00007654321; d3=0; scale=2; scalea=-0.01; frame=0; while(!dis_exit() && frame<2000) { if(dis_musplus()>-4) break; #ifdef SAVEPATH x=70.0*sin(d1)-30; y=70.0*cos(d1)+60; d1-=.005; xa=-1024.0*sin(d2)*scale; ya=1024.0*cos(d2)*scale; x-=xa/16; y-=ya/16; d2+=d3; putw(x,fp); putw(y,fp); putw(xa,fp); putw(ya,fp); rotate(x,y,xa,ya); scale+=scalea; if(frame>25) { if(d3<.02) d3+=0.00005; } if(frame<270) { if(scale<.9) { if(scalea<1) scalea+=0.0001; } } else if(frame<400) { if(scalea>0.001) scalea-=0.0001; } else if(frame>1600) { if(scalea>-.1) scalea-=0.001; } else if(frame>1100) { a=frame-900; if(a>100) a=100; if(scalea<256) scalea+=0.000001*a; } #else x=pathdata2[frame*4+0]; y=pathdata2[frame*4+1]; xa=pathdata2[frame*4+2]; ya=pathdata2[frame*4+3]; rotate(x,y,xa,ya); #endif frame+=waitb(); if(frame>2000-128) { a=frame-(2000-128); a/=2; if(a>63) a=63; setpalarea(fade+a*64*3,0,64); } if(frame<16) { setpalarea(fade+(64+frame)*64*3,0,64); } } } for(a=0;a<768;a++) palette[a]=63; setpalarea(palette,0,256); } main() { int x,y,xa,ya; int a,r,g,b,c,i; int frame=0; char *cp,*dp; FILE *f1; dis_partstart(); rotpic=halloc(16384,4); if(!rotpic) exit(1); fade=halloc(16000,1); if(!fade) exit(1); fade2=halloc(20000,1); if(!fade2) exit(1); setvmode(0x13); outp(0x3c8,0); for(a=0;a<768;a++) outp(0x3c9,0); #ifndef SAVEPATH a=*(int *)(lensexp+2); pathdata1=(int *)(lensexp+4); pathdata2=(int *)(lensexp+4+2*a); #endif memcpy(palette,lensexb+16,768); back=(char *)((long)lensexb+((768+16)/16)*65536L); memcpy(back+64000,back+64000-1536,1536); lenswid=*(int *)(lensex0+0); lenshig=*(int *)(lensex0+2); cp=lensex0+4; lensxs=lenswid/2; lensys=lenshig/2; for(i=1;i<4;i++) { r=*cp++; g=*cp++; b=*cp++; for(a=0;a<64*3;a+=3) { c=r+palette[a+0]; if(c>63) c=63; palette[a+i*64*3+0]=c; c=g+palette[a+1]; if(c>63) c=63; palette[a+i*64*3+1]=c; c=b+palette[a+2]; if(c>63) c=63; palette[a+i*64*3+2]=c; } } lens1=lensex1; lens2=lensex2; lens3=lensex3; lens4=lensex4; cp=fade; for(x=0;x<64;x++) { for(y=0;y<64*3;y++) { a=(palette[y]*(63-x)+x*63)/63; *cp++=a; } } for(x=0;x<16;x++) { for(y=0;y<64*3;y++) { a=palette[y]+(15-x)*5; if(a>63) a=63; *cp++=a; } } cp=fade2; for(x=0;x<32;x++) { for(y=64*3;y<256*3;y++) { a=y%(64*3); a=(palette[y]-palette[a]*(31-x)/31); *cp++=a; } } // rotpic readymake for(x=0;x<256;x++) { for(y=0;y<256;y++) { a=y*10/11-36/2; if(a<0 || a>199) a=0; a=back[x+32+a*320]; rotpic[x+y*256]=a; } } waitb(); setpalarea(palette,0,256); #ifdef SAVEPATH fp=fopen("lens.exp","wb"); putw(0,fp); putw(0,fp); #endif if(!dis_exit()) part1(); while(!dis_exit() && dis_musplus()<-20) ; dis_waitb(); if(!dis_exit()) part2(); #ifdef SAVEPATH pathstart2=(ftell(fp)-4)/2; #endif if(!dis_exit()) part3(); #ifdef SAVEPATH rewind(fp); putw(0,fp); putw(pathstart2,fp); fclose(fp); #endif }