1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * (c) 1995-98 Artsoft Entertainment *
8 * phone: ++49 +521 290471 *
9 * email: aeglos@valinor.owl.de *
10 *----------------------------------------------------------*
12 ***********************************************************/
30 GC gc, clip_gc[NUM_PIXMAPS], tile_clip_gc;
31 Pixmap pix[NUM_PIXMAPS];
32 Pixmap clipmask[NUM_PIXMAPS], tile_clipmask[NUM_TILES];
34 #ifdef USE_XPM_LIBRARY
35 XpmAttributes xpm_att[NUM_PICTURES];
38 Drawable drawto, drawto_field, backbuffer, fieldbuffer;
43 char *sound_device_name = SOUND_DEVICE;
44 int joystick_device = 0;
45 char *joystick_device_name[MAX_PLAYERS] =
53 char *program_name = NULL;
55 int game_status = MAINMENU;
56 boolean level_editor_test_game = FALSE;
57 boolean network_playing = FALSE;
58 int button_status = MB_NOT_PRESSED;
59 boolean motion_status = FALSE;
60 int key_joystick_mapping = 0;
61 int global_joystick_status = JOYSTICK_STATUS;
62 int joystick_status = JOYSTICK_STATUS;
63 int sound_status = SOUND_STATUS;
64 boolean sound_loops_allowed = FALSE;
66 boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
67 int redraw_x1 = 0, redraw_y1 = 0;
71 short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
72 short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
73 short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
74 short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
75 short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
76 short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
77 short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
78 short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
79 short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
80 boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
81 short JustHit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
82 short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
83 short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
84 unsigned long Elementeigenschaften[MAX_ELEMENTS];
86 int level_nr, leveldir_nr, num_leveldirs;
87 int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
89 int FX = SX, FY = SY, ScrollStepSize = TILEX/8;
90 int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
92 int BorderElement = EL_BETON;
93 int GameFrameDelay = GAME_FRAME_DELAY;
94 int FfwdFrameDelay = FFWD_FRAME_DELAY;
96 int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
97 int SBX_Left, SBX_Right;
98 int SBY_Upper, SBY_Lower;
99 int ZX,ZY, ExitX,ExitY;
101 int FrameCounter, TimeFrames, TimePlayed, TimeLeft;
102 int MampferMax, MampferNr;
106 int game_emulation = EMU_NONE;
108 boolean network_player_action_received = FALSE;
110 struct LevelDirInfo leveldir[MAX_LEVDIR_ENTRIES];
111 struct LevelInfo level;
112 struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
113 struct HiScore highscore[MAX_SCORE_ENTRIES];
114 struct SoundInfo Sound[NUM_SOUNDS];
115 struct TapeInfo tape;
116 struct OptionInfo options;
117 struct SetupInfo setup;
118 struct SetupFileList *setup_list = NULL;
119 struct SetupFileList *level_setup_list = NULL;
121 /* data needed for playing sounds */
122 char *sound_name[NUM_SOUNDS] =
187 /* background music */
188 int background_loop[] =
198 int num_bg_loops = sizeof(background_loop)/sizeof(int);
200 char *element_info[] =
219 "quicksand with rock",
242 "grey door (opened by red key)",
243 "grey door (opened by yellow key)",
244 "grey door (opened by green key)",
245 "grey door (opened by blue key)",
248 "invisible normal wall",
250 "ligh bulb (glowing)",
253 "amoeba with content",
258 "diamond (BD style)",
260 "wall with BD style diamond",
261 "wall with yellow emerald",
263 "magic wall (BD style)",
264 "invisible steel wall",
266 "increases number of bombs",
267 "increases explosion size",
268 "increases power of explosion",
270 "sokoban empty field",
271 "sokoban field with object",
272 "butterfly (starts moving right)",
273 "butterfly (starts moving up)",
274 "butterfly (starts moving left)",
275 "butterfly (starts moving down)",
276 "firefly (starts moving right)",
277 "firefly (starts moving up)",
278 "firefly (starts moving left)",
279 "firefly (starts moving down)",
286 "bug (starts moving right)",
287 "bug (starts moving up)",
288 "bug (starts moving left)",
289 "bug (starts moving down)",
290 "spaceship (starts moving right)",
291 "spaceship (starts moving up)",
292 "spaceship (starts moving left)",
293 "spaceship (starts moving down)",
294 "pac man (starts moving right)",
295 "pac man (starts moving up)",
296 "pac man (starts moving left)",
297 "pac man (starts moving down)",
300 "wall with red emerald",
301 "wall with violet emerald",
320 "fire breathing dragon",
402 "growing wall (horizontally)",
403 "growing wall (vertically)",
404 "growing wall (all directions)",
421 "port (leading right)",
422 "port (leading down)",
423 "port (leading left)",
425 "port (leading right)",
426 "port (leading down)",
427 "port (leading left)",
434 "port (horizontally)",
435 "port (all directions)",
460 int main(int argc, char *argv[])
462 program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
472 exit(0); /* to keep compilers happy */