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;
41 #ifdef USE_SDL_LIBRARY
42 SDL_Surface *sdl_window;
43 SDL_Surface *sdl_drawto, *sdl_drawto_field;
44 SDL_Surface *sdl_backbuffer, *sdl_fieldbuffer;
45 SDL_Surface *sdl_pix[NUM_PIXMAPS];
46 SDL_Surface *sdl_pix_masked[NUM_PIXMAPS], *sdl_tile_masked[NUM_TILES];
51 char *sound_device_name = SOUND_DEVICE;
52 int joystick_device = 0;
53 char *joystick_device_name[MAX_PLAYERS] =
61 char *program_name = NULL;
63 int game_status = MAINMENU;
64 boolean level_editor_test_game = FALSE;
65 boolean network_playing = FALSE;
66 int button_status = MB_NOT_PRESSED;
67 boolean motion_status = FALSE;
68 int key_joystick_mapping = 0;
69 int global_joystick_status = JOYSTICK_STATUS;
70 int joystick_status = JOYSTICK_STATUS;
71 int sound_status = SOUND_STATUS;
72 boolean sound_loops_allowed = FALSE;
74 boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
75 int redraw_x1 = 0, redraw_y1 = 0;
79 short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
80 short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
81 short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
82 short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
83 short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
84 short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
85 short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
86 short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
87 short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
88 boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
89 short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
90 short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
91 short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
92 unsigned long Elementeigenschaften1[MAX_ELEMENTS];
93 unsigned long Elementeigenschaften2[MAX_ELEMENTS];
96 int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
98 int FX = SX, FY = SY, ScrollStepSize;
99 int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
100 int ScreenGfxPos = 0;
101 int BorderElement = EL_BETON;
102 int GameFrameDelay = GAME_FRAME_DELAY;
103 int FfwdFrameDelay = FFWD_FRAME_DELAY;
104 int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
105 int SBX_Left, SBX_Right;
106 int SBY_Upper, SBY_Lower;
107 int ZX,ZY, ExitX,ExitY;
109 int FrameCounter, TimeFrames, TimePlayed, TimeLeft;
111 boolean network_player_action_received = FALSE;
113 struct LevelDirInfo *leveldir_first = NULL, *leveldir_current = NULL;
114 struct LevelInfo level;
115 struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
116 struct HiScore highscore[MAX_SCORE_ENTRIES];
117 struct SoundInfo Sound[NUM_SOUNDS];
118 struct TapeInfo tape;
119 struct OptionInfo options;
120 struct SetupInfo setup;
121 struct GameInfo game;
122 struct GlobalInfo global;
124 /* data needed for playing sounds */
125 char *sound_name[NUM_SOUNDS] =
191 /* background music */
192 int background_loop[] =
202 int num_bg_loops = sizeof(background_loop)/sizeof(int);
204 char *element_info[] =
206 "empty space", /* 0 */
216 "spaceship", /* 10 */
223 "quicksand with rock",
226 "magic wall", /* 20 */
236 "magic wheel", /* 30 */
246 "gray door (opened by red key)", /* 40 */
247 "gray door (opened by yellow key)",
248 "gray door (opened by green key)",
249 "gray door (opened by blue key)",
252 "invisible normal wall",
254 "ligh bulb (glowing)",
256 "wall with diamond", /* 50 */
257 "amoeba with content",
262 "diamond (BD style)",
264 "wall with BD style diamond",
265 "wall with yellow emerald",
266 "dark yam yam", /* 60 */
267 "magic wall (BD style)",
268 "invisible steel wall",
270 "increases number of bombs",
271 "increases explosion size",
272 "increases power of explosion",
274 "sokoban empty field",
275 "sokoban field with object",
276 "butterfly (starts moving right)", /* 70 */
277 "butterfly (starts moving up)",
278 "butterfly (starts moving left)",
279 "butterfly (starts moving down)",
280 "firefly (starts moving right)",
281 "firefly (starts moving up)",
282 "firefly (starts moving left)",
283 "firefly (starts moving down)",
286 "yellow player", /* 80 */
290 "bug (starts moving right)",
291 "bug (starts moving up)",
292 "bug (starts moving left)",
293 "bug (starts moving down)",
294 "spaceship (starts moving right)",
295 "spaceship (starts moving up)",
296 "spaceship (starts moving left)", /* 90 */
297 "spaceship (starts moving down)",
298 "pac man (starts moving right)",
299 "pac man (starts moving up)",
300 "pac man (starts moving left)",
301 "pac man (starts moving down)",
304 "wall with red emerald",
305 "wall with violet emerald",
311 "normal wall (BD style)",
324 "fire breathing dragon",
326 "letter ' '", /* 120 */
336 "letter '*'", /* 130 */
346 "letter '4'", /* 140 */
356 "letter '>'", /* 150 */
366 "letter 'H'", /* 160 */
376 "letter 'R'", /* 170 */
386 "letter 'Ö'", /* 180 */
396 "letter ''", /* 190 */
406 "growing wall (horizontal)", /* 200 */
407 "growing wall (vertical)",
408 "growing wall (all directions)",
416 "empty space", /* 210 */
425 "port (leading right)",
426 "port (leading down)", /* 220 */
427 "port (leading left)",
429 "port (leading right)",
430 "port (leading down)",
431 "port (leading left)",
436 "red disk", /* 230 */
439 "port (all directions)",
446 "hardware", /* 240 */
469 "white door", /* 260 */
470 "gray door (opened by white key)",
474 "switch gate (open)",
475 "switch gate (closed)",
476 "switch for switch gate",
477 "switch for switch gate",
480 "red conveyor belt (left)",
481 "red conveyor belt (middle)",
482 "red conveyor belt (right)",
483 "switch for red conveyor belt (left)",
484 "switch for red conveyor belt (middle)",
485 "switch for red conveyor belt (right)",
486 "yellow conveyor belt (left)",
487 "yellow conveyor belt (middle)",
488 "yellow conveyor belt (right)",
489 "switch for yellow conveyor belt (left)", /* 280 */
490 "switch for yellow conveyor belt (middle)",
491 "switch for yellow conveyor belt (right)",
492 "green conveyor belt (left)",
493 "green conveyor belt (middle)",
494 "green conveyor belt (right)",
495 "switch for green conveyor belt (left)",
496 "switch for green conveyor belt (middle)",
497 "switch for green conveyor belt (right)",
498 "blue conveyor belt (left)",
499 "blue conveyor belt (middle)", /* 290 */
500 "blue conveyor belt (right)",
501 "switch for blue conveyor belt (left)",
502 "switch for blue conveyor belt (middle)",
503 "switch for blue conveyor belt (right)",
506 "light switch (off)",
508 "sign (exclamation)",
509 "sign (radio activity)", /* 300 */
511 "sign (wheel chair)",
519 "sign (other)", /* 310 */
520 "mole (starts moving left)",
521 "mole (starts moving right)",
522 "mole (starts moving up)",
523 "mole (starts moving down)",
524 "steel wall (slanted)",
530 "shield (active, kills enemies)",
532 "time gate (closed)",
533 "switch for time gate",
534 "switch for time gate",
536 "send balloon to the left",
537 "send balloon to the right",
539 "send balloon down", /* 330 */
540 "send balloon in any direction",
549 "normal wall", /* 340 */
553 "tube (all directions)",
556 "tube (vertical & left)",
557 "tube (vertical & right)",
558 "tube (horizontal & up)",
559 "tube (horizontal & down)", /* 350 */
561 "tube (left & down)",
563 "tube (right & down)",
566 "stable bomb (DX style)",
570 "-------------------------------",
576 /* +-----------------------------------------------------------------------+ */
577 /* | SDL TEST STUFF | */
578 /* +-----------------------------------------------------------------------+ */
580 #ifdef USE_SDL_LIBRARY
582 SDL_Surface *sdl_screen, *sdl_image_tmp, *sdl_image, *sdl_image_masked;
583 SDL_Surface *sdl_image2_tmp, *sdl_image2, *sdl_image2_masked;
585 void TEST_SDL_BLIT_RECT(int x, int y)
587 SDL_Rect rect_src, rect_dst;
589 SDLCopyArea(sdl_pix_masked[PIX_HEROES], sdl_window,
590 8 * TILEX, 8 * TILEY, TILEX, TILEY, x, y);
593 rect_src.x = 8 * TILEX;
594 rect_src.y = 8 * TILEY;
603 SDL_BlitSurface(sdl_image2_masked, &rect_src, sdl_screen, &rect_dst);
604 SDL_UpdateRect(sdl_screen, x, y, TILEX, TILEY);
607 void TEST_SDL_INIT_DISPLAY()
609 SDL_Rect rect_src, rect_dst;
611 if (SDL_Init(SDL_INIT_VIDEO) < 0)
613 fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
617 /* automatically cleanup SDL stuff after exit() */
620 if ((sdl_screen = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, 16, SDL_HWSURFACE))
623 fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
627 SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING);
629 if ((sdl_image_tmp = IMG_Load("graphics/RocksScreen.pcx")) == NULL)
631 fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
635 sdl_image = SDL_DisplayFormat(sdl_image_tmp);
637 SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
638 SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
639 sdl_image_masked = SDL_DisplayFormat(sdl_image_tmp);
641 SDL_FreeSurface(sdl_image_tmp);
643 if ((sdl_image2_tmp = IMG_Load("graphics/RocksHeroes.pcx")) == NULL)
645 fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
649 sdl_image2 = SDL_DisplayFormat(sdl_image2_tmp);
650 SDL_FreeSurface(sdl_image2_tmp);
652 sdl_image2_masked = SDL_DisplayFormat(sdl_image2);
653 SDL_SetColorKey(sdl_image2_masked, SDL_SRCCOLORKEY,
654 SDL_MapRGB(sdl_image2_masked->format, 0x00, 0x00, 0x00));
658 rect_src.w = sdl_image->w;
659 rect_src.h = sdl_image->h;
663 rect_dst.w = sdl_image->w;
664 rect_dst.h = sdl_image->h;
666 SDL_BlitSurface(sdl_image, &rect_src, sdl_screen, &rect_dst);
669 SDL_UpdateRect(sdl_screen, 0, 0, WIN_XSIZE, WIN_YSIZE);
672 SDL_UpdateRect(sdl_screen, 0, 0, 0, 0);
674 SDL_Flip(sdl_screen);
681 void TEST_SDL_EVENT_LOOP()
686 SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
688 while (!quit_loop && SDL_WaitEvent(&event) >=0)
690 /* hier werden die Ereignisse behandelt */
699 case SDL_MOUSEBUTTONDOWN:
701 int x = event.button.x;
702 int y = event.button.y;
704 SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
706 TEST_SDL_BLIT_RECT(x, y);
708 printf("SDL_MOUSEBUTTONDOWN(%d, %d)\n", x, y);
712 case SDL_MOUSEBUTTONUP:
714 int x = event.button.x;
715 int y = event.button.y;
717 SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
719 printf("SDL_MOUSEBUTTONUP(%d, %d)\n", x, y);
723 case SDL_MOUSEMOTION:
725 int x = event.motion.x;
726 int y = event.motion.y;
728 TEST_SDL_BLIT_RECT(x, y);
730 printf("SDL_MOUSEMOTION(%d, %d)\n", x, y);
739 SDL_FreeSurface(sdl_image);
743 #endif /* USE_SDL_LIBRARY */
745 /* +-----------------------------------------------------------------------+ */
746 /* | SDL TEST STUFF | */
747 /* +-----------------------------------------------------------------------+ */
751 int main(int argc, char *argv[])
753 program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
762 #ifdef USE_SDL_LIBRARY
763 TEST_SDL_BLIT_RECT((WIN_XSIZE - TILEX)/2, (WIN_YSIZE - TILEY)/2);
764 TEST_SDL_EVENT_LOOP();
770 exit(0); /* to keep compilers happy */