rnd-20020501-1-src
[rocksndiamonds.git] / src / main.c
index 3182b47dd9d4cae4b3248d2e98cb5728fbc57ed0..2b0716e2cd2333f648394ddf6d31d052a1f4e33e 100644 (file)
@@ -1,72 +1,37 @@
 /***********************************************************
-*  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
+* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-*  (c) 1995-98 Artsoft Entertainment                       *
-*              Holger Schemel                              *
-*              Oststrasse 11a                              *
-*              33604 Bielefeld                             *
-*              phone: ++49 +521 290471                     *
-*              email: aeglos@valinor.owl.de                *
+* (c) 1995-2001 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
 *----------------------------------------------------------*
-*  main.c                                                  *
+* main.c                                                   *
 ***********************************************************/
 
+#include "libgame/libgame.h"
+
 #include "main.h"
 #include "init.h"
 #include "game.h"
 #include "events.h"
-#include "sound.h"
-#include "joystick.h"
-#include "misc.h"
-
-#ifdef MSDOS
-#include <fcntl.h>
-#endif
-
-Display        *display;
-Visual        *visual;
-int            screen;
-Window         window;
-GC             gc, clip_gc[NUM_PIXMAPS], tile_clip_gc;
-Pixmap         pix[NUM_PIXMAPS];
-Pixmap         clipmask[NUM_PIXMAPS], tile_clipmask[NUM_TILES];
-
-#ifdef USE_XPM_LIBRARY
-XpmAttributes  xpm_att[NUM_PICTURES];
-#endif
 
-Drawable        drawto, drawto_field, backbuffer, fieldbuffer;
-Colormap       cmap;
-
-int            sound_pipe[2];
-int            sound_device;
-char          *sound_device_name = SOUND_DEVICE;
-int            joystick_device = 0;
-char          *joystick_device_name[MAX_PLAYERS] =
-{
-  DEV_JOYSTICK_0,
-  DEV_JOYSTICK_1,
-  DEV_JOYSTICK_2,
-  DEV_JOYSTICK_3
-};
-
-char          *program_name = NULL;
+GC             tile_clip_gc;
+Bitmap        *pix[NUM_BITMAPS];
+Pixmap         tile_clipmask[NUM_TILES];
+DrawBuffer     *fieldbuffer;
+DrawBuffer     *drawto_field;
 
 int            game_status = MAINMENU;
 boolean                level_editor_test_game = FALSE;
 boolean                network_playing = FALSE;
-int            button_status = MB_NOT_PRESSED;
-boolean                motion_status = FALSE;
+
 int            key_joystick_mapping = 0;
-int            global_joystick_status = JOYSTICK_STATUS;
-int            joystick_status = JOYSTICK_STATUS;
-int            sound_status = SOUND_STATUS;
-boolean                sound_loops_allowed = FALSE;
 
 boolean                redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 int            redraw_x1 = 0, redraw_y1 = 0;
-int            redraw_mask;
-int            redraw_tiles;
 
 short          Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -81,10 +46,10 @@ boolean             Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
+short          ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 unsigned long  Elementeigenschaften1[MAX_ELEMENTS];
 unsigned long  Elementeigenschaften2[MAX_ELEMENTS];
 
-int            level_nr, num_leveldirs;
 int            lev_fieldx,lev_fieldy, scroll_x,scroll_y;
 
 int            FX = SX, FY = SY, ScrollStepSize;
@@ -98,100 +63,242 @@ int               SBX_Left, SBX_Right;
 int            SBY_Upper, SBY_Lower;
 int            ZX,ZY, ExitX,ExitY;
 int            AllPlayersGone;
-int            FrameCounter, TimeFrames, TimePlayed, TimeLeft;
+
+int            TimeFrames, TimePlayed, TimeLeft;
 
 boolean                network_player_action_received = FALSE;
 
-struct LevelDirInfo    *leveldir_first = NULL, *leveldir_current = NULL;
 struct LevelInfo       level;
 struct PlayerInfo      stored_player[MAX_PLAYERS], *local_player = NULL;
 struct HiScore         highscore[MAX_SCORE_ENTRIES];
