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