rnd-19981108-2
[rocksndiamonds.git] / src / main.h
index a9fba3709e76aec839bd4bda48b0a9aa4a87bfab..d698ffdf42bc298a637096e09f35eb47e55bf4d7 100644 (file)
@@ -1,13 +1,12 @@
 /***********************************************************
 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
 *----------------------------------------------------------*
-*  ©1995 Artsoft Development                               *
-*        Holger Schemel                                    *
-*        33659 Bielefeld-Senne                             *
-*        Telefon: (0521) 493245                            *
-*        eMail: aeglos@valinor.owl.de                      *
-*               aeglos@uni-paderborn.de                    *
-*               q99492@pbhrzx.uni-paderborn.de             *
+*  (c) 1995-98 Artsoft Entertainment                       *
+*              Holger Schemel                              *
+*              Oststrasse 11a                              *
+*              33604 Bielefeld                             *
+*              phone: ++49 +521 290471                     *
+*              email: aeglos@valinor.owl.de                *
 *----------------------------------------------------------*
 *  main.h                                                  *
 ***********************************************************/
 #ifndef MAIN_H
 #define MAIN_H
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
 #ifndef MSDOS
 #define XK_MISCELLANY
 #define XK_LATIN1
 #ifdef   XPM_INCLUDE_FILE
 #include XPM_INCLUDE_FILE
 #endif
-#else
+#else  /* MSDOS */
 #include "msdos.h"
-#endif  /* #ifndef MSDOS */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
+#endif  /* MSDOS */
 
-typedef int BOOL;
+typedef unsigned char boolean;
+typedef unsigned char byte;
 
 #ifndef FALSE
 #define FALSE 0
@@ -52,10 +52,10 @@ typedef int BOOL;
 #ifndef MSDOS
 #define WIN_XPOS       0
 #define WIN_YPOS       0
-#else
+#else  /* MSDOS */
 #define WIN_XPOS       ((XRES - WIN_XSIZE) / 2)
 #define WIN_YPOS       ((YRES - WIN_YSIZE) / 2)
-#endif
+#endif /* MSDOS */
 #define SCR_FIELDX     17
 #define SCR_FIELDY     17
 #define MAX_BUF_XSIZE  (SCR_FIELDX + 2)
@@ -82,6 +82,7 @@ typedef int BOOL;
 #ifndef SIGN
 #define SIGN(a)                ((a) < 0 ? -1 : ((a)>0 ? 1 : 0))
 #endif
+
 #define SCREENX(a)     ((a) - scroll_x)
 #define SCREENY(a)     ((a) - scroll_y)
 #define LEVELX(a)      ((a) + scroll_x)
@@ -144,12 +145,7 @@ typedef int BOOL;
 #define IS_PUSHABLE(e)         (Elementeigenschaften[e] & EP_BIT_PUSHABLE)
 #define ELEM_IS_PLAYER(e)      (Elementeigenschaften[e] & EP_BIT_PLAYER)
 
-/*
-#define IS_PLAYER(x,y)         (JX == (x) && JY == (y))
-*/
-
 #define IS_PLAYER(x,y)         (ELEM_IS_PLAYER(StorePlayer[x][y]))
-#define IS_LOCAL_PLAYER(x,y)   (StorePlayer[x][y] == EL_SPIELER1)
 
 #define IS_FREE(x,y)           (Feld[x][y] == EL_LEERRAUM && !IS_PLAYER(x,y))
 #define IS_FREE_OR_PLAYER(x,y) (Feld[x][y] == EL_LEERRAUM)
@@ -199,9 +195,10 @@ typedef int BOOL;
 #define MAX_LEVDIR_FILENAME    (64+1)
 #define MAX_LEVDIR_NAME                (16+1)
 #define MAX_LEVDIR_ENTRIES     15
-#define MAX_SCORE_ENTRIES      15
+#define MAX_SCORE_ENTRIES      100
 
-#define MAX_FILENAME           256
+#define MAX_OPTION_LEN         256
+#define MAX_FILENAME_LEN       256
 #define MAX_NUM_AMOEBA         100
 #define MAX_ELEMENTS           512
 
@@ -211,26 +208,95 @@ struct HiScore
   int Score;
 };
 