-struct SoundInfo       Sound[NUM_SOUNDS];
 struct TapeInfo                tape;
-struct OptionInfo      options;
 struct SetupInfo       setup;
 struct GameInfo                game;
 struct GlobalInfo      global;
 
-/* data needed for playing sounds */
+/* filenames of sound effects */
 char *sound_name[NUM_SOUNDS] =
 {
-  "alchemy",
-  "amoebe",
-  "antigrav",
-  "autsch",
-  "blurb",
-  "bong",
-  "buing",
-  "chase",
-  "czardasz",
-  "deng",
-  "fuel",
-  "gong",
-  "halloffame",
-  "holz",
-  "hui",
-  "kabumm",
-  "kink",
-  "klapper",
-  "kling",
-  "klopf",
-  "klumpf",
-  "knack",
-  "knurk",
-  "krach",
-  "lachen",
-  "laser",
-  "miep",
-  "network",
-  "njam",
-  "oeffnen",
-  "pling",
-  "pong",
-  "pusch",
-  "quiek",
-  "quirk",
-  "rhythmloop",
-  "roaaar",
-  "roehr",
-  "rumms",
-  "schlopp",
-  "schlurf",
-  "schrff",
-  "schwirr",
-  "sirr",
-  "slurp",
-  "sproing",
-  "twilight",
-  "tyger",
-  "voyager",
-  "warnton",
-  "whoosh",
-  "zisch",
-  "base",
-  "infotron",
-  "zonkdown",
-  "zonkpush",
-  "bug",
-  "boom",
-  "booom",
-  "exit",
-  "empty",
-  "gate"
+  "amoebe.wav",
+  "antigrav.wav",
+  "autsch.wav",
+  "blurb.wav",
+  "bong.wav",
+  "buing.wav",
+  "deng.wav",
+  "fuel.wav",
+  "gong.wav",
+  "halloffame.wav",
+  "holz.wav",
+  "hui.wav",
+  "kabumm.wav",
+  "kink.wav",
+  "klapper.wav",
+  "kling.wav",
+  "klopf.wav",
+  "klumpf.wav",
+  "knack.wav",
+  "knurk.wav",
+  "krach.wav",
+  "lachen.wav",
+  "laser.wav",
+  "miep.wav",
+  "njam.wav",
+  "oeffnen.wav",
+  "pling.wav",
+  "pong.wav",
+  "pusch.wav",
+  "quiek.wav",
+  "quirk.wav",
+  "rhythmloop.wav",
+  "roaaar.wav",
+  "roehr.wav",
+  "rumms.wav",
+  "schlopp.wav",
+  "schlurf.wav",
+  "schrff.wav",
+  "schwirr.wav",
+  "sirr.wav",
+  "slurp.wav",
+  "sproing.wav",
+  "warnton.wav",
+  "whoosh.wav",
+  "zisch.wav",
+  "base.wav",
+  "infotron.wav",
+  "zonkdown.wav",
+  "zonkpush.wav",
+  "bug.wav",
+  "boom.wav",
+  "booom.wav",
+  "exit.wav",
+  "empty.wav",
+  "gate.wav"
 };
 
