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