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