rnd-19980930-3
[rocksndiamonds.git] / src / main.h
index 3d8267d5f1c48dd75107506d73c6346cd8d02c6d..2aeb77090462363b445a311d19f3c2edf49f10a2 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
 #endif
 #else
 #include "msdos.h"
-#endif  // von #ifndef MSDOS
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
+#endif  /* #ifndef MSDOS */
 
 typedef int BOOL;
 
@@ -53,52 +52,43 @@ typedef int BOOL;
 #define WIN_XPOS       0
 #define WIN_YPOS       0
 #else
-#define WIN_XPOS       (XRES-WIN_XSIZE)/2
-#define WIN_YPOS       (YRES-WIN_YSIZE)/2
+#define WIN_XPOS       ((XRES - WIN_XSIZE) / 2)
+#define WIN_YPOS       ((YRES - WIN_YSIZE) / 2)
 #endif
 #define SCR_FIELDX     17
 #define SCR_FIELDY     17
 #define MAX_BUF_XSIZE  (SCR_FIELDX + 2)
 #define MAX_BUF_YSIZE  (SCR_FIELDY + 2)
 
-#define MIN_LEV_FIELDX (SCR_FIELDX-2)
-#define MIN_LEV_FIELDY (SCR_FIELDY-2)
+#define MIN_LEV_FIELDX (SCR_FIELDX - 2)
+#define MIN_LEV_FIELDY (SCR_FIELDY - 2)
 #define STD_LEV_FIELDX 64
 #define STD_LEV_FIELDY 32
 #define MAX_LEV_FIELDX 128
 #define MAX_LEV_FIELDY 128
 
+#define MAX_PLAYERS    4
+
 #ifndef MIN
-#define MIN(a,b)       ((a)<(b) ? (a) : (b))
+#define MIN(a,b)       ((a) < (b) ? (a) : (b))
 #endif
 #ifndef MAX
-#define MAX(a,b)       ((a)>(b) ? (a) : (b))
+#define MAX(a,b)       ((a) > (b) ? (a) : (b))
 #endif
 #ifndef ABS
-#define ABS(a)         ((a)<0 ? -(a) : (a))
+#define ABS(a)         ((a) < 0 ? -(a) : (a))
 #endif
 #ifndef SIGN
-#define SIGN(a)                ((a)<0 ? -1 : ((a)>0 ? 1 : 0))
+#define SIGN(a)                ((a) < 0 ? -1 : ((a)>0 ? 1 : 0))
 #endif
-#define SCROLLX(a)     ((a)-scroll_x)
-#define SCROLLY(a)     ((a)-scroll_y)
-#define UNSCROLLX(a)   ((a)+scroll_x)
-#define UNSCROLLY(a)   ((a)+scroll_y)
+#define SCREENX(a)     ((a) - scroll_x)
+#define SCREENY(a)     ((a) - scroll_y)
+#define LEVELX(a)      ((a) + scroll_x)
+#define LEVELY(a)      ((a) + scroll_y)
+#define IN_VIS_FIELD(x,y) ((x)>=0 && (x)<SCR_FIELDX && (y)>=0 &&(y)<SCR_FIELDY)
 #define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2)
 #define IN_LEV_FIELD(x,y) ((x)>=0 && (x)<lev_fieldx && (y)>=0 &&(y)<lev_fieldy)
 
-
-#define IS_PLAYER(x,y)         (JX==(x) && JY==(y))
-
-/*
-#define IS_PLAYER(x,y)         ((JX==(x) && JY==(y)) || (lastJX==(x) && lastJY==(y)))
-*/
-
-#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)
-#define IS_MOVING(x,y)         (MovPos[x][y]!=0)
-#define IS_BLOCKED(x,y)                (Feld[x][y]==EL_BLOCKED)
-
 #define EP_BIT_AMOEBALIVE      (1<<0)
 #define EP_BIT_AMOEBOID                (1<<1)
 #define EP_BIT_SCHLUESSEL      (1<<2)
@@ -124,6 +114,7 @@ typedef int BOOL;
 #define EP_BIT_EXPLOSIVE       (1<<22)
 #define EP_BIT_MAMPF3          (1<<23)
 #define EP_BIT_PUSHABLE                (1<<24)
+#define EP_BIT_PLAYER          (1<<25)
 
 #define IS_AMOEBALIVE(e)       (Elementeigenschaften[e] & EP_BIT_AMOEBALIVE)
 #define IS_AMOEBOID(e)         (Elementeigenschaften[e] & EP_BIT_AMOEBOID)
