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