-struct PlayerInfo
+struct OptionInfo
+{
+  char *display_name;
+  char *server_host;
+  int server_port;
+  char *base_directory;
+  char *level_directory;
+  boolean serveronly;
+  boolean network;
+  boolean verbose;
+};
+
+struct SetupJoystickInfo
+{
+  char device_name[MAX_FILENAME_LEN];
+  int xleft, xmiddle, xright;
+  int yupper, ymiddle, ylower;
+  int snap;
+  int bomb;
+};
+
+struct SetupKeyboardInfo
 {
-  int nr, active, local;
+  KeySym left;
+  KeySym right;
+  KeySym up;
+  KeySym down;
+  KeySym snap;
+  KeySym bomb;
+};
+
+struct SetupInputInfo
+{
+  boolean use_joystick;
+  struct SetupJoystickInfo joy;
+  struct SetupKeyboardInfo key;
+};
+
+struct SetupInfo
+{
+  boolean sound;
+  boolean sound_loops;
+  boolean sound_music;
+  boolean sound_simple;
+  boolean toons;
+  boolean double_buffering;
+  boolean direct_draw;         /* !double_buffering (redundant!) */
+  boolean scroll_delay;
+  boolean soft_scrolling;
+  boolean fading;
+  boolean autorecord;
+  boolean quick_doors;
+  boolean team_mode;
 
   char login_name[MAX_NAMELEN];
   char alias_name[MAX_NAMELEN];
-  int handicap;
-  unsigned int setup;
-  int leveldir_nr;
-  int level_nr;
 
-  int jx,jy, last_jx,last_jy;
-  int MovDir, MovPos, GfxPos;
-  int Pushing, Frame;
+  struct SetupInputInfo input[MAX_PLAYERS];
+};
 
-  int gone, LevelSolved, GameOver;
+struct SetupFileList
+{
+  char *token;
+  char *value;
+  struct SetupFileList *next;
+};
 