@@ -150,21 +141,37 @@ typedef int BOOL;
 #define IS_EXPLOSIVE(e)                (Elementeigenschaften[e] & EP_BIT_EXPLOSIVE)
 #define IS_MAMPF3(e)           (Elementeigenschaften[e] & EP_BIT_MAMPF3)
 #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 EL_CHANGED(e)          ((e)==EL_FELSBROCKEN    ? EL_EDELSTEIN :  \
-                                (e)==EL_EDELSTEIN      ? EL_DIAMANT :    \
-                                (e)==EL_EDELSTEIN_GELB ? EL_DIAMANT :    \
-                                (e)==EL_EDELSTEIN_ROT  ? EL_DIAMANT :    \
-                                (e)==EL_EDELSTEIN_LILA ? EL_DIAMANT :    \
+#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)
+
+#define IS_MOVING(x,y)         (MovPos[x][y] != 0)
+#define IS_BLOCKED(x,y)                (Feld[x][y] == EL_BLOCKED)
+
+#define EL_CHANGED(e)          ((e) == EL_FELSBROCKEN    ? EL_EDELSTEIN :  \
+                                (e) == EL_EDELSTEIN      ? EL_DIAMANT :    \
+                                (e) == EL_EDELSTEIN_GELB ? EL_DIAMANT :    \
+                                (e) == EL_EDELSTEIN_ROT  ? EL_DIAMANT :    \
+                                (e) == EL_EDELSTEIN_LILA ? EL_DIAMANT :    \
                                 EL_FELSBROCKEN)
-#define EL_CHANGED2(e)         ((e)==EL_FELSBROCKEN ? EL_EDELSTEIN_BD :  \
+#define EL_CHANGED2(e)         ((e) == EL_FELSBROCKEN ? EL_EDELSTEIN_BD :  \
                                 EL_FELSBROCKEN)
-#define IS_DRAWABLE(e)         ((e)<EL_BLOCKED)
-#define IS_NOT_DRAWABLE(e)     ((e)>=EL_BLOCKED)
-#define TIMESIZE               (TimeLeft*100/level.time)
+#define IS_DRAWABLE(e)         ((e) < EL_BLOCKED)
+#define IS_NOT_DRAWABLE(e)     ((e) >= EL_BLOCKED)
+#define TIMESIZE               (TimeLeft * 100 / level.time)
 #define TAPE_IS_EMPTY(x)       ((x).length == 0)
 #define TAPE_IS_STOPPED(x)     (!(x).recording && !(x).playing &&!(x).pausing)
 
+#define PLAYERINFO(x,y)                (&stored_player[StorePlayer[x][y]-EL_SPIELER1])
+
 /* Pixmaps with Xpm or X11 Bitmap files */
 #define PIX_BACK               0
 #define PIX_DOOR               1
@@ -205,12 +212,41 @@ struct HiScore
 
 struct PlayerInfo
 {
+  int nr, active, local;
+
   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;
+
+  int gone, LevelSolved, GameOver;
+
+  long actual_frame_counter;
+
+  int frame_reset_delay;
+
+  long move_delay;
+  int last_move_dir;
+
+  long push_delay;
+  int push_delay_value;
+
+  int snapped;
+
+  int score;
+  int gems_still_needed;
+  int sokobanfields_still_needed;
+  int lights_still_needed;
+  int friends_still_needed;
+  int key[4];
+  int dynamite;
+  int dynabomb_count, dynabomb_size, dynabombs_left, dynabomb_xl;
 };
 
 struct LevelInfo
@@ -251,7 +287,7 @@ struct RecordingInfo
   BOOL changed;
   struct
   {
-    unsigned char joystickdata;
+    unsigned char joystickdata[MAX_PLAYERS];
     unsigned char delay;
   } pos[MAX_TAPELEN];
 };
@@ -285,6 +321,11 @@ extern char               *joystick_device_name[2];
 extern char           *level_directory;
 extern int                     width, height;
 
+extern char           *server_host;
+extern int             server_port;
+extern int             networking;
+extern int             standalone;
+
 extern int             game_status;
 extern int             game_emulation;
 extern int             button_status, motion_status;
@@ -315,6 +356,7 @@ 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];
@@ -325,22 +367,21 @@ extern 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, ScreenMovPos, ScrollStepSize;
-extern int             GameSpeed, MoveSpeed;
+extern int             FX,FY, ScrollStepSize;
+extern int             ScreenMovDir, ScreenMovPos, ScreenGfxPos;
+extern int             GameFrameDelay, MoveSpeed;
 extern int             BX1,BY1, BX2,BY2;