-/* background music */
-int background_loop[] =
+/* sound effects: setup file identifiers and corresponding default filenames */
+struct SoundEffectInfo sound_effects[NUM_SOUND_EFFECTS] =
 {
-  SND_ALCHEMY,
-  SND_CHASE,
-  SND_NETWORK,
-  SND_CZARDASZ,
-  SND_TYGER,
-  SND_VOYAGER,
-  SND_TWILIGHT
+  { "infotron_collecting",     "infotron.wav"  },
+  { "zonk_falling",            "NONE"  },
+  { "zonk_pushing",            "zonkpush.wav"  },
+  { "player_screaming",                "autsch.wav"    }
+};
+
+struct SoundEffectInfo sound_effects_NEW[] =
+{
+  /* sounds for Boulder Dash style elements and actions */
+  { "bd_empty_space.digging",  "empty.wav"     },
+  { "bd_sand.digging",         "schlurf.wav"   },
+  { "bd_diamond.collecting",   "pong.wav"      },
+  { "bd_diamond.impact",       "pling.wav"     },
+  { "bd_rock.pushing",         "pusch.wav"     },
+  { "bd_rock.impact",          "klopf.wav"     },
+  { "bd_magic_wall.activating",        "quirk.wav"     },
+  { "bd_magic_wall.changing",  "quirk.wav"     },
+  { "bd_magic_wall.running",   "miep.wav"      },
+  { "bd_amoeba.growing",       "amoebe.wav"    },
+  { "bd_amoeba.turning_to_gem",        "pling.wav"     },
+  { "bd_amoeba.turning_to_rock","klopf.wav"    },
+  { "bd_butterfly.moving",     "klapper.wav"   },
+  { "bd_firefly.moving",       "roehr.wav"     },
+  { "bd_exit.entering",                "buing.wav"     },
+
+  /* sounds for Supaplex style elements and actions */
+  { "sp_empty_space.digging",  "empty.wav"     },
+  { "sp_base.digging",         "base.wav"      },
+  { "sp_buggy_base.digging",   "base.wav"      },
+  { "sp_buggy_base.passing",   "bug.wav"       },
+  { "sp_infotron.collecting",  "infotron.wav"  },
+  { "sp_infotron.impact",      "pling.wav"     },
+  { "sp_zonk.pushing",         "zonkpush.wav"  },
+  { "sp_zonk.impact",          "zonkdown.wav"  },
+  { "sp_disk_red.collecting",  "infotron.wav"  },
+  { "sp_disk_orange.pushing",  "zonkpush.wav"  },
+  { "sp_disk_yellow.pushing",  "pusch.wav"     },
+  { "sp_port.passing",         "gate.wav"      },
+  { "sp_exit.entering",                "buing.wav"     },
+  { "sp_element.exploding",    "booom.wav"     },
+
+  /* sounds for Sokoban style elements and actions */
+  { "sokoban_object.pushing",  "pusch.wav"     },
+  { "sokoban_field.filling",   "deng.wav"      },
+  { "sokoban_game.solving",    "buing.wav"     },
+
+  /* sounds for Emerald Mine style elements and actions */
+  { "empty_space.digging",     "empty.wav"     },
+  { "sand.digging",            "schlurf.wav"   },
+  { "emerald.collecting",      "pong.wav"      },
+  { "emerald.impact",          "pling.wav"     },
+  { "diamond.collecting",      "pong.wav"      },
+  { "diamond.impact",          "pling.wav"     },
+  { "diamond.smashing",                "quirk.wav"     },
+  { "rock.pushing",            "pusch.wav"     },
+  { "rock.impact",             "klopf.wav"     },
+  { "bomb.pushing",            "pusch.wav"     },
+  { "nut.pushing",             "knurk.wav"     },
+  { "nut.cracking",            "knack.wav"     },
+  { "nut.impact",              "klumpf.wav"    },
+  { "dynamite.collecting",     "pong.wav"      },
+  { "dynamite.placing",                "deng.wav"      },
+  { "dynamite.burning",                "zisch.wav"     },
+  { "key.collecting",          "pong.wav"      },
+  { "gate.passing",            "gate.wav"      },
+  { "bug.moving",              "klapper.wav"   },
+  { "spaceship.moving",                "roehr.wav"     },
+  { "yamyam.waiting",          "njam.wav"      },
+  { "robot.moving",            "schlurf.wav"   },
+  { "robot_wheel.activating",  "deng.wav"      },
+  { "robot_wheel.running",     "miep.wav"      },
+  { "magic_wall.activating",   "quirk.wav"     },
+  { "magic_wall.changing",     "quirk.wav"     },
+  { "magic_wall.running",      "miep.wav"      },
+  { "amoeba.growing",          "amoebe.wav"    },
+  { "acid.splashing",          "blurb.wav"     },
+  { "exit.opening",            "oeffnen.wav"   },
+  { "exit.entering",           "buing.wav"     },
+
+  /* sounds for Emerald Mine Club style elements and actions */
+  { "balloon.moving",          "schlurf.wav"   },
+  { "spring.pushing",          "pusch.wav"     },
+
+  /* sounds for Diamond Caves style elements and actions */
+  { "pearl.collecting",                "pong.wav"      },
+  { "pearl.breaking",          "knack.wav"     },
+  { "crystal.collecting",      "pong.wav"      },
+  { "envelope.collecting",     "pong.wav"      },
+  { "sand_invisible.digging",  "schlurf.wav"   },
+  { "shield_passive.collecting","pong.wav"     },
+  { "shield_active.collecting",        "pong.wav"      },
+  { "extra_time.collecting",   "gong.wav"      },
+  { "mole.eating_amoeba",      "blurb.wav"     },
+  { "switchgate.opening",      "oeffnen.wav"   },
+  { "switchgate.closing",      "oeffnen.wav"   },
+  { "switchgate.passing",      "gate.wav"      },
+  { "timegate.opening",                "oeffnen.wav"   },
+  { "timegate.closing",                "oeffnen.wav"   },
+  { "timegate.passing",                "gate.wav"      },
+  { "timegate_wheel.activating","deng.wav"     },
+  { "timegate_wheel.running",  "miep.wav"      },
+
+  /* sounds for DX Boulderdash style elements and actions */
+  { "dx_bomb.pushing",         "pusch.wav"     },
+  { "trap_inactive.digging",   "schlurf.wav"   },
+
+  /* sounds for Rocks'n'Diamonds style elements and actions */
+  { "amoeba.turning_to_gem",   "pling.wav"     },
+  { "amoeba.turning_to_rock",  "klopf.wav"     },
+  { "speed_pill.collecting",   "pong.wav"      },
+  { "penguin.entering_exit",   "buing.wav"     },
+  { "dynabomb_nr.collecting",  "pong.wav"      },
+  { "dynabomb_sz.collecting",  "pong.wav"      },
+  { "dynabomb_xl.collecting",  "pong.wav"      },
+  { "satellite.pushing",       "pusch.wav"     },
+  { "lamp.activating",         "deng.wav"      },
+  { "time_orb_full.collecting",        "gong.wav"      },
+  { "time_orb_full.impact",    "deng.wav"      },
+  { "time_orb_empty.pushing",  "pusch.wav"     },
+  { "time_orb_empty.impact",   "deng.wav"      },
+
+  /* sounds for generic elements and actions */
+  { "player.screaming",                "autsch.wav"    },
+  { "element.exploding",       "roaaar.wav"    },
+
+  /* sounds for other game actions */
+  { "game.running_out_of_time",        "gong.wav"      },
+  { "game.leveltime_bonus",    "sirr.wav"      },
+  { "game.laughing_at_player", "lachen.wav"    },
+
+  /* sounds for other non-game actions */
+  { "menu.door_opening",       "oeffnen.wav"   },
+  { "menu.door_closing",       "oeffnen.wav"   },
+  { "menu.hall_of_fame",       "halloffame.wav"},
+  { "menu.info_screen",                "rhythmloop.wav"},
+
+#if 0
+  { "[not used]",              "antigrav.wav"  },
+  { "[not used]",              "bong.wav"      },
+  { "[not used]",              "fuel.wav"      },
+  { "[not used]",              "holz.wav"      },
+  { "[not used]",              "hui.wav"       },
+  { "[not used]",              "kabumm.wav"    },
+  { "[not used]",              "kink.wav"      },
+  { "[not used]",              "kling.wav"     },
+  { "[not used]",              "krach.wav"     },
+  { "[not used]",              "laser.wav"     },
+  { "[not used]",              "quiek.wav"     },
+  { "[not used]",              "rumms.wav"     },
+  { "[not used]",              "schlopp.wav"   },
+  { "[not used]",              "schrff.wav"    },
+  { "[not used]",              "schwirr.wav"   },
+  { "[not used]",              "slurp.wav"     },
+  { "[not used]",              "sproing.wav"   },
+  { "[not used]",              "warnton.wav"   },
+  { "[not used]",              "whoosh.wav"    },
+  { "[not used]",              "boom.wav"      },
+  { "[not used]",              "exit.wav"      },
+#endif
 };