-  long actual_frame_counter;
+struct PlayerInfo
+{
+  boolean present;             /* player present in level playfield */
+  boolean connected;           /* player connected (locally or via network) */
+  boolean active;              /* player (present && connected) */
 
-  int frame_reset_delay;
+  int index_nr, client_nr, element_nr;
+
+  byte action;                 /* action from local input device */
+  byte effective_action;       /* action aknowledged from network server
+                                  or summarized over all configured input
+                                  devices when in single player mode */
+
+  int joystick_fd;             /* file descriptor of player's joystick */
+
+  int jx,jy, last_jx,last_jy;
+  int MovDir, MovPos, GfxPos;
+  int Frame;
+
+  boolean Pushing;
+  boolean gone, LevelSolved, GameOver;
+  boolean snapped;
 
   long move_delay;
   int last_move_dir;
@@ -238,7 +304,9 @@ struct PlayerInfo
   long push_delay;
   int push_delay_value;
 
-  int snapped;
+  int frame_reset_delay;
+
+  long actual_frame_counter;
 
   int score;
   int gems_still_needed;
@@ -276,29 +344,23 @@ struct LevelDirInfo
 struct RecordingInfo
 {
   int level_nr;
-  unsigned int random_seed;
+  unsigned long random_seed;
   unsigned long date;
   unsigned long counter;
   unsigned long length;
   unsigned long length_seconds;
   unsigned int delay_played;
-  BOOL pause_before_death;
-  BOOL recording, playing, pausing;
-  BOOL fast_forward;
-  BOOL changed;
+  boolean pause_before_death;
+  boolean recording, playing, pausing;
+  boolean fast_forward;
+  boolean changed;
   struct
   {
-    unsigned char joystickdata;
-    unsigned char delay;
+    byte action[MAX_PLAYERS];
+    byte delay;
   } pos[MAX_TAPELEN];
 };
 
-struct JoystickInfo
-{
-  int xleft, xright, xmiddle;
-  int yupper, ylower, ymiddle;
-};
-
 extern Display        *display;
 extern Visual         *visual;
 extern int             screen;
@@ -318,78 +380,74 @@ extern int                sound_pipe[2];
 extern int             sound_device;
 extern char           *sound_device_name;
 extern int             joystick_device;
-extern char           *joystick_device_name[2];
-extern char           *level_directory;
+extern char           *joystick_device_name[];
 extern int                     width, height;
 
+extern char           *program_name;
+
 extern int             game_status;
 extern int             game_emulation;
-extern int             button_status, motion_status;
+extern boolean         network_playing;
+extern int             button_status;
+extern boolean         motion_status;
 extern int             key_joystick_mapping;
 extern int             global_joystick_status, joystick_status;
-extern int             sound_status, sound_on;
-extern int             sound_loops_allowed, sound_loops_on;
-extern int             sound_music_on;
-extern int             sound_simple_on;
-extern int             toons_on;
-extern int             direct_draw_on;
-extern int             scroll_delay_on;
-extern int             soft_scrolling_on;
-extern int             fading_on;
-extern int             autorecord_on;
-extern int             joystick_nr;
-extern int             quick_doors;
-extern int             networking;
-
-extern BOOL            redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
+extern int             sound_status;
+extern boolean         sound_loops_allowed;
+
+extern boolean         redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 extern int             redraw_x1, redraw_y1;
 extern int             redraw_mask;
 extern int             redraw_tiles;
 
-extern int             Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             JustHit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int             AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
-extern long            Elementeigenschaften[MAX_ELEMENTS];
+extern short           Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern boolean         Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           JustHit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short           AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
+extern unsigned long   Elementeigenschaften[MAX_ELEMENTS];
 
 extern int             level_nr, leveldir_nr, num_leveldirs;
 extern int             lev_fieldx,lev_fieldy, scroll_x,scroll_y;
 
 extern int             FX,FY, ScrollStepSize;
 extern int             ScreenMovDir, ScreenMovPos, ScreenGfxPos;
-extern int             GameFrameDelay, MoveSpeed;
+extern int             GameFrameDelay;
+extern int             FfwdFrameDelay;
+extern int             MoveSpeed;
 extern int             BX1,BY1, BX2,BY2;
 extern int             ZX,ZY, ExitX,ExitY;
 extern int             AllPlayersGone;
 extern int             FrameCounter, TimeFrames, TimeLeft;
 extern int             MampferNr, SiebAktiv;
 
+extern boolean         network_player_action_received;
 extern int             TestPlayer;
 
 extern struct LevelDirInfo     leveldir[];
 extern struct LevelInfo                level;
-extern struct PlayerInfo       stored_player[];
-extern struct PlayerInfo       *local_player;
+extern struct PlayerInfo       stored_player[], *local_player;
 extern struct HiScore          highscore[];
 extern struct RecordingInfo    tape;
 extern struct SoundInfo                Sound[];
 extern struct JoystickInfo     joystick[];
+extern struct OptionInfo       options;
+extern struct SetupInfo                setup;
+extern struct SetupFileList    *setup_list;
+extern struct SetupFileList    *level_setup_list;
 
 extern char            *sound_name[];
 extern int             background_loop[];
 extern int             num_bg_loops;
 
-extern char            *progname;
-
 
 /* often used screen positions */
 #define SX                     8
@@ -611,7 +669,11 @@ extern char                *progname;
 #define EL_CHAR_COPY           (EL_CHAR_ASCII0+94)
 #define EL_CHAR_END            (EL_CHAR_START+79)
 
-#define EL_UNUSED_200          200
+#define EL_MAUER_X             200
+#define EL_MAUER_Y             201
+#define EL_MAUER_XY            202
+
+#define EL_UNUSED_200          203
 /* ... */
 #define EL_UNUSED_255          255
 
@@ -751,15 +813,20 @@ extern char               *progname;
 #define GFX_MAULWURF           145
 #define GFX_SCHWEIN            146
 #define GFX_DRACHE             147
+#define GFX_MAUER_XY           148
+#define GFX_MAUER_X            149
+#define GFX_MAUER_Y            150
 #define GFX_EDELSTEIN_ROT      152
 #define GFX_EDELSTEIN_LILA     154
 #define GFX_DYNABOMB_XL                156
 #define GFX_SONDE              159
 /* Zeile 10 (160) */
 #define GFX_EDELSTEIN_BD       163
-#define GFX_MAUER_R1           165
+#define GFX_MAUER_RIGHT                165
+#define GFX_MAUER_R1           GFX_MAUER_RIGHT
 #define GFX_MAUER_R            167
-#define GFX_MAUER_L1           168
+#define GFX_MAUER_LEFT         168
+#define GFX_MAUER_L1           GFX_MAUER_LEFT
 #define GFX_MAUER_L            170
 #define GFX_MAUER_LEBT         171
 #define GFX_SIEB2_LEER         172
@@ -819,6 +886,9 @@ extern char         *progname;
 #define GFX_SPIELER4_RIGHT     (GFX_START_ROCKSHEROES +10*HEROES_PER_LINE + 4)
 #define GFX_SPIELER4_PUSH_RIGHT        (GFX_START_ROCKSHEROES +11*HEROES_PER_LINE + 0)
 #define GFX_SPIELER4_PUSH_LEFT (GFX_START_ROCKSHEROES +11*HEROES_PER_LINE + 4)
+#define GFX_MAUER_DOWN         (GFX_START_ROCKSHEROES +12*HEROES_PER_LINE + 0)
+#define GFX_MAUER_UP           (GFX_START_ROCKSHEROES +12*HEROES_PER_LINE + 3)
+
 #define GFX_SONDE_START                (GFX_START_ROCKSHEROES + 9*HEROES_PER_LINE + 8)
 #define GFX_SCHWEIN_DOWN       (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE + 8)
 #define GFX_SCHWEIN_UP         (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE +12)
@@ -953,13 +1023,23 @@ extern char              *progname;
                                 (s)==SND_TYGER || (s)==SND_VOYAGER || \
                                 (s)==SND_TWILIGHT)
 
