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