24 #define MAXX (FLDW*CELW-WD/2)
25 #define MAXY (FLDH*CELH-HT/2)
27 extern map_block_t blk;
29 extern byte clrmap[256*12];
30 void V_remap_rect(int,int,int,int,byte *);
33 static void *horiz=NULL;
34 int w_o,w_x,w_y,sky_type=1;
42 byte fldb[FLDH][FLDW];
43 byte fldf[FLDH][FLDW];
46 extern int lt_time,lt_type,lt_side,lt_ypos;
47 extern void *ltn[2][2];
49 static void getname(int n,char *s) {
50 if(walh[n]==-1) {memset(s,0,8);return;}
52 memcpy(s,"_WATER_",8);s[7]=(byte)walp[n]-1+'0';
55 F_getresname(s,walh[n]&0x7FFF);
58 static short getani(char *n) {
59 if(strnicmp(n,"WALL22_1",8)==0) return 1;
60 if(strnicmp(n,"WALL58_1",8)==0) return 2;
61 if(strnicmp(n,"W73A_1",8)==0) return 3;
62 if(strnicmp(n,"RP2_1",8)==0) return 4;
66 void W_savegame(int h) {
72 getname(i,s);write(h,s,8);
74 write(h,walf,sizeof(walf));
75 write(h,walswp,sizeof(walswp));
76 write(h,fldb,FLDW*FLDH);
77 write(h,fld,FLDW*FLDH);
78 write(h,fldf,FLDW*FLDH);
81 void W_loadgame(int h) {
88 read(h,s,8);if(!s[0]) {walh[i]=-1;walp[i]=NULL;continue;}
90 if(memicmp(s,"_WATER_",7)==0) {
91 walh[i]=-2;walp[i]=(void*)(s[7]-'0'+1);
92 }else walp[i]=M_lock(walh[i]=F_getresid(s));
94 read(h,walf,sizeof(walf));
95 for(i=1;i<256;++i) if(walf[i]&1) walh[i]|=0x8000;
96 read(h,walswp,sizeof(walswp));
97 read(h,fldb,FLDW*FLDH);
98 read(h,fld,FLDW*FLDH);
99 read(h,fldf,FLDW*FLDH);
100 strcpy(s,"RSKY1");s[4]=sky_type+'0';
102 horiz=M_lock(F_getresid(s));
105 void W_adjust(void) {
106 if(w_x<WD/2) w_x=WD/2;
107 if(w_y<HT/2) w_y=HT/2;
108 if(w_x>MAXX) w_x=MAXX;
109 if(w_y>MAXY) w_y=MAXY;
114 V_setrect(0,WD,w_o+1,HT);
116 V_pic(127-(word)(w_x-WD/2)*56U/(word)(MAXX-WD/2),
117 w_o+123-(word)(w_y-HT/2)*28U/(word)(MAXY-HT/2),horiz);
118 if(sky_type==2) if(lt_time<0) {
119 if(!lt_side) V_spr(0,w_o+lt_ypos,ltn[lt_type][(lt_time<-5)?0:1]);
120 else V_spr2(WD-1,w_o+lt_ypos,ltn[lt_type][(lt_time<-5)?0:1]);
122 }else V_clr(0,WD,w_o+1,HT,0x97);
123 /* x=w_x-WD/2;y=w_y-HT/2;
124 sx=x/CELW;xo=-(x%CELW)+1;
125 sy=y/CELH;yo=-(y%CELH)+w_o+1;
127 Z_drawfld((byte *)fldb);
128 /* for(y=1-MAXTXH;y<HT/CELH+2;++y) if(y+sy>0 && y+sy<FLDH)
129 for(x=1-MAXTXW;x<WD/CELW+2;++x) if(x+sx>0 && x+sx<FLDW)
130 if((c=fldb[sy+y][sx+x])!=0) {
131 if(!(p=M_lock(walh[c]))) ERR_fatal("W_draw: not enough memory");
132 V_drawwall(x*CELW+xo,y*CELH+yo,wal[c].sx,wal[c].sy,wal[c].w*CELW,wal[c].h*CELH,p);
139 if(_2pl) PL_draw(&pl2);
144 Z_drawfld((byte *)fldf);
146 if(lt_time==-4 || lt_time==-2)
147 V_remap_rect(0,WD,w_o+1,HT,clrmap+256*11);
152 static char *anm[ANIT-1][5]={
153 {"WALL22_1","WALL23_1","WALL23_2",NULL,NULL},
154 {"WALL58_1","WALL58_2","WALL58_3",NULL,NULL},
155 {"W73A_1","W73A_2",NULL,NULL,NULL},
156 {"RP2_1","RP2_2","RP2_3","RP2_4",NULL}
159 for(i=1;i<ANIT;++i) {
160 for(j=0;anm[i-1][j];++j)
161 anih[i][j]=F_getresid(anm[i-1][j]);
162 for(;j<5;++j) anih[i][j]=-1;
164 memset(anic,0,sizeof(anic));
174 horiz=M_lock(F_getresid("RSKY1"));
180 if(g_time%3!=0) return;
181 for(i=1;i<256;++i) if((a=walani[i])!=0) {
182 if(anih[a][++anic[a]]==-1) anic[a]=0;
183 walp[i]=M_lock(anih[a][anic[a]]);
187 static void unpack(void *buf,int len,void *obuf) {
191 for(p=(byte*)buf,o=(byte*)obuf,l=len;l;++p,--l) if(*p==255) {
192 n=*((word*)(++p));memset(o,*(p+=2),n);o+=n;l-=3;
203 for(i=0;i<256;++i) {walh[i]=-1;walswp[i]=i;walani[i]=0;}
204 for(i=1;i<256 && blk.sz>0;++i,blk.sz-=sizeof(w)) {
205 read(h,&w,sizeof(w));
206 if(memicmp(w.n,"_WATER_",7)==0)
207 {walp[i]=(void*)(w.n[7]-'0'+1);walh[i]=-2;continue;}
208 walp[i]=M_lock(walh[i]=F_getresid(w.n));
209 if(w.n[0]=='S' && w.n[1]=='W' && w.n[4]=='_') walswp[i]=0;
210 walf[i]=(w.t)?1:0;if(w.t) walh[i]|=0x8000;
211 if(memicmp(w.n,"VTRAP01",8)==0) walf[i]|=2;
212 walani[i]=getani(w.n);
214 for(j=i,i=1;i<256;++i) if(walswp[i]==0) {
216 F_getresname(w.n,walh[i]&0x7FFF);
218 g=F_getresid(w.n)|(walh[i]&0x8000);
219 for(k=1;k<256;++k) if(walh[k]==g) break;
221 walh[k=j++]=g;walp[k]=M_lock(g);
222 walf[k]=(g&0x8000)?1:0;
224 walswp[i]=k;walswp[k]=i;
227 case MB_BACK: p=fldb;goto unp;
228 case MB_WTYPE: p=fld;goto unp;
229 case MB_FRONT: p=fldf;
230 unp: switch(blk.st) {
231 case 0: read(h,p,FLDW*FLDH);break;
233 if(!(buf=malloc(blk.sz)))
234 ERR_fatal("Не хватает памяти");
236 unpack(buf,blk.sz,p);free(buf);break;
240 sky_type=0;read(h,&sky_type,2);
241 strcpy(w.n,"RSKY1");w.n[4]=sky_type+'0';
243 horiz=M_lock(F_getresid(w.n));