-extern int             JX,JY, lastJX,lastJY, ZX,ZY, ExitX,ExitY;
-extern int             PlayerMovDir, PlayerMovPos, PlayerPushing;
-extern int             PlayerFrame, PlayerGfxPos;
-extern int             PlayerGone,LevelSolved,GameOver;
-extern int             FrameCounter,TimeFrames,TimeLeft,Score;
-extern int             Gems,SokobanFields,Lights,Friends;
-extern int             Dynamite,Key[4],MampferNr;
-extern int             DynaBombCount, DynaBombSize, DynaBombsLeft, DynaBombXL;
-extern int             SiebAktiv;
+extern int             ZX,ZY, ExitX,ExitY;
+extern int             AllPlayersGone;
+extern int             FrameCounter, TimeFrames, TimeLeft;
+extern int             MampferNr, SiebAktiv;
+
+extern int             TestPlayer;
 
 extern struct LevelDirInfo     leveldir[];
 extern struct LevelInfo                level;
-extern struct PlayerInfo       player;
+extern struct PlayerInfo       stored_player[];
+extern struct PlayerInfo       *local_player;
 extern struct HiScore          highscore[];
 extern struct RecordingInfo    tape;
 extern struct SoundInfo                Sound[];
@@ -751,23 +792,37 @@ extern char               *progname;
 #define GFX_FIREFLY_L          206
 #define GFX_FIREFLY_U          207
 
-/* CHANGE THIS!!!! (NO REGULAR POSITIONS...) */
-#define GFX_MASK_SPARKLING     210
-/* CHANGE THIS!!!! (NO REGULAR POSITIONS...) */
-
 #define GFX_SCHLUESSEL         GFX_SCHLUESSEL1
 #define GFX_SPIELFIGUR         GFX_SPIELER1
 
 
 /* graphics from "RocksHeroes" */
 
-#define GFX_SPIELER_DOWN       (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE + 0)
-#define GFX_SPIELER_UP         (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE + 4)
-#define GFX_SPIELER_LEFT       (GFX_START_ROCKSHEROES + 1*HEROES_PER_LINE + 0)
-#define GFX_SPIELER_RIGHT      (GFX_START_ROCKSHEROES + 1*HEROES_PER_LINE + 4)
-#define GFX_SPIELER_PUSH_RIGHT (GFX_START_ROCKSHEROES + 2*HEROES_PER_LINE + 0)
-#define GFX_SPIELER_PUSH_LEFT  (GFX_START_ROCKSHEROES + 2*HEROES_PER_LINE + 4)
-#define GFX_SONDE_START                (GFX_START_ROCKSHEROES + 7*HEROES_PER_LINE + 0)
+#define GFX_SPIELER1_DOWN      (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE + 0)
+#define GFX_SPIELER1_UP                (GFX_START_ROCKSHEROES + 0*HEROES_PER_LINE + 4)
+#define GFX_SPIELER1_LEFT      (GFX_START_ROCKSHEROES + 1*HEROES_PER_LINE + 0)
+#define GFX_SPIELER1_RIGHT     (GFX_START_ROCKSHEROES + 1*HEROES_PER_LINE + 4)
+#define GFX_SPIELER1_PUSH_RIGHT        (GFX_START_ROCKSHEROES + 2*HEROES_PER_LINE + 0)
+#define GFX_SPIELER1_PUSH_LEFT (GFX_START_ROCKSHEROES + 2*HEROES_PER_LINE + 4)
+#define GFX_SPIELER2_DOWN      (GFX_START_ROCKSHEROES + 3*HEROES_PER_LINE + 0)
+#define GFX_SPIELER2_UP                (GFX_START_ROCKSHEROES + 3*HEROES_PER_LINE + 4)
+#define GFX_SPIELER2_LEFT      (GFX_START_ROCKSHEROES + 4*HEROES_PER_LINE + 0)
+#define GFX_SPIELER2_RIGHT     (GFX_START_ROCKSHEROES + 4*HEROES_PER_LINE + 4)
+#define GFX_SPIELER2_PUSH_RIGHT        (GFX_START_ROCKSHEROES + 5*HEROES_PER_LINE + 0)
+#define GFX_SPIELER2_PUSH_LEFT (GFX_START_ROCKSHEROES + 5*HEROES_PER_LINE + 4)
+#define GFX_SPIELER3_DOWN      (GFX_START_ROCKSHEROES + 6*HEROES_PER_LINE + 0)
+#define GFX_SPIELER3_UP                (GFX_START_ROCKSHEROES + 6*HEROES_PER_LINE + 4)
+#define GFX_SPIELER3_LEFT      (GFX_START_ROCKSHEROES + 7*HEROES_PER_LINE + 0)
+#define GFX_SPIELER3_RIGHT     (GFX_START_ROCKSHEROES + 7*HEROES_PER_LINE + 4)
+#define GFX_SPIELER3_PUSH_RIGHT        (GFX_START_ROCKSHEROES + 8*HEROES_PER_LINE + 0)
+#define GFX_SPIELER3_PUSH_LEFT (GFX_START_ROCKSHEROES + 8*HEROES_PER_LINE + 4)
+#define GFX_SPIELER4_DOWN      (GFX_START_ROCKSHEROES + 9*HEROES_PER_LINE + 0)
+#define GFX_SPIELER4_UP                (GFX_START_ROCKSHEROES + 9*HEROES_PER_LINE + 4)
+#define GFX_SPIELER4_LEFT      (GFX_START_ROCKSHEROES +10*HEROES_PER_LINE + 0)
+#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_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)
 #define GFX_SCHWEIN_LEFT       (GFX_START_ROCKSHEROES + 1*HEROES_PER_LINE + 8)
