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