1 #pragma once
2 #include <stdbool.h>
3 
4 #include "audio.h"
5 #include "common.h"
6 #include "vswap.h"
7 
8 #define CW_LEVELS 100
9 #pragma pack(push, 1)
10 typedef struct
11 {
12 	uint16_t magic;
13 	int32_t ptr[CW_LEVELS];
14 } CWMapHead;
15 typedef struct
16 {
17 	uint32_t offPlane0;
18 	uint32_t offPlane1;
19 	uint32_t offPlane2;
20 	uint16_t lenPlane0;
21 	uint16_t lenPlane1;
22 	uint16_t lenPlane2;
23 	uint16_t width;
24 	uint16_t height;
25 	char name[16];
26 	char signature[4];
27 } CWLevelHead;
28 #pragma pack(pop)
29 
30 #define NUM_PLANES 3
31 typedef struct
32 {
33 	int len;
34 	uint16_t *plane;
35 } CWPlane;
36 typedef struct
37 {
38 	CWLevelHead header;
39 	CWPlane planes[NUM_PLANES];
40 } CWLevel;
41 
42 typedef struct
43 {
44 	CWMapHead mapHead;
45 	CWLevel *levels;
46 	int nLevels;
47 	CWAudio audio;
48 	CWVSwap vswap;
49 	CWMapType type;
50 } CWolfMap;
51 
52 bool CWIsMap(const char *path);
53 int CWLoad(CWolfMap *map, const char *path);
54 void CWFree(CWolfMap *map);
55 
56 typedef enum
57 {
58 	CWTILE_WALL,
59 	CWTILE_DOOR_V,
60 	CWTILE_DOOR_H,
61 	CWTILE_DOOR_GOLD_V,
62 	CWTILE_DOOR_GOLD_H,
63 	CWTILE_DOOR_SILVER_V,
64 	CWTILE_DOOR_SILVER_H,
65 	CWTILE_ELEVATOR_V,
66 	CWTILE_ELEVATOR_H,
67 	CWTILE_SECRET_EXIT,
68 	CWTILE_AREA,
69 	CWTILE_UNKNOWN,
70 } CWTile;
71 
72 typedef enum
73 {
74 	CWENT_NONE,
75 	CWENT_PLAYER_SPAWN_N,
76 	CWENT_PLAYER_SPAWN_E,
77 	CWENT_PLAYER_SPAWN_S,
78 	CWENT_PLAYER_SPAWN_W,
79 	CWENT_WATER,
80 	CWENT_OIL_DRUM,
81 	CWENT_TABLE_WITH_CHAIRS,
82 	CWENT_FLOOR_LAMP,
83 	CWENT_CHANDELIER,
84 	CWENT_HANGING_SKELETON,
85 	CWENT_DOG_FOOD,
86 	CWENT_WHITE_COLUMN,
87 	CWENT_GREEN_PLANT,
88 	CWENT_SKELETON,
89 	CWENT_SINK_SKULLS_ON_STICK,
90 	CWENT_BROWN_PLANT,
91 	CWENT_VASE,
92 	CWENT_TABLE,
93 	CWENT_CEILING_LIGHT_GREEN,
94 	CWENT_UTENSILS_BROWN_CAGE_BLOODY_BONES,
95 	CWENT_ARMOR,
96 	CWENT_CAGE,
97 	CWENT_CAGE_SKELETON,
98 	CWENT_BONES1,
99 	CWENT_KEY_GOLD,
100 	CWENT_KEY_SILVER,
101 	CWENT_BED_CAGE_SKULLS,
102 	CWENT_BASKET,
103 	CWENT_FOOD,
104 	CWENT_MEDKIT,
105 	CWENT_AMMO,
106 	CWENT_MACHINE_GUN,
107 	CWENT_CHAIN_GUN,
108 	CWENT_CROSS,
109 	CWENT_CHALICE,
110 	CWENT_CHEST,
111 	CWENT_CROWN,
112 	CWENT_LIFE,
113 	CWENT_BONES_BLOOD,
114 	CWENT_BARREL,
115 	CWENT_WELL_WATER,
116 	CWENT_WELL,
117 	CWENT_POOL_OF_BLOOD,
118 	CWENT_FLAG,
119 	CWENT_CEILING_LIGHT_RED_AARDWOLF,
120 	CWENT_BONES2,
121 	CWENT_BONES3,
122 	CWENT_BONES4,
123 	CWENT_UTENSILS_BLUE_COW_SKULL,
124 	CWENT_STOVE_WELL_BLOOD,
125 	CWENT_RACK_ANGEL_STATUE,
126 	CWENT_VINES,
127 	CWENT_BROWN_COLUMN,
128 	CWENT_AMMO_BOX,
129 	CWENT_TRUCK_REAR,
130 	CWENT_SPEAR,
131 	CWENT_PUSHWALL,
132 	CWENT_ENDGAME,
133 	CWENT_GHOST,
134 	CWENT_ANGEL,
135 	CWENT_DEAD_GUARD,
136 
137 	CWENT_GUARD_E,
138 	CWENT_GUARD_N,
139 	CWENT_GUARD_W,
140 	CWENT_GUARD_S,
141 	CWENT_OFFICER_E,
142 	CWENT_OFFICER_N,
143 	CWENT_OFFICER_W,
144 	CWENT_OFFICER_S,
145 	CWENT_SS_E,
146 	CWENT_SS_N,
147 	CWENT_SS_W,
148 	CWENT_SS_S,
149 	CWENT_DOG_E,
150 	CWENT_DOG_N,
151 	CWENT_DOG_W,
152 	CWENT_DOG_S,
153 	CWENT_MUTANT_E,
154 	CWENT_MUTANT_N,
155 	CWENT_MUTANT_W,
156 	CWENT_MUTANT_S,
157 
158 	CWENT_TURN_E,
159 	CWENT_TURN_NE,
160 	CWENT_TURN_N,
161 	CWENT_TURN_NW,
162 	CWENT_TURN_W,
163 	CWENT_TURN_SW,
164 	CWENT_TURN_S,
165 	CWENT_TURN_SE,
166 
167 	CWENT_TRANS,
168 	CWENT_UBER_MUTANT,
169 	CWENT_BARNACLE_WILHELM,
170 	CWENT_ROBED_HITLER,
171 	CWENT_DEATH_KNIGHT,
172 	CWENT_HITLER,
173 	CWENT_FETTGESICHT,
174 	CWENT_SCHABBS,
175 	CWENT_GRETEL,
176 	CWENT_HANS,
177 	CWENT_OTTO,
178 
179 	CWENT_PACMAN_GHOST_RED,
180 	CWENT_PACMAN_GHOST_YELLOW,
181 	CWENT_PACMAN_GHOST_ROSE,
182 	CWENT_PACMAN_GHOST_BLUE,
183 
184 	CWENT_UNKNOWN,
185 } CWEntity;
186 
187 typedef enum
188 {
189 	CWWALL_GREY_BRICK_1,
190 	CWWALL_GREY_BRICK_2,
191 	CWWALL_GREY_BRICK_FLAG,
192 	CWWALL_GREY_BRICK_HITLER,
193 	CWWALL_CELL,
194 	CWWALL_GREY_BRICK_EAGLE,
195 	CWWALL_CELL_SKELETON,
196 	CWWALL_BLUE_BRICK_1,
197 	CWWALL_BLUE_BRICK_2,
198 	CWWALL_WOOD_EAGLE,
199 	CWWALL_WOOD_HITLER,
200 	CWWALL_WOOD,
201 	CWWALL_ENTRANCE,
202 	CWWALL_STEEL_SIGN,
203 	CWWALL_STEEL,
204 	CWWALL_LANDSCAPE,
205 	CWWALL_RED_BRICK,
206 	CWWALL_RED_BRICK_SWASTIKA,
207 	CWWALL_PURPLE,
208 	CWWALL_RED_BRICK_FLAG,
209 	CWWALL_ELEVATOR,
210 	CWWALL_DEAD_ELEVATOR,
211 	CWWALL_WOOD_IRON_CROSS,
212 	CWWALL_DIRTY_BRICK_1,
213 	CWWALL_PURPLE_BLOOD,
214 	CWWALL_DIRTY_BRICK_2,
215 	CWWALL_GREY_BRICK_3,
216 	CWWALL_GREY_BRICK_SIGN,
217 	CWWALL_BROWN_WEAVE,
218 	CWWALL_BROWN_WEAVE_BLOOD_2,
219 	CWWALL_BROWN_WEAVE_BLOOD_3,
220 	CWWALL_BROWN_WEAVE_BLOOD_1,
221 	CWWALL_STAINED_GLASS,
222 	CWWALL_BLUE_WALL_SKULL,
223 	CWWALL_GREY_WALL_1,
224 	CWWALL_BLUE_WALL_SWASTIKA,
225 	CWWALL_GREY_WALL_VENT,
226 	CWWALL_MULTICOLOR_BRICK,
227 	CWWALL_GREY_WALL_2,
228 	CWWALL_BLUE_WALL,
229 	CWWALL_BLUE_BRICK_SIGN,
230 	CWWALL_BROWN_MARBLE_1,
231 	CWWALL_GREY_WALL_MAP,
232 	CWWALL_BROWN_STONE_1,
233 	CWWALL_BROWN_STONE_2,
234 	CWWALL_BROWN_MARBLE_2,
235 	CWWALL_BROWN_MARBLE_FLAG,
236 	CWWALL_WOOD_PANEL,
237 	CWWALL_GREY_WALL_HITLER,
238 	CWWALL_STONE_WALL_1,
239 	CWWALL_STONE_WALL_2,
240 	CWWALL_STONE_WALL_FLAG,
241 	CWWALL_STONE_WALL_WREATH,
242 	CWWALL_GREY_CONCRETE_LIGHT,
243 	CWWALL_GREY_CONCRETE_DARK,
244 	CWWALL_BLOOD_WALL,
245 	CWWALL_CONCRETE,
246 	CWWALL_RAMPART_STONE_1,
247 	CWWALL_RAMPART_STONE_2,
248 	CWWALL_ELEVATOR_WALL,
249 	CWWALL_BROWN_CONCRETE,
250 	CWWALL_PURPLE_BRICK,
251 	CWWALL_UNKNOWN
252 } CWWall;
253 
254 uint16_t CWLevelGetCh(
255 	const CWLevel *level, const int planeIndex, const int x, const int y);
256 CWTile CWChToTile(const uint16_t ch);
257 CWWall CWChToWall(const uint16_t ch);
258 CWEntity CWChToEntity(const uint16_t ch);
259