changed order of cave parameter initializations in EM engine
[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 #define PUT_BE16(x, y)          {(&x)[0] = (y) >> 8; (&x)[1] = (y) & 0xff;}
45
46 static const short map_emc[256] =
47 {
48   Xstone,               Xstone,         Xdiamond,       Xdiamond,
49   Xalien,               Xalien,         Xblank,         Xblank,
50   Xtank_1_n,            Xtank_1_e,      Xtank_1_s,      Xtank_1_w,
51   Xtank_2_n,            Xtank_2_e,      Xtank_2_s,      Xtank_2_w,
52
53   Xbomb,                Xbomb,          Xemerald,       Xemerald,
54   Xbug_1_n,             Xbug_1_e,       Xbug_1_s,       Xbug_1_w,
55   Xbug_2_n,             Xbug_2_e,       Xbug_2_s,       Xbug_2_w,
56   Xdrip,                Xdrip,          Xdrip,          Xdrip,
57
58   Xstone,               Xbomb,          Xdiamond,       Xemerald,
59   Xwonderwall,          Xnut,           Xnut,           Xnut,
60   Xwheel,               Xeater_n,       Xeater_s,       Xeater_w,
61   Xeater_e,             Xsand_stone,    Xblank,         Xblank,
62
63   Xblank,               Xsand,          Xsand,          Xsand,
64   Xsand_stone,          Xsand_stone,    Xsand_stone,    Xsand,
65   Xstone,               Xslide_ew,      Xslide_ns,      Xdynamite_1,
66   Xdynamite_2,          Xdynamite_3,    Xdynamite_4,    Xacid_s,
67
68   Xexit_1,              Xexit_2,        Xexit_3,        Xballoon,
69   Xplant,               Xspring,        Xspring_fall,   Xspring_w,
70   Xspring_e,            Xball_1,        Xball_2,        Xandroid,
71   Xblank,               Xandroid,       Xandroid,       Xandroid,
72
73   Xandroid,             Xandroid,       Xandroid,       Xandroid,
74   Xandroid,             Xblank,         Xblank,         Xblank,
75   Xblank,               Xblank,         Xblank,         Xblank,
76   Xblank,               Xblank,         Xblank,         Xblank,
77
78   Xblank,               Xblank,         Xblank,         Xpush_spring_w,
79   Xpush_spring_e,       Xacid_1,        Xacid_2,        Xacid_3,
80   Xacid_4,              Xacid_5,        Xacid_6,        Xacid_7,
81   Xacid_8,              Xblank,         Xblank,         Xblank,
82
83   Xblank,               Xblank,         Xpush_nut_w,    Xpush_nut_e,
84   Xsteel_1,             Xblank,         Xblank,         Xpush_bomb_w,
85   Xpush_bomb_e,         Xpush_stone_w,  Xpush_stone_e,  Xblank,
86   Xblank,               Xblank,         Xblank,         Xblank,
87
88   Xblank,               Xroundwall_1,   Xgrass,         Xsteel_1,
89   Xwall_1,              Xkey_1,         Xkey_2,         Xkey_3,
90   Xkey_4,               Xdoor_1,        Xdoor_2,        Xdoor_3,
91   Xdoor_4,              Xfake_amoeba,   Xfake_door_1,   Xfake_door_2,
92
93   Xfake_door_3,         Xfake_door_4,   Xwonderwall,    Xwheel,
94   Xsand,                Xacid_nw,       Xacid_ne,       Xacid_sw,
95   Xacid_se,             Xfake_blank,    Xamoeba_1,      Xamoeba_2,
96   Xamoeba_3,            Xamoeba_4,      Xexit,          Xalpha_arrow_w,
97
98   Xfake_grass,          Xlenses,        Xmagnify,       Xfake_blank,
99   Xfake_grass,          Xswitch,        Xswitch,        Xblank,
100   Xdecor_8,             Xdecor_9,       Xdecor_10,      Xdecor_5,
101   Xalpha_comma,         Xalpha_quote,   Xalpha_minus,   Xdynamite,
102
103   Xsteel_3,             Xdecor_6,       Xdecor_7,       Xsteel_2,
104   Xroundwall_2,         Xdecor_2,       Xdecor_4,       Xdecor_3,
105   Xwind_any,            Xwind_e,        Xwind_s,        Xwind_w,
106   Xwind_n,              Xdirt,          Xplant,         Xkey_5,
107
108   Xkey_6,               Xkey_7,         Xkey_8,         Xdoor_5,
109   Xdoor_6,              Xdoor_7,        Xdoor_8,        Xbumper,
110   Xalpha_a,             Xalpha_b,       Xalpha_c,       Xalpha_d,
111   Xalpha_e,             Xalpha_f,       Xalpha_g,       Xalpha_h,
112
113   Xalpha_i,             Xalpha_j,       Xalpha_k,       Xalpha_l,
114   Xalpha_m,             Xalpha_n,       Xalpha_o,       Xalpha_p,
115   Xalpha_q,             Xalpha_r,       Xalpha_s,       Xalpha_t,
116   Xalpha_u,             Xalpha_v,       Xalpha_w,       Xalpha_x,
117
118   Xalpha_y,             Xalpha_z,       Xalpha_0,       Xalpha_1,
119   Xalpha_2,             Xalpha_3,       Xalpha_4,       Xalpha_5,
120   Xalpha_6,             Xalpha_7,       Xalpha_8,       Xalpha_9,
121   Xalpha_perio,         Xalpha_excla,   Xalpha_colon,   Xalpha_quest,
122
123   Xalpha_arrow_e,       Xdecor_1,       Xfake_door_5,   Xfake_door_6,
124   Xfake_door_7,         Xfake_door_8,   Xblank,         Xblank,
125   Xblank,               Xblank,         Xblank,         Xblank,
126   Xblank,               Xblank,         Xalpha_copyr,   Xfake_acid_1
127 };
128
129 static int get_em_element(unsigned short em_element_raw, int file_version)
130 {
131   int em_element = map_emc[em_element_raw];
132
133   if (file_version < FILE_VERSION_EM_V5)
134   {
135     /* versions below V5 had no grass, but only sand/dirt */
136     if (em_element == Xgrass)
137       em_element = Xdirt;
138   }
139
140   return em_element;
141 }
142
143 void convert_em_level(unsigned char *src, int file_version)
144 {
145   static int eater_offset[8] =
146   {
147     2048, 2057, 2066, 2075,
148     2112, 2121, 2130, 2139
149   };
150   int i, x, y, temp;
151
152   /* common to all emc caves */
153
154   lev.time_seconds = GET_BE16(src[2110]);
155   if (lev.time_seconds > 9999)
156     lev.time_seconds = 9999;
157
158   lev.required_initial = src[2095];
159
160   /* scores */
161
162   lev.emerald_score     = src[2084];
163   lev.diamond_score     = src[2085];
164   lev.alien_score       = src[2086];
165   lev.tank_score        = src[2087];
166   lev.bug_score         = src[2088];
167   lev.eater_score       = src[2089];
168   lev.nut_score         = src[2090];
169   lev.dynamite_score    = src[2091];
170   lev.key_score         = src[2092];
171   lev.exit_score        = src[2093] * 8 / 5;
172
173   lev.lenses_score      = src[2151];
174   lev.magnify_score     = src[2152];
175   lev.slurp_score       = src[2153];
176
177   /* times */
178
179   lev.android_move_time  = GET_BE16(src[2164]);
180   lev.android_clone_time = GET_BE16(src[2166]);
181   lev.ball_time          = GET_BE16(src[2160]);
182
183   lev.lenses_time       = GET_BE16(src[2154]);
184   lev.magnify_time      = GET_BE16(src[2156]);
185   lev.wheel_time        = GET_BE16(src[2104]);
186
187   temp = GET_BE16(src[2100]) * 28;
188   if (temp > 9999)
189     temp = 9999;
190   lev.amoeba_time = temp;
191
192   lev.wonderwall_time_initial = GET_BE16(src[2102]);
193
194   lev.wind_cnt_initial = src[2149] & 15 ? lev.wind_time : 0;
195   temp = src[2149];
196   lev.wind_direction_initial = (temp & 8 ? 0 :
197                                 temp & 1 ? 1 :
198                                 temp & 2 ? 2 :
199                                 temp & 4 ? 3 : 0);
200   /* global flags */
201
202   lev.ball_random        = src[2162] & 1   ? 1 : 0;
203   lev.ball_state_initial = src[2162] & 128 ? 1 : 0;
204
205   for (temp = 1; temp < 2047; temp++)
206   {
207     switch (src[temp])
208     {
209       case 36:                                  /* wonderwall */
210         lev.wonderwall_state_initial = 1;
211         lev.wonderwall_time_initial = 9999;
212         break;
213
214       case 40:                                  /* wheel */
215         lev.wheel_x_initial = temp & 63;
216         lev.wheel_y_initial = temp >> 6;
217         lev.wheel_cnt_initial = lev.wheel_time;
218         break;
219
220       case 163:                                 /* fake blank */
221         lev.lenses_cnt_initial = 9999;
222         break;
223
224       case 164:                                 /* fake grass */
225         lev.magnify_cnt_initial = 9999;
226         break;
227     }
228   }
229
230   /* android */
231
232   temp = GET_BE16(src[2168]);
233
234   lev.android_emerald   = (temp & 1)    != 0;
235   lev.android_diamond   = (temp & 2)    != 0;
236   lev.android_stone     = (temp & 4)    != 0;
237   lev.android_bomb      = (temp & 8)    != 0;
238   lev.android_nut       = (temp & 16)   != 0;
239   lev.android_tank      = (temp & 32)   != 0;
240   lev.android_eater     = (temp & 64)   != 0;
241   lev.android_bug       = (temp & 128)  != 0;
242   lev.android_alien     = (temp & 256)  != 0;
243   lev.android_spring    = (temp & 512)  != 0;
244   lev.android_balloon   = (temp & 1024) != 0;
245   lev.android_amoeba    = (temp & 2048) != 0;
246   lev.android_dynamite  = (temp & 4096) != 0;
247
248   /* eaters */
249
250   for (i = 0; i < 8; i++)
251     for (x = 0; x < 9; x++)
252       lev.eater_array[i][x] =
253         get_em_element(src[eater_offset[i] + x], file_version);
254
255   /* ball */
256
257   temp = get_em_element(src[2159], file_version);
258
259   for (y = 0; y < 8; y++)
260   {
261     if (src[2162] & 1)
262     {
263       for (x = 0; x < 8; x++)
264         lev.ball_array[y][x] = temp;
265     }
266     else
267     {
268       lev.ball_array[y][1] = (src[2163] & 1)  ? temp : Xblank; /* north */
269       lev.ball_array[y][6] = (src[2163] & 2)  ? temp : Xblank; /* south */
270       lev.ball_array[y][3] = (src[2163] & 4)  ? temp : Xblank; /* west */
271       lev.ball_array[y][4] = (src[2163] & 8)  ? temp : Xblank; /* east */
272       lev.ball_array[y][7] = (src[2163] & 16) ? temp : Xblank; /* southeast */
273       lev.ball_array[y][5] = (src[2163] & 32) ? temp : Xblank; /* southwest */
274       lev.ball_array[y][2] = (src[2163] & 64) ? temp : Xblank; /* northeast */
275       lev.ball_array[y][0] = (src[2163] & 128)? temp : Xblank; /* northwest */
276     }
277   }
278
279   /* players */
280
281   for (i = 0; i < 2; i++)
282   {
283     temp = GET_BE16(src[2096 + i * 2]);
284
285     ply[i].x_initial = (temp & 63);
286     ply[i].y_initial = (temp >> 6 & 31);
287   }
288
289   /* cave */
290
291   /* first fill the complete playfield with the default border element */
292   for (y = 0; y < CAVE_HEIGHT; y++)
293     for (x = 0; x < CAVE_WIDTH; x++)
294       native_em_level.cave[x][y] = Zborder;
295
296   /* then copy the real level contents from level file into the playfield */
297   temp = 0;
298   for (y = 0; y < lev.height; y++)
299     for (x = 0; x < lev.width; x++)
300       native_em_level.cave[x][y] =
301         get_em_element(src[temp++], file_version);
302
303   /* at last, set the two players at their positions in the playfield */
304   /* (native EM[C] levels always have exactly two players in a level) */
305   for (i = 0; i < 2; i++)
306     native_em_level.cave[ply[i].x_initial][ply[i].y_initial] = Zplayer;
307
308   native_em_level.file_version = file_version;
309 }
310
311
312 /* convert all emerald mine caves to emc version 6 cave format.
313  *
314  * caves are filtered to get rid of invalid or unsupported tiles.
315  *
316  * although the result is a somewhat clean cave, it is meant only
317  * to give a common structure for the binary cave format. it is not
318  * for archiving purposes (it is better to keep the raw cave as-is)
319  * and it is not meant for serializing (the intermediate structure
320  * is better defined).
321  *
322  * acid top is added to acid bottom in both the cave and the eaters.
323  * fake acid (only in v4) does not exist because it adds nothing to
324  * the game, and is different even in different versions of the emc
325  * player.
326  *
327  * v4/v5 time is converted to 10x old time (as it should be).
328  * the reason the kingsoft player used 5x time was copy protection.
329  *
330  * note: emc v6 converter has an error in converting v4 eaters to the
331  * wrong bug(24 instead of 20) and tank(12 instead of 8).
332  */
333
334 static const unsigned char map_v6[256] =
335 {
336   /* filter for v6 */
337
338   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
339   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
340   0,16,2,18,       36,37,37,37,     40,41,42,43,     44,45,128,128,
341   128,148,148,     148,45,45,45,    148,0,57,58,     59,60,61,62,63,
342
343   64,65,66,67,     68,69,69,71,     72,73,74,75,     118,75,75,75,
344   75,75,75,75,     75,153,153,153,  153,153,153,153, 153,153,153,153,
345   153,153,153,99,  100,68,68,68,    68,68,68,68,     68,118,118,118,
346   118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
347
348   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
349   144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
350   160,161,162,163, 164,165,165,118, 168,169,170,171, 172,173,174,175,
351   176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,68,191,
352
353   192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207,
354   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
355   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
356   240,241,242,243, 244,245,153,153, 153,153,153,153, 153,153,153,153
357 };
358
359 static const unsigned char map_v5[256] =
360 {
361   /* filter for v5 */
362
363   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
364   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
365   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,
366   128,148,148,148, 45,45,45,148,    0,57,58,59,      60,61,62,63,
367
368   64,65,66,67,     68,153,153,153,  153,153,153,153, 153,153,153,153,
369   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
370   153,153,153,153, 153,68,68,68,    68,68,68,68,     68,118,118,118,
371   118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
372
373   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
374   144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
375   160,153,153,153, 153,153,153,118, 168,169,170,171, 172,173,174,175,
376   176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,68,153,
377
378   153,153,153,153, 153,153,153,153, 200,201,202,203, 204,205,206,207,
379   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
380   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
381   240,241,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153
382 };
383
384 static const unsigned char map_v4[256] =
385 {
386   /* filter for v4 */
387
388   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
389   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
390   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,
391   128,148,148,148, 45,45,45,148,    0,153,153,59,    60,61,62,63,
392
393   64,65,66,153,    153,153,153,153, 153,153,153,153, 153,153,153,153,
394   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
395   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
396   153,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
397
398   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
399   144,145,146,147, 148,149,150,151, 152,68,154,155,  156,157,158,160,
400   160,160,160,160, 160,160,160,160, 160,160,160,160, 160,160,160,175,
401   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,68,153,
402
403   153,153,153,153, 153,153,153,153, 200,201,202,203, 204,205,206,207,
404   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
405   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
406   240,241,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153
407 };
408
409 static const unsigned char map_v4_eater[32] =
410 {
411   /* filter for v4 eater */
412
413   128,18,2,0,      4,8,16,20,       28,37,41,45,     130,129,131,132,
414   133,134,135,136, 146,147,175,65,  66,64,2,18,      128,128,128,128
415 };
416
417 static boolean filename_has_v1_format(char *filename)
418 {
419   char *basename = getBaseNamePtr(filename);
420
421   return (strlen(basename) == 3 &&
422           basename[0] == 'a' &&
423           basename[1] >= 'a' && basename[1] <= 'k' &&
424           basename[2] >= '0' && basename[2] <= '9');
425 }
426
427 int cleanup_em_level(unsigned char *src, int length, char *filename)
428 {
429   int file_version = FILE_VERSION_EM_UNKNOWN;
430   int i;
431
432   if (length >= 2172 &&
433       src[2106] == 255 &&               /* version id: */
434       src[2107] == 54 &&                /* '6' */
435       src[2108] == 48 &&                /* '0' */
436       src[2109] == 48)                  /* '0' */
437   {
438     /* ---------- this cave has V6 file format ---------- */
439     file_version = FILE_VERSION_EM_V6;
440
441     /* remap elements to internal EMC level format */
442     for (i = 0; i < 2048; i++)
443       src[i] = map_v6[src[i]];
444     for (i = 2048; i < 2084; i++)
445       src[i] = map_v6[src[i]];
446     for (i = 2112; i < 2148; i++)
447       src[i] = map_v6[src[i]];
448   }
449   else if (length >= 2110 &&
450            src[2106] == 255 &&          /* version id: */
451            src[2107] == 53 &&           /* '5' */
452            src[2108] == 48 &&           /* '0' */
453            src[2109] == 48)             /* '0' */
454   {
455     /* ---------- this cave has V5 file format ---------- */
456     file_version = FILE_VERSION_EM_V5;
457
458     /* remap elements to internal EMC level format */
459     for (i = 0; i < 2048; i++)
460       src[i] = map_v5[src[i]];
461     for (i = 2048; i < 2084; i++)
462       src[i] = map_v5[src[i]];
463     for (i = 2112; i < 2148; i++)
464       src[i] = src[i - 64];
465   }
466   else if (length >= 2106 &&
467            (src[1983] == 27 ||          /* encrypted (only EM I/II/III) */
468             src[1983] == 116 ||         /* unencrypted (usual case) */
469             src[1983] == 131))          /* unencrypted (rare case) */
470   {
471     /* ---------- this cave has V1, V2 or V3 file format ---------- */
472
473     boolean fix_copyright = FALSE;
474
475     /*
476       byte at position 1983 (0x07bf) is used as "magic byte":
477       - 27  (0x1b)      => encrypted level (V3 only / Kingsoft original games)
478       - 116 (0x74)      => unencrypted level (byte is corrected to 131 (0x83))
479       - 131 (0x83)      => unencrypted level (happens only in very rare cases)
480     */
481
482     if (src[1983] == 27)        /* (0x1b) -- after decryption: 116 (0x74) */
483     {
484       /* this is original (encrypted) Emerald Mine I, II or III level file */
485
486       int first_byte = src[0];
487       unsigned char code0 = 0x65;
488       unsigned char code1 = 0x11;
489
490       /* decode encrypted level data */
491       for (i = 0; i < 2106; i++)
492       {
493         src[i] ^= code0;
494         src[i] -= code1;
495
496         code0 = (code0 + 7) & 0xff;
497       }
498
499       src[1] = 131;             /* needed for all Emerald Mine levels */
500
501       /* first byte is either 0xf1 (EM I and III) or 0xf5 (EM II) */
502       if (first_byte == 0xf5)
503       {
504         src[0] = 131;           /* only needed for Emerald Mine II levels */
505
506         fix_copyright = TRUE;
507       }
508
509       /* ---------- this cave has V3 file format ---------- */
510       file_version = FILE_VERSION_EM_V3;
511     }
512     else if (filename_has_v1_format(filename))
513     {
514       /* ---------- this cave has V1 file format ---------- */
515       file_version = FILE_VERSION_EM_V1;
516     }
517     else
518     {
519       /* ---------- this cave has V2 file format ---------- */
520       file_version = FILE_VERSION_EM_V2;
521     }
522
523     /* remap elements to internal EMC level format */
524     for (i = 0; i < 2048; i++)
525       src[i] = map_v4[src[i]];
526     for (i = 2048; i < 2084; i++)
527       src[i] = map_v4_eater[src[i] >= 28 ? 0 : src[i]];
528     for (i = 2112; i < 2148; i++)
529       src[i] = src[i - 64];
530
531     if (fix_copyright)          /* fix "(c)" sign in Emerald Mine II levels */
532     {
533       for (i = 0; i < 2048; i++)
534         if (src[i] == 241)
535           src[i] = 254;         /* replace 'Xdecor_1' with 'Xalpha_copyr' */
536     }
537   }
538   else
539   {
540     /* ---------- this cave has unknown file format ---------- */
541
542     /* if file has length of old-style level file, print (wrong) magic byte */
543     if (length < 2110)
544       Error(ERR_WARN, "unknown magic byte 0x%02x at position 0x%04x",
545             src[1983], 1983);
546
547     return FILE_VERSION_EM_UNKNOWN;
548   }
549
550   if (file_version < FILE_VERSION_EM_V6)
551   {
552     /* id */
553     src[2106] = 255;            /* version id: */
554     src[2107] = 54;             /* '6' */
555     src[2108] = 48;             /* '0' */
556     src[2109] = 48;             /* '0' */
557
558     /* time */
559     i = src[2094] * 10;
560     /* stored level time of levels for the V2 player was changed to 50% of the
561        time for the V1 player (original V3 levels already considered this) */
562     if (file_version != FILE_VERSION_EM_V1 &&
563         file_version != FILE_VERSION_EM_V3)
564       i /= 2;
565     src[2110] = i >> 8;
566     src[2111] = i;
567
568     for (i = 2148; i < 2172; i++)
569       src[i] = 0;
570
571     /* ball data */
572     src[2159] = 128;
573   }
574
575   /* ---------- at this stage, the cave data always has V6 format ---------- */
576
577   /* fix wheel */
578   for (i = 0; i < 2048; i++)
579     if (src[i] == 40)
580       break;
581   for (i++; i < 2048; i++)
582     if (src[i] == 40)
583       src[i] = 147;
584
585   /* fix acid */
586   for (i = 64; i < 2048; i++)
587     if (src[i] == 63)           /* replace element above 'Xacid_s' ... */
588       src[i - 64] = 101;        /* ... with 'Xacid_1' */
589
590   /* fix acid with no base beneath it (see below for details (*)) */
591   for (i = 64; i < 2048 - 1; i++)
592   {
593     if (file_version <= FILE_VERSION_EM_V2 &&
594         src[i - 64] == 101 && src[i] != 63)     /* acid without base */
595     {
596       if (src[i - 1] == 101 ||                  /* remove acid over acid row */
597           src[i + 1] == 101)
598         src[i - 64] = 6;        /* replace element above with 'Xblank' */
599       else
600         src[i - 64] = 255;      /* replace element above with 'Xfake_acid_1' */
601     }
602   }
603
604   /* fix acid in eater 1 */
605   for (i = 2051; i < 2057; i++)
606     if (src[i] == 63)
607       src[i - 3] = 101;
608
609   /* fix acid in eater 2 */
610   for (i = 2060; i < 2066; i++)
611     if (src[i] == 63)
612       src[i - 3] = 101;
613
614   /* fix acid in eater 3 */
615   for (i = 2069; i < 2075; i++)
616     if (src[i] == 63)
617       src[i - 3] = 101;
618
619   /* fix acid in eater 4 */
620   for (i = 2078; i < 2084; i++)
621     if (src[i] == 63)
622       src[i - 3] = 101;
623
624   /* fix acid in eater 5 */
625   for (i = 2115; i < 2121; i++)
626     if (src[i] == 63)
627       src[i - 3] = 101;
628
629   /* fix acid in eater 6 */
630   for (i = 2124; i < 2130; i++)
631     if (src[i] == 63)
632       src[i - 3] = 101;
633
634   /* fix acid in eater 7 */
635   for (i = 2133; i < 2139; i++)
636     if (src[i] == 63)
637       src[i - 3] = 101;
638
639   /* fix acid in eater 8 */
640   for (i = 2142; i < 2148; i++)
641     if (src[i] == 63)
642       src[i - 3] = 101;
643
644   /* old style time */
645   src[2094] = 0;
646
647   /* player 1 pos */
648   src[2096] &= 7;
649   src[GET_BE16(src[2096])] = 128;
650
651   /* player 2 pos */
652   src[2098] &= 7;
653   src[GET_BE16(src[2098])] = 128;
654
655   /* amoeba speed */
656   if (GET_BE16(src[2100]) > 9999)
657     PUT_BE16(src[2100], 9999);
658
659   /* time wonderwall */
660   if (GET_BE16(src[2102]) > 9999)
661     PUT_BE16(src[2102], 9999);
662
663   /* time */
664   if (GET_BE16(src[2110]) > 9999)
665     PUT_BE16(src[2110], 9999);
666
667   /* wind direction */
668   i = src[2149];
669   i &= 15;
670   i &= -i;
671   src[2149] = i;
672
673   /* time lenses */
674   if (GET_BE16(src[2154]) > 9999)
675     PUT_BE16(src[2154], 9999);
676
677   /* time magnify */
678   if (GET_BE16(src[2156]) > 9999)
679     PUT_BE16(src[2156], 9999);
680
681   /* ball object */
682   src[2158] = 0;
683   src[2159] = map_v6[src[2159]];
684
685   /* ball pause */
686   if (GET_BE16(src[2160]) > 9999)
687     PUT_BE16(src[2160], 9999);
688
689   /* ball data */
690   src[2162] &= 129;
691   if (src[2162] & 1)
692     src[2163] = 0;
693
694   /* android move pause */
695   if (GET_BE16(src[2164]) > 9999)
696     PUT_BE16(src[2164], 9999);
697
698   /* android clone pause */
699   if (GET_BE16(src[2166]) > 9999)
700     PUT_BE16(src[2166], 9999);
701
702   /* android data */
703   src[2168] &= 31;
704
705   /* size of v6 cave */
706   length = 2172;
707
708   if (options.debug)
709     Error(ERR_DEBUG, "EM level file version: %d", file_version);
710
711   return file_version;
712 }
713
714 /*
715 2000-08-20 09:41:18
716 David Tritscher
717
718 structure of emerald mine level disk files
719 ----------------------------------------------------------------------
720
721 if(len >= 2172 && (buf[2106] == 255 && buf[2107] == 54 && buf[2108] == 48 && buf[2109] == 48)) // v6
722 if(len >= 2110 && (buf[2106] == 255 && buf[2107] == 53 && buf[2108] == 48 && buf[2109] == 48)) // v5
723 if(len >= 2106 && (buf[1983] == 116 || buf[2047] == 116)) // v4
724 if(len >= 2106 && (buf[1983] == 27 || buf[2047] == 219)) // v3
725
726 buf[0]=241;buf[1]=248;for(i=0,j=101;i<2106;i++,j+=7)buf[i]=(buf[i]^j)-17; // decrypt
727
728 number of movements (calls to logic) = time * 50 / 8
729
730 {} reserved (but some broken levels use them)
731
732 ----------------------------------------------------------------------
733
734 version 6
735
736 0: level
737 2048: eater exp 1
738 2057: eater exp 2
739 2066: eater exp 3
740 2075: eater exp 4
741 2084: emerald value
742 2085: diamond value
743 2086: alien value
744 2087: tank value
745 2088: bug value
746 2089: eater value
747 2090: nut value
748 2091: dynamite value
749 2092: key value
750 2093: bonus
751 2094
752 2095: emeralds needed
753 2096: player 1 pos
754 2098: player 2 pos
755 2100: ameuba speed
756 2102: wonderwall time
757 2104: wheel time
758 2106: ID (0xff363030)
759 2110: time
760 2112: eater exp 5
761 2121: eater exp 6
762 2130: eater exp 7
763 2139: eater exp 8
764 2148: flags bit#7=NOI #6=RIS
765 2149: wind direction bit#0=right #1=down #2=left #3=up
766 2150: cave number bit#7=teamwork
767 2151: lenses value
768 2152: magnify value
769 2153: spring value
770 2154: lenses time
771 2156: magnify time
772 2158
773 2159: ball object
774 2160: ball speed
775 2162: ball info bit#15=switch state #8=random
776 ; bit#0=N #1=S #2=W #3=E #4=SE #5=SW #6=NE #7=NW
777 2164: android move speed
778 2166: android clone speed
779 2168: android data
780 ; bit#0=emerald #1=diamond #2=stone #3=bomb #4=nut #5=tank #6=eater
781 ; #7=bug #8=alien #9=spring #10=balloon #11=ameuba #12=dynamite
782 2170
783 2172: SIZE
784
785 0: stone
786 1: stone {stone_fall}
787 2: diamond
788 3: diamond {diamond_fall}
789 4: alien
790 5: alien {alien_pause}
791 6: pause {boom_1}
792 7: pause {boom_2}
793 8: tank_n_1
794 9: tank_e_1
795 10: tank_s_1
796 11: tank_w_1
797 12: tank_n_2
798 13: tank_e_2
799 14: tank_s_2
800 15: tank_w_2
801 16: bomb
802 17: bomb {bomb_fall}
803 18: emerald
804 19: emerald {emerald_fall}
805 20: bug_n_1
806 21: bug_e_1
807 22: bug_s_1
808 23: bug_w_1
809 24: bug_n_2
810 25: bug_e_2
811 26: bug_s_2
812 27: bug_w_2
813 28: drip
814 29: drip {drip_fall}
815 30: blank {drip_stretchB}
816 31: drip {drip_stretch}
817 32: stone {stone_pause}
818 33: bomb {bomb_pause}
819 34: diamond {diamond_pause}
820 35: emerald {emerald_pause}
821 36: wonderwall {wonderwallB}
822 37: nut
823 38: nut {nut_fall}
824 39: nut {nut_pause}
825 40: wheel {wheelB}
826 41: eater_n
827 42: eater_s
828 43: eater_w
829 44: eater_e
830 45: sand_stone
831 46: blank {sand_stonein_2}
832 47: blank {sand_stonein_3}
833 48: blank {sand_stonein_4}
834 49: sand {sand_stonesand_2}
835 50: sand {sand_stonesand_3}
836 51: sand {sand_stonesand_4}
837 52: sand_stone {sand_sandstone_2}
838 53: sand_stone {sand_sandstone_3}
839 54: sand_stone {sand_sandstone_4}
840 55: sand {sand_stonesand_4}
841 56: stone {sand_stoneout_2}
842 57: slide_ew
843 58: slide_ns
844 59: dynamite_1
845 60: dynamite_2
846 61: dynamite_3
847 62: dynamite_4
848 63: acid_s
849 64: exit_1
850 65: exit_2
851 66: exit_3
852 67: balloon
853 68: plant
854 69: spring
855 70: spring {spring_fall}
856 71: spring {spring_w}
857 72: spring {spring_e}
858 73: ball_1
859 74: ball_2
860 75: android
861 76: pause {}
862 77: android {android_n_1}
863 78: android {android_n_2}
864 79: android {android_s_1}
865 80: android {android_s_2}
866 81: android {android_e_1}
867 82: android {android_e_2}
868 83: android {android_w_1}
869 84: android {android_w_2}
870 85: fake_blank {}
871 86: fake_blank {}
872 87: fake_blank {}
873 88: fake_blank {}
874 89: fake_blank {}
875 90: fake_blank {}
876 91: fake_blank {}
877 92: fake_blank {}
878 93: fake_blank {}
879 94: fake_blank {}
880 95: fake_blank {}
881 96: fake_blank {}
882 97: fake_blank {}
883 98: fake_blank {}
884 99: spring {push_spring_w}
885 100: spring {push_spring_e}
886 101: plant {acid_1}
887 102: plant {acid_2}
888 103: plant {acid_3}
889 104: plant {acid_4}
890 105: plant {acid_5}
891 106: plant {acid_6}
892 107: plant {acid_7}
893 108: plant {acid_8}
894 109: pause {grass_wB}
895 110: pause {grass_eB}
896 111: pause {grass_nB}
897 112: pause {grass_sB}
898 113: pause {dynamite_blank}
899 114: nut {push_nut_w}
900 115: nut {push_nut_e}
901 116: steel_2 {end of level}
902 117: pause {}
903 118: pause {emerald_blank}
904 119: bomb {push_bomb_w}
905 120: bomb {push_bomb_e}
906 121: stone {push_stone_w}
907 122: stone {push_stone_e}
908 123: pause {diamond_blank}
909 124: pause {dirt_wB}
910 125: pause {dirt_eB}
911 126: pause {dirt_nB}
912 127: pause {dirt_sB}
913
914 128: blank
915 129: roundwall_2
916 130: grass
917 131: steel_2
918 132: wall_2
919 133: key_1
920 134: key_2
921 135: key_3
922 136: key_4
923 137: door_1
924 138: door_2
925 139: door_3
926 140: door_4
927 141: dripper
928 142: fake_door_1
929 143: fake_door_2
930 144: fake_door_3
931 145: fake_door_4
932 146: wonderwall
933 147: wheel
934 148: sand
935 149: acid_nw
936 150: acid_ne
937 151: acid_sw
938 152: acid_se
939 153: fake_blank
940 154: ameuba_1
941 155: ameuba_2
942 156: ameuba_3
943 157: ameuba_4
944 158: exit
945 159: alpha_arrow_w
946 160: fake_grass
947 161: lenses
948 162: magnify
949 163: fake_blank {fake_blankB}
950 164: fake_grass {fake_grassB}
951 165: switch
952 166: switch {switchB}
953 167: blank {}
954 168: decor_8
955 169: decor_9
956 170: decor_10
957 171: decor_5
958 172: alpha_comma
959 173: alpha_apost
960 174: alpha_minus
961 175: dynamite
962 176: steel_3
963 177: decor_6
964 178: decor_7
965 179: steel_1
966 180: roundwall_1
967 181: decor_2
968 182: decor_4
969 183: decor_3
970 184: wind_any
971 185: wind_e
972 186: wind_s
973 187: wind_w
974 188: wind_n
975 189: dirt
976 190: plant {}
977 191: key_5
978 192: key_6
979 193: key_7
980 194: key_8
981 195: door_5
982 196: door_6
983 197: door_7
984 198: door_8
985 199: bumper
986 200: alpha_a
987 201: alpha_b
988 202: alpha_c
989 203: alpha_d
990 204: alpha_e
991 205: alpha_f
992 206: alpha_g
993 207: alpha_h
994 208: alpha_i
995 209: alpha_j
996 210: alpha_k
997 211: alpha_l
998 212: alpha_m
999 213: alpha_n
1000 214: alpha_o
1001 215: alpha_p
1002 216: alpha_q
1003 217: alpha_r
1004 218: alpha_s
1005 219: alpha_t
1006 220: alpha_u
1007 221: alpha_v
1008 222: alpha_w
1009 223: alpha_x
1010 224: alpha_y
1011 225: alpha_z
1012 226: alpha_0
1013 227: alpha_1
1014 228: alpha_2
1015 229: alpha_3
1016 230: alpha_4
1017 231: alpha_5
1018 232: alpha_6
1019 233: alpha_7
1020 234: alpha_8
1021 235: alpha_9
1022 236: alpha_perio
1023 237: alpha_excla
1024 238: alpha_colon
1025 239: alpha_quest
1026 240: alpha_arrow_e
1027 241: decor_1
1028 242: fake_door_5
1029 243: fake_door_6
1030 244: fake_door_7
1031 245: fake_door_8
1032 246: fake_blank {}
1033 247: fake_blank {}
1034 248: fake_blank {}
1035 249: fake_blank {}
1036 250: fake_blank {}
1037 251: fake_blank {}
1038 252: fake_blank {}
1039 253: fake_blank {}
1040 254: fake_blank {}
1041 255: fake_blank {}
1042
1043 ----------------------------------------------------------------------
1044
1045 version 5
1046
1047 0: level
1048 2048: eater exp 1
1049 2057: eater exp 2
1050 2066: eater exp 3
1051 2075: eater exp 4
1052 2084: emerald value
1053 2085: diamond value
1054 2086: alien value
1055 2087: tank value
1056 2088: bug value
1057 2089: eater value
1058 2090: nut value
1059 2091: dynamite value
1060 2092: key value
1061 2093: bonus
1062 2094: time
1063 2095: emeralds needed
1064 2096: player 1 pos
1065 2098: player 2 pos
1066 2100: ameuba speed
1067 2102: wonderwall time
1068 2104: wheel time
1069 2106: ID (0xff353030)
1070 2110: SIZE
1071
1072 0: stone
1073 1: stone {stone_fall}
1074 2: diamond
1075 3: diamond {diamond_fall}
1076 4: alien
1077 5: alien {alien_pause}
1078 6: pause {boom_1}
1079 7: pause {boom_2}
1080 8: tank_n_1
1081 9: tank_e_1
1082 10: tank_s_1
1083 11: tank_w_1
1084 12: tank_n_2
1085 13: tank_e_2
1086 14: tank_s_2
1087 15: tank_w_2
1088 16: bomb
1089 17: bomb {bomb_fall}
1090 18: emerald
1091 19: emerald {emerald_fall}
1092 20: bug_n_1
1093 21: bug_e_1
1094 22: bug_s_1
1095 23: bug_w_1
1096 24: bug_n_2
1097 25: bug_e_2
1098 26: bug_s_2
1099 27: bug_w_2
1100 28: drip
1101 29: drip {drip_fall}
1102 30: blank {drip_stretchB}
1103 31: drip {drip_stretch}
1104 32: stone {stone_pause}
1105 33: bomb {bomb_pause}
1106 34: diamond {diamond_pause}
1107 35: emerald {emerald_pause}
1108 36: wonderwall {wonderwallB}
1109 37: nut
1110 38: nut {nut_fall}
1111 39: nut {nut_pause}
1112 40: wheel {wheelB}
1113 41: eater_n
1114 42: eater_s
1115 43: eater_w
1116 44: eater_e
1117 45: sand_stone
1118 46: blank {sand_stonein_2}
1119 47: blank {sand_stonein_3}
1120 48: blank {sand_stonein_4}
1121 49: sand {sand_stonesand_2}
1122 50: sand {sand_stonesand_3}
1123 51: sand {sand_stonesand_4}
1124 52: sand_stone {sand_sandstone_2}
1125 53: sand_stone {sand_sandstone_3}
1126 54: sand_stone {sand_sandstone_4}
1127 55: sand {sand_stonesand_4}
1128 56: stone {sand_stoneout_2}
1129 57: slide_ew
1130 58: slide_ns
1131 59: dynamite_1
1132 60: dynamite_2
1133 61: dynamite_3
1134 62: dynamite_4
1135 63: acid_s
1136 64: exit_1
1137 65: exit_2
1138 66: exit_3
1139 67: balloon
1140 68: plant
1141 69: fake_blank {}
1142 70: fake_blank {}
1143 71: fake_blank {}
1144 72: fake_blank {}
1145 73: fake_blank {}
1146 74: fake_blank {}
1147 75: fake_blank {}
1148 76: fake_blank {}
1149 77: fake_blank {}
1150 78: fake_blank {}
1151 79: fake_blank {}
1152 80: fake_blank {}
1153 81: fake_blank {}
1154 82: fake_blank {}
1155 83: fake_blank {}
1156 84: fake_blank {}
1157 85: fake_blank {}
1158 86: fake_blank {}
1159 87: fake_blank {}
1160 88: fake_blank {}
1161 89: fake_blank {}
1162 90: fake_blank {}
1163 91: fake_blank {}
1164 92: fake_blank {}
1165 93: fake_blank {}
1166 94: fake_blank {}
1167 95: fake_blank {}
1168 96: fake_blank {}
1169 97: fake_blank {}
1170 98: fake_blank {}
1171 99: fake_blank {}
1172 100: fake_blank {}
1173 101: plant {acid_1}
1174 102: plant {acid_2}
1175 103: plant {acid_3}
1176 104: plant {acid_4}
1177 105: plant {acid_5}
1178 106: plant {acid_6}
1179 107: plant {acid_7}
1180 108: plant {acid_8}
1181 109: pause {grass_wB}
1182 110: pause {grass_eB}
1183 111: pause {grass_nB}
1184 112: pause {grass_sB}
1185 113: pause {dynamite_blank}
1186 114: nut {push_nut_w}
1187 115: nut {push_nut_e}
1188 116: steel_2 {end of level}
1189 117: dynamite_4 {boom_2}
1190 118: pause {emerald_blank}
1191 119: bomb {push_bomb_w}
1192 120: bomb {push_bomb_e}
1193 121: stone {push_stone_w}
1194 122: stone {push_stone_e}
1195 123: pause {diamond_blank}
1196 124: pause {dirt_wB}
1197 125: pause {dirt_eB}
1198 126: pause {dirt_nB}
1199 127: pause {dirt_sB}
1200
1201 128: blank
1202 129: roundwall_2
1203 130: grass
1204 131: steel_2
1205 132: wall_2
1206 133: key_1
1207 134: key_2
1208 135: key_3
1209 136: key_4
1210 137: door_1
1211 138: door_2
1212 139: door_3
1213 140: door_4
1214 141: dripper
1215 142: fake_door_1
1216 143: fake_door_2
1217 144: fake_door_3
1218 145: fake_door_4
1219 146: wonderwall
1220 147: wheel
1221 148: sand
1222 149: acid_nw
1223 150: acid_ne
1224 151: acid_sw
1225 152: acid_se
1226 153: fake_blank
1227 154: ameuba_1
1228 155: ameuba_2
1229 156: ameuba_3
1230 157: ameuba_4
1231 158: exit
1232 159: alpha_arrow_w
1233 160: fake_grass
1234 161: fake_blank {}
1235 162: fake_blank {}
1236 163: fake_blank {}
1237 164: fake_blank {}
1238 165: fake_blank {}
1239 166: fake_blank {}
1240 167: blank {}
1241 168: decor_8
1242 169: decor_9
1243 170: decor_10
1244 171: decor_5
1245 172: alpha_comma
1246 173: alpha_apost
1247 174: alpha_minus
1248 175: dynamite
1249 176: steel_3
1250 177: decor_6
1251 178: decor_7
1252 179: steel_1
1253 180: roundwall_1
1254 181: decor_2
1255 182: decor_4
1256 183: decor_3
1257 184: wind_any
1258 185: wind_e
1259 186: wind_s
1260 187: wind_w
1261 188: wind_n
1262 189: dirt
1263 190: plant {}
1264 191: fake_blank {}
1265 192: fake_blank {}
1266 193: fake_blank {}
1267 194: fake_blank {}
1268 195: fake_blank {}
1269 196: fake_blank {}
1270 197: fake_blank {}
1271 198: fake_blank {}
1272 199: fake_blank {}
1273 200: alpha_a
1274 201: alpha_b
1275 202: alpha_c
1276 203: alpha_d
1277 204: alpha_e
1278 205: alpha_f
1279 206: alpha_g
1280 207: alpha_h
1281 208: alpha_i
1282 209: alpha_j
1283 210: alpha_k
1284 211: alpha_l
1285 212: alpha_m
1286 213: alpha_n
1287 214: alpha_o
1288 215: alpha_p
1289 216: alpha_q
1290 217: alpha_r
1291 218: alpha_s
1292 219: alpha_t
1293 220: alpha_u
1294 221: alpha_v
1295 222: alpha_w
1296 223: alpha_x
1297 224: alpha_y
1298 225: alpha_z
1299 226: alpha_0
1300 227: alpha_1
1301 228: alpha_2
1302 229: alpha_3
1303 230: alpha_4
1304 231: alpha_5
1305 232: alpha_6
1306 233: alpha_7
1307 234: alpha_8
1308 235: alpha_9
1309 236: alpha_perio
1310 237: alpha_excla
1311 238: alpha_colon
1312 239: alpha_quest
1313 240: alpha_arrow_e
1314 241: decor_1
1315 242: fake_blank {}
1316 243: fake_blank {}
1317 244: fake_blank {}
1318 245: fake_blank {}
1319 246: fake_blank {}
1320 247: fake_blank {}
1321 248: fake_blank {}
1322 249: fake_blank {}
1323 250: fake_blank {}
1324 251: fake_blank {}
1325 252: fake_blank {}
1326 253: fake_blank {}
1327 254: fake_blank {}
1328 255: fake_blank {}
1329
1330 ----------------------------------------------------------------------
1331
1332 version 4
1333
1334 0: level
1335 2048: eater exp 1
1336 2057: eater exp 2
1337 2066: eater exp 3
1338 2075: eater exp 4
1339 2084: emerald value
1340 2085: diamond value
1341 2086: alien value
1342 2087: tank value
1343 2088: bug value
1344 2089: eater value
1345 2090: nut value
1346 2091: dynamite value
1347 2092: key value
1348 2093: bonus
1349 2094: time
1350 2095: emeralds needed
1351 2096: player 1 pos
1352 2098: player 2 pos
1353 2100: ameuba speed
1354 2102: wonderwall time
1355 2104: wheel time
1356 2106: SIZE
1357
1358 0: blank
1359 1: emerald
1360 2: diamond
1361 3: stone
1362 4: alien
1363 5: tank_n_1
1364 6: bomb
1365 7: bug_n_1
1366 8: drip
1367 9: nut
1368 10: eater_n
1369 11: sand_stone
1370 12: grass
1371 13: roundwall_1
1372 14: steel_1
1373 15: wall_1
1374 16: key_1
1375 17: key_2
1376 18: key_3
1377 19: key_4
1378 20: wonderwall
1379 21: wheel
1380 22: dynamite
1381 23: exit_2 {}
1382 24: exit_3 {}
1383 25: exit_1 {}
1384 26: diamond {diamond_shine}
1385 27: emerald {emerald_shine}
1386
1387 0: stone
1388 1: stone {stone_fall}
1389 2: diamond
1390 3: diamond {diamond_fall}
1391 4: alien
1392 5: alien {alien_pause}
1393 6: pause {boom_1}
1394 7: pause {boom_2}
1395 8: tank_n_1
1396 9: tank_e_1
1397 10: tank_s_1
1398 11: tank_w_1
1399 12: tank_n_2
1400 13: tank_e_2
1401 14: tank_s_2
1402 15: tank_w_2
1403 16: bomb
1404 17: bomb {bomb_fall}
1405 18: emerald
1406 19: emerald {emerald_fall}
1407 20: bug_n_1
1408 21: bug_e_1
1409 22: bug_s_1
1410 23: bug_w_1
1411 24: bug_n_2
1412 25: bug_e_2
1413 26: bug_s_2
1414 27: bug_w_2
1415 28: drip
1416 29: drip {drip_fall}
1417 30: blank {drip_stretchB}
1418 31: drip {drip_stretch}
1419 32: stone {stone_pause}
1420 33: bomb {bomb_pause}
1421 34: diamond {diamond_pause}
1422 35: emerald {emerald_pause}
1423 36: wonderwall {wonderwallB}
1424 37: nut
1425 38: nut {nut_fall}
1426 39: nut {nut_pause}
1427 40: wheel {wheelB}
1428 41: eater_n
1429 42: eater_s
1430 43: eater_w
1431 44: eater_e
1432 45: sand_stone
1433 46: blank {sand_stonein_2}
1434 47: blank {sand_stonein_3}
1435 48: blank {sand_stonein_4}
1436 49: sand {sand_stonesand_2}
1437 50: sand {sand_stonesand_3}
1438 51: sand {sand_stonesand_4}
1439 52: sand_stone {sand_sandstone_2}
1440 53: sand_stone {sand_sandstone_3}
1441 54: sand_stone {sand_sandstone_4}
1442 55: sand {sand_stonesand_4}
1443 56: stone {sand_stoneout_2}
1444 57: fake_blank {}
1445 58: fake_blank {}
1446 59: dynamite_1
1447 60: dynamite_2
1448 61: dynamite_3
1449 62: dynamite_4
1450 63: acid_s
1451 64: exit_1
1452 65: exit_2
1453 66: exit_3
1454 67: fake_blank {}
1455 68: fake_blank {}
1456 69: fake_blank {}
1457 70: fake_blank {}
1458 71: fake_blank {}
1459 72: fake_blank {}
1460 73: fake_blank {}
1461 74: fake_blank {}
1462 75: fake_blank {}
1463 76: fake_blank {}
1464 77: fake_blank {}
1465 78: fake_blank
1466 79: fake_blank {}
1467 80: fake_blank {}
1468 81: fake_blank {}
1469 82: fake_blank {}
1470 83: fake_blank {}
1471 84: fake_blank {}
1472 85: fake_blank {}
1473 86: fake_blank {}
1474 87: fake_blank {}
1475 88: fake_blank {}
1476 89: fake_blank {}
1477 90: fake_blank {}
1478 91: fake_blank {}
1479 92: fake_blank {}
1480 93: fake_blank {}
1481 94: fake_blank {}
1482 95: fake_blank {}
1483 96: fake_blank {}
1484 97: fake_blank {}
1485 98: fake_blank {}
1486 99: fake_blank {}
1487 100: fake_blank {}
1488 101: fake_blank {}
1489 102: fake_blank {}
1490 103: fake_blank {}
1491 104: fake_blank {}
1492 105: fake_blank {}
1493 106: fake_blank {}
1494 107: fake_blank {}
1495 108: fake_blank {}
1496 109: fake_blank {}
1497 110: fake_blank {}
1498 111: fake_blank {}
1499 112: fake_blank {}
1500 113: pause {dynamite_blank}
1501 114: nut {push_nut_w}
1502 115: nut {push_nut_e}
1503 116: steel_1 {end of level}
1504 117: dynamite_4 {boom_2}
1505 118: pause {emerald_blank}
1506 119: bomb {push_bomb_w}
1507 120: bomb {push_bomb_e}
1508 121: stone {push_stone_w}
1509 122: stone {push_stone_e}
1510 123: pause {diamond_blank}
1511 124: pause {dirt_wB}
1512 125: pause {dirt_eB}
1513 126: pause {dirt_nB}
1514 127: pause {dirt_sB}
1515
1516 128: blank
1517 129: roundwall_1
1518 130: grass
1519 131: steel_1
1520 132: wall_1
1521 133: key_1
1522 134: key_2
1523 135: key_3
1524 136: key_4
1525 137: door_1
1526 138: door_2
1527 139: door_3
1528 140: door_4
1529 141: dripper {}
1530 142: fake_door_1
1531 143: fake_door_2
1532 144: fake_door_3
1533 145: fake_door_4
1534 146: wonderwall
1535 147: wheel
1536 148: sand
1537 149: acid_nw
1538 150: acid_ne
1539 151: acid_sw
1540 152: acid_se
1541 153: plant {acid_1}
1542 154: ameuba_5
1543 155: ameuba_6
1544 156: ameuba_7
1545 157: ameuba_8
1546 158: exit
1547 159: fake_grass {dirt}
1548 160: fake_grass {dirt}
1549 161: fake_grass {dirt}
1550 162: fake_grass {dirt}
1551 163: fake_grass {dirt}
1552 164: fake_grass {dirt}
1553 165: fake_grass {dirt}
1554 166: fake_grass {dirt}
1555 167: fake_grass {dirt}
1556 168: fake_grass {dirt}
1557 169: fake_grass {dirt}
1558 170: fake_grass {dirt}
1559 171: fake_grass {dirt}
1560 172: fake_grass {dirt}
1561 173: fake_grass {dirt}
1562 174: fake_grass {dirt}
1563 175: dynamite
1564 176: fake_blank {}
1565 177: fake_blank {}
1566 178: fake_blank {}
1567 179: fake_blank {}
1568 180: fake_blank {}
1569 181: fake_blank {}
1570 182: fake_blank {}
1571 183: fake_blank {}
1572 184: fake_blank {}
1573 185: fake_blank {}
1574 186: fake_blank {}
1575 187: fake_blank {}
1576 188: fake_blank {}
1577 189: fake_blank {}
1578 190: plant {}
1579 191: fake_blank {}
1580 192: fake_blank {}
1581 193: fake_blank {}
1582 194: fake_blank {}
1583 195: fake_blank {}
1584 196: fake_blank {}
1585 197: fake_blank {}
1586 198: fake_blank {}
1587 199: fake_blank {}
1588 200: alpha_a
1589 201: alpha_b
1590 202: alpha_c
1591 203: alpha_d
1592 204: alpha_e
1593 205: alpha_f
1594 206: alpha_g
1595 207: alpha_h
1596 208: alpha_i
1597 209: alpha_j
1598 210: alpha_k
1599 211: alpha_l
1600 212: alpha_m
1601 213: alpha_n
1602 214: alpha_o
1603 215: alpha_p
1604 216: alpha_q
1605 217: alpha_r
1606 218: alpha_s
1607 219: alpha_t
1608 220: alpha_u
1609 221: alpha_v
1610 222: alpha_w
1611 223: alpha_x
1612 224: alpha_y
1613 225: alpha_z
1614 226: alpha_0
1615 227: alpha_1
1616 228: alpha_2
1617 229: alpha_3
1618 230: alpha_4
1619 231: alpha_5
1620 232: alpha_6
1621 233: alpha_7
1622 234: alpha_8
1623 235: alpha_9
1624 236: alpha_perio
1625 237: alpha_excla
1626 238: alpha_colon
1627 239: alpha_quest
1628 240: alpha_arrow_e {}
1629 241: decor_1 {alpha_copyr}
1630 242: fake_blank {}
1631 243: fake_blank {}
1632 244: fake_blank {}
1633 245: fake_blank {}
1634 246: fake_blank {}
1635 247: fake_blank {}
1636 248: fake_blank {}
1637 249: fake_blank {}
1638 250: fake_blank {}
1639 251: fake_blank {}
1640 252: fake_blank {}
1641 253: fake_blank {}
1642 254: fake_blank {}
1643 255: fake_blank {}
1644
1645 ----------------------------------------------------------------------
1646 */