X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fview.c;h=b6b52c88df9a29f0ab3f1d47b00d5b8b58fca44c;hb=1907773f7b61fb7e58c585a183180b44d213a286;hp=3bf36772cd60cec019f9d89528746c84613d03c6;hpb=e5c2eddc151a59db4e611a77901732d7c15fde90;p=flatwaifu.git diff --git a/src/view.c b/src/view.c index 3bf3677..b6b52c8 100644 --- a/src/view.c +++ b/src/view.c @@ -39,6 +39,7 @@ #include "misc.h" #include "map.h" #include "sound.h" +#include "my.h" #define ANIT 5 @@ -75,13 +76,15 @@ byte fld[FLDH][FLDW]; extern int lt_time,lt_type,lt_side,lt_ypos; extern void *ltn[2][2]; -static void getname(int n,char *s) { - if(walh[n]==-1) {memset(s,0,8);return;} - if(walh[n]==-2) { - memcpy(s,"_WATER_",8);s[7]=(byte)walp[n]-1+'0'; - return; +static void getname (int n, char *s) { + if (walh[n] == -1) { + memset(s, 0, 8); + } else if (walh[n] == -2) { + memcpy(s, "_WATER_", 8); + s[7] = (char)((intptr_t)walp[n] - 1 + '0'); + } else { + F_getresname(s, walh[n] & 0x7FFF); } - F_getresname(s,walh[n]&0x7FFF); } static short getani(char *n) { @@ -95,100 +98,61 @@ 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); } - 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); + for (i = 0; i < 256; i++) { + myfwrite8(walswp[i], 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) { + sky_type = myfread32(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); + myfread(s, 8, 1, h); + if (!s[0]) { + walh[i] = -1; + walp[i] = NULL; } else { - walh[i]=F_getresid(s); - walp[i]=V_getvgaimg(walh[i]); + walani[i] = getani(s); + if (strncasecmp(s, "_WATER_", 7) == 0) { + walh[i] = -2; + walp[i] = (void*)((intptr_t)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'; - M_unlock(horiz); - horiz=V_loadvgaimg(s); -} - -void W_adjust(void) { - int MAXX =(FLDW*CELW-WD/2);// - int MAXY =(FLDH*CELH-HT/2);// - - if(w_xMAXX) w_x=MAXX; - if(w_y>MAXY) w_y=MAXY; -} - -void W_draw(void) { - W_adjust(); - V_setrect(0,WD,w_o+1,HT); - if(w_horiz) { - - - //V_pic(127-(word)(w_x-WD/2)*56U/(word)(MAXX-WD/2),w_o+123-(word)(w_y-HT/2)*28U/(word)(MAXY-HT/2),horiz); - vgaimg *img = (vgaimg*)horiz; - int x=0; - int d=0; - do { - int y=w_o; - d &= ~2; - do { - V_rotspr(x,y,img,d); - y+=img->h; - d^=2; - } while (yw; - d^=1; - } while (x 0 && walf[i] & 1) { + walh[i] |= 0x8000; } - }else V_clr(0,WD,w_o+1,HT,0x97); - Z_drawfld((byte *)fldb, 1); - DOT_draw(); - IT_draw(); - PL_draw(&pl1); - if(_2pl) PL_draw(&pl2); - MN_draw(); - WP_draw(); - SMK_draw(); - FX_draw(); - Z_drawfld((byte *)fldf, 0); - if(sky_type==2) - if(lt_time==-4 || lt_time==-2) - V_remap_rect(0,WD,w_o+1,HT,clrmap+256*11); + } + for (i = 0; i < 256; i++) { + walswp[i] = myfread8(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 = V_loadvgaimg(s); } - void W_init(void) { int i,j; static char *anm[ANIT-1][5]={ @@ -258,59 +222,93 @@ static void unpack(void *buf, int len, void *obuf) { } } -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;} - - 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; //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]=V_getvgaimg(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); + w.t = myfread8(h); + if (strncasecmp(w.n, "_WATER_", 7) == 0) { + walp[i] = (void*)((intptr_t)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,2,1,h); - sky_type = short2host(sky_type); - strcpy(w.n,"RSKY1");w.n[4]=sky_type+'0'; + sky_type = myfread16(h); + strcpy(w.n, "RSKY1"); + w.n[4] = '0' + sky_type; M_unlock(horiz); - horiz=V_loadvgaimg(w.n); + horiz = V_loadvgaimg(w.n); return 1; - }return 0; + } + return 0; }