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