diff --git a/src/view.c b/src/view.c
index c1af0ccae607ef58c40636abfaa73ebd981258f3..692066edf0db64efff3ea90caebb199209f5731f 100644 (file)
--- a/src/view.c
+++ b/src/view.c
#include "glob.h"
#include <string.h>
#include "glob.h"
#include <string.h>
-#include <malloc.h>
+#include <stdlib.h>
#include "vga.h"
#include "memory.h"
#include "files.h"
#include "vga.h"
#include "memory.h"
#include "files.h"
#include "misc.h"
#include "map.h"
#include "sound.h"
#include "misc.h"
#include "map.h"
#include "sound.h"
+#include "my.h"
#define ANIT 5
#define ANIT 5
extern int lt_time,lt_type,lt_side,lt_ypos;
extern void *ltn[2][2];
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) {
}
static short getani(char *n) {
void W_savegame(FILE* h) {
char s[8];
int i;
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;
}
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;
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*)((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';
+ for (i = 0; i < 256; i++) {
+ walf[i] = myfread32(h);
+ if (i > 0 && walf[i] & 1) {
+ walh[i] |= 0x8000;
+ }
+ }
+ 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);
M_unlock(horiz);
- horiz=M_lock(F_getresid(s));
+ horiz = V_loadvgaimg(s);
}
void W_adjust(void) {
}
void W_adjust(void) {
PL_init();
MN_init();
M_unlock(horiz);
PL_init();
MN_init();
M_unlock(horiz);
- horiz=M_lock(F_getresid("RSKY1"));
+ horiz=V_loadvgaimg("RSKY1");
free_chunks();
}
free_chunks();
}
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;
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;
static void unpack(void *buf,int len,void *obuf) {
byte *p,*o;
int l,n;
n=*((word*)(++p));memset(o,*(p+=2),n);o+=n;l-=3;
}else *(o++)=*p;
}
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);
+ 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;
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:
case 1:
- if(!(buf=malloc(blk.sz)))
+ buf = malloc(blk.sz);
+ if(buf == NULL) {
ERR_fatal("Не хватает памяти");
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:
case MB_SKY:
- sky_type=0;myfread(&sky_type,1,2,h);
- 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);
M_unlock(horiz);
- horiz=M_lock(F_getresid(w.n));
+ horiz = V_loadvgaimg(w.n);
return 1;
return 1;
- }return 0;
+ }
+ return 0;
}
}