13 #define WAIT_SZ 400000
15 extern byte gamcor[5][64];
17 extern char cd_path[];
24 static byte skipping=0,credits=0;
29 A8C_ENDFR,A8C_PAL,A8C_CLRSCR,A8C_DRAW,
30 A8C_FILL,A8C_DRAW2C,A8C_DRAW2
35 short width,height,frames;
40 typedef unsigned char uchar;
46 static int norm_gamma;
48 static unsigned char *frp,sqc[2][50][80];
54 static signed char *unpack(char *d,signed char *p,int l) {
56 memcpy(d,p+1,*p);d+=*p;l-=*p;p+=*p+1;
58 memset(d,p[1],-*p);d+=-*p;l-=-*p;p+=2;
63 static unsigned char *draw(signed char *p) {
66 for(y=0;y<sqh;) if(*p>0) {
67 for(yc=*p++;yc;--yc,++y) for(x=0;x<sqw;) if(*p>0) {
69 for(sy=0;sy<SQ;++sy) {
70 p=unpack(scra+(y*SQ+sy)*320+x*SQ,p,n);
78 static unsigned char *fill(signed char *p) {
81 for(y=0;y<sqh;) if(*p>0) {
82 for(yc=*p++;yc;--yc,++y) for(x=0;x<sqw;) if(*p>0) {
83 for(n=*p++;n;--n,++p,++x)
84 V_clr(x*SQ,SQ,y*SQ,SQ,*p);
90 static unsigned char *draw2c(signed char *p) {
94 for(y=0;y<sqh;) if(*p>0) {
95 for(yc=*p++;yc;--yc,++y) for(x=0;x<sqw;) if(*p>0) {
96 for(n=*p++;n;--n,++x) {
99 w=*(unsigned short*)p;p+=2;
101 for(sx=0;sx<SQ;++sx,w>>=1)
102 scra[(y*SQ+sy)*320+x*SQ+sx]=sqc[w&1][y][x];
109 static unsigned char *draw2(signed char *p) {
113 for(y=0;y<sqh;) if(*p>0) {
114 for(yc=*p++;yc;--yc,++y) for(x=0;x<sqw;) if(*p>0) {
115 for(n=*p++;n;--n,++x) {
116 w=*(unsigned short*)p;p+=2;
118 for(sx=0;sx<SQ;++sx,w>>=1)
119 scra[(y*SQ+sy)*320+x*SQ+sx]=sqc[w&1][y][x];
126 //---------------------------------------------------------------//
128 static int fh,fsz,fdptr;
131 //static void f_read(void *p,int l) {
133 // memcpy(p,fdata+fdptr,l);fdptr+=l;
134 // }else read(fh,p,l);
137 //static void f_skip(int n) {
138 // lseek(fh,n,SEEK_CUR);
141 static void f_close(void) {
143 free(fdata);fdata=NULL;
144 }else if(fh!=-1) {close(fh);fh=-1;}
147 static char end_clr=1;
149 void A8_close(void) {
150 if(strk) if(strk_ch) S_stop(strk_ch);
152 if(frp) {free(frp);frp=NULL;}
153 if(strk) {free(strk);strk=NULL;}
156 V_clr(0,320,0,200,0);V_copytoscr(0,320,0,200);
157 setgamma(norm_gamma);
161 int A8_nextframe(void) {
166 if(credits) if(keys[0x33] && keys[0x34]) skipping=1;
167 if(frame==-1) if(strk) strk_ch=S_play(strk,-1,1024,255);
169 len=*(int*)(fdata+fdptr);fdptr+=4;
170 }else {len=0;read(fh,&len,4);}
177 p=fdata+fdptr;fdptr+=len;
178 }else {read(fh,frp,len);p=frp;}
179 for(;*p;) switch(*p++) {
181 i=*p++;j=*p++;if(!j) j=256;
182 for(k=0;k<j*3;++k) p[k]=gamcor[3][p[k]];
187 V_clr(0,ah.width,0,ah.height,*p++);
202 ERR_fatal("Плохой блок в файле A8");
210 static void wait_scr(int s) {
212 if(s<WAIT_SZ) return;
214 V_setrect(0,320,0,200);
215 V_clr(0,320,0,200,0);
216 V_copytoscr(0,320,0,200);
217 V_pic(0,0,(void*)((char*)cd_scr+768));
219 V_copytoscr(0,320,0,200);
223 static void blank_scr(void) {
225 V_setrect(0,320,0,200);
226 V_clr(0,320,0,200,0);
227 V_copytoscr(0,320,0,200);
230 int A8_start(char *nm) {
236 if(stricmp(nm,"FINAL")==0 || stricmp(nm,"CREDITS")==0) end_clr=0;
237 else if(stricmp(nm,"KONEC")==0) end_clr=0;
238 credits=(stricmp(nm,"FINAL")==0)?1:0;
239 if(stricmp(nm,"CREDITS")==0) if(skipping) return 0;
243 if(snd_type!=ST_NONE) {
244 sprintf(s,"%sA8\\%s.SND",cd_path,nm);
245 if((h=open(s,O_BINARY|O_RDONLY))!=-1) {
246 lseek(h,0,SEEK_END);sz=tell(h);lseek(h,0,SEEK_SET);
247 if((strk=malloc(sz+sizeof(snd_t)))!=NULL) {
252 strk->lstart=strk->llen=0;
253 for(p=(unsigned char *)(strk+1);sz;--sz,++p) *p^=0x80;
258 sprintf(s,"%sA8\\%s.A8",cd_path,nm);
259 if((fh=open(s,O_BINARY|O_RDONLY))==-1) {
260 // if(strk) {free(strk);strk=NULL;}
262 ERR_fatal("Не могу открыть файл %s",s);
264 read(fh,&ah,sizeof(ah)-4);
265 if(ah.id!=A8_ID || ah.ver!=0) ERR_fatal("Испорченный файл A8 %s",s);
266 lseek(fh,0,SEEK_END);
267 fsz=tell(fh)-sizeof(ah)+4;
268 lseek(fh,sizeof(ah)-4,SEEK_SET);
269 if((fdata=malloc(fsz))!=NULL) {
274 }else if(!(frp=malloc(ah.maxfsize))) {
275 if(strk) {free(strk);strk=NULL;}
276 if(!(frp=malloc(ah.maxfsize))) {
277 close(fh);fh=-1;return 0;
280 sqw=ah.width/SQ;sqh=ah.height/SQ;
283 if(wscr) blank_scr();
284 // if(gamma<3) setgamma(3);