DEADSOFTWARE

manager: remove flag 0x8000 from resource handle id
[flatwaifu.git] / src / view.c
1 /*
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
21 */
23 #include "glob.h"
24 #include <string.h>
25 #include <stdlib.h>
26 #include "memory.h"
27 #include "files.h"
28 #include "error.h"
29 #include "view.h"
30 #include "dots.h"
31 #include "smoke.h"
32 #include "weapons.h"
33 #include "items.h"
34 #include "switch.h"
35 #include "fx.h"
36 #include "player.h"
37 #include "monster.h"
38 #include "misc.h"
39 #include "map.h"
40 #include "sound.h"
41 #include "my.h"
42 #include "render.h"
44 int sky_type=1;
45 dword walf[256];
46 byte fldb[FLDH][FLDW];
47 byte fldf[FLDH][FLDW];
48 byte fld[FLDH][FLDW];
50 void W_savegame (FILE* h) {
51 char s[8];
52 int i;
53 myfwrite32(sky_type, h);
54 for(i = 1; i < 256; ++i) {
55 R_get_name(i, s);
56 myfwrite(s, 8, 1, h);
57 }
58 for (i = 0; i < 256; i++) {
59 myfwrite32(walf[i], h);
60 }
61 for (i = 0; i < 256; i++) {
62 myfwrite8(R_get_swp(i), h);
63 }
64 myfwrite(fldb, FLDW*FLDH, 1, h);
65 myfwrite(fld, FLDW*FLDH, 1, h);
66 myfwrite(fldf, FLDW*FLDH, 1, h);
67 }
69 void W_loadgame (FILE* h) {
70 int i;
71 char s[8];
72 sky_type = myfread32(h);
73 R_loadsky(sky_type);
74 R_begin_load();
75 for (i = 1; i < 256; ++i) {
76 myfread(s, 8, 1, h);
77 if (s[0]) {
78 R_load(s);
79 }
80 }
81 R_end_load();
82 for (i = 0; i < 256; i++) {
83 myfread32(h); // useless
84 }
85 for (i = 0; i < 256; i++) {
86 walf[i] = myfread8(h);
87 }
88 myfread(fldb, FLDW*FLDH, 1, h);
89 myfread(fld, FLDW*FLDH, 1, h);
90 myfread(fldf, FLDW*FLDH, 1, h);
91 }
93 void W_init (void) {
94 DOT_init();
95 SMK_init();
96 FX_init();
97 WP_init();
98 IT_init();
99 SW_init();
100 PL_init();
101 MN_init();
102 R_loadsky(1);
105 static void unpack (void *buf, int len, void *obuf) {
106 int i = 0;
107 int j = 0;
108 unsigned char *p = buf;
109 unsigned char *q = obuf;
110 while (i < len) {
111 int id = p[i];
112 int step = 1;
113 i += 1;
114 if (id == 0xff) {
115 step = p[i] | p[i + 1] << 8;
116 id = p[i + 2];
117 i += 3;
119 memset(&q[j], id, step);
120 j += step;
124 int W_load (FILE *h) {
125 int i;
126 char s[8];
127 void *p, *buf;
128 switch (blk.t) {
129 case MB_WALLNAMES:
130 R_begin_load();
131 memset(walf, 0, sizeof(walf));
132 for (i = 1; i < 256 && blk.sz > 0; i++, blk.sz -= 9) {
133 myfread(s, 8, 1, h);
134 walf[i] = myfread8(h) ? 1 : 0; // ???
135 R_load(s);
136 if (strncasecmp(s, "VTRAP01", 8) == 0) {
137 walf[i] |= 2;
140 R_end_load();
141 return 1;
142 case MB_BACK:
143 p = fldb;
144 goto unp;
145 case MB_WTYPE:
146 p = fld;
147 goto unp;
148 case MB_FRONT:
149 p = fldf;
150 unp:
151 switch (blk.st) {
152 case 0:
153 myfread(p, FLDW * FLDH, 1, h);
154 break;
155 case 1:
156 buf = malloc(blk.sz);
157 if (buf == NULL) {
158 ERR_fatal("Не хватает памяти");
160 myfread(buf, blk.sz, 1, h);
161 unpack(buf, blk.sz, p);
162 free(buf);
163 break;
164 default:
165 return 0;
167 return 1;
168 case MB_SKY:
169 sky_type = myfread16(h);
170 R_loadsky(sky_type);
171 return 1;
173 return 0;