improved code for loading native EM levels
[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 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 had no grass, but only sand/dirt
450  * - object code 130 (V6 grass) is changed to 189 (V6 dirt)
451  * - object codes are changed in both cave and eater arrays
452  * - only graphical change, as both objects behave the same
453  *
454  * acid with no base beneath it is converted to fake acid
455  * - required for downunder mine 16, level 0 (and others)
456  */
457
458 static const unsigned char map_v6[256] =
459 {
460   /* filter for v6 */
461
462   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
463   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
464   0,16,2,18,       36,37,37,37,     40,41,42,43,     44,45,128,128,
465   128,148,148,     148,45,45,45,    148,0,57,58,     59,60,61,62,63,
466
467   64,65,66,67,     68,69,69,71,     72,73,74,75,     118,75,75,75,
468   75,75,75,75,     75,153,153,153,  153,153,153,153, 153,153,153,153,
469   153,153,153,99,  100,68,68,68,    68,68,68,68,     68,118,118,118,
470   118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
471
472   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
473   144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
474   160,161,162,163, 164,165,165,118, 168,169,170,171, 172,173,174,175,
475   176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,68,191,
476
477   192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207,
478   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
479   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
480   240,241,242,243, 244,245,153,153, 153,153,153,153, 153,153,153,153
481 };
482
483 static const unsigned char map_v5[256] =
484 {
485   /* filter for v5 */
486
487   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
488   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
489   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,
490   128,148,148,148, 45,45,45,148,    0,57,58,59,      60,61,62,63,
491
492   64,65,66,67,     68,153,153,153,  153,153,153,153, 153,153,153,153,
493   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
494   153,153,153,153, 153,68,68,68,    68,68,68,68,     68,118,118,118,
495   118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
496
497   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
498   144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
499   160,153,153,153, 153,153,153,118, 168,169,170,171, 172,173,174,175,
500   176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,68,153,
501
502   153,153,153,153, 153,153,153,153, 200,201,202,203, 204,205,206,207,
503   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
504   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
505   240,241,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153
506 };
507
508 static const unsigned char map_v4[256] =
509 {
510   /* filter for v4 */
511
512   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,
513   16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,
514   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,
515   128,148,148,148, 45,45,45,148,    0,153,153,59,    60,61,62,63,
516
517   64,65,66,153,    153,153,153,153, 153,153,153,153, 153,153,153,153,
518   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
519   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
520   153,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
521
522   128,129,189,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
523   144,145,146,147, 148,149,150,151, 152,68,154,155,  156,157,158,160,
524   160,160,160,160, 160,160,160,160, 160,160,160,160, 160,160,160,175,
525   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,68,153,
526
527   153,153,153,153, 153,153,153,153, 200,201,202,203, 204,205,206,207,
528   208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
529   224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
530   240,241,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153
531 };
532
533 static const unsigned char map_v4_eater[32] =
534 {
535   /* filter for v4 eater */
536
537   128,18,2,0,      4,8,16,20,       28,37,41,45,     189,129,131,132,
538   133,134,135,136, 146,147,175,65,  66,64,2,18,      128,128,128,128
539 };
540
541 static boolean filename_has_v1_format(char *filename)
542 {
543   char *basename = getBaseNamePtr(filename);
544
545   return (strlen(basename) == 3 &&
546           basename[0] == 'a' &&
547           basename[1] >= 'a' && basename[1] <= 'k' &&
548           basename[2] >= '0' && basename[2] <= '9');
549 }
550
551 int cleanup_em_level(unsigned char *src, int length, char *filename)
552 {
553   int file_version = FILE_VERSION_EM_UNKNOWN;
554   int i, j;
555
556   if (length >= 2172 &&
557       src[2106] == 255 &&               /* version id: */
558       src[2107] == 54 &&                /* '6' */
559       src[2108] == 48 &&                /* '0' */
560       src[2109] == 48)                  /* '0' */
561   {
562     /* ---------- this cave has V6 file format ---------- */
563     file_version = FILE_VERSION_EM_V6;
564
565     /* remap elements to internal EMC level format */
566     for (i = 0; i < 2048; i++)          /* cave */
567       src[i] = map_v6[src[i]];
568     for (i = 2048; i < 2084; i++)       /* eaters */
569       src[i] = map_v6[src[i]];
570     for (i = 2112; i < 2148; i++)       /* eaters */
571       src[i] = map_v6[src[i]];
572   }
573   else if (length >= 2110 &&
574            src[2106] == 255 &&          /* version id: */
575            src[2107] == 53 &&           /* '5' */
576            src[2108] == 48 &&           /* '0' */
577            src[2109] == 48)             /* '0' */
578   {
579     /* ---------- this cave has V5 file format ---------- */
580     file_version = FILE_VERSION_EM_V5;
581
582     /* remap elements to internal EMC level format */
583     for (i = 0; i < 2048; i++)          /* cave */
584       src[i] = map_v5[src[i]];
585     for (i = 2048; i < 2084; i++)       /* eaters */
586       src[i] = map_v5[src[i]];
587     for (i = 2112; i < 2148; i++)       /* eaters */
588       src[i] = src[i - 64];
589   }
590   else if (length >= 2106 &&
591            (src[1983] == 27 ||          /* encrypted (only EM I/II/III) */
592             src[1983] == 116 ||         /* unencrypted (usual case) */
593             src[1983] == 131))          /* unencrypted (rare case) */
594   {
595     /* ---------- this cave has V1, V2 or V3 file format ---------- */
596
597     boolean fix_copyright = FALSE;
598
599     /*
600       byte at position 1983 (0x07bf) is used as "magic byte":
601       - 27  (0x1b)      => encrypted level (V3 only / Kingsoft original games)
602       - 116 (0x74)      => unencrypted level (byte is corrected to 131 (0x83))
603       - 131 (0x83)      => unencrypted level (happens only in very rare cases)
604     */
605
606     if (src[1983] == 27)        /* (0x1b) -- after decryption: 116 (0x74) */
607     {
608       /* this is original (encrypted) Emerald Mine I, II or III level file */
609
610       int first_byte = src[0];
611       unsigned char code0 = 0x65;
612       unsigned char code1 = 0x11;
613
614       /* decode encrypted level data */
615       for (i = 0; i < 2106; i++)
616       {
617         src[i] ^= code0;
618         src[i] -= code1;
619
620         code0 = (code0 + 7) & 0xff;
621       }
622
623       src[1] = 131;             /* needed for all Emerald Mine levels */
624
625       /* first byte is either 0xf1 (EM I and III) or 0xf5 (EM II) */
626       if (first_byte == 0xf5)
627       {
628         src[0] = 131;           /* only needed for Emerald Mine II levels */
629
630         fix_copyright = TRUE;
631       }
632
633       /* ---------- this cave has V3 file format ---------- */
634       file_version = FILE_VERSION_EM_V3;
635     }
636     else if (filename_has_v1_format(filename))
637     {
638       /* ---------- this cave has V1 file format ---------- */
639       file_version = FILE_VERSION_EM_V1;
640     }
641     else
642     {
643       /* ---------- this cave has V2 file format ---------- */
644       file_version = FILE_VERSION_EM_V2;
645     }
646
647     /* remap elements to internal EMC level format */
648     for (i = 0; i < 2048; i++)          /* cave */
649       src[i] = map_v4[src[i]];
650     for (i = 2048; i < 2084; i++)       /* eaters */
651       src[i] = map_v4_eater[src[i] % 32];
652     for (i = 2112; i < 2148; i++)       /* eaters */
653       src[i] = src[i - 64];
654
655     if (fix_copyright)          /* fix "(c)" sign in Emerald Mine II levels */
656     {
657       for (i = 0; i < 2048; i++)
658         if (src[i] == 241)
659           src[i] = 254;         /* replace 'Cdecor_1' with 'Calpha_copyr' */
660     }
661   }
662   else
663   {
664     /* ---------- this cave has unknown file format ---------- */
665
666     /* if file has length of old-style level file, print (wrong) magic byte */
667     if (length < 2110)
668       Error(ERR_WARN, "unknown magic byte 0x%02x at position 0x%04x",
669             src[1983], 1983);
670
671     return FILE_VERSION_EM_UNKNOWN;
672   }
673
674   if (file_version < FILE_VERSION_EM_V6)
675   {
676     /* id */
677     src[2106] = 255;            /* version id: */
678     src[2107] = 54;             /* '6' */
679     src[2108] = 48;             /* '0' */
680     src[2109] = 48;             /* '0' */
681
682     /* time */
683     i = src[2094] * 10;
684     /* stored level time of levels for the V2 player was changed to 50% of the
685        time for the V1 player (original V3 levels already considered this) */
686     if (file_version != FILE_VERSION_EM_V1 &&
687         file_version != FILE_VERSION_EM_V3)
688       i /= 2;
689     src[2110] = i >> 8;
690     src[2111] = i;
691
692     for (i = 2148; i < 2172; i++)
693       src[i] = 0;
694
695     /* ball data */
696     src[2159] = 128;
697   }
698
699   /* ---------- at this stage, the cave data always has V6 format ---------- */
700
701   /* fix wheel */
702   for (i = 0; i < 2048; i++)
703     if (src[i] == 40)
704       break;
705   for (i++; i < 2048; i++)
706     if (src[i] == 40)
707       src[i] = 147;
708
709   /* fix acid */
710   for (i = 64; i < 2048; i++)
711     if (src[i] == 63)           /* replace element above 'Cacid_s' ... */
712       src[i - 64] = 101;        /* ... with 'Cacid_1' */
713
714   /* fix acid with no base beneath it (see comment above for details) */
715   for (i = 64; i < 2048 - 1; i++)
716   {
717     if (file_version <= FILE_VERSION_EM_V2 &&
718         src[i - 64] == 101 && src[i] != 63)     /* acid without base */
719     {
720       if (src[i - 1] == 101 ||                  /* remove acid over acid row */
721           src[i + 1] == 101)
722         src[i - 64] = 6;        /* replace element above with 'Cblank' */
723       else
724         src[i - 64] = 255;      /* replace element above with 'Cfake_acid_1' */
725     }
726   }
727
728   /* fix acid in eaters */
729   for (i = 0; i < 8; i++)
730     for (j = 0; j < 6; j++)
731       if (src[eater_offset[i] + j + 3] == 63)
732         src[eater_offset[i] + j] = 101;
733
734   /* old style time */
735   src[2094] = 0;
736
737   /* set cave tile at player position to blank */
738   for (i = 0; i < 2; i++)
739     src[GET_BE16(src[2096 + i * 2]) % 2048] = 128;
740
741   /* wind direction */
742   i = src[2149];
743   i &= 15;
744   i &= -i;
745   src[2149] = i;
746
747   /* ball object */
748   src[2158] = 0;
749   src[2159] = map_v6[src[2159]];
750
751   /* ball data */
752   src[2162] &= 129;
753   if (src[2162] & 1)
754     src[2163] = 0;
755
756   /* android data */
757   src[2168] &= 31;
758
759   /* size of v6 cave */
760   length = 2172;
761
762   if (options.debug)
763     Error(ERR_DEBUG, "EM level file version: %d", file_version);
764
765   return file_version;
766 }
767
768 /*
769 2000-08-20 09:41:18
770 David Tritscher
771
772 structure of emerald mine level disk files
773 ----------------------------------------------------------------------
774
775 if(len >= 2172 && (buf[2106] == 255 && buf[2107] == 54 && buf[2108] == 48 && buf[2109] == 48)) // v6
776 if(len >= 2110 && (buf[2106] == 255 && buf[2107] == 53 && buf[2108] == 48 && buf[2109] == 48)) // v5
777 if(len >= 2106 && (buf[1983] == 116 || buf[2047] == 116)) // v4
778 if(len >= 2106 && (buf[1983] == 27 || buf[2047] == 219)) // v3
779
780 buf[0]=241;buf[1]=248;for(i=0,j=101;i<2106;i++,j+=7)buf[i]=(buf[i]^j)-17; // decrypt
781
782 number of movements (calls to logic) = time * 50 / 8
783
784 {} reserved (but some broken levels use them)
785
786 ----------------------------------------------------------------------
787
788 version 6
789
790 0: level
791 2048: eater exp 1
792 2057: eater exp 2
793 2066: eater exp 3
794 2075: eater exp 4
795 2084: emerald value
796 2085: diamond value
797 2086: alien value
798 2087: tank value
799 2088: bug value
800 2089: eater value
801 2090: nut value
802 2091: dynamite value
803 2092: key value
804 2093: bonus
805 2094
806 2095: emeralds needed
807 2096: player 1 pos
808 2098: player 2 pos
809 2100: ameuba speed
810 2102: wonderwall time
811 2104: wheel time
812 2106: ID (0xff363030)
813 2110: time
814 2112: eater exp 5
815 2121: eater exp 6
816 2130: eater exp 7
817 2139: eater exp 8
818 2148: flags bit#7=NOI #6=RIS
819 2149: wind direction bit#0=right #1=down #2=left #3=up
820 2150: cave number bit#7=teamwork
821 2151: lenses value
822 2152: magnify value
823 2153: spring value
824 2154: lenses time
825 2156: magnify time
826 2158
827 2159: ball object
828 2160: ball speed
829 2162: ball info bit#15=switch state #8=random
830 ; bit#0=N #1=S #2=W #3=E #4=SE #5=SW #6=NE #7=NW
831 2164: android move speed
832 2166: android clone speed
833 2168: android data
834 ; bit#0=emerald #1=diamond #2=stone #3=bomb #4=nut #5=tank #6=eater
835 ; #7=bug #8=alien #9=spring #10=balloon #11=ameuba #12=dynamite
836 2170
837 2172: SIZE
838
839 0: stone
840 1: stone {stone_fall}
841 2: diamond
842 3: diamond {diamond_fall}
843 4: alien
844 5: alien {alien_pause}
845 6: pause {boom_1}
846 7: pause {boom_2}
847 8: tank_n_1
848 9: tank_e_1
849 10: tank_s_1
850 11: tank_w_1
851 12: tank_n_2
852 13: tank_e_2
853 14: tank_s_2
854 15: tank_w_2
855 16: bomb
856 17: bomb {bomb_fall}
857 18: emerald
858 19: emerald {emerald_fall}
859 20: bug_n_1
860 21: bug_e_1
861 22: bug_s_1
862 23: bug_w_1
863 24: bug_n_2
864 25: bug_e_2
865 26: bug_s_2
866 27: bug_w_2
867 28: drip
868 29: drip {drip_fall}
869 30: blank {drip_stretchB}
870 31: drip {drip_stretch}
871 32: stone {stone_pause}
872 33: bomb {bomb_pause}
873 34: diamond {diamond_pause}
874 35: emerald {emerald_pause}
875 36: wonderwall {wonderwallB}
876 37: nut
877 38: nut {nut_fall}
878 39: nut {nut_pause}
879 40: wheel {wheelB}
880 41: eater_n
881 42: eater_s
882 43: eater_w
883 44: eater_e
884 45: sand_stone
885 46: blank {sand_stonein_2}
886 47: blank {sand_stonein_3}
887 48: blank {sand_stonein_4}
888 49: sand {sand_stonesand_2}
889 50: sand {sand_stonesand_3}
890 51: sand {sand_stonesand_4}
891 52: sand_stone {sand_sandstone_2}
892 53: sand_stone {sand_sandstone_3}
893 54: sand_stone {sand_sandstone_4}
894 55: sand {sand_stonesand_4}
895 56: stone {sand_stoneout_2}
896 57: slide_ew
897 58: slide_ns
898 59: dynamite_1
899 60: dynamite_2
900 61: dynamite_3
901 62: dynamite_4
902 63: acid_s
903 64: exit_1
904 65: exit_2
905 66: exit_3
906 67: balloon
907 68: plant
908 69: spring
909 70: spring {spring_fall}
910 71: spring {spring_w}
911 72: spring {spring_e}
912 73: ball_1
913 74: ball_2
914 75: android
915 76: pause {}
916 77: android {android_n_1}
917 78: android {android_n_2}
918 79: android {android_s_1}
919 80: android {android_s_2}
920 81: android {android_e_1}
921 82: android {android_e_2}
922 83: android {android_w_1}
923 84: android {android_w_2}
924 85: fake_blank {}
925 86: fake_blank {}
926 87: fake_blank {}
927 88: fake_blank {}
928 89: fake_blank {}
929 90: fake_blank {}
930 91: fake_blank {}
931 92: fake_blank {}
932 93: fake_blank {}
933 94: fake_blank {}
934 95: fake_blank {}
935 96: fake_blank {}
936 97: fake_blank {}
937 98: fake_blank {}
938 99: spring {push_spring_w}
939 100: spring {push_spring_e}
940 101: plant {acid_1}
941 102: plant {acid_2}
942 103: plant {acid_3}
943 104: plant {acid_4}
944 105: plant {acid_5}
945 106: plant {acid_6}
946 107: plant {acid_7}
947 108: plant {acid_8}
948 109: pause {grass_wB}
949 110: pause {grass_eB}
950 111: pause {grass_nB}
951 112: pause {grass_sB}
952 113: pause {dynamite_blank}
953 114: nut {push_nut_w}
954 115: nut {push_nut_e}
955 116: steel_2 {end of level}
956 117: pause {}
957 118: pause {emerald_blank}
958 119: bomb {push_bomb_w}
959 120: bomb {push_bomb_e}
960 121: stone {push_stone_w}
961 122: stone {push_stone_e}
962 123: pause {diamond_blank}
963 124: pause {dirt_wB}
964 125: pause {dirt_eB}
965 126: pause {dirt_nB}
966 127: pause {dirt_sB}
967
968 128: blank
969 129: roundwall_2
970 130: grass
971 131: steel_2
972 132: wall_2
973 133: key_1
974 134: key_2
975 135: key_3
976 136: key_4
977 137: door_1
978 138: door_2
979 139: door_3
980 140: door_4
981 141: dripper
982 142: fake_door_1
983 143: fake_door_2
984 144: fake_door_3
985 145: fake_door_4
986 146: wonderwall
987 147: wheel
988 148: sand
989 149: acid_nw
990 150: acid_ne
991 151: acid_sw
992 152: acid_se
993 153: fake_blank
994 154: ameuba_1
995 155: ameuba_2
996 156: ameuba_3
997 157: ameuba_4
998 158: exit
999 159: alpha_arrow_w
1000 160: fake_grass
1001 161: lenses
1002 162: magnify
1003 163: fake_blank {fake_blankB}
1004 164: fake_grass {fake_grassB}
1005 165: switch
1006 166: switch {switchB}
1007 167: blank {}
1008 168: decor_8
1009 169: decor_9
1010 170: decor_10
1011 171: decor_5
1012 172: alpha_comma
1013 173: alpha_apost
1014 174: alpha_minus
1015 175: dynamite
1016 176: steel_3
1017 177: decor_6
1018 178: decor_7
1019 179: steel_1
1020 180: roundwall_1
1021 181: decor_2
1022 182: decor_4
1023 183: decor_3
1024 184: wind_any
1025 185: wind_e
1026 186: wind_s
1027 187: wind_w
1028 188: wind_n
1029 189: dirt
1030 190: plant {}
1031 191: key_5
1032 192: key_6
1033 193: key_7
1034 194: key_8
1035 195: door_5
1036 196: door_6
1037 197: door_7
1038 198: door_8
1039 199: bumper
1040 200: alpha_a
1041 201: alpha_b
1042 202: alpha_c
1043 203: alpha_d
1044 204: alpha_e
1045 205: alpha_f
1046 206: alpha_g
1047 207: alpha_h
1048 208: alpha_i
1049 209: alpha_j
1050 210: alpha_k
1051 211: alpha_l
1052 212: alpha_m
1053 213: alpha_n
1054 214: alpha_o
1055 215: alpha_p
1056 216: alpha_q
1057 217: alpha_r
1058 218: alpha_s
1059 219: alpha_t
1060 220: alpha_u
1061 221: alpha_v
1062 222: alpha_w
1063 223: alpha_x
1064 224: alpha_y
1065 225: alpha_z
1066 226: alpha_0
1067 227: alpha_1
1068 228: alpha_2
1069 229: alpha_3
1070 230: alpha_4
1071 231: alpha_5
1072 232: alpha_6
1073 233: alpha_7
1074 234: alpha_8
1075 235: alpha_9
1076 236: alpha_perio
1077 237: alpha_excla
1078 238: alpha_colon
1079 239: alpha_quest
1080 240: alpha_arrow_e
1081 241: decor_1
1082 242: fake_door_5
1083 243: fake_door_6
1084 244: fake_door_7
1085 245: fake_door_8
1086 246: fake_blank {}
1087 247: fake_blank {}
1088 248: fake_blank {}
1089 249: fake_blank {}
1090 250: fake_blank {}
1091 251: fake_blank {}
1092 252: fake_blank {}
1093 253: fake_blank {}
1094 254: fake_blank {}
1095 255: fake_blank {}
1096
1097 ----------------------------------------------------------------------
1098
1099 version 5
1100
1101 0: level
1102 2048: eater exp 1
1103 2057: eater exp 2
1104 2066: eater exp 3
1105 2075: eater exp 4
1106 2084: emerald value
1107 2085: diamond value
1108 2086: alien value
1109 2087: tank value
1110 2088: bug value
1111 2089: eater value
1112 2090: nut value
1113 2091: dynamite value
1114 2092: key value
1115 2093: bonus
1116 2094: time
1117 2095: emeralds needed
1118 2096: player 1 pos
1119 2098: player 2 pos
1120 2100: ameuba speed
1121 2102: wonderwall time
1122 2104: wheel time
1123 2106: ID (0xff353030)
1124 2110: SIZE
1125
1126 0: stone
1127 1: stone {stone_fall}
1128 2: diamond
1129 3: diamond {diamond_fall}
1130 4: alien
1131 5: alien {alien_pause}
1132 6: pause {boom_1}
1133 7: pause {boom_2}
1134 8: tank_n_1
1135 9: tank_e_1
1136 10: tank_s_1
1137 11: tank_w_1
1138 12: tank_n_2
1139 13: tank_e_2
1140 14: tank_s_2
1141 15: tank_w_2
1142 16: bomb
1143 17: bomb {bomb_fall}
1144 18: emerald
1145 19: emerald {emerald_fall}
1146 20: bug_n_1
1147 21: bug_e_1
1148 22: bug_s_1
1149 23: bug_w_1
1150 24: bug_n_2
1151 25: bug_e_2
1152 26: bug_s_2
1153 27: bug_w_2
1154 28: drip
1155 29: drip {drip_fall}
1156 30: blank {drip_stretchB}
1157 31: drip {drip_stretch}
1158 32: stone {stone_pause}
1159 33: bomb {bomb_pause}
1160 34: diamond {diamond_pause}
1161 35: emerald {emerald_pause}
1162 36: wonderwall {wonderwallB}
1163 37: nut
1164 38: nut {nut_fall}
1165 39: nut {nut_pause}
1166 40: wheel {wheelB}
1167 41: eater_n
1168 42: eater_s
1169 43: eater_w
1170 44: eater_e
1171 45: sand_stone
1172 46: blank {sand_stonein_2}
1173 47: blank {sand_stonein_3}
1174 48: blank {sand_stonein_4}
1175 49: sand {sand_stonesand_2}
1176 50: sand {sand_stonesand_3}
1177 51: sand {sand_stonesand_4}
1178 52: sand_stone {sand_sandstone_2}
1179 53: sand_stone {sand_sandstone_3}
1180 54: sand_stone {sand_sandstone_4}
1181 55: sand {sand_stonesand_4}
1182 56: stone {sand_stoneout_2}
1183 57: slide_ew
1184 58: slide_ns
1185 59: dynamite_1
1186 60: dynamite_2
1187 61: dynamite_3
1188 62: dynamite_4
1189 63: acid_s
1190 64: exit_1
1191 65: exit_2
1192 66: exit_3
1193 67: balloon
1194 68: plant
1195 69: fake_blank {}
1196 70: fake_blank {}
1197 71: fake_blank {}
1198 72: fake_blank {}
1199 73: fake_blank {}
1200 74: fake_blank {}
1201 75: fake_blank {}
1202 76: fake_blank {}
1203 77: fake_blank {}
1204 78: fake_blank {}
1205 79: fake_blank {}
1206 80: fake_blank {}
1207 81: fake_blank {}
1208 82: fake_blank {}
1209 83: fake_blank {}
1210 84: fake_blank {}
1211 85: fake_blank {}
1212 86: fake_blank {}
1213 87: fake_blank {}
1214 88: fake_blank {}
1215 89: fake_blank {}
1216 90: fake_blank {}
1217 91: fake_blank {}
1218 92: fake_blank {}
1219 93: fake_blank {}
1220 94: fake_blank {}
1221 95: fake_blank {}
1222 96: fake_blank {}
1223 97: fake_blank {}
1224 98: fake_blank {}
1225 99: fake_blank {}
1226 100: fake_blank {}
1227 101: plant {acid_1}
1228 102: plant {acid_2}
1229 103: plant {acid_3}
1230 104: plant {acid_4}
1231 105: plant {acid_5}
1232 106: plant {acid_6}
1233 107: plant {acid_7}
1234 108: plant {acid_8}
1235 109: pause {grass_wB}
1236 110: pause {grass_eB}
1237 111: pause {grass_nB}
1238 112: pause {grass_sB}
1239 113: pause {dynamite_blank}
1240 114: nut {push_nut_w}
1241 115: nut {push_nut_e}
1242 116: steel_2 {end of level}
1243 117: dynamite_4 {boom_2}
1244 118: pause {emerald_blank}
1245 119: bomb {push_bomb_w}
1246 120: bomb {push_bomb_e}
1247 121: stone {push_stone_w}
1248 122: stone {push_stone_e}
1249 123: pause {diamond_blank}
1250 124: pause {dirt_wB}
1251 125: pause {dirt_eB}
1252 126: pause {dirt_nB}
1253 127: pause {dirt_sB}
1254
1255 128: blank
1256 129: roundwall_2
1257 130: grass
1258 131: steel_2
1259 132: wall_2
1260 133: key_1
1261 134: key_2
1262 135: key_3
1263 136: key_4
1264 137: door_1
1265 138: door_2
1266 139: door_3
1267 140: door_4
1268 141: dripper
1269 142: fake_door_1
1270 143: fake_door_2
1271 144: fake_door_3
1272 145: fake_door_4
1273 146: wonderwall
1274 147: wheel
1275 148: sand
1276 149: acid_nw
1277 150: acid_ne
1278 151: acid_sw
1279 152: acid_se
1280 153: fake_blank
1281 154: ameuba_1
1282 155: ameuba_2
1283 156: ameuba_3
1284 157: ameuba_4
1285 158: exit
1286 159: alpha_arrow_w
1287 160: fake_grass
1288 161: fake_blank {}
1289 162: fake_blank {}
1290 163: fake_blank {}
1291 164: fake_blank {}
1292 165: fake_blank {}
1293 166: fake_blank {}
1294 167: blank {}
1295 168: decor_8
1296 169: decor_9
1297 170: decor_10
1298 171: decor_5
1299 172: alpha_comma
1300 173: alpha_apost
1301 174: alpha_minus
1302 175: dynamite
1303 176: steel_3
1304 177: decor_6
1305 178: decor_7
1306 179: steel_1
1307 180: roundwall_1
1308 181: decor_2
1309 182: decor_4
1310 183: decor_3
1311 184: wind_any
1312 185: wind_e
1313 186: wind_s
1314 187: wind_w
1315 188: wind_n
1316 189: dirt
1317 190: plant {}
1318 191: fake_blank {}
1319 192: fake_blank {}
1320 193: fake_blank {}
1321 194: fake_blank {}
1322 195: fake_blank {}
1323 196: fake_blank {}
1324 197: fake_blank {}
1325 198: fake_blank {}
1326 199: fake_blank {}
1327 200: alpha_a
1328 201: alpha_b
1329 202: alpha_c
1330 203: alpha_d
1331 204: alpha_e
1332 205: alpha_f
1333 206: alpha_g
1334 207: alpha_h
1335 208: alpha_i
1336 209: alpha_j
1337 210: alpha_k
1338 211: alpha_l
1339 212: alpha_m
1340 213: alpha_n
1341 214: alpha_o
1342 215: alpha_p
1343 216: alpha_q
1344 217: alpha_r
1345 218: alpha_s
1346 219: alpha_t
1347 220: alpha_u
1348 221: alpha_v
1349 222: alpha_w
1350 223: alpha_x
1351 224: alpha_y
1352 225: alpha_z
1353 226: alpha_0
1354 227: alpha_1
1355 228: alpha_2
1356 229: alpha_3
1357 230: alpha_4
1358 231: alpha_5
1359 232: alpha_6
1360 233: alpha_7
1361 234: alpha_8
1362 235: alpha_9
1363 236: alpha_perio
1364 237: alpha_excla
1365 238: alpha_colon
1366 239: alpha_quest
1367 240: alpha_arrow_e
1368 241: decor_1
1369 242: fake_blank {}
1370 243: fake_blank {}
1371 244: fake_blank {}
1372 245: fake_blank {}
1373 246: fake_blank {}
1374 247: fake_blank {}
1375 248: fake_blank {}
1376 249: fake_blank {}
1377 250: fake_blank {}
1378 251: fake_blank {}
1379 252: fake_blank {}
1380 253: fake_blank {}
1381 254: fake_blank {}
1382 255: fake_blank {}
1383
1384 ----------------------------------------------------------------------
1385
1386 version 4
1387
1388 0: level
1389 2048: eater exp 1
1390 2057: eater exp 2
1391 2066: eater exp 3
1392 2075: eater exp 4
1393 2084: emerald value
1394 2085: diamond value
1395 2086: alien value
1396 2087: tank value
1397 2088: bug value
1398 2089: eater value
1399 2090: nut value
1400 2091: dynamite value
1401 2092: key value
1402 2093: bonus
1403 2094: time
1404 2095: emeralds needed
1405 2096: player 1 pos
1406 2098: player 2 pos
1407 2100: ameuba speed
1408 2102: wonderwall time
1409 2104: wheel time
1410 2106: SIZE
1411
1412 0: blank
1413 1: emerald
1414 2: diamond
1415 3: stone
1416 4: alien
1417 5: tank_n_1
1418 6: bomb
1419 7: bug_n_1
1420 8: drip
1421 9: nut
1422 10: eater_n
1423 11: sand_stone
1424 12: grass
1425 13: roundwall_1
1426 14: steel_1
1427 15: wall_1
1428 16: key_1
1429 17: key_2
1430 18: key_3
1431 19: key_4
1432 20: wonderwall
1433 21: wheel
1434 22: dynamite
1435 23: exit_2 {}
1436 24: exit_3 {}
1437 25: exit_1 {}
1438 26: diamond {diamond_shine}
1439 27: emerald {emerald_shine}
1440
1441 0: stone
1442 1: stone {stone_fall}
1443 2: diamond
1444 3: diamond {diamond_fall}
1445 4: alien
1446 5: alien {alien_pause}
1447 6: pause {boom_1}
1448 7: pause {boom_2}
1449 8: tank_n_1
1450 9: tank_e_1
1451 10: tank_s_1
1452 11: tank_w_1
1453 12: tank_n_2
1454 13: tank_e_2
1455 14: tank_s_2
1456 15: tank_w_2
1457 16: bomb
1458 17: bomb {bomb_fall}
1459 18: emerald
1460 19: emerald {emerald_fall}
1461 20: bug_n_1
1462 21: bug_e_1
1463 22: bug_s_1
1464 23: bug_w_1
1465 24: bug_n_2
1466 25: bug_e_2
1467 26: bug_s_2
1468 27: bug_w_2
1469 28: drip
1470 29: drip {drip_fall}
1471 30: blank {drip_stretchB}
1472 31: drip {drip_stretch}
1473 32: stone {stone_pause}
1474 33: bomb {bomb_pause}
1475 34: diamond {diamond_pause}
1476 35: emerald {emerald_pause}
1477 36: wonderwall {wonderwallB}
1478 37: nut
1479 38: nut {nut_fall}
1480 39: nut {nut_pause}
1481 40: wheel {wheelB}
1482 41: eater_n
1483 42: eater_s
1484 43: eater_w
1485 44: eater_e
1486 45: sand_stone
1487 46: blank {sand_stonein_2}
1488 47: blank {sand_stonein_3}
1489 48: blank {sand_stonein_4}
1490 49: sand {sand_stonesand_2}
1491 50: sand {sand_stonesand_3}
1492 51: sand {sand_stonesand_4}
1493 52: sand_stone {sand_sandstone_2}
1494 53: sand_stone {sand_sandstone_3}
1495 54: sand_stone {sand_sandstone_4}
1496 55: sand {sand_stonesand_4}
1497 56: stone {sand_stoneout_2}
1498 57: fake_blank {}
1499 58: fake_blank {}
1500 59: dynamite_1
1501 60: dynamite_2
1502 61: dynamite_3
1503 62: dynamite_4
1504 63: acid_s
1505 64: exit_1
1506 65: exit_2
1507 66: exit_3
1508 67: fake_blank {}
1509 68: fake_blank {}
1510 69: fake_blank {}
1511 70: fake_blank {}
1512 71: fake_blank {}
1513 72: fake_blank {}
1514 73: fake_blank {}
1515 74: fake_blank {}
1516 75: fake_blank {}
1517 76: fake_blank {}
1518 77: fake_blank {}
1519 78: fake_blank
1520 79: fake_blank {}
1521 80: fake_blank {}
1522 81: fake_blank {}
1523 82: fake_blank {}
1524 83: fake_blank {}
1525 84: fake_blank {}
1526 85: fake_blank {}
1527 86: fake_blank {}
1528 87: fake_blank {}
1529 88: fake_blank {}
1530 89: fake_blank {}
1531 90: fake_blank {}
1532 91: fake_blank {}
1533 92: fake_blank {}
1534 93: fake_blank {}
1535 94: fake_blank {}
1536 95: fake_blank {}
1537 96: fake_blank {}
1538 97: fake_blank {}
1539 98: fake_blank {}
1540 99: fake_blank {}
1541 100: fake_blank {}
1542 101: fake_blank {}
1543 102: fake_blank {}
1544 103: fake_blank {}
1545 104: fake_blank {}
1546 105: fake_blank {}
1547 106: fake_blank {}
1548 107: fake_blank {}
1549 108: fake_blank {}
1550 109: fake_blank {}
1551 110: fake_blank {}
1552 111: fake_blank {}
1553 112: fake_blank {}
1554 113: pause {dynamite_blank}
1555 114: nut {push_nut_w}
1556 115: nut {push_nut_e}
1557 116: steel_1 {end of level}
1558 117: dynamite_4 {boom_2}
1559 118: pause {emerald_blank}
1560 119: bomb {push_bomb_w}
1561 120: bomb {push_bomb_e}
1562 121: stone {push_stone_w}
1563 122: stone {push_stone_e}
1564 123: pause {diamond_blank}
1565 124: pause {dirt_wB}
1566 125: pause {dirt_eB}
1567 126: pause {dirt_nB}
1568 127: pause {dirt_sB}
1569
1570 128: blank
1571 129: roundwall_1
1572 130: grass
1573 131: steel_1
1574 132: wall_1
1575 133: key_1
1576 134: key_2
1577 135: key_3
1578 136: key_4
1579 137: door_1
1580 138: door_2
1581 139: door_3
1582 140: door_4
1583 141: dripper {}
1584 142: fake_door_1
1585 143: fake_door_2
1586 144: fake_door_3
1587 145: fake_door_4
1588 146: wonderwall
1589 147: wheel
1590 148: sand
1591 149: acid_nw
1592 150: acid_ne
1593 151: acid_sw
1594 152: acid_se
1595 153: plant {acid_1}
1596 154: ameuba_5
1597 155: ameuba_6
1598 156: ameuba_7
1599 157: ameuba_8
1600 158: exit
1601 159: fake_grass {dirt}
1602 160: fake_grass {dirt}
1603 161: fake_grass {dirt}
1604 162: fake_grass {dirt}
1605 163: fake_grass {dirt}
1606 164: fake_grass {dirt}
1607 165: fake_grass {dirt}
1608 166: fake_grass {dirt}
1609 167: fake_grass {dirt}
1610 168: fake_grass {dirt}
1611 169: fake_grass {dirt}
1612 170: fake_grass {dirt}
1613 171: fake_grass {dirt}
1614 172: fake_grass {dirt}
1615 173: fake_grass {dirt}
1616 174: fake_grass {dirt}
1617 175: dynamite
1618 176: fake_blank {}
1619 177: fake_blank {}
1620 178: fake_blank {}
1621 179: fake_blank {}
1622 180: fake_blank {}
1623 181: fake_blank {}
1624 182: fake_blank {}
1625 183: fake_blank {}
1626 184: fake_blank {}
1627 185: fake_blank {}
1628 186: fake_blank {}
1629 187: fake_blank {}
1630 188: fake_blank {}
1631 189: fake_blank {}
1632 190: plant {}
1633 191: fake_blank {}
1634 192: fake_blank {}
1635 193: fake_blank {}
1636 194: fake_blank {}
1637 195: fake_blank {}
1638 196: fake_blank {}
1639 197: fake_blank {}
1640 198: fake_blank {}
1641 199: fake_blank {}
1642 200: alpha_a
1643 201: alpha_b
1644 202: alpha_c
1645 203: alpha_d
1646 204: alpha_e
1647 205: alpha_f
1648 206: alpha_g
1649 207: alpha_h
1650 208: alpha_i
1651 209: alpha_j
1652 210: alpha_k
1653 211: alpha_l
1654 212: alpha_m
1655 213: alpha_n
1656 214: alpha_o
1657 215: alpha_p
1658 216: alpha_q
1659 217: alpha_r
1660 218: alpha_s
1661 219: alpha_t
1662 220: alpha_u
1663 221: alpha_v
1664 222: alpha_w
1665 223: alpha_x
1666 224: alpha_y
1667 225: alpha_z
1668 226: alpha_0
1669 227: alpha_1
1670 228: alpha_2
1671 229: alpha_3
1672 230: alpha_4
1673 231: alpha_5
1674 232: alpha_6
1675 233: alpha_7
1676 234: alpha_8
1677 235: alpha_9
1678 236: alpha_perio
1679 237: alpha_excla
1680 238: alpha_colon
1681 239: alpha_quest
1682 240: alpha_arrow_e {}
1683 241: decor_1 {alpha_copyr}
1684 242: fake_blank {}
1685 243: fake_blank {}
1686 244: fake_blank {}
1687 245: fake_blank {}
1688 246: fake_blank {}
1689 247: fake_blank {}
1690 248: fake_blank {}
1691 249: fake_blank {}
1692 250: fake_blank {}
1693 251: fake_blank {}
1694 252: fake_blank {}
1695 253: fake_blank {}
1696 254: fake_blank {}
1697 255: fake_blank {}
1698
1699 ----------------------------------------------------------------------
1700 */