rnd-20040916-1-src
[rocksndiamonds.git] / src / game_em / convert.c
1 /* 2000-08-20T09:41:18Z
2  *
3  * identify all emerald mine caves and turn them into v6 format.
4  * fixes illegal tiles, acid, wheel, limits times, cleans flags.
5  *
6  * these tables weed out bad tiles for older caves (eg. wheel on -> wheel off)
7  * and clean up v6 caves (acid, number limits) which should(!) be
8  * inconsequential, but no doubt it will break some caves.
9  */
10
11 #include "tile.h"
12 #include "level.h"
13
14
15 #if defined(TARGET_X11)
16
17 static unsigned char remap_v6[256] =
18 {
19   /* filter crap for v6 */
20
21   0,0,2,2,4,4,118,118,8,9,10,11,12,13,14,15,
22   16,16,18,18,20,21,22,23,24,25,26,27,28,28,118,28,
23   0,16,2,18,36,37,37,37,40,41,42,43,44,45,128,128,
24   128,148,148,148,45,45,45,148,0,57,58,59,60,61,62,63,
25   64,65,66,67,68,69,69,69,69,73,74,75,118,75,75,75,
26   75,75,75,75,75,153,153,153,153,153,153,153,153,153,153,153,
27   153,153,153,99,100,68,68,68,68,68,68,68,68,118,118,118,
28   118,118,114,115,131,118,118,119,120,121,122,118,118,118,118,118,
29   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
30   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
31   160,161,162,163,164,165,165,118,168,169,170,171,172,173,174,175,
32   176,177,178,179,180,181,182,183,184,185,186,187,188,189,68,191,
33   192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
34   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
35   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
36   240,241,242,243,244,245,153,153,153,153,153,153,153,153,153,153
37 };
38
39 static unsigned char remap_v5[256] =
40 {
41   /* filter crap for v5 */
42
43   0,0,2,2,4,4,118,118,8,9,10,11,12,13,14,15,
44   16,16,18,18,20,21,22,23,24,25,26,27,28,28,118,28,
45   0,16,2,18,36,37,37,37,147,41,42,43,44,45,128,128,
46   128,148,148,148,45,45,45,148,0,57,58,59,60,61,62,63,
47   64,65,66,67,68,153,153,153,153,153,153,153,153,153,153,153,
48   153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
49   153,153,153,153,153,68,68,68,68,68,68,68,68,118,118,118,
50   118,118,114,115,131,118,118,119,120,121,122,118,118,118,118,118,
51   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
52   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
53   160,153,153,153,153,153,153,118,168,169,170,171,172,173,174,175,
54   176,177,178,179,180,181,182,183,184,185,186,187,188,189,68,153,
55   153,153,153,153,153,153,153,153,200,201,202,203,204,205,206,207,
56   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
57   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
58   240,241,153,153,153,153,153,153,153,153,153,153,153,153,153,153
59 };
60
61 static unsigned char remap_v4[256] =
62 {
63   /* filter crap for v4 */
64
65   0,0,2,2,4,4,118,118,8,9,10,11,12,13,14,15,
66   16,16,18,18,20,21,22,23,24,25,26,27,28,28,118,28,
67   0,16,2,18,36,37,37,37,147,41,42,43,44,45,128,128,
68   128,148,148,148,45,45,45,148,0,153,153,59,60,61,62,63,
69   64,65,66,153,153,153,153,153,153,153,153,153,153,153,153,153,
70   153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
71   153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
72   153,118,114,115,131,118,118,119,120,121,122,118,118,118,118,118,
73   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
74   144,145,146,147,148,149,150,151,152,68,154,155,156,157,158,160,
75   160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,175,
76   153,153,153,153,153,153,153,153,153,153,153,153,153,153,68,153,
77   153,153,153,153,153,153,153,153,200,201,202,203,204,205,206,207,
78   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
79   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
80   240,241,153,153,153,153,153,153,153,153,153,153,153,153,153,153
81 };
82
83 static unsigned char remap_v4eater[28] =
84 {
85   /* filter crap for v4 */
86
87   128,18,2,0,4,8,16,20,28,37,
88   41,45,130,129,131,132,133,134,135,136,
89   146,147,175,65,66,64,2,18
90 };
91
92 int clean_emerald(unsigned char *src, unsigned long *length)
93 {
94   unsigned int i;
95
96   if (*length >= 2172 &&
97       src[2106] == 255 &&
98       src[2107] == 54 &&
99       src[2108] == 48 &&
100       src[2109] == 48)
101   {
102     for (i = 0; i < 2048; i++)
103       src[i] = remap_v6[src[i]];
104     for (i = 2048; i < 2084; i++)
105       src[i] = remap_v6[src[i]];
106     for (i = 2112; i < 2148; i++)
107       src[i] = remap_v6[src[i]];
108
109     goto v6;
110   }
111
112   if (*length >= 2110 &&
113       src[2106] == 255 &&
114       src[2107] == 53 &&
115       src[2108] == 48 &&
116       src[2109] == 48)
117   {
118     for (i = 0; i < 2048; i++)
119       src[i] = remap_v5[src[i]];
120     for (i = 2048; i < 2084; i++)
121       src[i] = remap_v5[src[i]];
122     for (i = 2112; i < 2148; i++)
123       src[i] = src[i - 64];
124
125     goto v5;
126   }
127
128   if (*length >= 2106 &&
129       src[1983] == 116)
130   {
131     for (i = 0; i < 2048; i++)
132       src[i] = remap_v4[src[i]];
133     for (i = 2048; i < 2084; i++)
134       src[i] = remap_v4eater[src[i] >= 28 ? 0 : src[i]];
135     for (i = 2112; i < 2148; i++) src[i] = src[i - 64];
136
137     goto v4;
138   }
139
140   if (*length >= 2106 &&
141       src[0] == 241 &&
142       src[1983] == 27)
143   {
144     unsigned char j = 94;
145
146     for (i = 0; i < 2106; i++)
147       src[i] = (src[i] ^ (j += 7)) - 0x11;
148     src[1] = 131;
149     for (i = 0; i < 2048; i++)
150       src[i] = remap_v4[src[i]];
151     for (i = 2048; i < 2084; i++)
152       src[i] = remap_v4eater[src[i] >= 28 ? 0 : src[i]];
153     for (i = 2112; i < 2148; i++)
154       src[i] = src[i - 64];
155
156     goto v3;
157   }
158
159   return 1;             /* unrecognized cave */
160
161  v3:
162  v4:
163  v5:
164
165   /* id */
166   src[2106] = 255;
167   src[2107] = 54;
168   src[2108] = 48;
169   src[2109] = 48;
170
171   /* time */
172   i = src[2094] * 10;
173   src[2110] = i >> 8;
174   src[2111] = i;
175
176   for (i = 2148; i < 2172; i++)
177     src[i] = 0;
178
179   /* ball data */
180   src[2159] = 128;
181
182  v6:
183
184   /* fix wheel */
185   for (i = 0; i < 2048; i++)
186     if (src[i] == 40)
187       break;
188
189   for (i++; i < 2048; i++)
190     if (src[i] == 40)
191       src[i] = 147;
192
193   /* fix acid */
194   for (i = 64; i < 2048; i++)
195     if (src[i] == 63)
196       src[i - 64] = 101;
197
198   /* fix acid in eater 1 */
199   for (i = 2051; i < 2057; i++)
200     if (src[i] == 63)
201       src[i - 3] = 101;
202
203   /* fix acid in eater 2 */
204   for (i = 2060; i < 2066; i++)
205     if (src[i] == 63)
206       src[i - 3] = 101;
207
208   /* fix acid in eater 3 */
209   for (i = 2069; i < 2075; i++)
210     if (src[i] == 63)
211       src[i - 3] = 101;
212
213   /* fix acid in eater 4 */
214   for (i = 2078; i < 2084; i++)
215     if (src[i] == 63)
216       src[i - 3] = 101;
217
218   /* fix acid in eater 5 */
219   for (i = 2115; i < 2121; i++)
220     if (src[i] == 63)
221       src[i - 3] = 101;
222
223   /* fix acid in eater 6 */
224   for (i = 2124; i < 2130; i++)
225     if (src[i] == 63)
226       src[i - 3] = 101;
227
228   /* fix acid in eater 7 */
229   for (i = 2133; i < 2139; i++)
230     if (src[i] == 63)
231       src[i - 3] = 101;
232
233   /* fix acid in eater 8 */
234   for (i = 2142; i < 2148; i++)
235     if (src[i] == 63)
236       src[i - 3] = 101;
237
238   /* old style time */
239   src[2094] = 0;
240
241   /* player 1 pos */
242   src[2096] &= 7;
243   src[src[2096] << 8 | src[2097]] = 128;
244
245   /* player 2 pos */
246   src[2098] &= 7;
247   src[src[2098] << 8 | src[2099]] = 128;
248
249   /* ameuba speed */
250   if ((src[2100] << 8 | src[2101]) > 9999)
251   {
252     src[2100] = 39;
253     src[2101] = 15;
254   }
255
256   /* time wonderwall */
257   if ((src[2102] << 8 | src[2103]) > 9999)
258   {
259     src[2102] = 39;
260     src[2103] = 15;
261   }
262
263   /* time */
264   if ((src[2110] << 8 | src[2111]) > 9999)
265   {
266     src[2110] = 39;
267     src[2111] = 15;
268   }
269
270   /* wind direction */
271   i = src[2149];
272   i &= 15;
273   i &= -i;
274   src[2149] = i;
275
276   /* time lenses */
277   if ((src[2154] << 8 | src[2155]) > 9999)
278   {
279     src[2154] = 39;
280     src[2155] = 15;
281   }
282
283   /* time magnify */
284   if ((src[2156] << 8 | src[2157]) > 9999)
285   {
286     src[2156] = 39;
287     src[2157] = 15;
288   }
289
290   /* ball object */
291   src[2158] = 0;
292   src[2159] = remap_v6[src[2159]];
293
294   /* ball pause */
295   if ((src[2160] << 8 | src[2161]) > 9999)
296   {
297     src[2160] = 39;
298     src[2161] = 15;
299   }
300
301   /* ball data */
302   src[2162] &= 129;
303   if (src[2162] & 1)
304     src[2163] = 0;
305
306   /* android move pause */
307   if ((src[2164] << 8 | src[2165]) > 9999)
308   {
309     src[2164] = 39;
310     src[2165] = 15;
311   }
312
313   /* android clone pause */
314   if ((src[2166] << 8 | src[2167]) > 9999)
315   {
316     src[2166] = 39;
317     src[2167] = 15;
318   }
319
320   /* android data */
321   src[2168] &= 31;
322
323   /* size of v6 cave */
324   *length = 2172;
325
326   return 0;
327 }
328
329 /* 2000-07-30T00:26:00Z
330  *
331  * Read emerald mine caves version 6
332  *
333  * v4 and v5 emerald mine caves are converted to v6 (which completely supports
334  * older versions)
335  * 
336  * converting to the internal format loses /significant/ information which can
337  * break lots of caves.
338  * 
339  * major incompatibilities:
340  * - borderless caves behave completely differently, the player no longer
341  *   "warps" to the other side.
342  * - a compile time option for spring can make it behave differently when it
343  *   rolls.
344  * - a compile time option for rolling objects (stone, nut, spring, bomb) only
345  *   in eater.
346  * - acid is always deadly even with no base beneath it.
347  *
348  * so far all below have not broken any caves:
349  *
350  * - active wheel inside an eater will not function, eater explosions will not
351  *   change settings.
352  * - initial collect objects (emerald, diamond, dynamite) don't exist.
353  * - initial rolling objects will be moved manually and made into sitting
354  *   objects.
355  * - drips always appear from dots.
356  * - more than one thing can fall into acid at the same time.
357  * - acid explodes when the player walks into it, rather than splashing.
358  * - simultaneous explosions may be in a slightly different order.
359  * - quicksand states have been reduced.
360  * - acid base is effectively an indestructable wall now which can affect eater
361  *   explosions.
362  * - android can clone forever with a clone pause of 0 (emeralds, diamonds,
363  *   nuts, stones, bombs, springs).
364  *
365  * 2001-03-12T02:46:55Z
366  * - rolling stuff is now allowed in the cave, i didn't like making this
367  *   decision.
368  * - if BAD_ROLL is not defined, initial rolling objects are moved by hand.
369  * - initial collect objects break some cave in elvis mine 5.
370  * - different timing for wonderwall break some cave in exception mine 2.
371  * - i think i'm pretty locked into always using the bad roll. *sigh*
372  * - rolling spring is now turned into regular spring. it appears the emc
373  *   editor only uses the force code for initially moving spring. i will
374  *   follow this in my editor.
375  */
376
377 static unsigned short remap_emerald[256] =
378 {
379   Xstone, Xstone, Xdiamond, Xdiamond, Xalien, Xalien, Xblank, Xblank,
380   Xtank_n, Xtank_e, Xtank_s, Xtank_w, Xtank_gon, Xtank_goe, Xtank_gos, Xtank_gow,
381   Xbomb, Xbomb, Xemerald, Xemerald, Xbug_n, Xbug_e, Xbug_s, Xbug_w,
382   Xbug_gon, Xbug_goe, Xbug_gos, Xbug_gow, Xdrip_eat, Xdrip_eat, Xdrip_eat, Xdrip_eat,
383   Xstone, Xbomb, Xdiamond, Xemerald, Xwonderwall, Xnut, Xnut, Xnut,
384   Xwheel, Xeater_n, Xeater_s, Xeater_w, Xeater_e, Xsand_stone, Xblank, Xblank,
385   Xblank, Xsand, Xsand, Xsand, Xsand_stone, Xsand_stone, Xsand_stone, Xsand,
386   Xstone, Xgrow_ew, Xgrow_ns, Xdynamite_1, Xdynamite_2, Xdynamite_3, Xdynamite_4, Xacid_s,
387   Xexit_1, Xexit_2, Xexit_3, Xballoon, Xplant, Xspring, Xspring, Xspring,
388   Xspring, Xball_1, Xball_2, Xandroid, Xblank, Xandroid, Xandroid, Xandroid,
389   Xandroid, Xandroid, Xandroid, Xandroid, Xandroid, Xblank, Xblank, Xblank,
390   Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank,
391
392 #ifdef BAD_ROLL
393
394   Xblank, Xblank, Xblank, Xspring_force_w, Xspring_force_e, Xacid_1, Xacid_2, Xacid_3,
395   Xacid_4, Xacid_5, Xacid_6, Xacid_7, Xacid_8, Xblank, Xblank, Xblank,
396   Xblank, Xblank, Xnut_force_w, Xnut_force_e, Xsteel_1, Xblank, Xblank, Xbomb_force_w,
397   Xbomb_force_e, Xstone_force_w, Xstone_force_e, Xblank, Xblank, Xblank, Xblank, Xblank,
398
399 #else
400
401   Xblank, Xblank, Xblank, Xspring, Xspring, Xacid_1, Xacid_2, Xacid_3,
402   Xacid_4, Xacid_5, Xacid_6, Xacid_7, Xacid_8, Xblank, Xblank, Xblank,
403   Xblank, Xblank, Xnut, Xnut, Xsteel_1, Xblank, Xblank, Xbomb,
404   Xbomb, Xstone, Xstone, Xblank, Xblank, Xblank, Xblank, Xblank,
405
406 #endif
407
408   Xblank, Xround_wall_1, Xgrass, Xsteel_1, Xwall_1, Xkey_1, Xkey_2, Xkey_3,
409   Xkey_4, Xdoor_1, Xdoor_2, Xdoor_3, Xdoor_4, Xdripper, Xfake_door_1, Xfake_door_2,
410   Xfake_door_3, Xfake_door_4, Xwonderwall, Xwheel, Xsand, Xacid_nw, Xacid_ne, Xacid_sw,
411   Xacid_se, Xfake_blank, Xameuba_1, Xameuba_2, Xameuba_3, Xameuba_4, Xexit, Xalpha_arrow_w,
412   Xfake_grass, Xlenses, Xmagnify, Xfake_blank, Xfake_grass, Xswitch, Xswitch, Xblank,
413   Xdecor_8, Xdecor_9, Xdecor_10, Xdecor_5, Xalpha_comma, Xalpha_quote, Xalpha_minus, Xdynamite,
414   Xsteel_3, Xdecor_6, Xdecor_7, Xsteel_2, Xround_wall_2, Xdecor_2, Xdecor_4, Xdecor_3,
415   Xwind_nesw, Xwind_e, Xwind_s, Xwind_w, Xwind_n, Xdirt, Xplant, Xkey_5,
416   Xkey_6, Xkey_7, Xkey_8, Xdoor_5, Xdoor_6, Xdoor_7, Xdoor_8, Xbumper,
417   Xalpha_a, Xalpha_b, Xalpha_c, Xalpha_d, Xalpha_e, Xalpha_f, Xalpha_g, Xalpha_h,
418   Xalpha_i, Xalpha_j, Xalpha_k, Xalpha_l, Xalpha_m, Xalpha_n, Xalpha_o, Xalpha_p,
419   Xalpha_q, Xalpha_r, Xalpha_s, Xalpha_t, Xalpha_u, Xalpha_v, Xalpha_w, Xalpha_x,
420   Xalpha_y, Xalpha_z, Xalpha_0, Xalpha_1, Xalpha_2, Xalpha_3, Xalpha_4, Xalpha_5,
421   Xalpha_6, Xalpha_7, Xalpha_8, Xalpha_9, Xalpha_perio, Xalpha_excla, Xalpha_colon, Xalpha_quest,
422   Xalpha_arrow_e, Xdecor_1, Xfake_door_5, Xfake_door_6, Xfake_door_7, Xfake_door_8, Xblank, Xblank,
423   Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank,
424 };
425
426 void convert_emerald(unsigned char *src)
427 {
428   unsigned int x, y, temp;
429
430   lev.width = 64;
431   lev.height = 32;
432
433   temp = ((src[0x83E] << 8 | src[0x83F]) * 25 + 3) / 4;
434   if (temp == 0 || temp > 9999)
435     temp = 9999;
436   lev.time = temp;
437   lev.required = src[0x82F];
438
439   temp = src[0x830] << 8 | src[0x831];
440   ply1.oldx = ply1.x = (temp & 63) + 1;
441   ply1.oldy = ply1.y = (temp >> 6 & 31) + 1;
442   temp = src[0x832] << 8 | src[0x833];
443   ply2.oldx = ply2.x = (temp & 63) + 1;
444   ply2.oldy = ply2.y = (temp >> 6 & 31) + 1;
445
446   lev.alien_score = src[0x826];
447
448   temp = (src[0x834] << 8 | src[0x835]) * 28;
449   if (temp > 9999)
450     temp = 9999;
451   lev.ameuba_time = temp;
452   lev.android_move_cnt = lev.android_move_time = src[0x874] << 8 | src[0x875];
453   lev.android_clone_cnt= lev.android_clone_time = src[0x876] << 8 | src[0x877];
454   lev.ball_pos = 0;
455   lev.ball_random = src[0x872] & 1 ? 1 : 0;
456   lev.ball_state = src[0x872] & 128 ? 1 : 0;
457   lev.ball_cnt = lev.ball_time = src[0x870] << 8 | src[0x871];
458   lev.bug_score = src[0x828];
459   lev.diamond_score = src[0x825];
460   lev.dynamite_score = src[0x82B];
461   lev.eater_pos = 0;
462   lev.eater_score = src[0x829];
463   lev.emerald_score = src[0x824];
464   lev.exit_score = src[0x82D] * 8 / 5;
465   lev.key_score = src[0x82C];
466   lev.lenses_cnt = 0;
467   lev.lenses_score = src[0x867];
468   lev.lenses_time = src[0x86A] << 8 | src[0x86B];
469   lev.magnify_cnt = 0;
470   lev.magnify_score = src[0x868];
471   lev.magnify_time = src[0x86C] << 8 | src[0x86D];
472   lev.nut_score = src[0x82A];
473   lev.shine_cnt = 0;
474   lev.slurp_score = src[0x869];
475   lev.tank_score = src[0x827];
476   lev.wheel_cnt = 0;
477   lev.wheel_x = 1;
478   lev.wheel_y = 1;
479   lev.wheel_time = src[0x838] << 8 | src[0x839];
480   lev.wind_cnt = src[0x865] & 15 ? 9999 : 0;
481   temp = src[0x865];
482   lev.wind_direction = (temp & 8 ? 0 :
483                         temp & 1 ? 1 :
484                         temp & 2 ? 2 :
485                         temp & 4 ? 3 : 0);
486   lev.wind_time = 9999;
487   lev.wonderwall_state = 0;
488   lev.wonderwall_time = src[0x836] << 8 | src[0x837];
489
490   for (x = 0; x < 9; x++)
491     lev.eater_array[0][x] = remap_emerald[src[0x800 + x]];
492   for (x = 0; x < 9; x++)
493     lev.eater_array[1][x] = remap_emerald[src[0x809 + x]];
494   for (x = 0; x < 9; x++)
495     lev.eater_array[2][x] = remap_emerald[src[0x812 + x]];
496   for (x = 0; x < 9; x++)
497     lev.eater_array[3][x] = remap_emerald[src[0x81B + x]];
498   for (x = 0; x < 9; x++)
499     lev.eater_array[4][x] = remap_emerald[src[0x840 + x]];
500   for (x = 0; x < 9; x++)
501     lev.eater_array[5][x] = remap_emerald[src[0x849 + x]];
502   for (x = 0; x < 9; x++)
503     lev.eater_array[6][x] = remap_emerald[src[0x852 + x]];
504   for (x = 0; x < 9; x++)
505     lev.eater_array[7][x] = remap_emerald[src[0x85B + x]];
506
507   temp = remap_emerald[src[0x86F]];
508   for (y = 0; y < 8; y++)
509   {
510     if (src[0x872] & 1)
511     {
512       for (x = 0; x < 8; x++)
513         lev.ball_array[y][x] = temp;
514     }
515     else
516     {
517       lev.ball_array[y][1] = (src[0x873] & 1) ? temp : Xblank;  /* north */
518       lev.ball_array[y][6] = (src[0x873] & 2) ? temp : Xblank;  /* south */
519       lev.ball_array[y][3] = (src[0x873] & 4) ? temp : Xblank;  /* west */
520       lev.ball_array[y][4] = (src[0x873] & 8) ? temp : Xblank;  /* east */
521       lev.ball_array[y][7] = (src[0x873] & 16) ? temp : Xblank; /* southeast */
522       lev.ball_array[y][5] = (src[0x873] & 32) ? temp : Xblank; /* southwest */
523       lev.ball_array[y][2] = (src[0x873] & 64) ? temp : Xblank; /* northeast */
524       lev.ball_array[y][0] = (src[0x873] & 128) ? temp : Xblank;/* northwest */
525     }
526   }
527
528   for (temp = 0; temp < TILE_MAX; temp++)
529     lev.android_array[temp] = Xblank;
530
531   temp = src[0x878] << 8 | src[0x879];
532
533   if (temp & 1)
534   {
535     lev.android_array[Xemerald] =
536       lev.android_array[Xemerald_pause] =
537       lev.android_array[Xemerald_fall] =
538       lev.android_array[Yemerald_sB] =
539       lev.android_array[Yemerald_eB] =
540       lev.android_array[Yemerald_wB] = Xemerald;
541   }
542
543   if (temp & 2)
544   {
545     lev.android_array[Xdiamond] =
546       lev.android_array[Xdiamond_pause] =
547       lev.android_array[Xdiamond_fall] =
548       lev.android_array[Ydiamond_sB] =
549       lev.android_array[Ydiamond_eB] =
550       lev.android_array[Ydiamond_wB] = Xdiamond;
551   }
552
553   if (temp & 4)
554   {
555     lev.android_array[Xstone] =
556       lev.android_array[Xstone_pause] =
557       lev.android_array[Xstone_fall] =
558       lev.android_array[Ystone_sB] =
559       lev.android_array[Ystone_eB] =
560       lev.android_array[Ystone_wB] = Xstone;
561   }
562
563   if (temp & 8)
564   {
565     lev.android_array[Xbomb] =
566       lev.android_array[Xbomb_pause] =
567       lev.android_array[Xbomb_fall] =
568       lev.android_array[Ybomb_sB] =
569       lev.android_array[Ybomb_eB] =
570       lev.android_array[Ybomb_wB] = Xbomb;
571   }
572
573   if (temp & 16)
574   {
575     lev.android_array[Xnut] =
576       lev.android_array[Xnut_pause] =
577       lev.android_array[Xnut_fall] =
578       lev.android_array[Ynut_sB] =
579       lev.android_array[Ynut_eB] =
580       lev.android_array[Ynut_wB] = Xnut;
581   }
582
583   if (temp & 32)
584   {
585     lev.android_array[Xtank_n] =
586       lev.android_array[Xtank_gon] =
587       lev.android_array[Ytank_nB] =
588       lev.android_array[Ytank_n_e] =
589       lev.android_array[Ytank_n_w] = Xtank_n;
590
591     lev.android_array[Xtank_e] =
592       lev.android_array[Xtank_goe] =
593       lev.android_array[Ytank_eB] =
594       lev.android_array[Ytank_e_s] =
595       lev.android_array[Ytank_e_n] = Xtank_e;
596
597     lev.android_array[Xtank_s] =
598       lev.android_array[Xtank_gos] =
599       lev.android_array[Ytank_sB] =
600       lev.android_array[Ytank_s_w] =
601       lev.android_array[Ytank_s_e] = Xtank_s;
602
603     lev.android_array[Xtank_w] =
604       lev.android_array[Xtank_gow] =
605       lev.android_array[Ytank_wB] =
606       lev.android_array[Ytank_w_n] =
607       lev.android_array[Ytank_w_s] = Xtank_w;
608   }
609
610   if (temp & 64)
611   {
612     lev.android_array[Xeater_n] = lev.android_array[Yeater_nB] = Xeater_n;
613     lev.android_array[Xeater_e] = lev.android_array[Yeater_eB] = Xeater_e;
614     lev.android_array[Xeater_s] = lev.android_array[Yeater_sB] = Xeater_s;
615     lev.android_array[Xeater_w] = lev.android_array[Yeater_wB] = Xeater_w;
616   }
617
618   if (temp & 128)
619   {
620     lev.android_array[Xbug_n] =
621       lev.android_array[Xbug_gon] =
622       lev.android_array[Ybug_nB] =
623       lev.android_array[Ybug_n_e] =
624       lev.android_array[Ybug_n_w] = Xbug_gon;
625
626     lev.android_array[Xbug_e] =
627       lev.android_array[Xbug_goe] =
628       lev.android_array[Ybug_eB] =
629       lev.android_array[Ybug_e_s] =
630       lev.android_array[Ybug_e_n] = Xbug_goe;
631
632     lev.android_array[Xbug_s] =
633       lev.android_array[Xbug_gos] =
634       lev.android_array[Ybug_sB] =
635       lev.android_array[Ybug_s_w] =
636       lev.android_array[Ybug_s_e] = Xbug_gos;
637
638     lev.android_array[Xbug_w] =
639       lev.android_array[Xbug_gow] =
640       lev.android_array[Ybug_wB] =
641       lev.android_array[Ybug_w_n] =
642       lev.android_array[Ybug_w_s] = Xbug_gow;
643   }
644
645   if (temp & 256)
646   {
647     lev.android_array[Xalien] = lev.android_array[Xalien_pause] =
648       lev.android_array[Yalien_nB] = lev.android_array[Yalien_eB] =
649       lev.android_array[Yalien_sB] = lev.android_array[Yalien_wB] = Xalien;
650   }
651
652   if (temp & 512)
653   {
654     lev.android_array[Xspring] =
655       lev.android_array[Xspring_pause] =
656       lev.android_array[Xspring_e] =
657       lev.android_array[Yspring_eB] =
658       lev.android_array[Yspring_kill_eB] =
659       lev.android_array[Xspring_w] =
660       lev.android_array[Yspring_wB] =
661       lev.android_array[Yspring_kill_wB] =
662       lev.android_array[Xspring_fall] =
663       lev.android_array[Yspring_sB] = Xspring;
664   }
665
666   if (temp & 1024)
667   {
668     lev.android_array[Yballoon_nB] =
669       lev.android_array[Yballoon_eB] =
670       lev.android_array[Yballoon_sB] =
671       lev.android_array[Yballoon_wB] =
672       lev.android_array[Xballoon] = Xballoon;
673   }
674
675   if (temp & 2048)
676   {
677     lev.android_array[Xdripper] =
678       lev.android_array[XdripperB] =
679       lev.android_array[Xameuba_1] =
680       lev.android_array[Xameuba_2] =
681       lev.android_array[Xameuba_3] =
682       lev.android_array[Xameuba_4] =
683       lev.android_array[Xameuba_5] =
684       lev.android_array[Xameuba_6] =
685       lev.android_array[Xameuba_7] =
686       lev.android_array[Xameuba_8] = Xdrip_eat;
687   }
688
689   if (temp & 4096)
690   {
691     lev.android_array[Xdynamite] = Xdynamite;
692   }
693
694   for (temp = 1; temp < 2047; temp++)
695   {
696     switch (src[temp])
697     {
698       case 0x24:                                /* wonderwall */
699         lev.wonderwall_state = 1;
700         lev.wonderwall_time = 9999;
701         break;
702
703       case 0x28:                                /* wheel */
704         lev.wheel_x = temp & 63;
705         lev.wheel_y = temp >> 6;
706         lev.wheel_cnt = lev.wheel_time;
707         break;
708
709 #ifndef BAD_ROLL
710       case 0x63:                                /* spring roll left */
711         src[temp - 1] = 0x45;
712         src[temp] = 0x80;
713         break;
714
715       case 0x64:                                /* spring roll right */
716         src[temp + 1] = 0x45;
717         src[temp] = 0x80;
718         break;
719
720       case 0x72:                                /* nut roll left */
721         src[temp - 1] = 0x25;
722         src[temp] = 0x80;
723         break;
724
725       case 0x73:                                /* nut roll right */
726         src[temp + 1] = 0x25;
727         src[temp] = 0x80;
728         break;
729
730       case 0x77:                                /* bomb roll left */
731         src[temp - 1] = 0x10;
732         src[temp] = 0x80;
733         break;
734
735       case 0x78:                                /* bomb roll right */
736         src[temp + 1] = 0x10;
737         src[temp] = 0x80;
738         break;
739
740       case 0x79:                                /* stone roll left */
741         src[temp - 1] = 0x00;
742         src[temp] = 0x80;
743         break;
744
745       case 0x7A:                                /* stone roll right */
746         src[temp + 1] = 0x00;
747         src[temp] = 0x80;
748         break;
749 #endif
750
751       case 0xA3:                                /* fake blank */
752         lev.lenses_cnt = 9999;
753         break;
754
755       case 0xA4:                                /* fake grass */
756         lev.magnify_cnt = 9999;
757         break;
758     }
759   }
760
761   for (y = 0; y < HEIGHT; y++)
762     for (x = 0; x < WIDTH; x++)
763       Cave[y][x] = ZBORDER;
764
765   temp = 0;
766   for (y = 0; y < lev.height; y++)
767     for (x = 0; x < lev.width; x++)
768       Cave[y+1][x+1] = remap_emerald[src[temp++]];
769
770   if (ply1.alive)
771     Cave[ply1.y][ply1.x] = Zplayer;
772   if (ply2.alive)
773     Cave[ply2.y][ply2.x] = Zplayer;
774
775   for (y = 0; y < HEIGHT; y++)
776     for (x = 0; x < WIDTH; x++)
777       Next[y][x] = Cave[y][x];
778
779   for (y = 0; y < HEIGHT; y++)
780     for (x = 0; x < WIDTH; x++)
781       Draw[y][x] = Cave[y][x];
782 }
783
784 #endif