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