rnd-20001202-2-src
[rocksndiamonds.git] / src / main.c
index dac98c0f266f06eb8807be35f0c8189a80e617e7..92e8b38a1e20514c004175fbe370ec0de64ede82 100644 (file)
 *  main.c                                                  *
 ***********************************************************/
 
 *  main.c                                                  *
 ***********************************************************/
 
+#include "libgame/libgame.h"
+
 #include "main.h"
 #include "init.h"
 #include "game.h"
 #include "events.h"
 #include "main.h"
 #include "init.h"
 #include "game.h"
 #include "events.h"
-#include "sound.h"
 #include "joystick.h"
 #include "joystick.h"
-#include "misc.h"
 
 
-#ifdef MSDOS
+#if defined(PLATFORM_MSDOS)
 #include <fcntl.h>
 #endif
 
 #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];
+#if 0
+DrawWindow     window = None;
+DrawBuffer     backbuffer;
+GC             gc;
 #endif
 
 #endif
 
-Drawable        drawto, drawto_field, backbuffer, fieldbuffer;
+GC             clip_gc[NUM_BITMAPS], tile_clip_gc;
+Bitmap         pix[NUM_BITMAPS];
+Bitmap         pix_masked[NUM_BITMAPS], tile_masked[NUM_TILES];
+Pixmap         clipmask[NUM_BITMAPS], tile_clipmask[NUM_TILES];
+
+DrawBuffer     drawto, drawto_field, fieldbuffer;
+#if 0
 Colormap       cmap;
 Colormap       cmap;
