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
49 #define MAXX (FLDW*CELW-WD/2)
50 #define MAXY (FLDH*CELH-HT/2)
56 extern map_block_t blk
;
58 extern byte clrmap
[256*12];
59 void V_remap_rect(int,int,int,int,byte
*);
62 void *horiz
=NULL
;//static void *horiz=NULL;
63 int w_o
,w_x
,w_y
,sky_type
=1;
71 byte fldb
[FLDH
][FLDW
];
72 byte fldf
[FLDH
][FLDW
];
75 extern int lt_time
,lt_type
,lt_side
,lt_ypos
;
76 extern void *ltn
[2][2];
78 static void getname(int n
,char *s
) {
79 if(walh
[n
]==-1) {memset(s
,0,8);return;}
81 memcpy(s
,"_WATER_",8);s
[7]=(byte
)walp
[n
]-1+'0';
84 F_getresname(s
,walh
[n
]&0x7FFF);
87 static short getani(char *n
) {
88 if(strncasecmp(n
,"WALL22_1",8)==0) return 1;
89 if(strncasecmp(n
,"WALL58_1",8)==0) return 2;
90 if(strncasecmp(n
,"W73A_1",8)==0) return 3;
91 if(strncasecmp(n
,"RP2_1",8)==0) return 4;
95 void W_savegame(FILE* h
) {
98 myfwrite32(sky_type
, h
);
99 for(i
= 1; i
< 256; ++i
) {
101 myfwrite(s
, 8, 1, h
);
103 for (i
= 0; i
< 256; i
++) {
104 myfwrite32(walf
[i
], h
);
106 for (i
= 0; i
< 256; i
++) {
107 myfwrite8(walswp
[i
], h
);
109 myfwrite(fldb
, FLDW
*FLDH
, 1, h
);
110 myfwrite(fld
, FLDW
*FLDH
, 1, h
);
111 myfwrite(fldf
, FLDW
*FLDH
, 1, h
);
114 void W_loadgame(FILE* h
) {
117 myfread32(&sky_type
, h
);
118 for (i
= 1; i
< 256; ++i
) {
125 walani
[i
] = getani(s
);
126 if (strncasecmp(s
, "_WATER_", 7) == 0) {
128 walp
[i
] = (void*)(s
[7] - '0' + 1);
130 walh
[i
] = F_getresid(s
);
131 walp
[i
] = V_getvgaimg(walh
[i
]);
135 for (i
= 0; i
< 256; i
++) {
136 myfread32(&walf
[i
], h
);
137 if (i
> 0 && walf
[i
] & 1) {
141 for (i
= 0; i
< 256; i
++) {
142 myfread8(&walswp
[i
], h
);
144 myfread(fldb
, FLDW
*FLDH
, 1, h
);
145 myfread(fld
, FLDW
*FLDH
, 1, h
);
146 myfread(fldf
, FLDW
*FLDH
, 1, h
);
148 s
[4] = '0' + sky_type
;
150 horiz
= V_loadvgaimg(s
);
153 void W_adjust(void) {
154 int MAXX
=(FLDW
*CELW
-WD
/2);//
155 int MAXY
=(FLDH
*CELH
-HT
/2);//
157 if(w_x
<WD
/2) w_x
=WD
/2;
158 if(w_y
<HT
/2) w_y
=HT
/2;
159 if(w_x
>MAXX
) w_x
=MAXX
;
160 if(w_y
>MAXY
) w_y
=MAXY
;
165 V_setrect(0,WD
,w_o
+1,HT
);
169 //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);
170 vgaimg
*img
= (vgaimg
*)horiz
;
187 if(sky_type
==2) if(lt_time
<0) {
188 if(!lt_side
) V_spr(0,w_o
+lt_ypos
,ltn
[lt_type
][(lt_time
<-5)?0:1]);
189 else V_spr2(WD
-1,w_o
+lt_ypos
,ltn
[lt_type
][(lt_time
<-5)?0:1]);
191 }else V_clr(0,WD
,w_o
+1,HT
,0x97);
192 Z_drawfld((byte
*)fldb
, 1);
196 if(_2pl
) PL_draw(&pl2
);
201 Z_drawfld((byte
*)fldf
, 0);
203 if(lt_time
==-4 || lt_time
==-2)
204 V_remap_rect(0,WD
,w_o
+1,HT
,clrmap
+256*11);
210 static char *anm
[ANIT
-1][5]={
211 {"WALL22_1","WALL23_1","WALL23_2",NULL
,NULL
},
212 {"WALL58_1","WALL58_2","WALL58_3",NULL
,NULL
},
213 {"W73A_1","W73A_2",NULL
,NULL
,NULL
},
214 {"RP2_1","RP2_2","RP2_3","RP2_4",NULL
}
217 for(i
=1;i
<ANIT
;++i
) {
218 for(j
=0;anm
[i
-1][j
];++j
)
219 anih
[i
][j
]=F_getresid(anm
[i
-1][j
]);
220 for(;j
<5;++j
) anih
[i
][j
]=-1;
222 memset(anic
,0,sizeof(anic
));
232 horiz
=V_loadvgaimg("RSKY1");
240 if(g_time%3
!=0) return;
241 for(i
=1;i
<256;++i
) if((a
=walani
[i
])!=0) {
242 if(anih
[a
][++anic
[a
]]==-1) anic
[a
]=0;
243 walp
[i
]=V_getvgaimg(anih
[a
][anic
[a
]]);
248 static void unpack(void *buf,int len,void *obuf) {
252 for(p=(byte*)buf,o=(byte*)obuf,l=len;l;++p,--l) if(*p==255) {
253 n=*((word*)(++p));memset(o,*(p+=2),n);o+=n;l-=3;
258 static void unpack(void *buf
, int len
, void *obuf
) {
261 unsigned char *p
= buf
;
262 unsigned char *q
= obuf
;
268 step
= p
[i
] | p
[i
+ 1] << 8;
272 memset(&q
[j
], id
, step
);
277 int W_load (FILE *h
) {
283 for (i
= 0; i
< 256; ++i
) {
288 for (i
= 1; i
< 256 && blk
.sz
> 0; ++i
, blk
.sz
-= 9) {
289 myfread(w
.n
, 8, 1, h
);
291 if (strncasecmp(w
.n
, "_WATER_", 7) == 0) {
292 walp
[i
] = (void*)(w
.n
[7] - '0' + 1);
295 walh
[i
] = F_getresid(w
.n
);
296 walp
[i
] = V_getvgaimg(walh
[i
]);
297 if (w
.n
[0] == 'S' && w
.n
[1] == 'W' && w
.n
[4] == '_') {
300 walf
[i
] = w
.t
? 1 : 0;
304 if (strncasecmp(w
.n
, "VTRAP01", 8) == 0) {
307 walani
[i
] = getani(w
.n
);
310 for (j
= i
, i
= 1; i
< 256 && j
< 256; ++i
) {
311 if (walswp
[i
] == 0) {
312 F_getresname(w
.n
, walh
[i
] & 0x7FFF);
314 g
= F_getresid(w
.n
) | (walh
[i
] & 0x8000);
316 while (k
< 256 && walh
[k
] != g
) {
323 walp
[k
] = V_getvgaimg(g
);
324 walf
[k
] = g
& 0x8000 ? 1 : 0;
342 myfread(p
, FLDW
* FLDH
, 1, h
);
345 buf
= malloc(blk
.sz
);
347 ERR_fatal("Не хватает памяти");
349 myfread(buf
, blk
.sz
, 1, h
);
350 unpack(buf
, blk
.sz
, p
);
358 myfread16(&sky_type
, h
);
359 strcpy(w
.n
, "RSKY1");
360 w
.n
[4] = '0' + sky_type
;
362 horiz
= V_loadvgaimg(w
.n
);