-int num_bg_loops = sizeof(background_loop)/sizeof(int);
 
 char *element_info[] =
 {
@@ -258,7 +365,7 @@ char *element_info[] =
   "dark yam yam",                              /* 60 */
   "magic wall (BD style)",
   "invisible steel wall",
-  "dynabomb",
+  "-",
   "increases number of bombs",
   "increases explosion size",
   "increases power of explosion",
@@ -300,10 +407,10 @@ char *element_info[] =
   "unknown",
   "unknown",
   "unknown",
-  "unknown",
-  "unknown",
+  "normal wall (BD style)",
+  "rock (BD style)",
   "open exit",
-  "unknown",
+  "black orb bomb",
   "amoeba",
   "mole",                                      /* 110 */
   "penguin",
@@ -314,7 +421,7 @@ char *element_info[] =
   "arrow down",
   "pig",
   "fire breathing dragon",
-  "unknown",
+  "red key (EM style)",
   "letter ' '",                                        /* 120 */
   "letter '!'",
   "letter '\"'",
@@ -395,16 +502,16 @@ char *element_info[] =
   "letter ''",
   "letter ''",
   "letter ''",
-  "growing wall (horizontally)",               /* 200 */
-  "growing wall (vertically)",
+  "growing wall (horizontal)",                 /* 200 */
+  "growing wall (vertical)",
   "growing wall (all directions)",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
+  "red door (EM style)",
+  "yellow door (EM style)",
+  "green door (EM style)",
+  "blue door (EM style)",
+  "yellow key (EM style)",
+  "green key (EM style)",
+  "blue key (EM style)",
   "empty space",                               /* 210 */
   "zonk",
   "base",
@@ -426,8 +533,8 @@ char *element_info[] =
   "yellow disk",
   "terminal",
   "red disk",                                  /* 230 */
-  "port (vertically)",
-  "port (horizontally)",
+  "port (vertical)",
+  "port (horizontal)",
   "port (all directions)",
   "electron",
   "buggy base",
@@ -445,10 +552,10 @@ char *element_info[] =
   "hardware",
   "chip (upper half)",
   "chip (lower half)",
-  "unknown",                                   /* 250 */
-  "unknown",
-  "unknown",
-  "unknown",
+  "gray door (EM style, red key)",             /* 250 */
+  "gray door (EM style, yellow key)",
+  "gray door (EM style, green key)",
+  "gray door (EM style, blue key)",
   "unknown",
   "unknown",
 
@@ -542,23 +649,42 @@ char *element_info[] =
   "normal wall",
   "normal wall",
   "normal wall",
+  "tube (all directions)",
+  "tube (vertical)",
+  "tube (horizontal)",
+  "tube (vertical & left)",
+  "tube (vertical & right)",
+  "tube (horizontal & up)",
+  "tube (horizontal & down)",                  /* 350 */
+  "tube (left & up)",
+  "tube (left & down)",
+  "tube (right & up)",
+  "tube (right & down)",
+  "spring",
+  "trap",
+  "stable bomb (DX style)",
   "-"
 
   /*
   "-------------------------------",
   */
 };
+int num_element_info = sizeof(element_info)/sizeof(char *);
+
+
+/* ========================================================================= */
+/* main()                                                                    */
+/* ========================================================================= */
 
 int main(int argc, char *argv[])
 {
-  program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
-
-#ifdef MSDOS
-  _fmode = O_BINARY;
-#endif
+  InitCommandName(argv[0]);
+  InitExitFunction(CloseAllAndExit);
+  InitPlatformDependantStuff();
 
   GetOptions(argv);
-  OpenAll(argc,argv);
+  OpenAll();
+
   EventLoop();
   CloseAllAndExit(0);
   exit(0);     /* to keep compilers happy */