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