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