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