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