58733ee79cd13814828fa740b4d1de73fe92224b
[rocksndiamonds.git] / src / game_em / reademc.c
1 /* 2008-08-27 04:17:36
2  *
3  * handle binary emc cave file format
4  */
5
6 #include "main_em.h"
7
8
9 /* convert emc caves to intermediate cave format.
10  *
11  * the intermediate format supports most emc caves, but some internal
12  * objects are not supported.
13  *
14  * different:
15  * - active objects - use global flags instead of individual on/off
16  * - falling or paused objects - become still objects
17  * - sand states - become either sand with/without stone
18  * - collected objects - become a common pause object
19  * - drip states - become a normal drip
20  *
21  * unsupported:
22  * - exploding objects (not in emc player either)
23  *
24  * pushed objects are supported in the cave, eaters and magic ball.
25  * they behave almost the same as in the emc player, pushing over
26  * steel wall, androids, players etc. a compile time option chooses
27  * if pushed objects go into the acid.
28  *
29  * acid is handled completely different in my player. acid top is a
30  * separate object, which can be put anywhere and the beasts will
31  * be gobbled, even if they go in from below. in the emc player, an
32  * acid top without a bottom becomes plant.
33  *
34  * borderless caves are supported, almost the same as in the emc
35  * player. going off the left edge of the screen resulted in the
36  * beast/player moving up 1 square (and the player disappeared).
37  * going off the right edge of the screen, the beast/player would
38  * go down 1 square. in my player, everything stays on the same y
39  * coord, which is sensible, but breaks caves which expect the old
40  * behaviour.
41  */
42
43 #define GET_BE16(x)             ((&x)[0] << 8 | (&x)[1])
44
45 static const short map_emc[256] =
46 {
47   Cstone,               Cstone,         Cdiamond,       Cdiamond,
48   Calien,               Calien,         Cblank,         Cblank,
49   Ctank_1_n,            Ctank_1_e,      Ctank_1_s,      Ctank_1_w,
50   Ctank_2_n,            Ctank_2_e,      Ctank_2_s,      Ctank_2_w,
51
52   Cbomb,                Cbomb,          Cemerald,       Cemerald,
53   Cbug_1_n,             Cbug_1_e,       Cbug_1_s,       Cbug_1_w,
54   Cbug_2_n,             Cbug_2_e,       Cbug_2_s,       Cbug_2_w,
55   Cdrip,                Cdrip,          Cdrip,          Cdrip,
56
57   Cstone,               Cbomb,          Cdiamond,       Cemerald,
58   Cwonderwall,          Cnut,           Cnut,           Cnut,
59   Cwheel,               Ceater_n,       Ceater_s,       Ceater_w,
60   Ceater_e,             Csand_stone,    Cblank,         Cblank,
61
62   Cblank,               Csand,          Csand,          Csand,
63   Csand_stone,          Csand_stone,    Csand_stone,    Csand,
64   Cstone,               Cslide_ew,      Cslide_ns,      Cdynamite_1,
65   Cdynamite_2,          Cdynamite_3,    Cdynamite_4,    Cacid_s,
66
67   Cexit_1,              Cexit_2,        Cexit_3,        Cballoon,
68   Cplant,               Cspring,        Cspring,        Cpush_spring_w,
69   Cpush_spring_e,       Cball_1,        Cball_2,        Candroid,
70   Cblank,               Candroid,       Candroid,       Candroid,
71
72   Candroid,             Candroid,       Candroid,       Candroid,
73   Candroid,             Cblank,         Cblank,         Cblank,
74   Cblank,               Cblank,         Cblank,         Cblank,
75   Cblank,               Cblank,         Cblank,         Cblank,
76
77   Cblank,               Cblank,         Cblank,         Cpush_spring_w,
78   Cpush_spring_e,       Cacid_1,        Cacid_2,        Cacid_3,
79   Cacid_4,              Cacid_5,        Cacid_6,        Cacid_7,
80   Cacid_8,              Cblank,         Cblank,         Cblank,
81
82   Cblank,               Cblank,         Cpush_nut_w,    Cpush_nut_e,
83   Csteel_1,             Cblank,         Cblank,         Cpush_bomb_w,
84   Cpush_bomb_e,         Cpush_stone_w,  Cpush_stone_e,  Cblank,
85   Cblank,               Cblank,         Cblank,         Cblank,
86
87   Cblank,               Croundwall_1,   Cgrass,         Csteel_1,
88   Cwall_1,              Ckey_1,         Ckey_2,         Ckey_3,
89   Ckey_4,               Cdoor_1,        Cdoor_2,        Cdoor_3,
90   Cdoor_4,              Cfake_amoeba,   Cfake_door_1,   Cfake_door_2,
91
92   Cfake_door_3,         Cfake_door_4,   Cwonderwall,    Cwheel,
93   Csand,                Cacid_nw,       Cacid_ne,       Cacid_sw,
94   Cacid_se,             Cfake_blank,    Camoeba_1,      Camoeba_2,
95   Camoeba_3,            Camoeba_4,      Cexit,          Calpha_arrow_w,
96
97   Cfake_grass,          Clenses,        Cmagnify,       Cfake_blank,
98   Cfake_grass,          Cswitch,        Cswitch,        Cblank,
99   Cdecor_8,             Cdecor_9,       Cdecor_10,      Cdecor_5,
100   Calpha_comma,         Calpha_apost,   Calpha_minus,   Cdynamite,
101
102   Csteel_3,             Cdecor_6,       Cdecor_7,       Csteel_2,
103   Croundwall_2,         Cdecor_2,       Cdecor_4,       Cdecor_3,
104   Cwind_any,            Cwind_e,        Cwind_s,        Cwind_w,
105   Cwind_n,              Cdirt,          Cplant,         Ckey_5,
106
107   Ckey_6,               Ckey_7,         Ckey_8,         Cdoor_5,
108   Cdoor_6,              Cdoor_7,        Cdoor_8,        Cbumper,
109   Calpha_a,             Calpha_b,       Calpha_c,       Calpha_d,
110   Calpha_e,             Calpha_f,       Calpha_g,       Calpha_h,
111
112   Calpha_i,             Calpha_j,       Calpha_k,       Calpha_l,
113   Calpha_m,             Calpha_n,       Calpha_o,       Calpha_p,
114   Calpha_q,             Calpha_r,       Calpha_s,       Calpha_t,
115   Calpha_u,             Calpha_v,       Calpha_w,       Calpha_x,
116
117   Calpha_y,             Calpha_z,       Calpha_0,       Calpha_1,
118   Calpha_2,             Calpha_3,       Calpha_4,       Calpha_5,
119   Calpha_6,             Calpha_7,       Calpha_8,       Calpha_9,
120   Calpha_perio,         Calpha_excla,   Calpha_colon,   Calpha_quest,
121
122   Calpha_arrow_e,       Cdecor_1,       Cfake_door_5,   Cfake_door_6,
123   Cfake_door_7,         Cfake_door_8,   Cblank,         Cblank,
124   Cblank,               Cblank,         Cblank,         Cblank,
125   Cblank,               Cblank,         Calpha_copyr,   Cfake_acid_1
126 };
127
128 static void init_android_clone_table(short android_clone_bits)
129 {
130   boolean android_emerald       = (android_clone_bits & 1)      != 0;
131   boolean android_diamond       = (android_clone_bits & 2)      != 0;
132   boolean android_stone         = (android_clone_bits & 4)      != 0;
133   boolean android_bomb          = (android_clone_bits & 8)      != 0;
134   boolean android_nut           = (android_clone_bits & 16)     != 0;
135   boolean android_tank          = (android_clone_bits & 32)     != 0;
136   boolean android_eater         = (android_clone_bits & 64)     != 0;
137   boolean android_bug           = (android_clone_bits & 128)    != 0;
138   boolean android_alien         = (android_clone_bits & 256)    != 0;
139   boolean android_spring        = (android_clone_bits & 512)    != 0;
140   boolean android_balloon       = (android_clone_bits & 1024)   != 0;
141   boolean android_amoeba        = (android_clone_bits & 2048)   != 0;
142   boolean android_dynamite      = (android_clone_bits & 4096)   != 0;
143   int i;
144
145   for (i = 0; i < TILE_MAX; i++)
146     cav.android_array[i] = Cblank;
147
148   if (android_eater)
149   {
150     cav.android_array[Xeater_n]         = Ceater_n;
151     cav.android_array[Yeater_nB]        = Ceater_n;
152
153     cav.android_array[Xeater_e]         = Ceater_e;
154     cav.android_array[Yeater_eB]        = Ceater_e;
155
156     cav.android_array[Xeater_s]         = Ceater_s;
157     cav.android_array[Yeater_sB]        = Ceater_s;
158
159     cav.android_array[Xeater_w]         = Ceater_w;
160     cav.android_array[Yeater_wB]        = Ceater_w;
161   }
162
163   if (android_alien)
164   {
165     cav.android_array[Xalien]           = Calien;
166     cav.android_array[Xalien_pause]     = Calien;
167     cav.android_array[Yalien_nB]        = Calien;
168     cav.android_array[Yalien_eB]        = Calien;
169     cav.android_array[Yalien_sB]        = Calien;
170     cav.android_array[Yalien_wB]        = Calien;
171   }
172
173   if (android_bug)
174   {
175     cav.android_array[Xbug_1_n]         = Cbug_2_n;
176     cav.android_array[Xbug_2_n]         = Cbug_2_n;
177     cav.android_array[Ybug_nB]          = Cbug_2_n;
178     cav.android_array[Ybug_n_e]         = Cbug_2_n;
179     cav.android_array[Ybug_n_w]         = Cbug_2_n;
180
181     cav.android_array[Xbug_1_e]         = Cbug_2_e;
182     cav.android_array[Xbug_2_e]         = Cbug_2_e;
183     cav.android_array[Ybug_eB]          = Cbug_2_e;
184     cav.android_array[Ybug_e_s]         = Cbug_2_e;
185     cav.android_array[Ybug_e_n]         = Cbug_2_e;
186
187     cav.android_array[Xbug_1_s]         = Cbug_2_s;
188     cav.android_array[Xbug_2_s]         = Cbug_2_s;
189     cav.android_array[Ybug_sB]          = Cbug_2_s;
190     cav.android_array[Ybug_s_w]         = Cbug_2_s;
191     cav.android_array[Ybug_s_e]         = Cbug_2_s;
192
193     cav.android_array[Xbug_1_w]         = Cbug_2_w;
194     cav.android_array[Xbug_2_w]         = Cbug_2_w;
195     cav.android_array[Ybug_wB]          = Cbug_2_w;
196     cav.android_array[Ybug_w_n]         = Cbug_2_w;
197     cav.android_array[Ybug_w_s]         = Cbug_2_w;
198   }
199
200   if (android_tank)
201   {
202     cav.android_array[Xtank_1_n]        = Ctank_1_n;
203     cav.android_array[Xtank_2_n]        = Ctank_1_n;
204     cav.android_array[Ytank_nB]         = Ctank_1_n;
205     cav.android_array[Ytank_n_e]        = Ctank_1_n;
206     cav.android_array[Ytank_n_w]        = Ctank_1_n;
207
208     cav.android_array[Xtank_1_e]        = Ctank_1_e;
209     cav.android_array[Xtank_2_e]        = Ctank_1_e;
210     cav.android_array[Ytank_eB]         = Ctank_1_e;
211     cav.android_array[Ytank_e_s]        = Ctank_1_e;
212     cav.android_array[Ytank_e_n]        = Ctank_1_e;
213
214     cav.android_array[Xtank_1_s]        = Ctank_1_s;
215     cav.android_array[Xtank_2_s]        = Ctank_1_s;
216     cav.android_array[Ytank_sB]         = Ctank_1_s;
217     cav.android_array[Ytank_s_w]        = Ctank_1_s;
218     cav.android_array[Ytank_s_e]        = Ctank_1_s;
219
220     cav.android_array[Xtank_1_w]        = Ctank_1_w;
221     cav.android_array[Xtank_2_w]        = Ctank_1_w;
222     cav.android_array[Ytank_wB]         = Ctank_1_w;
223     cav.android_array[Ytank_w_n]        = Ctank_1_w;
224     cav.android_array[Ytank_w_s]        = Ctank_1_w;
225   }
226
227   if (android_emerald)
228   {
229     cav.android_array[Xemerald]         = Cemerald;
230     cav.android_array[Xemerald_pause]   = Cemerald;
231     cav.android_array[Xemerald_fall]    = Cemerald;
232     cav.android_array[Yemerald_sB]      = Cemerald;
233     cav.android_array[Yemerald_eB]      = Cemerald;
234     cav.android_array[Yemerald_wB]      = Cemerald;
235   }
236
237   if (android_diamond)
238   {
239     cav.android_array[Xdiamond]         = Cdiamond;
240     cav.android_array[Xdiamond_pause]   = Cdiamond;
241     cav.android_array[Xdiamond_fall]    = Cdiamond;
242     cav.android_array[Ydiamond_sB]      = Cdiamond;
243     cav.android_array[Ydiamond_eB]      = Cdiamond;
244     cav.android_array[Ydiamond_wB]      = Cdiamond;
245   }
246
247   if (android_stone)
248   {
249     cav.android_array[Xstone]           = Cstone;
250     cav.android_array[Xstone_pause]     = Cstone;
251     cav.android_array[Xstone_fall]      = Cstone;
252     cav.android_array[Ystone_sB]        = Cstone;
253     cav.android_array[Ystone_eB]        = Cstone;
254     cav.android_array[Ystone_wB]        = Cstone;
255   }
256
257   if (android_bomb)
258   {
259     cav.android_array[Xbomb]            = Cbomb;
260     cav.android_array[Xbomb_pause]      = Cbomb;
261     cav.android_array[Xbomb_fall]       = Cbomb;
262     cav.android_array[Ybomb_sB]         = Cbomb;
263     cav.android_array[Ybomb_eB]         = Cbomb;
264     cav.android_array[Ybomb_wB]         = Cbomb;
265   }
266
267   if (android_nut)
268   {
269     cav.android_array[Xnut]             = Cnut;
270     cav.android_array[Xnut_pause]       = Cnut;
271     cav.android_array[Xnut_fall]        = Cnut;
272     cav.android_array[Ynut_sB]          = Cnut;
273     cav.android_array[Ynut_eB]          = Cnut;
274     cav.android_array[Ynut_wB]          = Cnut;
275   }
276
277   if (android_spring)
278   {
279     cav.android_array[Xspring]          = Cspring;
280     cav.android_array[Xspring_pause]    = Cspring;
281     cav.android_array[Xspring_fall]     = Cspring;
282     cav.android_array[Xspring_e]        = Cspring;
283     cav.android_array[Xspring_w]        = Cspring;
284     cav.android_array[Yspring_sB]       = Cspring;
285     cav.android_array[Yspring_eB]       = Cspring;
286     cav.android_array[Yspring_wB]       = Cspring;
287     cav.android_array[Yspring_alien_eB] = Cspring;
288     cav.android_array[Yspring_alien_wB] = Cspring;
289   }
290
291   if (android_dynamite)
292   {
293     cav.android_array[Xdynamite]        = Cdynamite;
294   }
295
296   if (android_balloon)
297   {
298     cav.android_array[Xballoon]         = Cballoon;
299     cav.android_array[Yballoon_nB]      = Cballoon;
300     cav.android_array[Yballoon_eB]      = Cballoon;
301     cav.android_array[Yballoon_sB]      = Cballoon;
302     cav.android_array[Yballoon_wB]      = Cballoon;
303   }
304
305   if (android_amoeba)
306   {
307     cav.android_array[Xfake_amoeba]     = Cdrip;
308     cav.android_array[Yfake_amoeba]     = Cdrip;
309     cav.android_array[Xamoeba_1]        = Cdrip;
310     cav.android_array[Xamoeba_2]        = Cdrip;
311     cav.android_array[Xamoeba_3]        = Cdrip;
312     cav.android_array[Xamoeba_4]        = Cdrip;
313     cav.android_array[Xamoeba_5]        = Cdrip;
314     cav.android_array[Xamoeba_6]        = Cdrip;
315     cav.android_array[Xamoeba_7]        = Cdrip;
316     cav.android_array[Xamoeba_8]        = Cdrip;
317   }
318 }
319
320 void convert_em_level(unsigned char *src, int file_version)
321 {
322   static int eater_offset[8] =
323   {
324     2048, 2057, 2066, 2075,
325     2112, 2121, 2130, 2139
326   };
327   int i, x, y, temp;
328
329   /* common to all emc caves */
330
331   cav.time_seconds = MIN(GET_BE16(src[2110]), 9999);
332   cav.gems_needed = src[2095];
333
334   /* scores */
335
336   cav.emerald_score     = src[2084];
337   cav.diamond_score     = src[2085];
338   cav.alien_score       = src[2086];
339   cav.tank_score        = src[2087];
340   cav.bug_score         = src[2088];
341   cav.eater_score       = src[2089];
342   cav.nut_score         = src[2090];
343   cav.dynamite_score    = src[2091];
344   cav.key_score         = src[2092];
345   cav.exit_score        = src[2093] * 8 / 5;
346
347   cav.lenses_score      = src[2151];
348   cav.magnify_score     = src[2152];
349   cav.slurp_score       = src[2153];
350
351   /* times */
352
353   cav.android_move_time  = MIN(GET_BE16(src[2164]), 9999);
354   cav.android_clone_time = MIN(GET_BE16(src[2166]), 9999);
355   cav.ball_time          = MIN(GET_BE16(src[2160]), 9999);
356
357   cav.lenses_time       = MIN(GET_BE16(src[2154]), 9999);
358   cav.magnify_time      = MIN(GET_BE16(src[2156]), 9999);
359   cav.wheel_time        = MIN(GET_BE16(src[2104]), 9999);
360
361   cav.amoeba_time       = MIN(GET_BE16(src[2100]) * 28, 9999);
362   cav.wonderwall_time   = MIN(GET_BE16(src[2102]), 9999);
363
364   cav.wind_cnt = src[2149] & 15 ? cav.wind_time : 0;
365   temp = src[2149];
366   cav.wind_direction = (temp & 8 ? 0 :
367                         temp & 1 ? 1 :
368                         temp & 2 ? 2 :
369                         temp & 4 ? 3 : 0);
370
371   /* global flags */
372
373   cav.ball_random = src[2162] & 1   ? 1 : 0;
374   cav.ball_state  = src[2162] & 128 ? 1 : 0;
375
376   for (temp = 1; temp < 2047; temp++)
377   {
378     switch (src[temp])
379     {
380       case 36:                                  /* wonderwall */
381         cav.wonderwall_state = 1;
382         cav.wonderwall_time = 9999;
383         break;
384
385       case 40:                                  /* wheel */
386         cav.wheel_x = temp & 63;
387         cav.wheel_y = temp >> 6;
388         cav.wheel_cnt = cav.wheel_time;
389         break;
390
391       case 163:                                 /* fake blank */
392         cav.lenses_cnt = 9999;
393         break;
394
395       case 164:                                 /* fake grass */
396         cav.magnify_cnt = 9999;
397         break;
398     }
399   }
400
401   /* android */
402
403   init_android_clone_table(GET_BE16(src[2168]));
404
405   /* eaters */
406
407   for (i = 0; i < 8; i++)
408     for (x = 0; x < 9; x++)
409       cav.eater_array[i][x] = map_emc[src[eater_offset[i] + x]];
410
411   /* ball */
412
413   temp = map_emc[src[2159]];
414
415   for (y = 0; y < 8; y++)
416   {
417     if (src[2162] & 1)
418     {
419       for (x = 0; x < 8; x++)
420         cav.ball_array[y][x] = temp;
421     }
422     else
423     {
424       cav.ball_array[y][1] = (src[2163] & 1)  ? temp : Cblank; /* north */
425       cav.ball_array[y][6] = (src[2163] & 2)  ? temp : Cblank; /* south */
426       cav.ball_array[y][3] = (src[2163] & 4)  ? temp : Cblank; /* west */
427       cav.ball_array[y][4] = (src[2163] & 8)  ? temp : Cblank; /* east */
428       cav.ball_array[y][7] = (src[2163] & 16) ? temp : Cblank; /* southeast */
429       cav.ball_array[y][5] = (src[2163] & 32) ? temp : Cblank; /* southwest */
430       cav.ball_array[y][2] = (src[2163] & 64) ? temp : Cblank; /* northeast */
431       cav.ball_array[y][0] = (src[2163] & 128)? temp : Cblank; /* northwest */
432     }
433   }
434
435   /* players */
436
437   for (i = 0; i < 2; i++)
438   {
439     temp = GET_BE16(src[2096 + i * 2]);
440
441     cav.player_x[i] = (temp & 63);
442     cav.player_y[i] = (temp >> 6 & 31);
443   }
444
445   /* cave */
446
447   /* first fill the complete playfield with the empty space element */
448   for (y = 0; y < CAVE_HEIGHT; y++)
449     for (x = 0; x < CAVE_WIDTH; x++)
450       cav.cave[x][y] = Cblank;
451
452   /* then copy the real level contents from level file into the playfield */
453   temp = 0;
454   for (y = 0; y < cav.height; y++)
455     for (x = 0; x < cav.width; x++)
456       cav.cave[x][y] = map_emc[src[temp++]];
457
458   native_em_level.file_version = file_version;
459 }
460
461
462 /* convert all emerald mine caves to emc version 6 cave format.
463  *
464  * caves are filtered to get rid of invalid or unsupported tiles.
465  *
466  * although the result is a somewhat clean cave, it is meant only
467  * to give a common structure for the binary cave format. it is not
468  * for archiving purposes (it is better to keep the raw cave as-is)
469  * and it is not meant for serializing (the intermediate structure
470  * is better defined).
471  *
472  * acid top is added to acid bottom in both the cave and the eaters.
473  * fake acid (only in v4) does not exist because it adds nothing to
474  * the game, and is different even in different versions of the emc
475  * player.
476  *
477  * v4/v5 time is converted to 10x old time (as it should be).
478  * the reason the kingsoft player used 5x time was copy protection.
479  *
480  * note: emc v6 converter has an error in converting v4 eaters to the
481  * wrong bug(24 instead of 20) and tank(12 instead of 8).
482  */
483
484 /* changes for game engine integration in Rocks'n'Diamonds:
485  *
486  * cave versions below V5 had no grass, but only sand/dirt
487  * - object code 130 (V6 grass) is changed to 189 (V6 dirt)
488  * - object codes are changed in both cave and eater arrays
489  * - only graphical change, as both objects behave the same
490  */
491
492 static const unsigned char map_v6[256] =
493 {
494   /* filter for v6 */
495
496   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
497   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
498   0,16,2,18,       36,37,37,37,     40,41,42,43,     44,45,128,128,
499   128,148,148,     148,45,45,45,    148,0,57,58,     59,60,61,62,63,
500
501   64,65,66,67,     68,69,69,71,     72,73,74,75,     118,75,75,75,
502   75,75,75,75,     75,153,153,153,  153,153,153,153, 153,153,153,153,
503   153,153,153,99,  100,68,68,68,    68,68,68,68,     68,118,118,118,
504   118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
505
506   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
507   144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
508   160,161,162,163, 164,165,165,118, 168,169,170,171, 172,173,174,175,
509   176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,68,191,
510
511   192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207,
512   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
513   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
514   240,241,242,243, 244,245,153,153, 153,153,153,153, 153,153,153,153
515 };
516
517 static const unsigned char map_v5[256] =
518 {
519   /* filter for v5 */
520
521   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
522   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
523   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,
524   128,148,148,148, 45,45,45,148,    0,57,58,59,      60,61,62,63,
525
526   64,65,66,67,     68,153,153,153,  153,153,153,153, 153,153,153,153,
527   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
528   153,153,153,153, 153,68,68,68,    68,68,68,68,     68,118,118,118,
529   118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
530
531   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
532   144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
533   160,153,153,153, 153,153,153,118, 168,169,170,171, 172,173,174,175,
534   176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,68,153,
535
536   153,153,153,153, 153,153,153,153, 200,201,202,203, 204,205,206,207,
537   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
538   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
539   240,241,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153
540 };
541
542 static const unsigned char map_v4[256] =
543 {
544   /* filter for v4 */
545
546   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
547   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
548   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,
549   128,148,148,148, 45,45,45,148,    0,153,153,59,    60,61,62,63,
550
551   64,65,66,153,    153,153,153,153, 153,153,153,153, 153,153,153,153,
552   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
553   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
554   153,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
555
556   128,129,189,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
557   144,145,146,147, 148,149,150,151, 152,68,154,155,  156,157,158,160,
558   160,160,160,160, 160,160,160,160, 160,160,160,160, 160,160,160,175,
559   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,68,153,
560
561   153,153,153,153, 153,153,153,153, 200,201,202,203, 204,205,206,207,
562   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
563   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
564   240,241,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153
565 };
566
567 static const unsigned char map_v4_eater[32] =
568 {
569   /* filter for v4 eater */
570
571   128,18,2,0,      4,8,16,20,       28,37,41,45,     189,129,131,132,
572   133,134,135,136, 146,147,175,65,  66,64,2,18,      128,128,128,128
573 };
574
575 static boolean filename_has_v1_format(char *filename)
576 {
577   char *basename = getBaseNamePtr(filename);
578
579   return (strlen(basename) == 3 &&
580           basename[0] == 'a' &&
581           basename[1] >= 'a' && basename[1] <= 'k' &&
582           basename[2] >= '0' && basename[2] <= '9');
583 }
584
585 int cleanup_em_level(unsigned char *src, int length, char *filename)
586 {
587   int file_version = FILE_VERSION_EM_UNKNOWN;
588   int i;
589
590   if (length >= 2172 &&
591       src[2106] == 255 &&               /* version id: */
592       src[2107] == 54 &&                /* '6' */
593       src[2108] == 48 &&                /* '0' */
594       src[2109] == 48)                  /* '0' */
595   {
596     /* ---------- this cave has V6 file format ---------- */
597     file_version = FILE_VERSION_EM_V6;
598
599     /* remap elements to internal EMC level format */
600     for (i = 0; i < 2048; i++)
601       src[i] = map_v6[src[i]];
602     for (i = 2048; i < 2084; i++)
603       src[i] = map_v6[src[i]];
604     for (i = 2112; i < 2148; i++)
605       src[i] = map_v6[src[i]];
606   }
607   else if (length >= 2110 &&
608            src[2106] == 255 &&          /* version id: */
609            src[2107] == 53 &&           /* '5' */
610            src[2108] == 48 &&           /* '0' */
611            src[2109] == 48)             /* '0' */
612   {
613     /* ---------- this cave has V5 file format ---------- */
614     file_version = FILE_VERSION_EM_V5;
615
616     /* remap elements to internal EMC level format */
617     for (i = 0; i < 2048; i++)
618       src[i] = map_v5[src[i]];
619     for (i = 2048; i < 2084; i++)
620       src[i] = map_v5[src[i]];
621     for (i = 2112; i < 2148; i++)
622       src[i] = src[i - 64];
623   }
624   else if (length >= 2106 &&
625            (src[1983] == 27 ||          /* encrypted (only EM I/II/III) */
626             src[1983] == 116 ||         /* unencrypted (usual case) */
627             src[1983] == 131))          /* unencrypted (rare case) */
628   {
629     /* ---------- this cave has V1, V2 or V3 file format ---------- */
630
631     boolean fix_copyright = FALSE;
632
633     /*
634       byte at position 1983 (0x07bf) is used as "magic byte":
635       - 27  (0x1b)      => encrypted level (V3 only / Kingsoft original games)
636       - 116 (0x74)      => unencrypted level (byte is corrected to 131 (0x83))
637       - 131 (0x83)      => unencrypted level (happens only in very rare cases)
638     */
639
640     if (src[1983] == 27)        /* (0x1b) -- after decryption: 116 (0x74) */
641     {
642       /* this is original (encrypted) Emerald Mine I, II or III level file */
643
644       int first_byte = src[0];
645       unsigned char code0 = 0x65;
646       unsigned char code1 = 0x11;
647
648       /* decode encrypted level data */
649       for (i = 0; i < 2106; i++)
650       {
651         src[i] ^= code0;
652         src[i] -= code1;
653
654         code0 = (code0 + 7) & 0xff;
655       }
656
657       src[1] = 131;             /* needed for all Emerald Mine levels */
658
659       /* first byte is either 0xf1 (EM I and III) or 0xf5 (EM II) */
660       if (first_byte == 0xf5)
661       {
662         src[0] = 131;           /* only needed for Emerald Mine II levels */
663
664         fix_copyright = TRUE;
665       }
666
667       /* ---------- this cave has V3 file format ---------- */
668       file_version = FILE_VERSION_EM_V3;
669     }
670     else if (filename_has_v1_format(filename))
671     {
672       /* ---------- this cave has V1 file format ---------- */
673       file_version = FILE_VERSION_EM_V1;
674     }
675     else
676     {
677       /* ---------- this cave has V2 file format ---------- */
678       file_version = FILE_VERSION_EM_V2;
679     }
680
681     /* remap elements to internal EMC level format */
682     for (i = 0; i < 2048; i++)
683       src[i] = map_v4[src[i]];
684     for (i = 2048; i < 2084; i++)
685       src[i] = map_v4_eater[src[i] >= 28 ? 0 : src[i]];
686     for (i = 2112; i < 2148; i++)
687       src[i] = src[i - 64];
688
689     if (fix_copyright)          /* fix "(c)" sign in Emerald Mine II levels */
690     {
691       for (i = 0; i < 2048; i++)
692         if (src[i] == 241)
693           src[i] = 254;         /* replace 'Cdecor_1' with 'Calpha_copyr' */
694     }
695   }
696   else
697   {
698     /* ---------- this cave has unknown file format ---------- */
699
700     /* if file has length of old-style level file, print (wrong) magic byte */
701     if (length < 2110)
702       Error(ERR_WARN, "unknown magic byte 0x%02x at position 0x%04x",
703             src[1983], 1983);
704
705     return FILE_VERSION_EM_UNKNOWN;
706   }
707
708   if (file_version < FILE_VERSION_EM_V6)
709   {
710     /* id */
711     src[2106] = 255;            /* version id: */
712     src[2107] = 54;             /* '6' */
713     src[2108] = 48;             /* '0' */
714     src[2109] = 48;             /* '0' */
715
716     /* time */
717     i = src[2094] * 10;
718     /* stored level time of levels for the V2 player was changed to 50% of the
719        time for the V1 player (original V3 levels already considered this) */
720     if (file_version != FILE_VERSION_EM_V1 &&
721         file_version != FILE_VERSION_EM_V3)
722       i /= 2;
723     src[2110] = i >> 8;
724     src[2111] = i;
725
726     for (i = 2148; i < 2172; i++)
727       src[i] = 0;
728
729     /* ball data */
730     src[2159] = 128;
731   }
732
733   /* ---------- at this stage, the cave data always has V6 format ---------- */
734
735   /* fix wheel */
736   for (i = 0; i < 2048; i++)
737     if (src[i] == 40)
738       break;
739   for (i++; i < 2048; i++)
740     if (src[i] == 40)
741       src[i] = 147;
742
743   /* fix acid */
744   for (i = 64; i < 2048; i++)
745     if (src[i] == 63)           /* replace element above 'Cacid_s' ... */
746       src[i - 64] = 101;        /* ... with 'Cacid_1' */
747
748   /* fix acid with no base beneath it (see below for details (*)) */
749   for (i = 64; i < 2048 - 1; i++)
750   {
751     if (file_version <= FILE_VERSION_EM_V2 &&
752         src[i - 64] == 101 && src[i] != 63)     /* acid without base */
753     {
754       if (src[i - 1] == 101 ||                  /* remove acid over acid row */
755           src[i + 1] == 101)
756         src[i - 64] = 6;        /* replace element above with 'Cblank' */
757       else
758         src[i - 64] = 255;      /* replace element above with 'Cfake_acid_1' */
759     }
760   }
761
762   /* fix acid in eater 1 */
763   for (i = 2051; i < 2057; i++)
764     if (src[i] == 63)
765       src[i - 3] = 101;
766
767   /* fix acid in eater 2 */
768   for (i = 2060; i < 2066; i++)
769     if (src[i] == 63)
770       src[i - 3] = 101;
771
772   /* fix acid in eater 3 */
773   for (i = 2069; i < 2075; i++)
774     if (src[i] == 63)
775       src[i - 3] = 101;
776
777   /* fix acid in eater 4 */
778   for (i = 2078; i < 2084; i++)
779     if (src[i] == 63)
780       src[i - 3] = 101;
781
782   /* fix acid in eater 5 */
783   for (i = 2115; i < 2121; i++)
784     if (src[i] == 63)
785       src[i - 3] = 101;
786
787   /* fix acid in eater 6 */
788   for (i = 2124; i < 2130; i++)
789     if (src[i] == 63)
790       src[i - 3] = 101;
791
792   /* fix acid in eater 7 */
793   for (i = 2133; i < 2139; i++)
794     if (src[i] == 63)
795       src[i - 3] = 101;
796
797   /* fix acid in eater 8 */
798   for (i = 2142; i < 2148; i++)
799     if (src[i] == 63)
800       src[i - 3] = 101;
801
802   /* old style time */
803   src[2094] = 0;
804
805   /* player 1 pos */
806   src[2096] &= 7;
807   src[GET_BE16(src[2096])] = 128;
808
809   /* player 2 pos */
810   src[2098] &= 7;
811   src[GET_BE16(src[2098])] = 128;
812
813   /* wind direction */
814   i = src[2149];
815   i &= 15;
816   i &= -i;
817   src[2149] = i;
818
819   /* ball object */
820   src[2158] = 0;
821   src[2159] = map_v6[src[2159]];
822
823   /* ball data */
824   src[2162] &= 129;
825   if (src[2162] & 1)
826     src[2163] = 0;
827
828   /* android data */
829   src[2168] &= 31;
830
831   /* size of v6 cave */
832   length = 2172;
833
834   if (options.debug)
835     Error(ERR_DEBUG, "EM level file version: %d", file_version);
836
837   return file_version;
838 }
839
840 /*
841 2000-08-20 09:41:18
842 David Tritscher
843
844 structure of emerald mine level disk files
845 ----------------------------------------------------------------------
846
847 if(len >= 2172 && (buf[2106] == 255 && buf[2107] == 54 && buf[2108] == 48 && buf[2109] == 48)) // v6
848 if(len >= 2110 && (buf[2106] == 255 && buf[2107] == 53 && buf[2108] == 48 && buf[2109] == 48)) // v5
849 if(len >= 2106 && (buf[1983] == 116 || buf[2047] == 116)) // v4
850 if(len >= 2106 && (buf[1983] == 27 || buf[2047] == 219)) // v3
851
852 buf[0]=241;buf[1]=248;for(i=0,j=101;i<2106;i++,j+=7)buf[i]=(buf[i]^j)-17; // decrypt
853
854 number of movements (calls to logic) = time * 50 / 8
855
856 {} reserved (but some broken levels use them)
857
858 ----------------------------------------------------------------------
859
860 version 6
861
862 0: level
863 2048: eater exp 1
864 2057: eater exp 2
865 2066: eater exp 3
866 2075: eater exp 4
867 2084: emerald value
868 2085: diamond value
869 2086: alien value
870 2087: tank value
871 2088: bug value
872 2089: eater value
873 2090: nut value
874 2091: dynamite value
875 2092: key value
876 2093: bonus
877 2094
878 2095: emeralds needed
879 2096: player 1 pos
880 2098: player 2 pos
881 2100: ameuba speed
882 2102: wonderwall time
883 2104: wheel time
884 2106: ID (0xff363030)
885 2110: time
886 2112: eater exp 5
887 2121: eater exp 6
888 2130: eater exp 7
889 2139: eater exp 8
890 2148: flags bit#7=NOI #6=RIS
891 2149: wind direction bit#0=right #1=down #2=left #3=up
892 2150: cave number bit#7=teamwork
893 2151: lenses value
894 2152: magnify value
895 2153: spring value
896 2154: lenses time
897 2156: magnify time
898 2158
899 2159: ball object
900 2160: ball speed
901 2162: ball info bit#15=switch state #8=random
902 ; bit#0=N #1=S #2=W #3=E #4=SE #5=SW #6=NE #7=NW
903 2164: android move speed
904 2166: android clone speed
905 2168: android data
906 ; bit#0=emerald #1=diamond #2=stone #3=bomb #4=nut #5=tank #6=eater
907 ; #7=bug #8=alien #9=spring #10=balloon #11=ameuba #12=dynamite
908 2170
909 2172: SIZE
910
911 0: stone
912 1: stone {stone_fall}
913 2: diamond
914 3: diamond {diamond_fall}
915 4: alien
916 5: alien {alien_pause}
917 6: pause {boom_1}
918 7: pause {boom_2}
919 8: tank_n_1
920 9: tank_e_1
921 10: tank_s_1
922 11: tank_w_1
923 12: tank_n_2
924 13: tank_e_2
925 14: tank_s_2
926 15: tank_w_2
927 16: bomb
928 17: bomb {bomb_fall}
929 18: emerald
930 19: emerald {emerald_fall}
931 20: bug_n_1
932 21: bug_e_1
933 22: bug_s_1
934 23: bug_w_1
935 24: bug_n_2
936 25: bug_e_2
937 26: bug_s_2
938 27: bug_w_2
939 28: drip
940 29: drip {drip_fall}
941 30: blank {drip_stretchB}
942 31: drip {drip_stretch}
943 32: stone {stone_pause}
944 33: bomb {bomb_pause}
945 34: diamond {diamond_pause}
946 35: emerald {emerald_pause}
947 36: wonderwall {wonderwallB}
948 37: nut
949 38: nut {nut_fall}
950 39: nut {nut_pause}
951 40: wheel {wheelB}
952 41: eater_n
953 42: eater_s
954 43: eater_w
955 44: eater_e
956 45: sand_stone
957 46: blank {sand_stonein_2}
958 47: blank {sand_stonein_3}
959 48: blank {sand_stonein_4}
960 49: sand {sand_stonesand_2}
961 50: sand {sand_stonesand_3}
962 51: sand {sand_stonesand_4}
963 52: sand_stone {sand_sandstone_2}
964 53: sand_stone {sand_sandstone_3}
965 54: sand_stone {sand_sandstone_4}
966 55: sand {sand_stonesand_4}
967 56: stone {sand_stoneout_2}
968 57: slide_ew
969 58: slide_ns
970 59: dynamite_1
971 60: dynamite_2
972 61: dynamite_3
973 62: dynamite_4
974 63: acid_s
975 64: exit_1
976 65: exit_2
977 66: exit_3
978 67: balloon
979 68: plant
980 69: spring
981 70: spring {spring_fall}
982 71: spring {spring_w}
983 72: spring {spring_e}
984 73: ball_1
985 74: ball_2
986 75: android
987 76: pause {}
988 77: android {android_n_1}
989 78: android {android_n_2}
990 79: android {android_s_1}
991 80: android {android_s_2}
992 81: android {android_e_1}
993 82: android {android_e_2}
994 83: android {android_w_1}
995 84: android {android_w_2}
996 85: fake_blank {}
997 86: fake_blank {}
998 87: fake_blank {}
999 88: fake_blank {}
1000 89: fake_blank {}
1001 90: fake_blank {}
1002 91: fake_blank {}
1003 92: fake_blank {}
1004 93: fake_blank {}
1005 94: fake_blank {}
1006 95: fake_blank {}
1007 96: fake_blank {}
1008 97: fake_blank {}
1009 98: fake_blank {}
1010 99: spring {push_spring_w}
1011 100: spring {push_spring_e}
1012 101: plant {acid_1}
1013 102: plant {acid_2}
1014 103: plant {acid_3}
1015 104: plant {acid_4}
1016 105: plant {acid_5}
1017 106: plant {acid_6}
1018 107: plant {acid_7}
1019 108: plant {acid_8}
1020 109: pause {grass_wB}
1021 110: pause {grass_eB}
1022 111: pause {grass_nB}
1023 112: pause {grass_sB}
1024 113: pause {dynamite_blank}
1025 114: nut {push_nut_w}
1026 115: nut {push_nut_e}
1027 116: steel_2 {end of level}
1028 117: pause {}
1029 118: pause {emerald_blank}
1030 119: bomb {push_bomb_w}
1031 120: bomb {push_bomb_e}
1032 121: stone {push_stone_w}
1033 122: stone {push_stone_e}
1034 123: pause {diamond_blank}
1035 124: pause {dirt_wB}
1036 125: pause {dirt_eB}
1037 126: pause {dirt_nB}
1038 127: pause {dirt_sB}
1039
1040 128: blank
1041 129: roundwall_2
1042 130: grass
1043 131: steel_2
1044 132: wall_2
1045 133: key_1
1046 134: key_2
1047 135: key_3
1048 136: key_4
1049 137: door_1
1050 138: door_2
1051 139: door_3
1052 140: door_4
1053 141: dripper
1054 142: fake_door_1
1055 143: fake_door_2
1056 144: fake_door_3
1057 145: fake_door_4
1058 146: wonderwall
1059 147: wheel
1060 148: sand
1061 149: acid_nw
1062 150: acid_ne
1063 151: acid_sw
1064 152: acid_se
1065 153: fake_blank
1066 154: ameuba_1
1067 155: ameuba_2
1068 156: ameuba_3
1069 157: ameuba_4
1070 158: exit
1071 159: alpha_arrow_w
1072 160: fake_grass
1073 161: lenses
1074 162: magnify
1075 163: fake_blank {fake_blankB}
1076 164: fake_grass {fake_grassB}
1077 165: switch
1078 166: switch {switchB}
1079 167: blank {}
1080 168: decor_8
1081 169: decor_9
1082 170: decor_10
1083 171: decor_5
1084 172: alpha_comma
1085 173: alpha_apost
1086 174: alpha_minus
1087 175: dynamite
1088 176: steel_3
1089 177: decor_6
1090 178: decor_7
1091 179: steel_1
1092 180: roundwall_1
1093 181: decor_2
1094 182: decor_4
1095 183: decor_3
1096 184: wind_any
1097 185: wind_e
1098 186: wind_s
1099 187: wind_w
1100 188: wind_n
1101 189: dirt
1102 190: plant {}
1103 191: key_5
1104 192: key_6
1105 193: key_7
1106 194: key_8
1107 195: door_5
1108 196: door_6
1109 197: door_7
1110 198: door_8
1111 199: bumper
1112 200: alpha_a
1113 201: alpha_b
1114 202: alpha_c
1115 203: alpha_d
1116 204: alpha_e
1117 205: alpha_f
1118 206: alpha_g
1119 207: alpha_h
1120 208: alpha_i
1121 209: alpha_j
1122 210: alpha_k
1123 211: alpha_l
1124 212: alpha_m
1125 213: alpha_n
1126 214: alpha_o
1127 215: alpha_p
1128 216: alpha_q
1129 217: alpha_r
1130 218: alpha_s
1131 219: alpha_t
1132 220: alpha_u
1133 221: alpha_v
1134 222: alpha_w
1135 223: alpha_x
1136 224: alpha_y
1137 225: alpha_z
1138 226: alpha_0
1139 227: alpha_1
1140 228: alpha_2
1141 229: alpha_3
1142 230: alpha_4
1143 231: alpha_5
1144 232: alpha_6
1145 233: alpha_7
1146 234: alpha_8
1147 235: alpha_9
1148 236: alpha_perio
1149 237: alpha_excla
1150 238: alpha_colon
1151 239: alpha_quest
1152 240: alpha_arrow_e
1153 241: decor_1
1154 242: fake_door_5
1155 243: fake_door_6
1156 244: fake_door_7
1157 245: fake_door_8
1158 246: fake_blank {}
1159 247: fake_blank {}
1160 248: fake_blank {}
1161 249: fake_blank {}
1162 250: fake_blank {}
1163 251: fake_blank {}
1164 252: fake_blank {}
1165 253: fake_blank {}
1166 254: fake_blank {}
1167 255: fake_blank {}
1168
1169 ----------------------------------------------------------------------
1170
1171 version 5
1172
1173 0: level
1174 2048: eater exp 1
1175 2057: eater exp 2
1176 2066: eater exp 3
1177 2075: eater exp 4
1178 2084: emerald value
1179 2085: diamond value
1180 2086: alien value
1181 2087: tank value
1182 2088: bug value
1183 2089: eater value
1184 2090: nut value
1185 2091: dynamite value
1186 2092: key value
1187 2093: bonus
1188 2094: time
1189 2095: emeralds needed
1190 2096: player 1 pos
1191 2098: player 2 pos
1192 2100: ameuba speed
1193 2102: wonderwall time
1194 2104: wheel time
1195 2106: ID (0xff353030)
1196 2110: SIZE
1197
1198 0: stone
1199 1: stone {stone_fall}
1200 2: diamond
1201 3: diamond {diamond_fall}
1202 4: alien
1203 5: alien {alien_pause}
1204 6: pause {boom_1}
1205 7: pause {boom_2}
1206 8: tank_n_1
1207 9: tank_e_1
1208 10: tank_s_1
1209 11: tank_w_1
1210 12: tank_n_2
1211 13: tank_e_2
1212 14: tank_s_2
1213 15: tank_w_2
1214 16: bomb
1215 17: bomb {bomb_fall}
1216 18: emerald
1217 19: emerald {emerald_fall}
1218 20: bug_n_1
1219 21: bug_e_1
1220 22: bug_s_1
1221 23: bug_w_1
1222 24: bug_n_2
1223 25: bug_e_2
1224 26: bug_s_2
1225 27: bug_w_2
1226 28: drip
1227 29: drip {drip_fall}
1228 30: blank {drip_stretchB}
1229 31: drip {drip_stretch}
1230 32: stone {stone_pause}
1231 33: bomb {bomb_pause}
1232 34: diamond {diamond_pause}
1233 35: emerald {emerald_pause}
1234 36: wonderwall {wonderwallB}
1235 37: nut
1236 38: nut {nut_fall}
1237 39: nut {nut_pause}
1238 40: wheel {wheelB}
1239 41: eater_n
1240 42: eater_s
1241 43: eater_w
1242 44: eater_e
1243 45: sand_stone
1244 46: blank {sand_stonein_2}
1245 47: blank {sand_stonein_3}
1246 48: blank {sand_stonein_4}
1247 49: sand {sand_stonesand_2}
1248 50: sand {sand_stonesand_3}
1249 51: sand {sand_stonesand_4}
1250 52: sand_stone {sand_sandstone_2}
1251 53: sand_stone {sand_sandstone_3}
1252 54: sand_stone {sand_sandstone_4}
1253 55: sand {sand_stonesand_4}
1254 56: stone {sand_stoneout_2}
1255 57: slide_ew
1256 58: slide_ns
1257 59: dynamite_1
1258 60: dynamite_2
1259 61: dynamite_3
1260 62: dynamite_4
1261 63: acid_s
1262 64: exit_1
1263 65: exit_2
1264 66: exit_3
1265 67: balloon
1266 68: plant
1267 69: fake_blank {}
1268 70: fake_blank {}
1269 71: fake_blank {}
1270 72: fake_blank {}
1271 73: fake_blank {}
1272 74: fake_blank {}
1273 75: fake_blank {}
1274 76: fake_blank {}
1275 77: fake_blank {}
1276 78: fake_blank {}
1277 79: fake_blank {}
1278 80: fake_blank {}
1279 81: fake_blank {}
1280 82: fake_blank {}
1281 83: fake_blank {}
1282 84: fake_blank {}
1283 85: fake_blank {}
1284 86: fake_blank {}
1285 87: fake_blank {}
1286 88: fake_blank {}
1287 89: fake_blank {}
1288 90: fake_blank {}
1289 91: fake_blank {}
1290 92: fake_blank {}
1291 93: fake_blank {}
1292 94: fake_blank {}
1293 95: fake_blank {}
1294 96: fake_blank {}
1295 97: fake_blank {}
1296 98: fake_blank {}
1297 99: fake_blank {}
1298 100: fake_blank {}
1299 101: plant {acid_1}
1300 102: plant {acid_2}
1301 103: plant {acid_3}
1302 104: plant {acid_4}
1303 105: plant {acid_5}
1304 106: plant {acid_6}
1305 107: plant {acid_7}
1306 108: plant {acid_8}
1307 109: pause {grass_wB}
1308 110: pause {grass_eB}
1309 111: pause {grass_nB}
1310 112: pause {grass_sB}
1311 113: pause {dynamite_blank}
1312 114: nut {push_nut_w}
1313 115: nut {push_nut_e}
1314 116: steel_2 {end of level}
1315 117: dynamite_4 {boom_2}
1316 118: pause {emerald_blank}
1317 119: bomb {push_bomb_w}
1318 120: bomb {push_bomb_e}
1319 121: stone {push_stone_w}
1320 122: stone {push_stone_e}
1321 123: pause {diamond_blank}
1322 124: pause {dirt_wB}
1323 125: pause {dirt_eB}
1324 126: pause {dirt_nB}
1325 127: pause {dirt_sB}
1326
1327 128: blank
1328 129: roundwall_2
1329 130: grass
1330 131: steel_2
1331 132: wall_2
1332 133: key_1
1333 134: key_2
1334 135: key_3
1335 136: key_4
1336 137: door_1
1337 138: door_2
1338 139: door_3
1339 140: door_4
1340 141: dripper
1341 142: fake_door_1
1342 143: fake_door_2
1343 144: fake_door_3
1344 145: fake_door_4
1345 146: wonderwall
1346 147: wheel
1347 148: sand
1348 149: acid_nw
1349 150: acid_ne
1350 151: acid_sw
1351 152: acid_se
1352 153: fake_blank
1353 154: ameuba_1
1354 155: ameuba_2
1355 156: ameuba_3
1356 157: ameuba_4
1357 158: exit
1358 159: alpha_arrow_w
1359 160: fake_grass
1360 161: fake_blank {}
1361 162: fake_blank {}
1362 163: fake_blank {}
1363 164: fake_blank {}
1364 165: fake_blank {}
1365 166: fake_blank {}
1366 167: blank {}
1367 168: decor_8
1368 169: decor_9
1369 170: decor_10
1370 171: decor_5
1371 172: alpha_comma
1372 173: alpha_apost
1373 174: alpha_minus
1374 175: dynamite
1375 176: steel_3
1376 177: decor_6
1377 178: decor_7
1378 179: steel_1
1379 180: roundwall_1
1380 181: decor_2
1381 182: decor_4
1382 183: decor_3
1383 184: wind_any
1384 185: wind_e
1385 186: wind_s
1386 187: wind_w
1387 188: wind_n
1388 189: dirt
1389 190: plant {}
1390 191: fake_blank {}
1391 192: fake_blank {}
1392 193: fake_blank {}
1393 194: fake_blank {}
1394 195: fake_blank {}
1395 196: fake_blank {}
1396 197: fake_blank {}
1397 198: fake_blank {}
1398 199: fake_blank {}
1399 200: alpha_a
1400 201: alpha_b
1401 202: alpha_c
1402 203: alpha_d
1403 204: alpha_e
1404 205: alpha_f
1405 206: alpha_g
1406 207: alpha_h
1407 208: alpha_i
1408 209: alpha_j
1409 210: alpha_k
1410 211: alpha_l
1411 212: alpha_m
1412 213: alpha_n
1413 214: alpha_o
1414 215: alpha_p
1415 216: alpha_q
1416 217: alpha_r
1417 218: alpha_s
1418 219: alpha_t
1419 220: alpha_u
1420 221: alpha_v
1421 222: alpha_w
1422 223: alpha_x
1423 224: alpha_y
1424 225: alpha_z
1425 226: alpha_0
1426 227: alpha_1
1427 228: alpha_2
1428 229: alpha_3
1429 230: alpha_4
1430 231: alpha_5
1431 232: alpha_6
1432 233: alpha_7
1433 234: alpha_8
1434 235: alpha_9
1435 236: alpha_perio
1436 237: alpha_excla
1437 238: alpha_colon
1438 239: alpha_quest
1439 240: alpha_arrow_e
1440 241: decor_1
1441 242: fake_blank {}
1442 243: fake_blank {}
1443 244: fake_blank {}
1444 245: fake_blank {}
1445 246: fake_blank {}
1446 247: fake_blank {}
1447 248: fake_blank {}
1448 249: fake_blank {}
1449 250: fake_blank {}
1450 251: fake_blank {}
1451 252: fake_blank {}
1452 253: fake_blank {}
1453 254: fake_blank {}
1454 255: fake_blank {}
1455
1456 ----------------------------------------------------------------------
1457
1458 version 4
1459
1460 0: level
1461 2048: eater exp 1
1462 2057: eater exp 2
1463 2066: eater exp 3
1464 2075: eater exp 4
1465 2084: emerald value
1466 2085: diamond value
1467 2086: alien value
1468 2087: tank value
1469 2088: bug value
1470 2089: eater value
1471 2090: nut value
1472 2091: dynamite value
1473 2092: key value
1474 2093: bonus
1475 2094: time
1476 2095: emeralds needed
1477 2096: player 1 pos
1478 2098: player 2 pos
1479 2100: ameuba speed
1480 2102: wonderwall time
1481 2104: wheel time
1482 2106: SIZE
1483
1484 0: blank
1485 1: emerald
1486 2: diamond
1487 3: stone
1488 4: alien
1489 5: tank_n_1
1490 6: bomb
1491 7: bug_n_1
1492 8: drip
1493 9: nut
1494 10: eater_n
1495 11: sand_stone
1496 12: grass
1497 13: roundwall_1
1498 14: steel_1
1499 15: wall_1
1500 16: key_1
1501 17: key_2
1502 18: key_3
1503 19: key_4
1504 20: wonderwall
1505 21: wheel
1506 22: dynamite
1507 23: exit_2 {}
1508 24: exit_3 {}
1509 25: exit_1 {}
1510 26: diamond {diamond_shine}
1511 27: emerald {emerald_shine}
1512
1513 0: stone
1514 1: stone {stone_fall}
1515 2: diamond
1516 3: diamond {diamond_fall}
1517 4: alien
1518 5: alien {alien_pause}
1519 6: pause {boom_1}
1520 7: pause {boom_2}
1521 8: tank_n_1
1522 9: tank_e_1
1523 10: tank_s_1
1524 11: tank_w_1
1525 12: tank_n_2
1526 13: tank_e_2
1527 14: tank_s_2
1528 15: tank_w_2
1529 16: bomb
1530 17: bomb {bomb_fall}
1531 18: emerald
1532 19: emerald {emerald_fall}
1533 20: bug_n_1
1534 21: bug_e_1
1535 22: bug_s_1
1536 23: bug_w_1
1537 24: bug_n_2
1538 25: bug_e_2
1539 26: bug_s_2
1540 27: bug_w_2
1541 28: drip
1542 29: drip {drip_fall}
1543 30: blank {drip_stretchB}
1544 31: drip {drip_stretch}
1545 32: stone {stone_pause}
1546 33: bomb {bomb_pause}
1547 34: diamond {diamond_pause}
1548 35: emerald {emerald_pause}
1549 36: wonderwall {wonderwallB}
1550 37: nut
1551 38: nut {nut_fall}
1552 39: nut {nut_pause}
1553 40: wheel {wheelB}
1554 41: eater_n
1555 42: eater_s
1556 43: eater_w
1557 44: eater_e
1558 45: sand_stone
1559 46: blank {sand_stonein_2}
1560 47: blank {sand_stonein_3}
1561 48: blank {sand_stonein_4}
1562 49: sand {sand_stonesand_2}
1563 50: sand {sand_stonesand_3}
1564 51: sand {sand_stonesand_4}
1565 52: sand_stone {sand_sandstone_2}
1566 53: sand_stone {sand_sandstone_3}
1567 54: sand_stone {sand_sandstone_4}
1568 55: sand {sand_stonesand_4}
1569 56: stone {sand_stoneout_2}
1570 57: fake_blank {}
1571 58: fake_blank {}
1572 59: dynamite_1
1573 60: dynamite_2
1574 61: dynamite_3
1575 62: dynamite_4
1576 63: acid_s
1577 64: exit_1
1578 65: exit_2
1579 66: exit_3
1580 67: fake_blank {}
1581 68: fake_blank {}
1582 69: fake_blank {}
1583 70: fake_blank {}
1584 71: fake_blank {}
1585 72: fake_blank {}
1586 73: fake_blank {}
1587 74: fake_blank {}
1588 75: fake_blank {}
1589 76: fake_blank {}
1590 77: fake_blank {}
1591 78: fake_blank
1592 79: fake_blank {}
1593 80: fake_blank {}
1594 81: fake_blank {}
1595 82: fake_blank {}
1596 83: fake_blank {}
1597 84: fake_blank {}
1598 85: fake_blank {}
1599 86: fake_blank {}
1600 87: fake_blank {}
1601 88: fake_blank {}
1602 89: fake_blank {}
1603 90: fake_blank {}
1604 91: fake_blank {}
1605 92: fake_blank {}
1606 93: fake_blank {}
1607 94: fake_blank {}
1608 95: fake_blank {}
1609 96: fake_blank {}
1610 97: fake_blank {}
1611 98: fake_blank {}
1612 99: fake_blank {}
1613 100: fake_blank {}
1614 101: fake_blank {}
1615 102: fake_blank {}
1616 103: fake_blank {}
1617 104: fake_blank {}
1618 105: fake_blank {}
1619 106: fake_blank {}
1620 107: fake_blank {}
1621 108: fake_blank {}
1622 109: fake_blank {}
1623 110: fake_blank {}
1624 111: fake_blank {}
1625 112: fake_blank {}
1626 113: pause {dynamite_blank}
1627 114: nut {push_nut_w}
1628 115: nut {push_nut_e}
1629 116: steel_1 {end of level}
1630 117: dynamite_4 {boom_2}
1631 118: pause {emerald_blank}
1632 119: bomb {push_bomb_w}
1633 120: bomb {push_bomb_e}
1634 121: stone {push_stone_w}
1635 122: stone {push_stone_e}
1636 123: pause {diamond_blank}
1637 124: pause {dirt_wB}
1638 125: pause {dirt_eB}
1639 126: pause {dirt_nB}
1640 127: pause {dirt_sB}
1641
1642 128: blank
1643 129: roundwall_1
1644 130: grass
1645 131: steel_1
1646 132: wall_1
1647 133: key_1
1648 134: key_2
1649 135: key_3
1650 136: key_4
1651 137: door_1
1652 138: door_2
1653 139: door_3
1654 140: door_4
1655 141: dripper {}
1656 142: fake_door_1
1657 143: fake_door_2
1658 144: fake_door_3
1659 145: fake_door_4
1660 146: wonderwall
1661 147: wheel
1662 148: sand
1663 149: acid_nw
1664 150: acid_ne
1665 151: acid_sw
1666 152: acid_se
1667 153: plant {acid_1}
1668 154: ameuba_5
1669 155: ameuba_6
1670 156: ameuba_7
1671 157: ameuba_8
1672 158: exit
1673 159: fake_grass {dirt}
1674 160: fake_grass {dirt}
1675 161: fake_grass {dirt}
1676 162: fake_grass {dirt}
1677 163: fake_grass {dirt}
1678 164: fake_grass {dirt}
1679 165: fake_grass {dirt}
1680 166: fake_grass {dirt}
1681 167: fake_grass {dirt}
1682 168: fake_grass {dirt}
1683 169: fake_grass {dirt}
1684 170: fake_grass {dirt}
1685 171: fake_grass {dirt}
1686 172: fake_grass {dirt}
1687 173: fake_grass {dirt}
1688 174: fake_grass {dirt}
1689 175: dynamite
1690 176: fake_blank {}
1691 177: fake_blank {}
1692 178: fake_blank {}
1693 179: fake_blank {}
1694 180: fake_blank {}
1695 181: fake_blank {}
1696 182: fake_blank {}
1697 183: fake_blank {}
1698 184: fake_blank {}
1699 185: fake_blank {}
1700 186: fake_blank {}
1701 187: fake_blank {}
1702 188: fake_blank {}
1703 189: fake_blank {}
1704 190: plant {}
1705 191: fake_blank {}
1706 192: fake_blank {}
1707 193: fake_blank {}
1708 194: fake_blank {}
1709 195: fake_blank {}
1710 196: fake_blank {}
1711 197: fake_blank {}
1712 198: fake_blank {}
1713 199: fake_blank {}
1714 200: alpha_a
1715 201: alpha_b
1716 202: alpha_c
1717 203: alpha_d
1718 204: alpha_e
1719 205: alpha_f
1720 206: alpha_g
1721 207: alpha_h
1722 208: alpha_i
1723 209: alpha_j
1724 210: alpha_k
1725 211: alpha_l
1726 212: alpha_m
1727 213: alpha_n
1728 214: alpha_o
1729 215: alpha_p
1730 216: alpha_q
1731 217: alpha_r
1732 218: alpha_s
1733 219: alpha_t
1734 220: alpha_u
1735 221: alpha_v
1736 222: alpha_w
1737 223: alpha_x
1738 224: alpha_y
1739 225: alpha_z
1740 226: alpha_0
1741 227: alpha_1
1742 228: alpha_2
1743 229: alpha_3
1744 230: alpha_4
1745 231: alpha_5
1746 232: alpha_6
1747 233: alpha_7
1748 234: alpha_8
1749 235: alpha_9
1750 236: alpha_perio
1751 237: alpha_excla
1752 238: alpha_colon
1753 239: alpha_quest
1754 240: alpha_arrow_e {}
1755 241: decor_1 {alpha_copyr}
1756 242: fake_blank {}
1757 243: fake_blank {}
1758 244: fake_blank {}
1759 245: fake_blank {}
1760 246: fake_blank {}
1761 247: fake_blank {}
1762 248: fake_blank {}
1763 249: fake_blank {}
1764 250: fake_blank {}
1765 251: fake_blank {}
1766 252: fake_blank {}
1767 253: fake_blank {}
1768 254: fake_blank {}
1769 255: fake_blank {}
1770
1771 ----------------------------------------------------------------------
1772 */