+#endif
+
+#if 0
+char          *sound_device_name = AUDIO_DEVICE;
+#endif
 
 
-int            sound_pipe[2];
-int            sound_device;
-char          *sound_device_name = SOUND_DEVICE;
 int            joystick_device = 0;
 char          *joystick_device_name[MAX_PLAYERS] =
 {
 int            joystick_device = 0;
 char          *joystick_device_name[MAX_PLAYERS] =
 {
@@ -60,8 +62,11 @@ boolean              motion_status = FALSE;
 int            key_joystick_mapping = 0;
 int            global_joystick_status = JOYSTICK_STATUS;
 int            joystick_status = JOYSTICK_STATUS;
 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;
+
+#if 0
+boolean                fullscreen_available = FULLSCREEN_STATUS;
+boolean                fullscreen_enabled = FALSE;
+#endif
 
 boolean                redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 int            redraw_x1 = 0, redraw_y1 = 0;
 
 boolean                redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 int            redraw_x1 = 0, redraw_y1 = 0;
@@ -84,7 +89,7 @@ short         AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
 unsigned long  Elementeigenschaften1[MAX_ELEMENTS];
 unsigned long  Elementeigenschaften2[MAX_ELEMENTS];
 
 unsigned long  Elementeigenschaften1[MAX_ELEMENTS];
 unsigned long  Elementeigenschaften2[MAX_ELEMENTS];
 
-int            level_nr, leveldir_nr, num_leveldirs;
+int            level_nr;
 int            lev_fieldx,lev_fieldy, scroll_x,scroll_y;
 
 int            FX = SX, FY = SY, ScrollStepSize;
 int            lev_fieldx,lev_fieldy, scroll_x,scroll_y;
 
 int            FX = SX, FY = SY, ScrollStepSize;
@@ -98,21 +103,34 @@ int                SBX_Left, SBX_Right;
 int            SBY_Upper, SBY_Lower;
 int            ZX,ZY, ExitX,ExitY;
 int            AllPlayersGone;
 int            SBY_Upper, SBY_Lower;
 int            ZX,ZY, ExitX,ExitY;
 int            AllPlayersGone;
-int            FrameCounter, TimeFrames, TimePlayed, TimeLeft;
+
+#if 0
+int            FrameCounter;
+#endif
+
+int            TimeFrames, TimePlayed, TimeLeft;
 
 boolean                network_player_action_received = FALSE;
 
 
 boolean                network_player_action_received = FALSE;
 
-struct LevelDirInfo    leveldir[MAX_LEVDIR_ENTRIES];
+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 LevelInfo       level;
 struct PlayerInfo      stored_player[MAX_PLAYERS], *local_player = NULL;
 struct HiScore         highscore[MAX_SCORE_ENTRIES];
-struct SoundInfo       Sound[NUM_SOUNDS];
+struct SampleInfo      Sound[NUM_SOUNDS];
 struct TapeInfo                tape;
 struct TapeInfo                tape;
+
+#if 0
 struct OptionInfo      options;
 struct OptionInfo      options;
+#endif
+
 struct SetupInfo       setup;
 struct SetupInfo       setup;
-struct SetupFileList   *setup_list = NULL;
-struct SetupFileList   *level_setup_list = NULL;
 struct GameInfo                game;
 struct GameInfo                game;
+
+#if 0
+struct VideoSystemInfo video;
+struct AudioSystemInfo audio;
+#endif
+
 struct GlobalInfo      global;
 
 /* data needed for playing sounds */
 struct GlobalInfo      global;
 
 /* data needed for playing sounds */
@@ -260,7 +278,7 @@ char *element_info[] =
   "dark yam yam",                              /* 60 */
   "magic wall (BD style)",
   "invisible steel wall",
   "dark yam yam",                              /* 60 */
   "magic wall (BD style)",
   "invisible steel wall",
-  "dynabomb",
+  "-",
   "increases number of bombs",
   "increases explosion size",
   "increases power of explosion",
   "increases number of bombs",
   "increases explosion size",
   "increases power of explosion",
@@ -302,8 +320,8 @@ char *element_info[] =
   "unknown",
   "unknown",
   "unknown",
   "unknown",
   "unknown",
   "unknown",
-  "unknown",
-  "unknown",
+  "normal wall (BD style)",
+  "rock (BD style)",
   "open exit",
   "unknown",
   "amoeba",
   "open exit",
   "unknown",
   "amoeba",
@@ -397,8 +415,8 @@ char *element_info[] =
   "letter ''",
   "letter ''",
   "letter ''",
   "letter ''",
   "letter ''",
   "letter ''",
-  "growing wall (horizontally)",               /* 200 */
-  "growing wall (vertically)",
+  "growing wall (horizontal)",                 /* 200 */
+  "growing wall (vertical)",
   "growing wall (all directions)",
   "unused",
   "unused",
   "growing wall (all directions)",
   "unused",
   "unused",
@@ -428,8 +446,8 @@ char *element_info[] =
   "yellow disk",
   "terminal",
   "red disk",                                  /* 230 */
   "yellow disk",
   "terminal",
   "red disk",                                  /* 230 */
-  "port (vertically)",
-  "port (horizontally)",
+  "port (vertical)",
+  "port (horizontal)",
   "port (all directions)",
   "electron",
   "buggy base",
   "port (all directions)",
   "electron",
   "buggy base",
@@ -463,14 +481,14 @@ char *element_info[] =
   "white door",                                        /* 260 */
   "gray door (opened by white key)",
   "white key",
   "white door",                                        /* 260 */
   "gray door (opened by white key)",
   "white key",
-  "force field",
+  "shield (passive)",
   "extra time",
   "switch gate (open)",
   "switch gate (closed)",
   "switch for switch gate",
   "switch for switch gate",
   "extra time",
   "switch gate (open)",
   "switch gate (closed)",
   "switch for switch gate",
   "switch for switch gate",
-  "time gate",
-  "time gate with magic wheel",                        /* 270 */
+  "-",
+  "-",                                         /* 270 */
   "red conveyor belt (left)",
   "red conveyor belt (middle)",
   "red conveyor belt (right)",
   "red conveyor belt (left)",
   "red conveyor belt (middle)",
   "red conveyor belt (right)",
@@ -517,32 +535,457 @@ char *element_info[] =
   "mole (starts moving down)",
   "steel wall (slanted)",
   "invisible sand",
   "mole (starts moving down)",
   "steel wall (slanted)",
   "invisible sand",
-  "-",
-  "-",
+  "dx unknown 15",
+  "dx unknown 42",
   "-",
   "-",                                         /* 320 */
   "-",
   "-",                                         /* 320 */
-  "-",
-  "-",
-  "-",
-  "-",
-  "-",
+  "shield (active, kills enemies)",
+  "time gate (open)",
+  "time gate (closed)",
+  "switch for time gate",
+  "switch for time gate",
+  "balloon",
+  "send balloon to the left",
+  "send balloon to the right",
+  "send balloon up",
+  "send balloon down",                         /* 330 */
+  "send balloon in any direction",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "normal wall",
+  "normal wall",
+  "normal wall",
+  "normal wall",
+  "normal wall",                               /* 340 */
+  "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 *);
+
+
+
+/* +-----------------------------------------------------------------------+ */
+/* | SDL TEST STUFF                                                        | */
+/* +-----------------------------------------------------------------------+ */
+
+#if defined(TARGET_SDL)
+
+SDL_Surface *sdl_screen, *sdl_image_tmp, *sdl_image, *sdl_image_masked;
+SDL_Surface *sdl_image2_tmp, *sdl_image2, *sdl_image2_masked;
+
+void TEST_SDL_BLIT_RECT(int x, int y)
+{
+  SDL_Rect rect_src, rect_dst;
+
+  SDLCopyArea(pix_masked[PIX_HEROES], window,
+             8 * TILEX, 8 * TILEY, TILEX, TILEY, x, y);
+  return;
+
+  rect_src.x = 8 * TILEX;
+  rect_src.y = 8 * TILEY;
+  rect_src.w = TILEX;
+  rect_src.h = TILEY;
+
+  rect_dst.x = x;
+  rect_dst.y = y;
+  rect_dst.w = TILEX;
+  rect_dst.h = TILEY;
+
+  SDL_BlitSurface(sdl_image2_masked, &rect_src, sdl_screen, &rect_dst);
+  SDL_UpdateRect(sdl_screen, x, y, TILEX, TILEY);
+}
+
+void TEST_SDL_INIT_DISPLAY()
+{
+  SDL_Rect rect_src, rect_dst;
+
+  if (SDL_Init(SDL_INIT_VIDEO) < 0)
+  {
+    fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  /* automatically cleanup SDL stuff after exit() */
+  atexit(SDL_Quit);
+
+  if ((sdl_screen = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, 16, SDL_HWSURFACE))
+      == NULL)
+  {
+    fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING);
+
+  if ((sdl_image_tmp = IMG_Load("graphics/RocksScreen.pcx")) == NULL)
+  {
+    fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  sdl_image = SDL_DisplayFormat(sdl_image_tmp);
+
+  SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
+                 SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
+  sdl_image_masked = SDL_DisplayFormat(sdl_image_tmp);
+
+  SDL_FreeSurface(sdl_image_tmp);
+
+  if ((sdl_image2_tmp = IMG_Load("graphics/RocksHeroes.pcx")) == NULL)
+  {
+    fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  sdl_image2 = SDL_DisplayFormat(sdl_image2_tmp);
+  SDL_FreeSurface(sdl_image2_tmp);
+
+  sdl_image2_masked = SDL_DisplayFormat(sdl_image2);
+  SDL_SetColorKey(sdl_image2_masked, SDL_SRCCOLORKEY,
+                 SDL_MapRGB(sdl_image2_masked->format, 0x00, 0x00, 0x00));
+
+  rect_src.x = 0;
+  rect_src.y = 0;
+  rect_src.w = sdl_image->w;
+  rect_src.h = sdl_image->h;
+
+  rect_dst.x = 0;
+  rect_dst.y = 0;
+  rect_dst.w = sdl_image->w;
+  rect_dst.h = sdl_image->h;
+                                           
+  SDL_BlitSurface(sdl_image, &rect_src, sdl_screen, &rect_dst);
+
+  /*
+  SDL_UpdateRect(sdl_screen, 0, 0, WIN_XSIZE, WIN_YSIZE);
+  */
+  /*
+  SDL_UpdateRect(sdl_screen, 0, 0, 0, 0);
+  */
+  SDL_Flip(sdl_screen);
+
+  /*
+  SDL_Delay(5000);
+  */
+}
+
+void TEST_SDL_EVENT_LOOP()
+{
+  int quit_loop = 0;
+
+  SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
+
+  /*
+  while (!quit_loop && SDL_WaitEvent(&event) >=0)
+  */
+
+  while (!quit_loop)
+  {
+    SDL_Event event;
+
+    if (SDL_PollEvent(&event))
+    {
+      /* hier werden die Ereignisse behandelt */
+      switch(event.type)
+      {
+        case SDL_QUIT:
+       {
+         quit_loop = 1;
+         break;
+       }
+
+        case SDL_MOUSEBUTTONDOWN:
+       {
+         int x = event.button.x;
+         int y = event.button.y;
+
+         SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
+
+         TEST_SDL_BLIT_RECT(x, y);
+
+         printf("SDL_MOUSEBUTTONDOWN(%d, %d)\n", x, y);
+         break;
+       }
+
+        case SDL_MOUSEBUTTONUP:
+       {
+         int x = event.button.x;
+         int y = event.button.y;
+
+         SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
+
+         printf("SDL_MOUSEBUTTONUP(%d, %d)\n", x, y);
+         break;
+       }
+
+        case SDL_MOUSEMOTION:
+       {
+         int x = event.motion.x;
+         int y = event.motion.y;
+
+         TEST_SDL_BLIT_RECT(x, y);
+
+         printf("SDL_MOUSEMOTION(%d, %d)\n", x, y);
+         break;
+       }
+
+        default:
+         break;
+      }
+    }
+
+    if (!SDL_PollEvent(NULL))  /* delay only if no pending events */
+    {
+      printf("waiting...\n");
+      Delay(100);
+    }
+  }
+
+  SDL_FreeSurface(sdl_image);
+  SDL_Quit();
+}
+
+#define SCREEN_WIDTH   640
+#define SCREEN_HEIGHT  480
+
+void WatchJoysticks()
+{
+       SDL_Surface *screen;
+       const char *name;
+       int i, done;
+       SDL_Event event;
+       int x, y, draw;
+       SDL_Rect axis_area[2];
+       int joystick_nr = 0;
+       SDL_Joystick *joystick = Get_SDL_Joystick(joystick_nr);
+
+       /* Set a video mode to display joystick axis position */
+       screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0);
+       if ( screen == NULL ) {
+               fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError());
+               return;
+       }
+
+       /* Print info about the joysticks we are watching */
+       for (i=0; i<2; i++)
+       {
+         joystick = Get_SDL_Joystick(i);
+
+         name = SDL_JoystickName(i);
+         printf("Watching joystick %d: (%s)\n", i,
+                name ? name : "Unknown Joystick");
+         printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n",
+                SDL_JoystickNumAxes(joystick),
+                SDL_JoystickNumHats(joystick),
+                SDL_JoystickNumBalls(joystick),
+                SDL_JoystickNumButtons(joystick));
+       }
+
+       /* Initialize drawing rectangles */
+       memset(axis_area, 0, (sizeof axis_area));
+       draw = 0;
+
+       /* Loop, getting joystick events! */
+       done = 0;
+       while ( ! done ) {
+               while ( SDL_PollEvent(&event) ) {
+                       switch (event.type) {
+                           case SDL_JOYAXISMOTION:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d axis %d value: %d\n",
+                                      event.jaxis.which,
+                                      event.jaxis.axis,
+                                      event.jaxis.value);
+                               break;
+                           case SDL_JOYHATMOTION:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d hat %d value:",
+                                      event.jhat.which,
+                                      event.jhat.hat);
+                               if ( event.jhat.value == SDL_HAT_CENTERED )
+                                       printf(" centered");
+                               if ( event.jhat.value & SDL_HAT_UP )
+                                       printf(" up");
+                               if ( event.jhat.value & SDL_HAT_RIGHT )
+                                       printf(" right");
+                               if ( event.jhat.value & SDL_HAT_DOWN )
+                                       printf(" down");
+                               if ( event.jhat.value & SDL_HAT_LEFT )
+                                       printf(" left");
+                               printf("\n");
+                               break;
+                           case SDL_JOYBALLMOTION:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d ball %d delta: (%d,%d)\n",
+                                      event.jball.which,
+                                      event.jball.ball,
+                                      event.jball.xrel,
+                                      event.jball.yrel);
+                               break;
+                           case SDL_JOYBUTTONDOWN:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d button %d down\n",
+                                      event.jbutton.which,
+                                      event.jbutton.button);
+                               break;
+                           case SDL_JOYBUTTONUP:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d button %d up\n",
+                                      event.jbutton.which,
+                                      event.jbutton.button);
+                               break;
+                           case SDL_KEYDOWN:
+                               if ( event.key.keysym.sym != SDLK_ESCAPE ) {
+                                       break;
+                               }
+                               /* Fall through to signal quit */
+                           case SDL_QUIT:
+                               done = 1;
+                               break;
+                           default:
+                               break;
+                       }
+               }
+
+               joystick = Get_SDL_Joystick(joystick_nr);               
+
+               /* Update visual joystick state */
+               for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) {
+                       SDL_Rect area;
+
+                       area.x = i*34;
+                       area.y = SCREEN_HEIGHT-34;
+                       area.w = 32;
+                       area.h = 32;
+                       if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) {
+                               SDL_FillRect(screen, &area, 0xFFFF);
+                       } else {
+                               SDL_FillRect(screen, &area, 0x0000);
+                       }
+                       SDL_UpdateRects(screen, 1, &area);
+               }
+
+               /* Erase previous axes */
+               SDL_FillRect(screen, &axis_area[draw], 0x0000);
+
+               /* Draw the X/Y axis */
+               draw = !draw;
+               x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768);
+               x *= SCREEN_WIDTH;
+               x /= 65535;
+               if ( x < 0 ) {
+                       x = 0;
+               } else
+               if ( x > (SCREEN_WIDTH-16) ) {
+                       x = SCREEN_WIDTH-16;
+               }
+               y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768);
+               y *= SCREEN_HEIGHT;
+               y /= 65535;
+               if ( y < 0 ) {
+                       y = 0;
+               } else
+               if ( y > (SCREEN_HEIGHT-16) ) {
+                       y = SCREEN_HEIGHT-16;
+               }
+               axis_area[draw].x = (Sint16)x;
+               axis_area[draw].y = (Sint16)y;
+               axis_area[draw].w = 16;
+               axis_area[draw].h = 16;
+               SDL_FillRect(screen, &axis_area[draw], 0xFFFF);
+
+               SDL_UpdateRects(screen, 2, axis_area);
+       }
+}
+
+void TEST_SDL_JOYSTICK()
+{
+  const char *name;
+  int i;
+
+  /* Initialize SDL (Note: video is required to start event loop) */
+  if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 )
+  {
+    fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
+    exit(1);
+  }
+
+  /* Print information about the joysticks */
+  printf("There are %d joysticks attached\n", SDL_NumJoysticks());
+  for ( i=0; i<SDL_NumJoysticks(); ++i )
+  {
+    name = SDL_JoystickName(i);
+    printf("Joystick %d: %s\n",i,name ? name : "Unknown Joystick");
+  }
+
+  for (i=0; i<2; i++)
+  {
+    if (!Open_SDL_Joystick(i))
+      printf("Couldn't open joystick %d: %s\n", i, SDL_GetError());
+  }
+
+  WatchJoysticks();
+
+  for (i=0; i<2; i++)
+    Close_SDL_Joystick(i);
+
+  SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
+}
+
+#endif /* TARGET_SDL */
+
+/* +-----------------------------------------------------------------------+ */
+/* | SDL TEST STUFF                                                        | */
+/* +-----------------------------------------------------------------------+ */
+
+
 
 int main(int argc, char *argv[])
 {
   program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
 
 
 int main(int argc, char *argv[])
 {
   program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
 
-#ifdef MSDOS
+#if defined(PLATFORM_MSDOS)
   _fmode = O_BINARY;
 #endif
 
   _fmode = O_BINARY;
 #endif
 
+#if 1
   GetOptions(argv);
   OpenAll(argc,argv);
   GetOptions(argv);
   OpenAll(argc,argv);
+#endif
+
+#if 0
+#ifdef TARGET_SDL
+  /*
+  TEST_SDL_BLIT_RECT((WIN_XSIZE - TILEX)/2, (WIN_YSIZE - TILEY)/2);
+  TEST_SDL_EVENT_LOOP();
+  */
+  TEST_SDL_JOYSTICK();
+  exit(0);
+#endif
+#endif
+
   EventLoop();
   CloseAllAndExit(0);
   exit(0);     /* to keep compilers happy */
   EventLoop();
   CloseAllAndExit(0);
   exit(0);     /* to keep compilers happy */