X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fview.c;h=034b0aa80a6a7bf5956d901f5c3c9e84cce4bee2;hb=da79be9b6a4134aa9cd19e6f5909fedb20d318cb;hp=0d19be0e66e0fc562a7e1ce294c2763d7de937c0;hpb=8fb3d3f767b8e5d094e8bcbee350f4d16ab17c5a;p=flatwaifu.git diff --git a/src/view.c b/src/view.c index 0d19be0..034b0aa 100644 --- a/src/view.c +++ b/src/view.c @@ -95,40 +95,59 @@ static short getani(char *n) { void W_savegame(FILE* h) { char s[8]; int i; - - myfwrite(&sky_type,1,4,h); - for(i=1;i<256;++i) { - getname(i,s);myfwrite(s,1,8,h); + myfwrite32(sky_type, h); + for(i = 1; i < 256; ++i) { + getname(i, s); + myfwrite(s, 8, 1, h); + } + for (i = 0; i < 256; i++) { + myfwrite32(walf[i], h); + } + for (i = 0; i < 256; i++) { + myfwrite8(walswp[i], h); } - myfwrite(walf,1,sizeof(walf),h); - myfwrite(walswp,1,sizeof(walswp),h); - myfwrite(fldb,1,FLDW*FLDH,h); - myfwrite(fld,1,FLDW*FLDH,h); - myfwrite(fldf,1,FLDW*FLDH,h); + myfwrite(fldb, FLDW*FLDH, 1, h); + myfwrite(fld, FLDW*FLDH, 1, h); + myfwrite(fldf, FLDW*FLDH, 1, h); } void W_loadgame(FILE* h) { char s[8]; int i; - - myfread(&sky_type,1,4,h); - for(i=1;i<256;++i) { + myfread32(&sky_type, h); + for (i = 1; i < 256; ++i) { walani[i]=0; - myfread(s,1,8,h);if(!s[0]) {walh[i]=-1;walp[i]=NULL;continue;} - walani[i]=getani(s); - if(strncasecmp(s,"_WATER_",7)==0) { //if(memicmp(s,"_WATER_",7)==0) { - walh[i]=-2;walp[i]=(void*)(s[7]-'0'+1); - }else walp[i]=M_lock(walh[i]=F_getresid(s)); + myfread(s, 8, 1, h); + if (!s[0]) { + walh[i] = -1; + walp[i] = NULL; + } else { + walani[i] = getani(s); + if (strncasecmp(s, "_WATER_", 7) == 0) { + walh[i] = -2; + walp[i] = (void*)(s[7] - '0' + 1); + } else { + walh[i] = F_getresid(s); + walp[i] = V_getvgaimg(walh[i]); + } + } } - myfread(walf,1,sizeof(walf),h); - for(i=1;i<256;++i) if(walf[i]&1) walh[i]|=0x8000; - myfread(walswp,1,sizeof(walswp),h); - myfread(fldb,1,FLDW*FLDH,h); - myfread(fld,1,FLDW*FLDH,h); - myfread(fldf,1,FLDW*FLDH,h); - strcpy(s,"RSKY1");s[4]=sky_type+'0'; + for (i = 0; i < 256; i++) { + myfread32(&walf[i], h); + if (i > 0 && walf[i] & 1) { + walh[i] |= 0x8000; + } + } + for (i = 0; i < 256; i++) { + myfread8(&walswp[i], h); + } + myfread(fldb, FLDW*FLDH, 1, h); + myfread(fld, FLDW*FLDH, 1, h); + myfread(fldf, FLDW*FLDH, 1, h); + strcpy(s, "RSKY1"); + s[4] = '0' + sky_type; M_unlock(horiz); - horiz=M_lock(F_getresid(s)); + horiz = V_loadvgaimg(s); } void W_adjust(void) { @@ -210,7 +229,7 @@ void W_init(void) { PL_init(); MN_init(); M_unlock(horiz); - horiz=M_lock(F_getresid("RSKY1")); + horiz=V_loadvgaimg("RSKY1"); free_chunks(); } @@ -221,10 +240,11 @@ void W_act(void) { if(g_time%3!=0) return; for(i=1;i<256;++i) if((a=walani[i])!=0) { if(anih[a][++anic[a]]==-1) anic[a]=0; - walp[i]=M_lock(anih[a][anic[a]]); + walp[i]=V_getvgaimg(anih[a][anic[a]]); } } +/* static void unpack(void *buf,int len,void *obuf) { byte *p,*o; int l,n; @@ -233,57 +253,114 @@ static void unpack(void *buf,int len,void *obuf) { n=*((word*)(++p));memset(o,*(p+=2),n);o+=n;l-=3; }else *(o++)=*p; } +*/ + +static void unpack(void *buf, int len, void *obuf) { + int i = 0; + int j = 0; + unsigned char *p = buf; + unsigned char *q = obuf; + while (i < len) { + int id = p[i]; + int step = 1; + i += 1; + if (id == 0xff) { + step = p[i] | p[i + 1] << 8; + id = p[i + 2]; + i += 3; + } + memset(&q[j], id, step); + j += step; + } +} -int W_load(FILE* h) { - int i,j,k,g; - static wall_t w; - void *p,*buf; - - switch(blk.t) { - case MB_WALLNAMES: - for(i=0;i<256;++i) {walh[i]=-1;walswp[i]=i;walani[i]=0;} - for(i=1;i<256 && blk.sz>0;++i,blk.sz-=sizeof(w)) { - myfread(&w,1,sizeof(w),h); - - if(strncasecmp(w.n,"_WATER_",7)==0) //if(memicmp(w.n,"_WATER_",7)==0) - {walp[i]=(void*)(w.n[7]-'0'+1);walh[i]=-2;continue;} - walp[i]=M_lock(walh[i]=F_getresid(w.n)); - if(w.n[0]=='S' && w.n[1]=='W' && w.n[4]=='_') walswp[i]=0; - walf[i]=(w.t)?1:0;if(w.t) walh[i]|=0x8000; - - if(strncasecmp(w.n,"VTRAP01",8)==0) walf[i]|=2; //if(memicmp(w.n,"VTRAP01",8)==0) walf[i]|=2; - walani[i]=getani(w.n); - } - for(j=i,i=1;i<256;++i) if(walswp[i]==0) { - if(j>=256) break; - F_getresname(w.n,walh[i]&0x7FFF); - w.n[5]^=1; - g=F_getresid(w.n)|(walh[i]&0x8000); - for(k=1;k<256;++k) if(walh[k]==g) break; - if(k>=256) { - walh[k=j++]=g;walp[k]=M_lock(g); - walf[k]=(g&0x8000)?1:0; - } - walswp[i]=k;walswp[k]=i; +int W_load (FILE *h) { + int i, j, k, g; + void *p, *buf; + wall_t w; + switch (blk.t) { + case MB_WALLNAMES: + for (i = 0; i < 256; ++i) { + walh[i] = -1; + walswp[i] = i; + walani[i] = 0; + } + for (i = 1; i < 256 && blk.sz > 0; ++i, blk.sz -= 9) { + myfread(w.n, 8, 1, h); + myfread8(&w.t, h); + if (strncasecmp(w.n, "_WATER_", 7) == 0) { + walp[i] = (void*)(w.n[7] - '0' + 1); + walh[i] = -2; + } else { + walh[i] = F_getresid(w.n); + walp[i] = V_getvgaimg(walh[i]); + if (w.n[0] == 'S' && w.n[1] == 'W' && w.n[4] == '_') { + walswp[i] = 0; + } + walf[i] = w.t ? 1 : 0; + if (w.t) { + walh[i] |= 0x8000; + } + if (strncasecmp(w.n, "VTRAP01", 8) == 0) { + walf[i] |= 2; + } + walani[i] = getani(w.n); + } } + for (j = i, i = 1; i < 256 && j < 256; ++i) { + if (walswp[i] == 0) { + F_getresname(w.n, walh[i] & 0x7FFF); + w.n[5] ^= 1; + g = F_getresid(w.n) | (walh[i] & 0x8000); + k = 1; + while (k < 256 && walh[k] != g) { + k += 1; + } + if(k >= 256) { + k = j; + j += 1; + walh[k] = g; + walp[k] = V_getvgaimg(g); + walf[k] = g & 0x8000 ? 1 : 0; + } + walswp[i] = k; + walswp[k] = i; + } + } return 1; - case MB_BACK: p=fldb;goto unp; - case MB_WTYPE: p=fld;goto unp; - case MB_FRONT: p=fldf; - unp: switch(blk.st) { - case 0: myfread(p,1,FLDW*FLDH,h);break; + case MB_BACK: + p = fldb; + goto unp; + case MB_WTYPE: + p = fld; + goto unp; + case MB_FRONT: + p = fldf; + unp: + switch (blk.st) { + case 0: + myfread(p, FLDW * FLDH, 1, h); + break; case 1: - if(!(buf=malloc(blk.sz))) + buf = malloc(blk.sz); + if(buf == NULL) { ERR_fatal("Не хватает памяти"); - myfread(buf,1,blk.sz,h); - unpack(buf,blk.sz,p);free(buf);break; - default: return 0; - }return 1; + } + myfread(buf, blk.sz, 1, h); + unpack(buf, blk.sz, p); + free(buf); + break; + default: + return 0; + } + return 1; case MB_SKY: - sky_type=0;myfread(&sky_type,1,2,h); - strcpy(w.n,"RSKY1");w.n[4]=sky_type+'0'; + myfread16(&sky_type, h); + strcpy(w.n, "RSKY1"); + w.n[4] = '0' + sky_type; M_unlock(horiz); - horiz=M_lock(F_getresid(w.n)); + horiz = V_loadvgaimg(w.n); return 1; - }return 0; + } + return 0; }