1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * (c) 1995-2002 Artsoft Entertainment *
6 * Detmolder Strasse 189 *
9 * e-mail: info@artsoft.org *
10 *----------------------------------------------------------*
12 ***********************************************************/
14 #include "libgame/libgame.h"
22 Bitmap *pix[NUM_BITMAPS];
23 Pixmap tile_clipmask[NUM_TILES];
24 DrawBuffer *fieldbuffer;
25 DrawBuffer *drawto_field;
27 int game_status = MAINMENU;
28 boolean level_editor_test_game = FALSE;
29 boolean network_playing = FALSE;
31 int key_joystick_mapping = 0;
33 boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
34 int redraw_x1 = 0, redraw_y1 = 0;
36 short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
37 short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
38 short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
39 short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
40 short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
41 short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
42 short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
43 short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
44 short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
45 boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
46 short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
47 short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
48 short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
49 short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
50 unsigned long Elementeigenschaften1[MAX_ELEMENTS];
51 unsigned long Elementeigenschaften2[MAX_ELEMENTS];
53 int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
55 int FX = SX, FY = SY, ScrollStepSize;
56 int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
58 int BorderElement = EL_BETON;
59 int GameFrameDelay = GAME_FRAME_DELAY;
60 int FfwdFrameDelay = FFWD_FRAME_DELAY;
61 int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
62 int SBX_Left, SBX_Right;
63 int SBY_Upper, SBY_Lower;
64 int ZX,ZY, ExitX,ExitY;
67 int TimeFrames, TimePlayed, TimeLeft;
69 boolean network_player_action_received = FALSE;
71 struct LevelInfo level;
72 struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
73 struct HiScore highscore[MAX_SCORE_ENTRIES];
75 struct SetupInfo setup;
77 struct GlobalInfo global;
79 /* filenames of sound effects */
80 char *sound_name[NUM_SOUNDS] =
139 struct ArtworkConfigInfo image_config[] =
141 /* graphics for Boulder Dash style elements and actions */
142 { "bd_empty_space.digging", "empty.pcx" },
143 { "bd_sand.digging", "schlurf.pcx" },
144 { "bd_diamond.collecting", "pong.pcx" },
145 { "bd_diamond.impact", "pling.pcx" },
146 { "bd_rock.pushing", "pusch.pcx" },
147 { "bd_rock.impact", "klopf.pcx" },
148 { "bd_magic_wall.activating", "quirk.pcx" },
149 { "bd_magic_wall.changing", "quirk.pcx" },
150 { "bd_magic_wall.running", "miep.pcx" },
151 { "bd_amoeba.waiting", "amoebe.pcx" },
152 { "bd_amoeba.creating", "amoebe.pcx" },
153 { "bd_amoeba.turning_to_gem", "pling.pcx" },
154 { "bd_amoeba.turning_to_rock", "klopf.pcx" },
155 { "bd_butterfly.moving", "klapper.pcx" },
156 { "bd_butterfly.waiting", "klapper.pcx" },
157 { "bd_firefly.moving", "roehr.pcx" },
158 { "bd_firefly.waiting", "roehr.pcx" },
159 { "bd_exit.entering", "buing.pcx" },
162 struct ArtworkConfigInfo sound_config[] =
164 /* sounds for Boulder Dash style elements and actions */
165 { "bd_empty_space.digging", "empty.wav" },
166 { "bd_sand.digging", "schlurf.wav" },
167 { "bd_diamond.collecting", "pong.wav" },
168 { "bd_diamond.impact", "pling.wav" },
169 { "bd_rock.pushing", "pusch.wav" },
170 { "bd_rock.impact", "klopf.wav" },
171 { "bd_magic_wall.activating", "quirk.wav" },
172 { "bd_magic_wall.changing", "quirk.wav" },
173 { "bd_magic_wall.running", "miep.wav" },
174 { "bd_amoeba.waiting", SND_FILE_UNDEFINED },
175 { "bd_amoeba.creating", "amoebe.wav" },
176 { "bd_amoeba.turning_to_gem", "pling.wav" },
177 { "bd_amoeba.turning_to_rock", "klopf.wav" },
178 { "bd_butterfly.moving", "klapper.wav" },
179 { "bd_butterfly.waiting", "klapper.wav" },
180 { "bd_firefly.moving", "roehr.wav" },
181 { "bd_firefly.waiting", "roehr.wav" },
182 { "bd_exit.entering", "buing.wav" },
184 /* sounds for Supaplex style elements and actions */
185 { "sp_empty_space.digging", "empty.wav" },
186 { "sp_base.digging", "base.wav" },
187 { "sp_buggy_base.digging", "base.wav" },
188 { "sp_buggy_base.activating", "bug.wav" },
189 { "sp_infotron.collecting", "infotron.wav" },
190 { "sp_infotron.impact", "pling.wav" },
191 { "sp_zonk.pushing", "zonkpush.wav" },
192 { "sp_zonk.impact", "zonkdown.wav" },
193 { "sp_disk_red.collecting", "infotron.wav" },
194 { "sp_disk_orange.pushing", "zonkpush.wav" },
195 { "sp_disk_yellow.pushing", "pusch.wav" },
196 { "sp_port.passing", "gate.wav" },
197 { "sp_exit.entering", "exit.wav" },
198 { "sp_element.exploding", "booom.wav" },
199 { "sp_sniksnak.moving", SND_FILE_UNDEFINED },
200 { "sp_sniksnak.waiting", SND_FILE_UNDEFINED },
201 { "sp_electron.moving", SND_FILE_UNDEFINED },
202 { "sp_electron.waiting", SND_FILE_UNDEFINED },
203 { "sp_terminal.activating", SND_FILE_UNDEFINED },
205 /* sounds for Sokoban style elements and actions */
206 { "sokoban_object.pushing", "pusch.wav" },
207 { "sokoban_field.filling", "deng.wav" },
208 { "sokoban_field.clearing", SND_FILE_UNDEFINED },
209 { "sokoban_game.solving", "buing.wav" },
211 /* sounds for Emerald Mine style elements and actions */
212 { "empty_space.digging", "empty.wav" },
213 { "sand.digging", "schlurf.wav" },
214 { "emerald.collecting", "pong.wav" },
215 { "emerald.impact", "pling.wav" },
216 { "diamond.collecting", "pong.wav" },
217 { "diamond.impact", "pling.wav" },
218 { "diamond.breaking", "quirk.wav" },
219 { "rock.pushing", "pusch.wav" },
220 { "rock.impact", "klopf.wav" },
221 { "bomb.pushing", "pusch.wav" },
222 { "nut.pushing", "knurk.wav" },
223 { "nut.cracking", "knack.wav" },
224 { "nut.impact", "klumpf.wav" },
225 { "dynamite.collecting", "pong.wav" },
226 { "dynamite.placing", "deng.wav" },
227 { "dynamite.burning", "zisch.wav" },
228 { "key.collecting", "pong.wav" },
229 { "gate.passing", "gate.wav" },
230 { "bug.moving", "klapper.wav" },
231 { "bug.waiting", "klapper.wav" },
232 { "spaceship.moving", "roehr.wav" },
233 { "spaceship.waiting", "roehr.wav" },
234 { "yamyam.moving", SND_FILE_UNDEFINED },
235 { "yamyam.waiting", "njam.wav" },
236 { "yamyam.eating_diamond", SND_FILE_UNDEFINED },
237 { "robot.stepping", "schlurf.wav" },
238 { "robot.waiting", SND_FILE_UNDEFINED },
239 { "robot_wheel.activating", "deng.wav" },
240 { "robot_wheel.running", "miep.wav" },
241 { "magic_wall.activating", "quirk.wav" },
242 { "magic_wall.changing", "quirk.wav" },
243 { "magic_wall.running", "miep.wav" },
244 { "amoeba.waiting", SND_FILE_UNDEFINED },
245 { "amoeba.creating", "amoebe.wav" },
246 { "amoeba.dropping", SND_FILE_UNDEFINED },
247 { "acid.splashing", "blurb.wav" },
248 { "quicksand.filling", SND_FILE_UNDEFINED },
249 { "quicksand.slipping_through", SND_FILE_UNDEFINED },
250 { "quicksand.emptying", SND_FILE_UNDEFINED },
251 { "exit.opening", "oeffnen.wav" },
252 { "exit.entering", "buing.wav" },
254 /* sounds for Emerald Mine Club style elements and actions */
255 { "balloon.moving", SND_FILE_UNDEFINED },
256 { "balloon.waiting", SND_FILE_UNDEFINED },
257 { "balloon.pushing", "schlurf.wav" },
258 { "balloon_switch.activating", SND_FILE_UNDEFINED },
259 { "spring.moving", SND_FILE_UNDEFINED },
260 { "spring.pushing", "pusch.wav" },
261 { "spring.impact", "klopf.wav" },
262 { "wall.growing", SND_FILE_UNDEFINED },
264 /* sounds for Diamond Caves style elements and actions */
265 { "pearl.collecting", "pong.wav" },
266 { "pearl.breaking", "knack.wav" },
267 { "pearl.impact", "pling.wav" },
268 { "crystal.collecting", "pong.wav" },
269 { "crystal.impact", "pling.wav" },
270 { "envelope.collecting", "pong.wav" },
271 { "sand_invisible.digging", "schlurf.wav" },
272 { "shield_passive.collecting", "pong.wav" },
273 { "shield_passive.activated", SND_FILE_UNDEFINED },
274 { "shield_active.collecting", "pong.wav" },
275 { "shield_active.activated", SND_FILE_UNDEFINED },
276 { "extra_time.collecting", "gong.wav" },
277 { "mole.moving", SND_FILE_UNDEFINED },
278 { "mole.waiting", SND_FILE_UNDEFINED },
279 { "mole.eating_amoeba", "blurb.wav" },
280 { "switchgate_switch.activating", SND_FILE_UNDEFINED },
281 { "switchgate.opening", "oeffnen.wav" },
282 { "switchgate.closing", "oeffnen.wav" },
283 { "switchgate.passing", "gate.wav" },
284 { "timegate_wheel.activating", "deng.wav" },
285 { "timegate_wheel.running", "miep.wav" },
286 { "timegate.opening", "oeffnen.wav" },
287 { "timegate.closing", "oeffnen.wav" },
288 { "timegate.passing", "gate.wav" },
289 { "conveyor_belt_switch.activating", SND_FILE_UNDEFINED },
290 { "conveyor_belt.running", SND_FILE_UNDEFINED },
291 { "light_switch.activating", SND_FILE_UNDEFINED },
292 { "light_switch.deactivating", SND_FILE_UNDEFINED },
294 /* sounds for DX Boulderdash style elements and actions */
295 { "dx_bomb.pushing", "pusch.wav" },
296 { "trap_inactive.digging", "schlurf.wav" },
297 { "trap.activating", SND_FILE_UNDEFINED },
298 { "tube.passing", SND_FILE_UNDEFINED },
300 /* sounds for Rocks'n'Diamonds style elements and actions */
301 { "amoeba.turning_to_gem", "pling.wav" },
302 { "amoeba.turning_to_rock", "klopf.wav" },
303 { "speed_pill.collecting", "pong.wav" },
304 { "dynabomb_nr.collecting", "pong.wav" },
305 { "dynabomb_sz.collecting", "pong.wav" },
306 { "dynabomb_xl.collecting", "pong.wav" },
307 { "dynabomb.placing", "deng.wav" },
308 { "dynabomb.burning", "zisch.wav" },
309 { "satellite.moving", SND_FILE_UNDEFINED },
310 { "satellite.waiting", SND_FILE_UNDEFINED },
311 { "satellite.pushing", "pusch.wav" },
312 { "lamp.activating", "deng.wav" },
313 { "lamp.deactivating", "deng.wav" },
314 { "time_orb_full.collecting", "gong.wav" },
315 { "time_orb_full.impact", "deng.wav" },
316 { "time_orb_empty.pushing", "pusch.wav" },
317 { "time_orb_empty.impact", "deng.wav" },
318 { "gameoflife.waiting", SND_FILE_UNDEFINED },
319 { "gameoflife.creating", "amoebe.wav" },
320 { "biomaze.waiting", SND_FILE_UNDEFINED },
321 { "biomaze.creating", "amoebe.wav" },
322 { "pacman.moving", SND_FILE_UNDEFINED },
323 { "pacman.waiting", SND_FILE_UNDEFINED },
324 { "pacman.eating_amoeba", SND_FILE_UNDEFINED },
325 { "dark_yamyam.moving", SND_FILE_UNDEFINED },
326 { "dark_yamyam.waiting", "njam.wav" },
327 { "dark_yamyam.eating_any", SND_FILE_UNDEFINED },
328 { "penguin.moving", SND_FILE_UNDEFINED },
329 { "penguin.waiting", SND_FILE_UNDEFINED },
330 { "penguin.entering_exit", "buing.wav" },
331 { "pig.moving", SND_FILE_UNDEFINED },
332 { "pig.waiting", SND_FILE_UNDEFINED },
333 { "pig.eating_gem", SND_FILE_UNDEFINED },
334 { "dragon.moving", SND_FILE_UNDEFINED },
335 { "dragon.waiting", SND_FILE_UNDEFINED },
336 { "dragon.attacking", SND_FILE_UNDEFINED },
338 /* sounds for generic elements and actions */
339 { "player.dying", "autsch.wav" },
340 { "element.exploding", "roaaar.wav" },
342 /* sounds for other game actions */
343 { "game.starting", SND_FILE_UNDEFINED },
344 { "game.running_out_of_time", "gong.wav" },
345 { "game.leveltime_bonus", "sirr.wav" },
346 { "game.losing", "lachen.wav" },
347 { "game.winning", SND_FILE_UNDEFINED },
349 /* sounds for other non-game actions */
350 { "menu.door_opening", "oeffnen.wav" },
351 { "menu.door_closing", "oeffnen.wav" },
352 { "menu.hall_of_fame", "halloffame.wav" },
353 { "menu.info_screen", "rhythmloop.wav" },
356 { "[not used]", "antigrav.wav" },
357 { "[not used]", "bong.wav" },
358 { "[not used]", "fuel.wav" },
359 { "[not used]", "holz.wav" },
360 { "[not used]", "hui.wav" },
361 { "[not used]", "kabumm.wav" },
362 { "[not used]", "kink.wav" },
363 { "[not used]", "kling.wav" },
364 { "[not used]", "krach.wav" },
365 { "[not used]", "laser.wav" },
366 { "[not used]", "quiek.wav" },
367 { "[not used]", "rumms.wav" },
368 { "[not used]", "schlopp.wav" },
369 { "[not used]", "schrff.wav" },
370 { "[not used]", "schwirr.wav" },
371 { "[not used]", "slurp.wav" },
372 { "[not used]", "sproing.wav" },
373 { "[not used]", "warnton.wav" },
374 { "[not used]", "whoosh.wav" },
375 { "[not used]", "boom.wav" },
379 struct ElementInfo element_info[MAX_ELEMENTS] =
381 { "empty_space", "empty space" }, /* 0 */
383 { "wall", "normal wall" },
384 { "wall", "round wall" },
387 { "emerald", "emerald" },
388 { "exit", "closed exit" },
389 { "player", "player" },
391 { "spaceship", "spaceship" }, /* 10 */
392 { "yamyam", "yam yam" },
393 { "robot", "robot" },
394 { "wall", "steel wall" },
395 { "diamond", "diamond" },
396 { "amoeba", "dead amoeba" },
397 { "quicksand", "empty quicksand" },
398 { "quicksand", "quicksand with rock" },
399 { "amoeba", "amoeba drop" },
401 { "magic_wall", "magic wall" }, /* 20 */
402 { "speed_pill", "speed pill" },
403 { "acid", "acid pool" },
404 { "amoeba", "dropping amoeba" },
405 { "amoeba", "normal amoeba" },
406 { "nut", "nut with emerald" },
407 { "gameoflife", "Conway's wall of life" },
408 { "biomaze", "biomaze" },
409 { "dynamite", "burning dynamite" },
411 { "robot_wheel", "magic wheel" }, /* 30 */
412 { "robot_wheel", "magic wheel (running)" },
413 { "key", "red key" },
414 { "key", "yellow key" },
415 { "key", "green key" },
416 { "key", "blue key" },
417 { "gate", "red door" },
418 { "gate", "yellow door" },
419 { "gate", "green door" },
420 { "gate", "blue door" },
421 { "gate", "gray door (opened by red key)" }, /* 40 */
422 { "gate", "gray door (opened by yellow key)"},
423 { "gate", "gray door (opened by green key)"},
424 { "gate", "gray door (opened by blue key)"},
425 { "dynamite", "dynamite" },
426 { "pacman", "pac man" },
427 { "wall", "invisible normal wall" },
428 { "lamp", "lamp (off)" },
429 { "lamp", "lamp (on)" },
430 { "wall", "wall with emerald" },
431 { "wall", "wall with diamond" }, /* 50 */
432 { "amoeba", "amoeba with content" },
433 { "bd_amoeba", "amoeba (BD style)" },
434 { "time_orb_full", "time orb (full)" },
435 { "time_orb_empty", "time orb (empty)" },
436 { "wall", "growing wall" },
437 { "bd_diamond", "diamond (BD style)" },
438 { "emerald", "yellow emerald" },
439 { "wall", "wall with BD style diamond" },
440 { "wall", "wall with yellow emerald" },
441 { "dark_yamyam", "dark yam yam" }, /* 60 */
442 { "bd_magic_wall", "magic wall (BD style)" },
443 { "wall", "invisible steel wall" },
445 { "dynabomb_nr", "increases number of bombs" },
446 { "dynabomb_sz", "increases explosion size" },
447 { "dynabomb_xl", "increases power of explosion" },
448 { "sokoban_object", "sokoban object" },
449 { "sokoban_field", "sokoban empty field" },
450 { "sokoban_field", "sokoban field with object" },
451 { "bd_butterfly", "butterfly (starts moving right)"}, /* 70 */
452 { "bd_butterfly", "butterfly (starts moving up)" },
453 { "bd_butterfly", "butterfly (starts moving left)"},
454 { "bd_butterfly", "butterfly (starts moving down)"},
455 { "bd_firefly", "firefly (starts moving right)" },
456 { "bd_firefly", "firefly (starts moving up)" },
457 { "bd_firefly", "firefly (starts moving left)" },
458 { "bd_firefly", "firefly (starts moving down)" },
459 { "bd_butterfly", "butterfly" },
460 { "bd_firefly", "firefly" },
461 { "player", "yellow player" }, /* 80 */
462 { "player", "red player" },
463 { "player", "green player" },
464 { "player", "blue player" },
465 { "bug", "bug (starts moving right)" },
466 { "bug", "bug (starts moving up)" },
467 { "bug", "bug (starts moving left)" },
468 { "bug", "bug (starts moving down)" },
469 { "spaceship", "spaceship (starts moving right)"},
470 { "spaceship", "spaceship (starts moving up)" },
471 { "spaceship", "spaceship (starts moving left)"}, /* 90 */
472 { "spaceship", "spaceship (starts moving down)"},
473 { "pacman", "pac man (starts moving right)" },
474 { "pacman", "pac man (starts moving up)" },
475 { "pacman", "pac man (starts moving left)" },
476 { "pacman", "pac man (starts moving down)" },
477 { "emerald", "red emerald" },
478 { "emerald", "purple emerald" },
479 { "wall", "wall with red emerald" },
480 { "wall", "wall with purple emerald" },
481 { NULL, "unknown" }, /* 100 */
486 { NULL, "normal wall (BD style)" },
487 { "bd_rock", "rock (BD style)" },
488 { "exit", "open exit" },
489 { NULL, "black orb bomb" },
490 { "amoeba", "amoeba" },
491 { "mole", "mole" }, /* 110 */
492 { "penguin", "penguin" },
493 { "satellite", "satellite" },
494 { NULL, "arrow left" },
495 { NULL, "arrow right" },
496 { NULL, "arrow up" },
497 { NULL, "arrow down" },
499 { "dragon", "fire breathing dragon" },
500 { "key", "red key (EM style)" },
501 { NULL, "letter ' '" }, /* 120 */
502 { NULL, "letter '!'" },
503 { NULL, "letter '\"'" },
504 { NULL, "letter '#'" },
505 { NULL, "letter '$'" },
506 { NULL, "letter '%'" },
507 { NULL, "letter '&'" },
508 { NULL, "letter '''" },
509 { NULL, "letter '('" },
510 { NULL, "letter ')'" },
511 { NULL, "letter '*'" }, /* 130 */
512 { NULL, "letter '+'" },
513 { NULL, "letter ','" },
514 { NULL, "letter '-'" },
515 { NULL, "letter '.'" },
516 { NULL, "letter '/'" },
517 { NULL, "letter '0'" },
518 { NULL, "letter '1'" },
519 { NULL, "letter '2'" },
520 { NULL, "letter '3'" },
521 { NULL, "letter '4'" }, /* 140 */
522 { NULL, "letter '5'" },
523 { NULL, "letter '6'" },
524 { NULL, "letter '7'" },
525 { NULL, "letter '8'" },
526 { NULL, "letter '9'" },
527 { NULL, "letter ':'" },
528 { NULL, "letter ';'" },
529 { NULL, "letter '<'" },
530 { NULL, "letter '='" },
531 { NULL, "letter '>'" }, /* 150 */
532 { NULL, "letter '?'" },
533 { NULL, "letter '@'" },
534 { NULL, "letter 'A'" },
535 { NULL, "letter 'B'" },
536 { NULL, "letter 'C'" },
537 { NULL, "letter 'D'" },
538 { NULL, "letter 'E'" },
539 { NULL, "letter 'F'" },
540 { NULL, "letter 'G'" },
541 { NULL, "letter 'H'" }, /* 160 */
542 { NULL, "letter 'I'" },
543 { NULL, "letter 'J'" },
544 { NULL, "letter 'K'" },
545 { NULL, "letter 'L'" },
546 { NULL, "letter 'M'" },
547 { NULL, "letter 'N'" },
548 { NULL, "letter 'O'" },
549 { NULL, "letter 'P'" },
550 { NULL, "letter 'Q'" },
551 { NULL, "letter 'R'" }, /* 170 */
552 { NULL, "letter 'S'" },
553 { NULL, "letter 'T'" },
554 { NULL, "letter 'U'" },
555 { NULL, "letter 'V'" },
556 { NULL, "letter 'W'" },
557 { NULL, "letter 'X'" },
558 { NULL, "letter 'Y'" },
559 { NULL, "letter 'Z'" },
560 { NULL, "letter 'Ä'" },
561 { NULL, "letter 'Ö'" }, /* 180 */
562 { NULL, "letter 'Ü'" },
563 { NULL, "letter '^'" },
564 { NULL, "letter ''" },
565 { NULL, "letter ''" },
566 { NULL, "letter ''" },
567 { NULL, "letter ''" },
568 { NULL, "letter ''" },
569 { NULL, "letter ''" },
570 { NULL, "letter ''" },
571 { NULL, "letter ''" }, /* 190 */
572 { NULL, "letter ''" },
573 { NULL, "letter ''" },
574 { NULL, "letter ''" },
575 { NULL, "letter ''" },
576 { NULL, "letter ''" },
577 { NULL, "letter ''" },
578 { NULL, "letter ''" },
579 { NULL, "letter ''" },
580 { NULL, "letter ''" },
581 { "wall", "growing wall (horizontal)" }, /* 200 */
582 { "wall", "growing wall (vertical)" },
583 { "wall", "growing wall (all directions)" },
584 { "gate", "red door (EM style)" },
585 { "gate", "yellow door (EM style)" },
586 { "gate", "green door (EM style)" },
587 { "gate", "blue door (EM style)" },
588 { "key", "yellow key (EM style)" },
589 { "key", "green key (EM style)" },
590 { "key", "blue key (EM style)" },
591 { "empty_space", "empty space" }, /* 210 */
592 { "sp_zonk", "zonk" },
593 { "sp_base", "base" },
594 { "player", "murphy" },
595 { "sp_infotron", "infotron" },
596 { "wall", "chip (single)" },
597 { "wall", "hardware" },
598 { "sp_exit", "exit" },
599 { "sp_disk_orange", "orange disk" },
600 { "sp_port", "port (leading right)" },
601 { "sp_port", "port (leading down)" }, /* 220 */
602 { "sp_port", "port (leading left)" },
603 { "sp_port", "port (leading up)" },
604 { "sp_port", "port (leading right)" },
605 { "sp_port", "port (leading down)" },
606 { "sp_port", "port (leading left)" },
607 { "sp_port", "port (leading up)" },
608 { "sp_sniksnak", "snik snak" },
609 { "sp_disk_yellow", "yellow disk" },
610 { "sp_terminal", "terminal" },
611 { "sp_disk_red", "red disk" }, /* 230 */
612 { "sp_port", "port (vertical)" },
613 { "sp_port", "port (horizontal)" },
614 { "sp_port", "port (all directions)" },
615 { "sp_electron", "electron" },
616 { "sp_buggy_base", "buggy base" },
617 { "wall", "chip (left half)" },
618 { "wall", "chip (right half)" },
619 { "wall", "hardware" },
620 { "wall", "hardware" },
621 { "wall", "hardware" }, /* 240 */
622 { "wall", "hardware" },
623 { "wall", "hardware" },
624 { "wall", "hardware" },
625 { "wall", "hardware" },
626 { "wall", "hardware" },
627 { "wall", "hardware" },
628 { "wall", "hardware" },
629 { "wall", "chip (upper half)" },
630 { "wall", "chip (lower half)" },
631 { "gate", "gray door (EM style, red key)" }, /* 250 */
632 { "gate", "gray door (EM style, yellow key)"},
633 { "gate", "gray door (EM style, green key)"},
634 { "gate", "gray door (EM style, blue key)"},
640 { "pearl", "pearl" }, /* (256) */
641 { "crystal", "crystal" },
642 { "wall", "wall with pearl" },
643 { "wall", "wall with crystal" },
644 { "gate", "white door" }, /* 260 */
645 { "gate", "gray door (opened by white key)"},
646 { "key", "white key" },
647 { "shield_passive", "shield (passive)" },
648 { "extra_time", "extra time" },
649 { "switchgate", "switch gate (open)" },
650 { "switchgate", "switch gate (closed)" },
651 { "switchgate_switch", "switch for switch gate" },
652 { "switchgate_switch", "switch for switch gate" },
654 { NULL, "-" }, /* 270 */
655 { "conveyor_belt", "red conveyor belt (left)" },
656 { "conveyor_belt", "red conveyor belt (middle)" },
657 { "conveyor_belt", "red conveyor belt (right)" },
658 { "conveyor_belt_switch", "switch for red conveyor belt (left)"},
659 { "conveyor_belt_switch", "switch for red conveyor belt (middle)"},
660 { "conveyor_belt_switch", "switch for red conveyor belt (right)"},
661 { "conveyor_belt", "yellow conveyor belt (left)" },
662 { "conveyor_belt", "yellow conveyor belt (middle)" },
663 { "conveyor_belt", "yellow conveyor belt (right)" },
664 { "conveyor_belt_switch", "switch for yellow conveyor belt (left)"},
665 { "conveyor_belt_switch", "switch for yellow conveyor belt (middle)"},
666 { "conveyor_belt_switch", "switch for yellow conveyor belt (right)"},
667 { "conveyor_belt", "green conveyor belt (left)" },
668 { "conveyor_belt", "green conveyor belt (middle)" },
669 { "conveyor_belt", "green conveyor belt (right)" },
670 { "conveyor_belt_switch", "switch for green conveyor belt (left)"},
671 { "conveyor_belt_switch", "switch for green conveyor belt (middle)"},
672 { "conveyor_belt_switch", "switch for green conveyor belt (right)"},
673 { "conveyor_belt", "blue conveyor belt (left)" },
674 { "conveyor_belt", "blue conveyor belt (middle)" },
675 { "conveyor_belt", "blue conveyor belt (right)" },
676 { "conveyor_belt_switch", "switch for blue conveyor belt (left)"},
677 { "conveyor_belt_switch", "switch for blue conveyor belt (middle)"},
678 { "conveyor_belt_switch", "switch for blue conveyor belt (right)"},
679 { "sand", "land mine" },
680 { "envelope", "mail envelope" },
681 { "light_switch", "light switch (off)" },
682 { "light_switch", "light switch (on)" },
683 { "wall", "sign (exclamation)" },
684 { "wall", "sign (radio activity)" }, /* 300 */
685 { "wall", "sign (stop)" },
686 { "wall", "sign (wheel chair)" },
687 { "wall", "sign (parking)" },
688 { "wall", "sign (one way)" },
689 { "wall", "sign (heart)" },
690 { "wall", "sign (triangle)" },
691 { "wall", "sign (round)" },
692 { "wall", "sign (exit)" },
693 { "wall", "sign (yin yang)" },
694 { "wall", "sign (other)" }, /* 310 */
695 { "mole", "mole (starts moving left)" },
696 { "mole", "mole (starts moving right)" },
697 { "mole", "mole (starts moving up)" },
698 { "mole", "mole (starts moving down)" },
699 { "wall", "steel wall (slanted)" },
700 { "sand", "invisible sand" },
701 { NULL, "dx unknown 15" },
702 { NULL, "dx unknown 42" },
704 { NULL, "-" }, /* 320 */
705 { "shield_active", "shield (active, kills enemies)"},
706 { "timegate", "time gate (open)" },
707 { "timegate", "time gate (closed)" },
708 { "timegate_wheel", "switch for time gate" },
709 { "timegate_wheel", "switch for time gate" },
710 { "balloon", "balloon" },
711 { "wall", "send balloon to the left" },
712 { "wall", "send balloon to the right" },
713 { "balloon_switch", "send balloon up" },
714 { "balloon_switch", "send balloon down" }, /* 330 */
715 { "balloon_switch", "send balloon in any direction" },
716 { "wall", "steel wall" },
717 { "wall", "steel wall" },
718 { "wall", "steel wall" },
719 { "wall", "steel wall" },
720 { "wall", "normal wall" },
721 { "wall", "normal wall" },
722 { "wall", "normal wall" },
723 { "wall", "normal wall" },
724 { "wall", "normal wall" }, /* 340 */
725 { "wall", "normal wall" },
726 { "wall", "normal wall" },
727 { "wall", "normal wall" },
728 { "tube", "tube (all directions)" },
729 { "tube", "tube (vertical)" },
730 { "tube", "tube (horizontal)" },
731 { "tube", "tube (vertical & left)" },
732 { "tube", "tube (vertical & right)" },
733 { "tube", "tube (horizontal & up)" },
734 { "tube", "tube (horizontal & down)" }, /* 350 */
735 { "tube", "tube (left & up)" },
736 { "tube", "tube (left & down)" },
737 { "tube", "tube (right & up)" },
738 { "tube", "tube (right & down)" },
739 { "spring", "spring" },
741 { "dx_bomb", "stable bomb (DX style)" },
745 "-------------------------------",
749 struct GraphicInfo graphic_info[MAX_GRAPHICS];
752 /* ========================================================================= */
754 /* ========================================================================= */
756 int main(int argc, char *argv[])
758 InitCommandName(argv[0]);
759 InitExitFunction(CloseAllAndExit);
760 InitPlatformDependantStuff();
768 return 0; /* to keep compilers happy */