2 Copyright (C) Prikol Software 1996-1997
3 Copyright (C) Aleksey Volynskov 1996-1997
4 Copyright (C) <ARembo@gmail.com> 2011
6 This file is part of the Doom2D:Rembo project.
8 Doom2D:Rembo is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License version 2 as
10 published by the Free Software Foundation.
12 Doom2D:Rembo is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, see <http://www.gnu.org/licenses/> or
19 write to the Free Software Foundation, Inc.,
20 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
50 #define MAXX (FLDW*CELW-WD/2)
51 #define MAXY (FLDH*CELH-HT/2)
57 extern map_block_t blk
;
59 extern byte clrmap
[256*12];
60 void V_remap_rect(int,int,int,int,byte
*);
63 void *horiz
=NULL
;//static void *horiz=NULL;
64 int w_o
,w_x
,w_y
,sky_type
=1;
72 byte fldb
[FLDH
][FLDW
];
73 byte fldf
[FLDH
][FLDW
];
76 extern int lt_time
,lt_type
,lt_side
,lt_ypos
;
77 extern void *ltn
[2][2];
79 static void getname (int n
, char *s
) {
82 } else if (walh
[n
] == -2) {
83 memcpy(s
, "_WATER_", 8);
84 s
[7] = (char)walp
[n
] - 1 + '0';
86 F_getresname(s
, walh
[n
] & 0x7FFF);
90 static short getani(char *n
) {
91 if(strncasecmp(n
,"WALL22_1",8)==0) return 1;
92 if(strncasecmp(n
,"WALL58_1",8)==0) return 2;
93 if(strncasecmp(n
,"W73A_1",8)==0) return 3;
94 if(strncasecmp(n
,"RP2_1",8)==0) return 4;
98 void W_savegame(FILE* h
) {
101 myfwrite32(sky_type
, h
);
102 for(i
= 1; i
< 256; ++i
) {
104 myfwrite(s
, 8, 1, h
);
106 for (i
= 0; i
< 256; i
++) {
107 myfwrite32(walf
[i
], h
);
109 for (i
= 0; i
< 256; i
++) {
110 myfwrite8(walswp
[i
], h
);
112 myfwrite(fldb
, FLDW
*FLDH
, 1, h
);
113 myfwrite(fld
, FLDW
*FLDH
, 1, h
);
114 myfwrite(fldf
, FLDW
*FLDH
, 1, h
);
117 void W_loadgame(FILE* h
) {
120 sky_type
= myfread32(h
);
121 for (i
= 1; i
< 256; ++i
) {
128 walani
[i
] = getani(s
);
129 if (strncasecmp(s
, "_WATER_", 7) == 0) {
131 walp
[i
] = (void*)(s
[7] - '0' + 1);
133 walh
[i
] = F_getresid(s
);
134 walp
[i
] = V_getvgaimg(walh
[i
]);
138 for (i
= 0; i
< 256; i
++) {
139 walf
[i
] = myfread32(h
);
140 if (i
> 0 && walf
[i
] & 1) {
144 for (i
= 0; i
< 256; i
++) {
145 walswp
[i
] = myfread8(h
);
147 myfread(fldb
, FLDW
*FLDH
, 1, h
);
148 myfread(fld
, FLDW
*FLDH
, 1, h
);
149 myfread(fldf
, FLDW
*FLDH
, 1, h
);
151 s
[4] = '0' + sky_type
;
153 horiz
= V_loadvgaimg(s
);
156 void W_adjust(void) {
157 int MAXX
=(FLDW
*CELW
-WD
/2);//
158 int MAXY
=(FLDH
*CELH
-HT
/2);//
160 if(w_x
<WD
/2) w_x
=WD
/2;
161 if(w_y
<HT
/2) w_y
=HT
/2;
162 if(w_x
>MAXX
) w_x
=MAXX
;
163 if(w_y
>MAXY
) w_y
=MAXY
;
168 V_setrect(0,WD
,w_o
+1,HT
);
172 //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);
173 vgaimg
*img
= (vgaimg
*)horiz
;
190 if(sky_type
==2) if(lt_time
<0) {
191 if(!lt_side
) V_spr(0,w_o
+lt_ypos
,ltn
[lt_type
][(lt_time
<-5)?0:1]);
192 else V_spr2(WD
-1,w_o
+lt_ypos
,ltn
[lt_type
][(lt_time
<-5)?0:1]);
194 }else V_clr(0,WD
,w_o
+1,HT
,0x97);
195 Z_drawfld((byte
*)fldb
, 1);
199 if(_2pl
) PL_draw(&pl2
);
204 Z_drawfld((byte
*)fldf
, 0);
206 if(lt_time
==-4 || lt_time
==-2)
207 V_remap_rect(0,WD
,w_o
+1,HT
,clrmap
+256*11);
213 static char *anm
[ANIT
-1][5]={
214 {"WALL22_1","WALL23_1","WALL23_2",NULL
,NULL
},
215 {"WALL58_1","WALL58_2","WALL58_3",NULL
,NULL
},
216 {"W73A_1","W73A_2",NULL
,NULL
,NULL
},
217 {"RP2_1","RP2_2","RP2_3","RP2_4",NULL
}
220 for(i
=1;i
<ANIT
;++i
) {
221 for(j
=0;anm
[i
-1][j
];++j
)
222 anih
[i
][j
]=F_getresid(anm
[i
-1][j
]);
223 for(;j
<5;++j
) anih
[i
][j
]=-1;
225 memset(anic
,0,sizeof(anic
));
235 horiz
=V_loadvgaimg("RSKY1");
243 if(g_time%3
!=0) return;
244 for(i
=1;i
<256;++i
) if((a
=walani
[i
])!=0) {
245 if(anih
[a
][++anic
[a
]]==-1) anic
[a
]=0;
246 walp
[i
]=V_getvgaimg(anih
[a
][anic
[a
]]);
251 static void unpack(void *buf,int len,void *obuf) {
255 for(p=(byte*)buf,o=(byte*)obuf,l=len;l;++p,--l) if(*p==255) {
256 n=*((word*)(++p));memset(o,*(p+=2),n);o+=n;l-=3;
261 static void unpack(void *buf
, int len
, void *obuf
) {
264 unsigned char *p
= buf
;
265 unsigned char *q
= obuf
;
271 step
= p
[i
] | p
[i
+ 1] << 8;
275 memset(&q
[j
], id
, step
);
280 int W_load (FILE *h
) {
286 for (i
= 0; i
< 256; ++i
) {
291 for (i
= 1; i
< 256 && blk
.sz
> 0; ++i
, blk
.sz
-= 9) {
292 myfread(w
.n
, 8, 1, h
);
294 if (strncasecmp(w
.n
, "_WATER_", 7) == 0) {
295 walp
[i
] = (void*)(w
.n
[7] - '0' + 1);
298 walh
[i
] = F_getresid(w
.n
);
299 walp
[i
] = V_getvgaimg(walh
[i
]);
300 if (w
.n
[0] == 'S' && w
.n
[1] == 'W' && w
.n
[4] == '_') {
303 walf
[i
] = w
.t
? 1 : 0;
307 if (strncasecmp(w
.n
, "VTRAP01", 8) == 0) {
310 walani
[i
] = getani(w
.n
);
313 for (j
= i
, i
= 1; i
< 256 && j
< 256; ++i
) {
314 if (walswp
[i
] == 0) {
315 F_getresname(w
.n
, walh
[i
] & 0x7FFF);
317 g
= F_getresid(w
.n
) | (walh
[i
] & 0x8000);
319 while (k
< 256 && walh
[k
] != g
) {
326 walp
[k
] = V_getvgaimg(g
);
327 walf
[k
] = g
& 0x8000 ? 1 : 0;
345 myfread(p
, FLDW
* FLDH
, 1, h
);
348 buf
= malloc(blk
.sz
);
350 ERR_fatal("Не хватает памяти");
352 myfread(buf
, blk
.sz
, 1, h
);
353 unpack(buf
, blk
.sz
, p
);
361 sky_type
= myfread16(h
);
362 strcpy(w
.n
, "RSKY1");
363 w
.n
[4] = '0' + sky_type
;
365 horiz
= V_loadvgaimg(w
.n
);