@@ -780,16 +835,18 @@ extern char               *progname;
 #define GFX_MAULWURF_UP                (GFX_START_ROCKSHEROES + 4*HEROES_PER_LINE +12)
 #define GFX_MAULWURF_LEFT      (GFX_START_ROCKSHEROES + 5*HEROES_PER_LINE + 8)
 #define GFX_MAULWURF_RIGHT     (GFX_START_ROCKSHEROES + 5*HEROES_PER_LINE +12)
-#define GFX_PINGUIN_DOWN       (GFX_START_ROCKSHEROES + 7*HEROES_PER_LINE + 8)
-#define GFX_PINGUIN_UP         (GFX_START_ROCKSHEROES + 7*HEROES_PER_LINE +12)
-#define GFX_PINGUIN_LEFT       (GFX_START_ROCKSHEROES + 8*HEROES_PER_LINE + 8)
-#define GFX_PINGUIN_RIGHT      (GFX_START_ROCKSHEROES + 8*HEROES_PER_LINE +12)
-#define GFX_BLURB_LEFT         (GFX_START_ROCKSHEROES + 9*HEROES_PER_LINE + 8)
-#define GFX_BLURB_RIGHT                (GFX_START_ROCKSHEROES + 9*HEROES_PER_LINE +12)
-#define GFX_FLAMMEN_LEFT       (GFX_START_ROCKSHEROES + 8*HEROES_PER_LINE + 0)
-#define GFX_FLAMMEN_RIGHT      (GFX_START_ROCKSHEROES + 9*HEROES_PER_LINE + 0)
-#define GFX_FLAMMEN_UP         (GFX_START_ROCKSHEROES +10*HEROES_PER_LINE + 0)
-#define GFX_FLAMMEN_DOWN       (GFX_START_ROCKSHEROES +11*HEROES_PER_LINE + 0)
+#define GFX_PINGUIN_DOWN       (GFX_START_ROCKSHEROES + 6*HEROES_PER_LINE + 8)
+#define GFX_PINGUIN_UP         (GFX_START_ROCKSHEROES + 6*HEROES_PER_LINE +12)
+#define GFX_PINGUIN_LEFT       (GFX_START_ROCKSHEROES + 7*HEROES_PER_LINE + 8)
+#define GFX_PINGUIN_RIGHT      (GFX_START_ROCKSHEROES + 7*HEROES_PER_LINE +12)
+#define GFX_BLURB_LEFT         (GFX_START_ROCKSHEROES +10*HEROES_PER_LINE + 8)
+#define GFX_BLURB_RIGHT                (GFX_START_ROCKSHEROES +10*HEROES_PER_LINE +12)
+#define GFX_FUNKELN_BLAU       (GFX_START_ROCKSHEROES +11*HEROES_PER_LINE + 8)
+#define GFX_FUNKELN_WEISS      (GFX_START_ROCKSHEROES +11*HEROES_PER_LINE +12)
+#define GFX_FLAMMEN_LEFT       (GFX_START_ROCKSHEROES +12*HEROES_PER_LINE + 8)
+#define GFX_FLAMMEN_RIGHT      (GFX_START_ROCKSHEROES +13*HEROES_PER_LINE + 8)
+#define GFX_FLAMMEN_UP         (GFX_START_ROCKSHEROES +14*HEROES_PER_LINE + 8)
+#define GFX_FLAMMEN_DOWN       (GFX_START_ROCKSHEROES +15*HEROES_PER_LINE + 8)
 
 /* graphics from "RocksFont" */
 #define GFX_CHAR_START         (GFX_START_ROCKSFONT)
@@ -902,10 +959,10 @@ extern char               *progname;
 
 /* 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
@@ -984,12 +1041,13 @@ extern char              *progname;
 
 /* 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 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 LEVEL_COOKIE_LEN       (strlen(LEVEL_COOKIE)+1)
 #define SCORE_COOKIE_LEN       (strlen(SCORE_COOKIE)+1)