+/* default input keys */
+#define KEY_UNDEFINDED         XK_VoidSymbol
+#define DEFAULT_KEY_LEFT       XK_Left
+#define DEFAULT_KEY_RIGHT      XK_Right
+#define DEFAULT_KEY_UP         XK_Up
+#define DEFAULT_KEY_DOWN       XK_Down
+#define DEFAULT_KEY_SNAP       XK_Shift_L
+#define DEFAULT_KEY_BOMB       XK_Shift_R
+#define DEFAULT_KEY_OKAY       XK_Return
+#define DEFAULT_KEY_CANCEL     XK_Escape
 
 /* directions for moving */
 #define MV_NO_MOVING           0
-#define MV_LEFT                        1
-#define MV_RIGHT               2
-#define MV_UP                  4
-#define MV_DOWN                        8
+#define MV_LEFT                        (1<<0)
+#define MV_RIGHT               (1<<1)
+#define MV_UP                  (1<<2)
+#define MV_DOWN                        (1<<3)
 
 /* font types */
 #define FS_SMALL               0
@@ -981,78 +1061,73 @@ extern char              *progname;
 #define TYPENAME               5
 #define HALLOFFAME             6
 #define SETUP                  7
-#define EXITGAME               8
+#define SETUPINPUT             8
+#define EXITGAME               9
 
 /* values for game_emulation */
 #define EMU_NONE               0
 #define EMU_BOULDERDASH                1
 #define EMU_SOKOBAN            2
 
-
 #ifndef GAME_DIR
 #define GAME_DIR               "."
 #endif
 
-#ifndef GFX_PATH
-#define GFX_PATH               GAME_DIR "/graphics"
-#endif
-#ifndef SND_PATH
-#define SND_PATH               GAME_DIR "/sounds"
-#endif
-#ifndef LEVEL_PATH
-#define LEVEL_PATH             GAME_DIR "/levels"
-#endif
-#ifndef SCORE_PATH
-#define SCORE_PATH             LEVEL_PATH
-#endif
-#ifndef NAMES_PATH
-#define NAMES_PATH             LEVEL_PATH
-#endif
-#ifndef CONFIG_PATH
-#define CONFIG_PATH            GAME_DIR
-#endif
-#ifndef JOYDAT_PATH
-#define JOYDAT_PATH            GAME_DIR
-#endif
+#define BASE_PATH              GAME_DIR
+
+#define GRAPHICS_DIRECTORY     "graphics"
+#define SOUNDS_DIRECTORY       "sounds"
+#define LEVELS_DIRECTORY       "levels"
+#define TAPES_DIRECTORY                "tapes"
+#define SCORES_DIRECTORY       "scores"
 
 #ifndef MSDOS
-#define SCORE_FILENAME         "ROCKS.score"
-#define NAMES_FILENAME         "ROCKS.names"
+#define USERDATA_DIRECTORY     ".rocksndiamonds"
 #define LEVDIR_FILENAME                "ROCKS.levelinfo"
-#define JOYDAT_FILENAME                "ROCKS.joystick"
+#define SETUP_FILENAME         "setup"
+#define LEVELSETUP_FILENAME    "setup.level"
+#define TAPEFILE_EXTENSION     "tape"
+#define SCOREFILE_EXTENSION    "score"
 #else
