#endif
#else
#include "msdos.h"
-#endif // von #ifndef MSDOS
+#endif /* #ifndef MSDOS */
#include <sys/types.h>
#include <sys/stat.h>
#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_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)
#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)
#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 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_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)
+
+#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
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, Pushing;
+ int Frame, GfxPos;
+
+ 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
};
extern Display *display;
+extern Visual *visual;
extern int screen;
extern Window window;
-extern GC gc, clip_gc[];
-extern XImage *image[];
-extern Pixmap clipmask[];
+extern GC gc, clip_gc[], tile_clip_gc;
extern Pixmap pix[];
-
-
-extern Pixmap test_pix[];
-extern Pixmap test_clipmask[];
-extern int test_picture_count;
-
-
+extern Pixmap clipmask[], tile_clipmask[];
#ifdef XPM_INCLUDE_FILE
extern XpmAttributes xpm_att[];
extern char *joystick_device_name[2];
extern char *level_directory;
extern int width, height;
-extern unsigned long pen_fg, pen_bg;
extern int game_status;
extern int game_emulation;
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 lev_fieldx,lev_fieldy, scroll_x,scroll_y;
extern int FX,FY, ScreenMovPos, ScrollStepSize;
+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 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[];
#define GFX_START_ROCKSHEROES 512
#define GFX_END_ROCKSHEROES 767
+#define NUM_TILES 768
+
/* graphics from "RocksScreen" */
/* Zeile 0 (0) */
#define GFX_LEERRAUM (-1)
/* 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)
#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)
#define LEVELREC_COOKIE_LEN (strlen(LEVELREC_COOKIE)+1)
#define JOYSTICK_COOKIE_LEN (strlen(JOYSTICK_COOKIE)+1)
-#define VERSION_STRING "1.1"
+#define VERSION_STRING "1.2"
#define GAMETITLE_STRING "Rocks'n'Diamonds"
#define WINDOWTITLE_STRING GAMETITLE_STRING " " VERSION_STRING
#define COPYRIGHT_STRING "Copyright ^1995-98 by Holger Schemel"