1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * ©1995 Artsoft Development *
6 * 33659 Bielefeld-Senne *
7 * Telefon: (0521) 493245 *
8 * eMail: aeglos@valinor.owl.de *
9 * aeglos@uni-paderborn.de *
10 * q99492@pbhrzx.uni-paderborn.de *
11 *----------------------------------------------------------*
14 * Letzte Aenderung: 15.06.1995 *
15 ***********************************************************/
34 DrawText(SX+16, SY+8, "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
35 DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
37 DrawText(SX+32, SY+64, "Name:",FS_BIG,FC_GREEN);
38 DrawText(SX+192,SY+64, player.alias_name,FS_BIG,FC_RED);
39 DrawText(SX+32, SY+96, "Level:",FS_BIG,FC_GREEN);
40 DrawText(SX+352,SY+96, int2str(level_nr,3),FS_BIG,
41 (level_nr<leveldir[leveldir_nr].num_ready ? FC_RED : FC_YELLOW));
42 DrawText(SX+32, SY+128,"Hall Of Fame",FS_BIG,FC_GREEN);
43 DrawText(SX+32, SY+160,"Level Creator",FS_BIG,FC_GREEN);
44 DrawText(SY+32, SY+192,"Info Screen",FS_BIG,FC_GREEN);
45 DrawText(SX+32, SY+224,"Start Game",FS_BIG,FC_GREEN);
46 DrawText(SX+32, SY+256,"Setup",FS_BIG,FC_GREEN);
47 DrawText(SX+32, SY+288,"Quit",FS_BIG,FC_GREEN);
49 DrawMicroLevel(MICROLEV_XPOS,MICROLEV_YPOS);
52 DrawGraphic(0,i,GFX_KUGEL_BLAU);
53 DrawGraphic(10,3,GFX_KUGEL_BLAU);
54 DrawGraphic(14,3,GFX_KUGEL_BLAU);
56 DrawText(SX+54+16,SY+326,"A Game by Artsoft Development",FS_SMALL,FC_BLUE);
57 DrawText(SX+40+16,SY+344,"Graphics: Deluxe Paint IV Amiga",
59 DrawText(SX+60+16,SY+362,"Sounds: AudioMaster IV Amiga",
64 HandleMainMenu(0,0,0,0,MB_MENU_MARK);
67 if (TAPE_IS_EMPTY(tape))
68 LoadLevelTape(level_nr);
69 DrawCompleteVideoDisplay();
71 OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
73 XAutoRepeatOn(display);
76 void HandleMainMenu(int mx, int my, int dx, int dy, int button)
78 static int choice = 3;
79 static int redraw = TRUE;
80 int x = (mx+32-SX)/32, y = (my+32-SY)/32;
84 DrawGraphic(0,choice-1,GFX_KUGEL_ROT);
109 if (!mx && !my && !dx && !dy)
115 if (y==4 && ((x==11 && level_nr>0) ||
116 (x==15 && level_nr<LEVELDIR_SIZE(leveldir[leveldir_nr]))) &&
119 static int level_delay = 0;
120 int step = (button==1 ? 1 : button==2 ? 5 : 10);
122 if (!DelayReached(&level_delay,20))
125 level_nr += (x==11 ? -step : +step);
128 if (level_nr>LEVELDIR_SIZE(leveldir[leveldir_nr])-1)
129 level_nr = LEVELDIR_SIZE(leveldir[leveldir_nr])-1;
131 if (level_nr>player.handicap && level_nr<leveldir[leveldir_nr].num_ready)
133 if (x==11 || leveldir[leveldir_nr].num_free==0)
134 level_nr = player.handicap;
136 level_nr = leveldir[leveldir_nr].num_ready;
139 DrawTextExt(drawto,gc,SX+352,SY+96, int2str(level_nr,3),FS_BIG,
140 (level_nr<leveldir[leveldir_nr].num_ready ?FC_RED :FC_YELLOW));
141 DrawTextExt(window,gc,SX+352,SY+96, int2str(level_nr,3),FS_BIG,
142 (level_nr<leveldir[leveldir_nr].num_ready ?FC_RED :FC_YELLOW));
145 DrawMicroLevel(MICROLEV_XPOS,MICROLEV_YPOS);
148 LoadLevelTape(level_nr);
149 DrawCompleteVideoDisplay();
151 else if (x==1 && y>=3 && y<=10)
157 DrawGraphic(0,y-1,GFX_KUGEL_ROT);
158 DrawGraphic(0,choice-1,GFX_KUGEL_BLAU);
166 game_status = TYPENAME;
167 HandleTypeName(strlen(player.alias_name),0);
173 game_status = CHOOSELEVEL;
180 game_status = HALLOFFAME;
186 game_status = LEVELED;
192 game_status = HELPSCREEN;
198 if (autorecord_on && !tape.playing)
201 game_status = PLAYING;
213 if (AreYouSure("Do you really want to quit ?",AYS_ASK|AYS_STAY_CLOSED))
214 game_status = EXITGAME;
222 if (game_status==MAINMENU)
226 #define MAX_HELPSCREEN_ELS 10
230 static int helpscreen_state;
231 static int helpscreen_step[MAX_HELPSCREEN_ELS];
232 static int helpscreen_frame[MAX_HELPSCREEN_ELS];
233 static int helpscreen_delay[MAX_HELPSCREEN_ELS];
234 static int helpscreen_action[] =
236 GFX_ERDREICH,1,100, HA_NEXT,
237 GFX_LEERRAUM,1,100, HA_NEXT,
238 GFX_MORAST_LEER,1,100, HA_NEXT,
239 GFX_BETON,1,100, HA_NEXT,
240 GFX_MAUERWERK,1,100, HA_NEXT,
241 GFX_FELSBODEN,1,100, HA_NEXT,
242 GFX_EDELSTEIN,2,5, HA_NEXT,
243 GFX_DIAMANT,2,5, HA_NEXT,
244 GFX_FELSBROCKEN,4,5, HA_NEXT,
245 GFX_BOMBE,1,50, GFX_EXPLOSION,8,1, GFX_LEERRAUM,1,10, HA_NEXT,
246 GFX_KOKOSNUSS,1,50, GFX_CRACKINGNUT,3,1, GFX_EDELSTEIN,1,10, HA_NEXT,
247 GFX_ERZ_1,1,50, GFX_EXPLOSION,8,1, GFX_EDELSTEIN,1,10, HA_NEXT,
248 GFX_ERZ_2,1,50, GFX_EXPLOSION,8,1, GFX_DIAMANT,1,10, HA_NEXT,
249 GFX_GEBLUBBER,4,4, HA_NEXT,
250 GFX_SCHLUESSEL1,4,33, HA_NEXT,
251 GFX_PFORTE1,4,33, HA_NEXT,
252 GFX_PFORTE1X,4,33, HA_NEXT,
253 GFX_DYNAMIT_AUS,1,100, HA_NEXT,
254 GFX_DYNAMIT,7,6, GFX_EXPLOSION,8,1, GFX_LEERRAUM,1,10, HA_NEXT,
255 GFX_FLIEGER+4,1,3, GFX_FLIEGER+0,1,3, GFX_FLIEGER+4,1,3,
256 GFX_FLIEGER+5,1,3, GFX_FLIEGER+1,1,3, GFX_FLIEGER+5,1,3,
257 GFX_FLIEGER+6,1,3, GFX_FLIEGER+2,1,3, GFX_FLIEGER+6,1,3,
258 GFX_FLIEGER+7,1,3, GFX_FLIEGER+3,1,3, GFX_FLIEGER+7,1,3, HA_NEXT,
259 GFX_KAEFER+4,1,1, GFX_KAEFER+0,1,1, GFX_KAEFER+4,1,1,
260 GFX_KAEFER+5,1,1, GFX_KAEFER+1,1,1, GFX_KAEFER+5,1,1,
261 GFX_KAEFER+6,1,1, GFX_KAEFER+2,1,1, GFX_KAEFER+6,1,1,
262 GFX_KAEFER+7,1,1, GFX_KAEFER+3,1,1, GFX_KAEFER+7,1,1, HA_NEXT,
263 GFX_PACMAN+0,1,3, GFX_PACMAN+4,1,2, GFX_PACMAN+0,1,3,
264 GFX_PACMAN+1,1,3, GFX_PACMAN+5,1,2, GFX_PACMAN+1,1,3,
265 GFX_PACMAN+2,1,3, GFX_PACMAN+6,1,2, GFX_PACMAN+2,1,3,
266 GFX_PACMAN+3,1,3, GFX_PACMAN+7,1,2, GFX_PACMAN+3,1,3, HA_NEXT,
267 GFX_MAMPFER+0,4,0, GFX_MAMPFER+3,1,0, GFX_MAMPFER+2,1,0,
268 GFX_MAMPFER+1,1,0, HA_NEXT,
269 GFX_ZOMBIE+0,4,0, GFX_ZOMBIE+3,1,0, GFX_ZOMBIE+2,1,0,
270 GFX_ZOMBIE+1,1,0, HA_NEXT,
271 GFX_ABLENK,4,1, HA_NEXT,
272 GFX_AMOEBE_LEBT,4,40, HA_NEXT,
273 GFX_AMOEBE_TOT+2,2,50, GFX_AMOEBE_TOT,2,50, HA_NEXT,
274 GFX_SIEB_LEER,4,2, HA_NEXT,
277 static char *helpscreen_eltext[][2] =
279 "Normal sand:", "You can dig through it",
280 "Empty field:", "You can walk through it",
281 "Quicksand: You cannot pass it,", "but rocks can fall though it",
282 "Massive Wall:", "Nothing can go through it",
283 "Normal Wall: You can't go through", "it, but you can bomb it away",
284 "Old Wall: Like normal wall, but", "some things can fall down from it",
285 "Emerald: You must collect enough of", "them to finish a level",
286 "Diamond: Counts as 3 emeralds;", "Can be destroyed by rocks",
287 "Rock: Smashes several things;", "Can be moved by the player",
288 "Bomb: You can move it, but be", "careful when dropping it",
289 "Nut: Throw a rock on it to open it;", "Each nut contains an emerald",
290 "Wall with an Emerald inside:", "Bomb the wall away to get it",
291 "Wall with a Diamond inside:", "Bomb the wall away to get it",
292 "Acid: Destroys everything that", "falls or walks into it",
293 "Key: Opens the door that has the", "same color (red/yellow/green/blue)",
294 "Door: Can be opened by the key", "with the same color",
295 "Door: You have to find out the", "right color of the key for it",
296 "Dynamite: Collect it and use it to", "destroy walls or kill enemies",
297 "Dynamite: This one explodes after", "a few seconds",
298 "Spaceship: Moves at the left side", "of walls; don't touch it!",
299 "Bug: Moves at the right side of", "walls; don't touch it!",
300 "Pacman: Eats the amoeba and you,", "if you're not careful",
301 "Cruncher: Eats diamonds and you,", "if you're not careful",
302 "Robot: Tries to kill the player", "",
303 "Magic Wheel: Touch it to get rid of", "the robots for some seconds",
304 "Living Amoeba: Grows through empty", "fields, sand and quicksand",
305 "Dead Amoeba: Does not grow, but", "can still kill bugs and spaceships",
306 "Magic Wall: Changes rocks, emeralds", "and diamonds when they pass it",
308 static int num_helpscreen_els = sizeof(helpscreen_eltext)/(2*sizeof(char *));
310 static char *helpscreen_music[][3] =
312 "Alchemy", "Ian Boddy", "Drive",
313 "The Chase", "Propaganda", "A Secret Wish",
314 "Network 23", "Tangerine Dream", "Exit",
315 "Czardasz", "Robert Pieculewicz", "Czardasz",
316 "21st Century Common Man", "Tangerine Dream", "Tyger",
317 "Voyager", "The Alan Parsons Project","Pyramid",
318 "Twilight Painter", "Tangerine Dream", "Heartbreakers"
320 static int helpscreen_musicpos;
322 void DrawHelpScreenElAction(int start)
325 int frame, delay, graphic;
326 int xstart = SX+16, ystart = SY+64+2*32, ystep = TILEY+4;
328 while(helpscreen_action[j] != HA_END)
330 if (i>=start+MAX_HELPSCREEN_ELS || i>=num_helpscreen_els)
332 else if (i<start || helpscreen_delay[i-start])
334 if (i>=start && helpscreen_delay[i-start])
335 helpscreen_delay[i-start]--;
337 while(helpscreen_action[j] != HA_NEXT)
344 j += 3*helpscreen_step[i-start];
345 graphic = helpscreen_action[j++];
347 if (helpscreen_frame[i-start])
349 frame = helpscreen_action[j++] - helpscreen_frame[i-start];
350 helpscreen_frame[i-start]--;
355 helpscreen_frame[i-start] = helpscreen_action[j++]-1;
358 delay = helpscreen_action[j++];
359 helpscreen_delay[i-start] = delay;
361 if (helpscreen_action[j] == HA_NEXT)
363 if (!helpscreen_frame[i-start])
364 helpscreen_step[i-start] = 0;
368 if (!helpscreen_frame[i-start])
369 helpscreen_step[i-start]++;
370 while(helpscreen_action[j] != HA_NEXT)
375 DrawGraphicExtHiRes(drawto,gc,xstart,ystart+(i-start)*ystep,
382 redraw[0][i] = redraw[1][i] = TRUE;
383 redraw_mask |= REDRAW_TILES;
386 void DrawHelpScreenElText(int start)
389 int xstart = SX+56, ystart = SY+65+2*32, ystep = TILEY+4;
390 char text[FULL_SXSIZE/FONT2_XSIZE+10];
393 DrawText(SX+16, SY+8, "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
394 DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
397 sprintf(text,"The game elements:");
398 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+100,
399 text,FS_SMALL,FC_GREEN);
401 for(i=start;i<start+MAX_HELPSCREEN_ELS && i<num_helpscreen_els;i++)
403 DrawText(xstart,ystart+(i-start)*ystep+(*helpscreen_eltext[i][1] ? 0 : 8),
404 helpscreen_eltext[i][0],FS_SMALL,FC_YELLOW);
405 DrawText(xstart,ystart+(i-start)*ystep+16,
406 helpscreen_eltext[i][1],FS_SMALL,FC_YELLOW);
409 sprintf(text,"Press any key or button for next page");
410 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+SYSIZE-20,
411 text,FS_SMALL,FC_BLUE);
414 void DrawHelpScreenMusicText(int num)
416 int ystart = 150, ystep = 30;
417 char text[FULL_SXSIZE/FONT2_XSIZE+10];
421 DrawText(SX+16, SY+8, "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
422 DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
425 sprintf(text,"The game background music loops:");
426 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+100,
427 text,FS_SMALL,FC_GREEN);
429 sprintf(text,"Excerpt from");
430 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+0*ystep,
431 text,FS_SMALL,FC_YELLOW);
432 sprintf(text,"%c%s%c",'\"',helpscreen_music[num][0],'\"');
433 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+1*ystep,
434 text,FS_SMALL,FC_RED);
436 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+2*ystep,
437 text,FS_SMALL,FC_YELLOW);
438 sprintf(text,"%s",helpscreen_music[num][1]);
439 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+3*ystep,
440 text,FS_SMALL,FC_RED);
441 sprintf(text,"from the album");
442 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+4*ystep,
443 text,FS_SMALL,FC_YELLOW);
444 sprintf(text,"%c%s%c",'\"',helpscreen_music[num][2],'\"');
445 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+5*ystep,
446 text,FS_SMALL,FC_RED);
448 sprintf(text,"Press any key or button for next page");
449 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+SYSIZE-20,
450 text,FS_SMALL,FC_BLUE);
452 PlaySoundLoop(background_loop[num]);
455 void DrawHelpScreenRegistrationText()
457 int ystart = 150, ystep = 30;
458 char text[FULL_SXSIZE/FONT2_XSIZE+10];
462 DrawText(SX+16, SY+8, "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
463 DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
466 sprintf(text,"Registration information:");
467 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+100,
468 text,FS_SMALL,FC_GREEN);
470 sprintf(text,"Unregistered version");
471 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+4*ystep,
472 text,FS_SMALL,FC_YELLOW);
474 sprintf(text,"Press any key or button for main menu");
475 DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+SYSIZE-20,
476 text,FS_SMALL,FC_BLUE);
479 void DrawHelpScreen()
483 CloseDoor(DOOR_CLOSE_2);
485 for(i=0;i<MAX_HELPSCREEN_ELS;i++)
486 helpscreen_step[i] = helpscreen_frame[i] = helpscreen_delay[i] = 0;
487 helpscreen_musicpos = 0;
488 helpscreen_state = 0;
489 DrawHelpScreenElText(0);
490 DrawHelpScreenElAction(0);
494 PlaySoundLoop(SND_RHYTHMLOOP);
497 void HandleHelpScreen(int button)
499 static int hs_delay = 0;
500 int num_helpscreen_els_pages =
501 (num_helpscreen_els + MAX_HELPSCREEN_ELS-1) / MAX_HELPSCREEN_ELS;
502 int button_released = !button;
507 if (helpscreen_state<num_helpscreen_els_pages-1)
509 for(i=0;i<MAX_HELPSCREEN_ELS;i++)
510 helpscreen_step[i] = helpscreen_frame[i] = helpscreen_delay[i] = 0;
512 DrawHelpScreenElText(helpscreen_state*MAX_HELPSCREEN_ELS);
513 DrawHelpScreenElAction(helpscreen_state*MAX_HELPSCREEN_ELS);
515 else if (helpscreen_state<num_helpscreen_els_pages+num_bg_loops-1)
518 DrawHelpScreenMusicText(helpscreen_state-num_helpscreen_els_pages);
520 else if (helpscreen_state==num_helpscreen_els_pages+num_bg_loops-1)
523 DrawHelpScreenRegistrationText();
529 game_status = MAINMENU;
534 if (DelayReached(&hs_delay,3))
536 if (helpscreen_state<num_helpscreen_els_pages)
537 DrawHelpScreenElAction(helpscreen_state*MAX_HELPSCREEN_ELS);
547 int old_handicap = player.handicap;
549 if (!strcmp(player.alias_name,"Artsoft"))
550 player.handicap = MAX(0,leveldir[leveldir_nr].num_ready-1);
552 if (player.handicap != old_handicap)
554 SavePlayerInfo(PLAYER_LEVEL);
555 level_nr = player.handicap;
559 void HandleTypeName(int newxpos, KeySym key)
561 static int xpos = 0, ypos = 2;
567 DrawText(SX+6*32,SY+ypos*32,player.alias_name,FS_BIG,FC_YELLOW);
568 DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
572 if ((key>=XK_A && key<=XK_Z) || (key>=XK_a && key<=XK_z &&
575 if (key>=XK_A && key<=XK_Z)
576 ascii = 'A'+(char)(key-XK_A);
577 if (key>=XK_a && key<=XK_z)
578 ascii = 'a'+(char)(key-XK_a);
579 player.alias_name[xpos] = ascii;
580 player.alias_name[xpos+1] = 0;
582 DrawTextExt(drawto,gc,SX+6*32,SY+ypos*32,
583 player.alias_name,FS_BIG,FC_YELLOW);
584 DrawTextExt(window,gc,SX+6*32,SY+ypos*32,
585 player.alias_name,FS_BIG,FC_YELLOW);
586 DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
588 else if (key==XK_Delete && xpos>0)
590 player.alias_name[xpos] = 0;
592 DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
593 DrawGraphic(xpos+7,ypos,GFX_LEERRAUM);
595 else if (key==XK_Return && xpos>0)
597 DrawText(SX+6*32,SY+ypos*32,player.alias_name,FS_BIG,FC_RED);
598 DrawGraphic(xpos+6,ypos,GFX_LEERRAUM);
599 SavePlayerInfo(PLAYER_SETUP);
602 game_status = MAINMENU;
608 void DrawChooseLevel()
613 DrawText(SX,SY,"Level Directories",FS_BIG,FC_GREEN);
614 for(i=0;i<num_leveldirs;i++)
616 DrawText(SX+32,SY+(i+2)*32,leveldir[i].name,FS_BIG,FC_YELLOW);
617 DrawGraphic(0,i+2,GFX_KUGEL_BLAU);
622 HandleChooseLevel(0,0,0,0,MB_MENU_MARK);
625 void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
627 static int choice = 3;
628 static int redraw = TRUE;
629 int x = (mx+32-SX)/32, y = (my+32-SY)/32;
633 DrawGraphic(0,choice-1,GFX_KUGEL_ROT);
649 else if (y>num_leveldirs+2)
653 if (!mx && !my && !dx && !dy)
659 if (x==1 && y>=3 && y<=num_leveldirs+2)
665 DrawGraphic(0,y-1,GFX_KUGEL_ROT);
666 DrawGraphic(0,choice-1,GFX_KUGEL_BLAU);
672 player.leveldir_nr = leveldir_nr = y-3;
673 LoadPlayerInfo(PLAYER_LEVEL);
674 SavePlayerInfo(PLAYER_SETUP);
677 game_status = MAINMENU;
684 if (game_status==CHOOSELEVEL)
688 void DrawHallOfFame(int pos)
693 CloseDoor(DOOR_CLOSE_2);
698 DrawText(SX+64,SY+10,"Hall Of Fame",FS_BIG,FC_YELLOW);
699 sprintf(txt,"HighScores of Level %d",level_nr);
700 DrawText(SX+256-strlen(txt)*7,SY+48,txt,FS_SMALL,FC_RED);
701 for(y=0;y<MAX_SCORE_ENTRIES;y++)
703 DrawText(SX,SY+64+y*32,".................",FS_BIG,
704 (y==pos ? FC_RED : FC_GREEN));
705 DrawText(SX,SY+64+y*32,highscore[y].Name,FS_BIG,
706 (y==pos ? FC_RED : FC_GREEN));
707 DrawText(SX+12*32,SY+64+y*32,
708 int2str(highscore[y].Score,5),FS_BIG,
709 (y==pos ? FC_RED : FC_GREEN));
714 PlaySound(SND_HALLOFFAME);
717 void HandleHallOfFame(int button)
719 int button_released = !button;
723 FadeSound(SND_HALLOFFAME);
724 game_status = MAINMENU;
732 void DrawSetupScreen()
736 CloseDoor(DOOR_CLOSE_2);
739 DrawText(SX+16, SY+16, "SETUP",FS_BIG,FC_YELLOW);
740 DrawText(SX+32, SY+2*32,"Sound:",FS_BIG,FC_GREEN);
741 DrawText(SX+32, SY+3*32,"Sound loops:",FS_BIG,FC_GREEN);
742 DrawText(SX+32, SY+4*32,"Game music:",FS_BIG,FC_GREEN);
743 DrawText(SX+32, SY+5*32,"Toons:",FS_BIG,FC_GREEN);
744 DrawText(SX+32, SY+6*32,"Buffered gfx:",FS_BIG,FC_GREEN);
745 DrawText(SX+32, SY+7*32,"Fading:",FS_BIG,FC_GREEN);
746 DrawText(SX+32, SY+8*32,"Auto-Record:",FS_BIG,FC_GREEN);
747 DrawText(SX+32, SY+9*32,"Joystick:",FS_BIG,FC_GREEN);
748 DrawText(SX+32, SY+10*32,"Cal. Joystick",FS_BIG,FC_GREEN);
749 DrawText(SX+32, SY+12*32,"Exit",FS_BIG,FC_GREEN);
750 DrawText(SX+32, SY+13*32,"Save and exit",FS_BIG,FC_GREEN);
752 if (SETUP_SOUND_ON(player.setup))
753 DrawText(SX+14*32, SY+2*32,"on",FS_BIG,FC_YELLOW);
755 DrawText(SX+14*32, SY+2*32,"off",FS_BIG,FC_BLUE);
757 if (SETUP_SOUND_LOOPS_ON(player.setup))
758 DrawText(SX+14*32, SY+3*32,"on",FS_BIG,FC_YELLOW);
760 DrawText(SX+14*32, SY+3*32,"off",FS_BIG,FC_BLUE);
762 if (SETUP_SOUND_MUSIC_ON(player.setup))
763 DrawText(SX+14*32, SY+4*32,"on",FS_BIG,FC_YELLOW);
765 DrawText(SX+14*32, SY+4*32,"off",FS_BIG,FC_BLUE);
767 if (SETUP_TOONS_ON(player.setup))
768 DrawText(SX+14*32, SY+5*32,"on",FS_BIG,FC_YELLOW);
770 DrawText(SX+14*32, SY+5*32,"off",FS_BIG,FC_BLUE);
772 if (!SETUP_DIRECT_DRAW_ON(player.setup))
773 DrawText(SX+14*32, SY+6*32,"on",FS_BIG,FC_YELLOW);
775 DrawText(SX+14*32, SY+6*32,"off",FS_BIG,FC_BLUE);
777 if (SETUP_FADING_ON(player.setup))
778 DrawText(SX+14*32, SY+7*32,"on",FS_BIG,FC_YELLOW);
780 DrawText(SX+14*32, SY+7*32,"off",FS_BIG,FC_BLUE);
782 if (SETUP_RECORD_EACH_GAME_ON(player.setup))
783 DrawText(SX+14*32, SY+8*32,"on",FS_BIG,FC_YELLOW);
785 DrawText(SX+14*32, SY+8*32,"off",FS_BIG,FC_BLUE);
787 if (SETUP_2ND_JOYSTICK_ON(player.setup))
788 DrawText(SX+14*32, SY+9*32,"2nd",FS_BIG,FC_YELLOW);
790 DrawText(SX+14*32, SY+9*32,"1st",FS_BIG,FC_YELLOW);
794 DrawGraphic(0,i,GFX_KUGEL_BLAU);
798 HandleSetupScreen(0,0,0,0,MB_MENU_MARK);
801 void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
803 static int choice = 3;
804 static int redraw = TRUE;
805 int x = (mx+32-SX)/32, y = (my+32-SY)/32;
809 DrawGraphic(0,choice-1,GFX_KUGEL_ROT);
824 y = (dy>0 ? 13 : 11);
832 if (!mx && !my && !dx && !dy)
838 if (x==1 && y>=3 && y<=14 && y!=12)
844 DrawGraphic(0,y-1,GFX_KUGEL_ROT);
845 DrawGraphic(0,choice-1,GFX_KUGEL_BLAU);
853 if (y==3 && sound_status==SOUND_AVAILABLE)
855 if (SETUP_SOUND_ON(player.setup))
856 DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
858 DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
859 player.setup ^= SETUP_SOUND;
861 else if (y==4 && sound_loops_allowed)
863 if (SETUP_SOUND_LOOPS_ON(player.setup))
864 DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
866 DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
867 player.setup ^= SETUP_SOUND_LOOPS;
869 else if (y==5 && sound_loops_allowed)
871 if (SETUP_SOUND_MUSIC_ON(player.setup))
872 DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
874 DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
875 player.setup ^= SETUP_SOUND_MUSIC;
879 if (SETUP_TOONS_ON(player.setup))
880 DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
882 DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
883 player.setup ^= SETUP_TOONS;
887 if (!SETUP_DIRECT_DRAW_ON(player.setup))
888 DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
890 DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
891 player.setup ^= SETUP_DIRECT_DRAW;
895 if (SETUP_FADING_ON(player.setup))
896 DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
898 DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
899 player.setup ^= SETUP_FADING;
903 if (SETUP_RECORD_EACH_GAME_ON(player.setup))
904 DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
906 DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
907 player.setup ^= SETUP_RECORD_EACH_GAME;
911 if (SETUP_2ND_JOYSTICK_ON(player.setup))
912 DrawText(SX+14*32, SY+yy*32,"1st",FS_BIG,FC_YELLOW);
914 DrawText(SX+14*32, SY+yy*32,"2nd",FS_BIG,FC_YELLOW);
915 player.setup ^= SETUP_2ND_JOYSTICK;
922 else if (y==13 || y==14)
926 SavePlayerInfo(PLAYER_SETUP);
930 game_status = MAINMENU;
938 if (game_status==SETUP)
942 void HandleVideoButtons(int mx, int my, int button)
944 if (game_status!=MAINMENU && game_status!=PLAYING)
947 switch(CheckVideoButtons(mx,my,button))
949 case BUTTON_VIDEO_EJECT:
951 if (!TAPE_IS_EMPTY(tape))
952 SaveLevelTape(tape.level_nr);
954 AreYouSure("Tape is empty !",AYS_CONFIRM);
955 DrawCompleteVideoDisplay();
957 case BUTTON_VIDEO_STOP:
960 case BUTTON_VIDEO_PAUSE:
963 case BUTTON_VIDEO_REC:
966 else if (game_status==MAINMENU)
969 case BUTTON_VIDEO_PLAY:
972 else if (game_status==MAINMENU)
980 void HandleSoundButtons(int mx, int my, int button)
982 if (game_status!=PLAYING)
985 switch(CheckSoundButtons(mx,my,button))
987 case BUTTON_SOUND_MUSIC:
990 sound_music_on = FALSE;
991 player.setup &= ~SETUP_SOUND_MUSIC;
992 FadeSound(background_loop[level_nr % num_bg_loops]);
993 DrawSoundDisplay(BUTTON_SOUND_MUSIC_OFF);
995 else if (sound_loops_allowed)
997 sound_music_on = TRUE;
998 player.setup |= SETUP_SOUND_MUSIC;
999 PlaySoundLoop(background_loop[level_nr % num_bg_loops]);
1000 DrawSoundDisplay(BUTTON_SOUND_MUSIC_ON);
1003 DrawSoundDisplay(BUTTON_SOUND_MUSIC_OFF);
1005 case BUTTON_SOUND_LOOPS:
1008 sound_loops_on = FALSE;
1009 player.setup &= ~SETUP_SOUND_LOOPS;
1010 DrawSoundDisplay(BUTTON_SOUND_LOOPS_OFF);
1012 else if (sound_loops_allowed)
1014 sound_loops_on = TRUE;
1015 player.setup |= SETUP_SOUND_LOOPS;
1016 DrawSoundDisplay(BUTTON_SOUND_LOOPS_ON);
1019 DrawSoundDisplay(BUTTON_SOUND_LOOPS_OFF);
1021 case BUTTON_SOUND_SOUND:
1025 player.setup &= ~SETUP_SOUND;
1026 DrawSoundDisplay(BUTTON_SOUND_SOUND_OFF);
1028 else if (sound_status==SOUND_AVAILABLE)
1031 player.setup |= SETUP_SOUND;
1032 DrawSoundDisplay(BUTTON_SOUND_SOUND_ON);
1035 DrawSoundDisplay(BUTTON_SOUND_SOUND_OFF);
1042 void HandleGameButtons(int mx, int my, int button)
1044 if (game_status!=PLAYING)
1047 switch(CheckGameButtons(mx,my,button))
1049 case BUTTON_GAME_STOP:
1050 if (AreYouSure("Do you really want to quit the game ?",
1051 AYS_ASK | AYS_STAY_CLOSED))
1053 game_status = MAINMENU;
1057 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
1059 case BUTTON_GAME_PAUSE:
1062 tape.pausing = FALSE;
1063 DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0);
1067 tape.pausing = TRUE;
1068 DrawVideoDisplay(VIDEO_STATE_PAUSE_ON,0);
1071 case BUTTON_GAME_PLAY:
1074 tape.pausing = FALSE;
1075 DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0);
1083 int CheckVideoButtons(int mx, int my, int button)
1085 int return_code = 0;
1086 static int choice = -1;
1087 static BOOL pressed = FALSE;
1088 static int video_button[5] =
1090 VIDEO_PRESS_EJECT_ON,
1091 VIDEO_PRESS_STOP_ON,
1092 VIDEO_PRESS_PAUSE_ON,
1099 if (!motion_status) /* Maustaste neu gedrückt */
1101 if (ON_VIDEO_BUTTON(mx,my))
1103 choice = VIDEO_BUTTON(mx);
1105 DrawVideoDisplay(video_button[choice],0);
1108 else /* Mausbewegung bei gedrückter Maustaste */
1110 if ((!ON_VIDEO_BUTTON(mx,my) || VIDEO_BUTTON(mx)!=choice) &&
1111 choice>=0 && pressed)
1114 DrawVideoDisplay(video_button[choice]<<1,0);
1116 else if (ON_VIDEO_BUTTON(mx,my) && VIDEO_BUTTON(mx)==choice && !pressed)
1119 DrawVideoDisplay(video_button[choice],0);
1123 else /* Maustaste wieder losgelassen */
1125 if (ON_VIDEO_BUTTON(mx,my) && VIDEO_BUTTON(mx)==choice && pressed)
1127 DrawVideoDisplay(video_button[choice]<<1,0);
1128 return_code = choice+1;
1140 return(return_code);
1143 int CheckSoundButtons(int mx, int my, int button)
1145 int return_code = 0;
1146 static int choice = -1;
1147 static BOOL pressed = FALSE;
1150 sound_state[0] = BUTTON_SOUND_MUSIC | (BUTTON_ON * sound_music_on);
1151 sound_state[1] = BUTTON_SOUND_LOOPS | (BUTTON_ON * sound_loops_on);
1152 sound_state[2] = BUTTON_SOUND_SOUND | (BUTTON_ON * sound_on);
1156 if (!motion_status) /* Maustaste neu gedrückt */
1158 if (ON_SOUND_BUTTON(mx,my))
1160 choice = SOUND_BUTTON(mx);
1162 DrawSoundDisplay(sound_state[choice] | BUTTON_PRESSED);
1165 else /* Mausbewegung bei gedrückter Maustaste */
1167 if ((!ON_SOUND_BUTTON(mx,my) || SOUND_BUTTON(mx)!=choice) &&
1168 choice>=0 && pressed)
1171 DrawSoundDisplay(sound_state[choice] | BUTTON_RELEASED);
1173 else if (ON_SOUND_BUTTON(mx,my) && SOUND_BUTTON(mx)==choice && !pressed)
1176 DrawSoundDisplay(sound_state[choice] | BUTTON_PRESSED);
1180 else /* Maustaste wieder losgelassen */
1182 if (ON_SOUND_BUTTON(mx,my) && SOUND_BUTTON(mx)==choice && pressed)
1184 DrawSoundDisplay(sound_state[choice] | BUTTON_RELEASED);
1185 return_code = 1<<choice;
1197 return(return_code);
1200 int CheckGameButtons(int mx, int my, int button)
1202 int return_code = 0;
1203 static int choice = -1;
1204 static BOOL pressed = FALSE;
1214 if (!motion_status) /* Maustaste neu gedrückt */
1216 if (ON_GAME_BUTTON(mx,my))
1218 choice = GAME_BUTTON(mx);
1220 DrawGameButton(game_state[choice] | BUTTON_PRESSED);
1223 else /* Mausbewegung bei gedrückter Maustaste */
1225 if ((!ON_GAME_BUTTON(mx,my) || GAME_BUTTON(mx)!=choice) &&
1226 choice>=0 && pressed)
1229 DrawGameButton(game_state[choice] | BUTTON_RELEASED);
1231 else if (ON_GAME_BUTTON(mx,my) && GAME_BUTTON(mx)==choice && !pressed)
1234 DrawGameButton(game_state[choice] | BUTTON_PRESSED);
1238 else /* Maustaste wieder losgelassen */
1240 if (ON_GAME_BUTTON(mx,my) && GAME_BUTTON(mx)==choice && pressed)
1242 DrawGameButton(game_state[choice] | BUTTON_RELEASED);
1243 return_code = 1<<choice;
1255 return(return_code);
1258 int CheckChooseButtons(int mx, int my, int button)
1260 int return_code = 0;
1261 static int choice = -1;
1262 static BOOL pressed = FALSE;
1263 static int choose_button[5] =
1271 if (!motion_status) /* Maustaste neu gedrückt */
1273 if (ON_CHOOSE_BUTTON(mx,my))
1275 choice = CHOOSE_BUTTON(mx);
1277 DrawChooseButton(choose_button[choice] | BUTTON_PRESSED);
1280 else /* Mausbewegung bei gedrückter Maustaste */
1282 if ((!ON_CHOOSE_BUTTON(mx,my) || CHOOSE_BUTTON(mx)!=choice) &&
1283 choice>=0 && pressed)
1286 DrawChooseButton(choose_button[choice] | BUTTON_RELEASED);
1288 else if (ON_CHOOSE_BUTTON(mx,my) &&CHOOSE_BUTTON(mx)==choice && !pressed)
1291 DrawChooseButton(choose_button[choice] | BUTTON_PRESSED);
1295 else /* Maustaste wieder losgelassen */
1297 if (ON_CHOOSE_BUTTON(mx,my) && CHOOSE_BUTTON(mx)==choice && pressed)
1299 DrawChooseButton(choose_button[choice] | BUTTON_RELEASED);
1300 return_code = choice+1;
1312 return(return_code);
1315 int CheckConfirmButton(int mx, int my, int button)
1317 int return_code = 0;
1318 static int choice = -1;
1319 static BOOL pressed = FALSE;
1323 if (!motion_status) /* Maustaste neu gedrückt */
1325 if (ON_CONFIRM_BUTTON(mx,my))
1329 DrawConfirmButton(BUTTON_PRESSED);
1332 else /* Mausbewegung bei gedrückter Maustaste */
1334 if (!ON_CONFIRM_BUTTON(mx,my) && choice>=0 && pressed)
1337 DrawConfirmButton(BUTTON_RELEASED);
1339 else if (ON_CONFIRM_BUTTON(mx,my) && !pressed)
1342 DrawConfirmButton(BUTTON_PRESSED);
1346 else /* Maustaste wieder losgelassen */
1348 if (ON_CONFIRM_BUTTON(mx,my) && pressed)
1350 DrawConfirmButton(BUTTON_RELEASED);
1351 return_code = BUTTON_CONFIRM;
1363 return(return_code);
1366 void DrawCompleteVideoDisplay()
1368 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
1369 DOOR_GFX_PAGEX3,DOOR_GFX_PAGEY2, VXSIZE,VYSIZE, VX,VY);
1370 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
1371 DOOR_GFX_PAGEX4+VIDEO_CONTROL_XPOS,
1372 DOOR_GFX_PAGEY2+VIDEO_CONTROL_YPOS,
1373 VIDEO_CONTROL_XSIZE,VIDEO_CONTROL_YSIZE,
1374 VX+VIDEO_CONTROL_XPOS,VY+VIDEO_CONTROL_YPOS);
1376 DrawVideoDisplay(VIDEO_ALL_OFF,0);
1377 if (tape.date && tape.length)
1379 DrawVideoDisplay(VIDEO_STATE_DATE_ON,tape.date);
1380 DrawVideoDisplay(VIDEO_STATE_TIME_ON,0);
1383 XCopyArea(display,drawto,pix[PIX_DB_DOOR],gc,
1384 VX,VY, VXSIZE,VYSIZE, DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);