-#define SCORE_FILENAME         "ROCKS.sco"
-#define NAMES_FILENAME         "ROCKS.nam"
+#define USERDATA_DIRECTORY     "userdata"
 #define LEVDIR_FILENAME                "ROCKS.lev"
-#define JOYDAT_FILENAME                "ROCKS.joy"
+#define SETUP_FILENAME         "setup"
+#define LEVELSETUP_FILENAME    "setup.lev"
+#define TAPEFILE_EXTENSION     "rec"
+#define SCOREFILE_EXTENSION    "sco"
 #endif
 
-#define JOYDAT_FILE            JOYDAT_PATH "/" JOYDAT_FILENAME
-
-#define LEVEL_PERMS    (S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP | S_IROTH|S_IWOTH)
+#define MODE_R_ALL             (S_IRUSR | S_IRGRP | S_IROTH)
+#define MODE_W_ALL             (S_IWUSR | S_IWGRP | S_IWOTH)
+#define MODE_X_ALL             (S_IXUSR | S_IXGRP | S_IXOTH)
+#define USERDATA_DIR_MODE      (MODE_R_ALL | MODE_X_ALL | S_IWUSR)
+#define LEVEL_PERMS            (MODE_R_ALL | MODE_W_ALL)
 #define SCORE_PERMS            LEVEL_PERMS
 #define NAMES_PERMS            LEVEL_PERMS
 #define LEVDIR_PERMS           LEVEL_PERMS
 #define LEVREC_PERMS           LEVEL_PERMS
 #define JOYDAT_PERMS           LEVEL_PERMS
+#define SETUP_PERMS            LEVEL_PERMS
 
 /* old cookies */
-#define NAMES_COOKIE_10                "ROCKSNDIAMONDS_NAMES_FILE_VERSION_1.0"
+#define LEVELREC_COOKIE_10     "ROCKSNDIAMONDS_LEVELREC_FILE_VERSION_1.0"
 
 #define LEVEL_COOKIE           "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.0"
-#define SCORE_COOKIE           "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.0"
-#define NAMES_COOKIE           "ROCKSNDIAMONDS_NAMES_FILE_VERSION_1.1"
+#define SCORE_COOKIE           "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.2"
 #define LEVELDIR_COOKIE                "ROCKSNDIAMONDS_LEVELDIR_FILE_VERSION_1.0"
-#define LEVELREC_COOKIE                "ROCKSNDIAMONDS_LEVELREC_FILE_VERSION_1.0"
+#define LEVELREC_COOKIE                "ROCKSNDIAMONDS_LEVELREC_FILE_VERSION_1.2"
 #define JOYSTICK_COOKIE                "ROCKSNDIAMONDS_JOYSTICK_FILE_VERSION_1.0"
+#define SETUP_COOKIE           "ROCKSNDIAMONDS_SETUP_FILE_VERSION_1.2"
+#define LEVELSETUP_COOKIE      "ROCKSNDIAMONDS_LEVELSETUP_FILE_VERSION_1.2"
 #define LEVEL_COOKIE_LEN       (strlen(LEVEL_COOKIE)+1)
 #define SCORE_COOKIE_LEN       (strlen(SCORE_COOKIE)+1)
-#define NAMES_COOKIE_LEN       (strlen(NAMES_COOKIE)+1)
 #define LEVELDIR_COOKIE_LEN    (strlen(LEVELDIR_COOKIE)+1)
 #define LEVELREC_COOKIE_LEN    (strlen(LEVELREC_COOKIE)+1)
 #define JOYSTICK_COOKIE_LEN    (strlen(JOYSTICK_COOKIE)+1)
+#define SETUP_COOKIE_LEN       (strlen(SETUP_COOKIE)+1)
+#define LEVELSETUP_COOKIE_LEN  (strlen(LEVELSETUP_COOKIE)+1)
 
-#define VERSION_STRING         "1.2"
+#define VERSION_STRING         "1.2 preview 1"
 #define GAMETITLE_STRING       "Rocks'n'Diamonds"
 #define WINDOWTITLE_STRING     GAMETITLE_STRING " " VERSION_STRING
 #define COPYRIGHT_STRING       "Copyright ^1995-98 by Holger Schemel"
@@ -1146,4 +1221,4 @@ extern char               *progname;
 #define ANIM_OSCILLATE 1
 #define ANIM_REVERSE   2
 
-#endif
+#endif /* MAIN_H */