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 *----------------------------------------------------------*
13 ***********************************************************/
22 #define CHOICE_DELAY_VALUE 100
24 static int level_xpos,level_ypos;
25 static BOOL edit_mode;
26 static BOOL name_typing;
27 static int new_element1 = EL_MAUERWERK;
28 static int new_element2 = EL_LEERRAUM;
29 static int new_element3 = EL_ERDREICH;
32 int editor_element[] =
34 EL_CHAR_A + ('B' - 'A'),
35 EL_CHAR_A + ('O' - 'A'),
36 EL_CHAR_A + ('U' - 'A'),
37 EL_CHAR_A + ('L' - 'A'),
40 EL_CHAR_A + ('D' - 'A'),
41 EL_CHAR_A + ('E' - 'A'),
42 EL_CHAR_A + ('R' - 'A'),
44 EL_CHAR_A + ('D' - 'A'),
45 EL_CHAR_A + ('A' - 'A'),
46 EL_CHAR_A + ('S' - 'A'),
47 EL_CHAR_A + ('H' - 'A'),
74 EL_CHAR_A + ('E' - 'A'),
75 EL_CHAR_A + ('M' - 'A'),
76 EL_CHAR_A + ('E' - 'A'),
79 EL_CHAR_A + ('R' - 'A'),
80 EL_CHAR_A + ('A' - 'A'),
81 EL_CHAR_A + ('L' - 'A'),
82 EL_CHAR_A + ('D' - 'A'),
84 EL_CHAR_A + ('M' - 'A'),
85 EL_CHAR_A + ('I' - 'A'),
86 EL_CHAR_A + ('N' - 'A'),
87 EL_CHAR_A + ('E' - 'A'),
164 EL_CHAR_A + ('M' - 'A'),
165 EL_CHAR_A + ('O' - 'A'),
166 EL_CHAR_A + ('R' - 'A'),
167 EL_CHAR_A + ('E' - 'A'),
214 EL_CHAR_A + ('S' - 'A'),
215 EL_CHAR_A + ('O' - 'A'),
216 EL_CHAR_A + ('K' - 'A'),
217 EL_CHAR_A + ('O' - 'A'),
220 EL_CHAR_A + ('B' - 'A'),
221 EL_CHAR_A + ('A' - 'A'),
222 EL_CHAR_A + ('N' - 'A'),
225 EL_SOKOBAN_FELD_LEER,
226 EL_SOKOBAN_FELD_VOLL,
230 EL_CHAR_A + ('D' - 'A'),
231 EL_CHAR_A + ('Y' - 'A'),
232 EL_CHAR_A + ('N' - 'A'),
233 EL_CHAR_A + ('A' - 'A'),
235 EL_CHAR_A + ('B' - 'A'),
236 EL_CHAR_A + ('L' - 'A'),
237 EL_CHAR_A + ('A' - 'A'),
238 EL_CHAR_A + ('S' - 'A'),
241 EL_CHAR_A + ('T' - 'A'),
242 EL_CHAR_A + ('E' - 'A'),
243 EL_CHAR_A + ('R' - 'A'),
325 int elements_in_list = sizeof(editor_element)/sizeof(int);
337 CloseDoor(DOOR_CLOSE_2);
339 DrawMiniLevel(level_xpos,level_ypos);
342 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
343 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
345 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
346 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
347 DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
348 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
349 4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
350 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
351 DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
353 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
355 if (i < elements_in_list)
356 graphic = el2gfx(editor_element[i]);
358 graphic = GFX_LEERRAUM;
360 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
361 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 +
362 (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
363 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
364 (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
368 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
369 DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
370 DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
371 el2gfx(new_element1));
372 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
373 DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
374 DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
375 el2gfx(new_element2));
376 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
377 DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
378 DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
379 el2gfx(new_element3));
380 DrawTextExt(pix[PIX_DB_DOOR],gc,
381 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
382 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
383 int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
384 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
385 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
386 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
388 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
389 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
390 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
391 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
392 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
394 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
395 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
397 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
398 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
400 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
402 OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
405 void DrawControlWindow()
411 /* Inhalt der Mampfer */
412 DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
413 "Contents of a smashed cruncher:",FS_SMALL,FC_YELLOW);
414 for(i=0;i<4;i++) for(y=0;y<4;y++) for(x=0;x<4;x++)
416 DrawMiniElement(1+5*i+x,2+y,EL_ERDREICH);
417 XFillRectangle(display,drawto,gc,
418 SX+(1+5*i)*MINI_TILEX+MINI_TILEX/2-1,
419 SY+(2)*MINI_TILEY+MINI_TILEY/2-1,
420 3*MINI_TILEX+2,3*MINI_TILEY+2);
422 XCopyArea(display,drawto,drawto,gc,
423 SX+1*MINI_TILEX,SY+2*MINI_TILEY,
424 4*5*MINI_TILEX,5*MINI_TILEY,
425 SX+1*MINI_TILEX-MINI_TILEX/2,SY+2*MINI_TILEY-MINI_TILEY/2);
428 for(y=0;y<3;y++) for(x=0;x<3;x++)
429 DrawMiniElement(1+5*i+x,2+y,level.mampfer_inhalt[i][x][y]);
431 DrawText(SX+MINI_TILEX+(5*i+1)*MINI_TILEX+1,
432 SY+2*MINI_TILEY+(4)*MINI_TILEY-4,
433 int2str(i+1,1),FS_SMALL,FC_YELLOW);
436 /* Inhalt der Amöbe */
437 for(y=0;y<2;y++) for(x=0;x<2;x++)
439 DrawMiniElement(29+x,26+y,EL_ERDREICH);
440 XFillRectangle(display,drawto,gc,
441 SX+29*MINI_TILEX+MINI_TILEX/2-1,
442 SY+26*MINI_TILEY+MINI_TILEY/2-1,
443 MINI_TILEX+2,MINI_TILEY+2);
445 XCopyArea(display,drawto,drawto,gc,
446 SX+29*MINI_TILEX,SY+26*MINI_TILEY,
447 3*MINI_TILEX,3*MINI_TILEY,
448 SX+29*MINI_TILEX-MINI_TILEX/2,SY+26*MINI_TILEY-MINI_TILEY/2);
449 DrawMiniElement(29,26,level.amoebe_inhalt);
451 for(i=0;i<11+3+2;i++)
453 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
454 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
455 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
456 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
457 ED_COUNT_GADGET_XPOS,
458 ED_COUNT_GADGET_YPOS+i*ED_COUNT_GADGET_YSIZE);
461 DrawText(ED_COUNT_VALUE_XPOS,
462 ED_COUNT_VALUE_YPOS+i*ED_COUNT_GADGET_YSIZE,
463 int2str(level.score[i],3),FS_SMALL,FC_YELLOW);
465 DrawText(ED_COUNT_VALUE_XPOS,
466 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
467 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
469 DrawText(ED_COUNT_VALUE_XPOS,
470 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
471 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
473 DrawText(ED_COUNT_VALUE_XPOS,
474 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
475 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
477 DrawText(ED_COUNT_VALUE_XPOS,
478 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
479 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
481 DrawText(ED_COUNT_VALUE_XPOS,
482 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
483 int2str(level.time,3),FS_SMALL,FC_YELLOW);
486 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+0*ED_COUNT_TEXT_YSIZE,
487 "Score for Emerald",FS_SMALL,FC_YELLOW);
488 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+1*ED_COUNT_TEXT_YSIZE,
489 "Score for Diamond",FS_SMALL,FC_YELLOW);
490 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+2*ED_COUNT_TEXT_YSIZE,
491 "Score for smashing a Bug",FS_SMALL,FC_YELLOW);
492 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+3*ED_COUNT_TEXT_YSIZE,
493 "Score for smashing a Spaceship",FS_SMALL,FC_YELLOW);
494 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+4*ED_COUNT_TEXT_YSIZE,
495 "Score for smashing a Cruncher",FS_SMALL,FC_YELLOW);
496 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+5*ED_COUNT_TEXT_YSIZE,
497 "Score for smashing an Alien",FS_SMALL,FC_YELLOW);
498 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+6*ED_COUNT_TEXT_YSIZE,
499 "Score for smashing a Pacman",FS_SMALL,FC_YELLOW);
500 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+7*ED_COUNT_TEXT_YSIZE,
501 "Score for cracking a nut",FS_SMALL,FC_YELLOW);
502 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+8*ED_COUNT_TEXT_YSIZE,
503 "Score for dynamite",FS_SMALL,FC_YELLOW);
504 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+9*ED_COUNT_TEXT_YSIZE,
505 "Score for key",FS_SMALL,FC_YELLOW);
506 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+10*ED_COUNT_TEXT_YSIZE,
507 "Score for each 10 seconds left",FS_SMALL,FC_YELLOW);
508 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+11*ED_COUNT_TEXT_YSIZE,
509 "Speed of the amoeba / Content",FS_SMALL,FC_YELLOW);
510 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+12*ED_COUNT_TEXT_YSIZE,
511 "Time for magic wall",FS_SMALL,FC_YELLOW);
512 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+13*ED_COUNT_TEXT_YSIZE,
513 "Time for wheel",FS_SMALL,FC_YELLOW);
514 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+14*ED_COUNT_TEXT_YSIZE,
515 "Emeralds needed in this level",FS_SMALL,FC_YELLOW);
516 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+15*ED_COUNT_TEXT_YSIZE,
517 "Time available for this level",FS_SMALL,FC_YELLOW);
519 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
520 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS,
521 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
522 ED_WIN_COUNT_XSIZE,ED_WIN_COUNT_YSIZE,
523 ED_COUNT_GADGET_XPOS,
524 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
526 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
527 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS+3+2*FONT2_XSIZE,
528 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
529 ED_WIN_COUNT_XSIZE-3-2*FONT2_XSIZE,ED_WIN_COUNT_YSIZE,
530 ED_COUNT_GADGET_XPOS+3+i*FONT2_XSIZE,
531 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
532 DrawText(ED_COUNT_GADGET_XPOS+5,
533 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
534 level.name,FS_SMALL,FC_YELLOW);
535 DrawText(ED_COUNT_GADGET_XPOS+(30+3)*FONT2_XSIZE-5,
536 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
537 "Title",FS_SMALL,FC_YELLOW);
539 DrawText(ED_SIZE_GADGET_XPOS,ED_SIZE_GADGET_YPOS-18,
540 "Playfield size:",FS_SMALL,FC_YELLOW);
541 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
542 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
543 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
544 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
546 ED_SIZE_GADGET_YPOS+0*ED_COUNT_GADGET_YSIZE);
547 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
548 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
549 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
550 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
552 ED_SIZE_GADGET_YPOS+1*ED_COUNT_GADGET_YSIZE);
553 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+0*ED_SIZE_TEXT_YSIZE,
554 "Width",FS_SMALL,FC_YELLOW);
555 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+1*ED_SIZE_TEXT_YSIZE,
556 "Height",FS_SMALL,FC_YELLOW);
557 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
558 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
559 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
560 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
563 void ScrollMiniLevel(int from_x, int from_y, int scroll)
566 int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
567 int dy = (scroll==ED_SCROLL_UP ? -1 : scroll==ED_SCROLL_DOWN ? 1 : 0);
569 XCopyArea(display,drawto,drawto,gc,
570 SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
571 SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
572 SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
575 x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
576 for(y=0;y<2*SCR_FIELDY;y++)
577 DrawMiniElementOrWall(x,y,from_x,from_y);
581 y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
582 for(x=0;x<2*SCR_FIELDX;x++)
583 DrawMiniElementOrWall(x,y,from_x,from_y);
586 redraw_mask |= REDRAW_FIELD;
590 void AdjustLevelScrollPosition()
594 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
595 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
596 if (lev_fieldx<2*SCR_FIELDX-2)
601 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
602 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
603 if (lev_fieldy<2*SCR_FIELDY-2)
607 void FloodFill(int from_x, int from_y, int fill_element)
611 static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} };
612 static int safety = 0;
616 if (safety>lev_fieldx*lev_fieldy)
618 fprintf(stderr,"Something went wrong in 'FloodFill()'. Please debug.\n");
622 old_element = Feld[from_x][from_y];
623 Feld[from_x][from_y] = fill_element;
627 x = from_x+check[i][0];
628 y = from_y+check[i][1];
630 if (IN_LEV_FIELD(x,y) && Feld[x][y]==old_element)
631 FloodFill(x,y,fill_element);
637 void LevelEd(int mx, int my, int button)
639 static int last_button = 0;
640 static int in_field_pressed = FALSE;
641 static BOOL use_floodfill = FALSE;
642 int x = (mx-SX)/MINI_TILEX;
643 int y = (my-SY)/MINI_TILEY;
645 if (use_floodfill) /********** FLOOD FILL **********/
649 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
654 if (x>lev_fieldx || y>lev_fieldy ||
655 (x==0 && level_xpos<0) ||
656 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
657 (y==0 && level_ypos<0) ||
658 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY))
661 from_x = x+level_xpos;
662 from_y = y+level_ypos;
663 fill_element = (button==1 ? new_element1 :
664 button==2 ? new_element2 :
665 button==3 ? new_element3 : 0);
667 FloodFill(from_x,from_y,fill_element);
668 DrawMiniLevel(level_xpos,level_ypos);
671 use_floodfill = FALSE;
672 CloseDoor(DOOR_CLOSE_1);
673 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
677 else /********** EDIT/CTRL-FENSTER **********/
679 static long choice_delay = 0;
680 int choice = CheckElemButtons(mx,my,button);
681 int elem_pos = choice-ED_BUTTON_ELEM;
683 if (((choice == ED_BUTTON_EUP && element_shift>0) ||
684 (choice == ED_BUTTON_EDOWN &&
685 element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)) &&
686 DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
690 step = (button==1 ? MAX_ELEM_X : button==2 ? 5*MAX_ELEM_X :
692 element_shift += (choice==ED_BUTTON_EUP ? -step : step);
695 if (element_shift>elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)
696 element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y;
697 if (element_shift % MAX_ELEM_X)
698 element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X);
700 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
701 DrawElemButton(i+2,ED_BUTTON_RELEASED);
703 else if (elem_pos>=0 && elem_pos<MAX_ELEM_X*MAX_ELEM_Y)
707 if (elem_pos+element_shift < elements_in_list)
708 new_element = editor_element[elem_pos+element_shift];
710 new_element = EL_LEERRAUM;
713 new_element1 = new_element;
714 else if (last_button==2)
715 new_element2 = new_element;
716 else if (last_button==3)
717 new_element3 = new_element;
719 DrawMiniGraphicExt(drawto,gc,
720 DX+ED_WIN_MB_LEFT_XPOS,
721 DY+ED_WIN_MB_LEFT_YPOS,
722 el2gfx(new_element1));
723 DrawMiniGraphicExt(drawto,gc,
724 DX+ED_WIN_MB_MIDDLE_XPOS,
725 DY+ED_WIN_MB_MIDDLE_YPOS,
726 el2gfx(new_element2));
727 DrawMiniGraphicExt(drawto,gc,
728 DX+ED_WIN_MB_RIGHT_XPOS,
729 DY+ED_WIN_MB_RIGHT_YPOS,
730 el2gfx(new_element3));
731 redraw_mask |= REDRAW_DOOR_1;
734 if (edit_mode) /********** EDIT-FENSTER **********/
736 switch(CheckEditButtons(mx,my,button))
739 CloseDoor(DOOR_CLOSE_2);
741 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
742 DOOR_GFX_PAGEX4,DOOR_GFX_PAGEY1+80,
744 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
745 OpenDoor(DOOR_OPEN_2);
749 AreYouSure("Caution ! Flood fill mode ! Choose area !",AYS_OPEN);
750 use_floodfill = TRUE;
756 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
758 if (lev_fieldx<2*SCR_FIELDX-2)
761 level_xpos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
765 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT);
767 DrawMiniLevel(level_xpos,level_ypos);
770 case ED_BUTTON_RIGHT:
771 if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
773 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
775 if (lev_fieldx<2*SCR_FIELDX-2)
778 level_xpos += (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
779 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
780 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
782 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT);
784 DrawMiniLevel(level_xpos,level_ypos);
790 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
792 if (lev_fieldy<2*SCR_FIELDY-2)
795 level_ypos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
799 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN);
801 DrawMiniLevel(level_xpos,level_ypos);
805 if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
807 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
809 if (lev_fieldy<2*SCR_FIELDY-2)
812 level_ypos += (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
813 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
814 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
816 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP);
818 DrawMiniLevel(level_xpos,level_ypos);
825 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
829 if (button && !motion_status)
830 in_field_pressed = TRUE;
832 if (!button || !in_field_pressed || button<1 || button>3 ||
833 (y==0 && level_ypos<0) ||
834 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY) ||
835 (x==0 && level_xpos<0) ||
836 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
837 x>lev_fieldx || y>lev_fieldy)
840 new_element = (button==1 ? new_element1 :
841 button==2 ? new_element2 :
842 button==3 ? new_element3 : 0);
844 if (new_element != Feld[x+level_xpos][y+level_ypos])
846 if (new_element==EL_SPIELFIGUR) /* Jeder nur EINE Figur bitte... */
850 for(x=0;x<lev_fieldx;x++) for(y=0;y<lev_fieldy;y++)
852 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
854 Feld[x][y] = EL_LEERRAUM;
855 if (x-level_xpos>=0 && x-level_xpos<2*SCR_FIELDX &&
856 y-level_ypos>=0 && y-level_ypos<2*SCR_FIELDY)
857 DrawMiniElement(x-level_xpos,y-level_ypos,EL_LEERRAUM);
862 Feld[x+level_xpos][y+level_ypos] = new_element;
863 DrawMiniElement(x,y,new_element);
866 else if (!motion_status) /* Mauszeiger nicht im Level-Feld */
867 in_field_pressed = FALSE;
869 else /********** KONTROLL-FENSTER **********/
871 int choice = CheckCountButtons(mx,my,button);
872 int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
874 if (choice >= 0 && choice < 36 &&
875 DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
884 level.score[choice] += step;
885 if (level.score[choice]<0)
886 level.score[choice] = 0;
887 else if (level.score[choice]>255)
888 level.score[choice] = 255;
892 level.tempo_amoebe += step;
893 if (level.tempo_amoebe<0)
894 level.tempo_amoebe = 0;
895 else if (level.tempo_amoebe>255)
896 level.tempo_amoebe = 255;
900 level.dauer_sieb += step;
901 if (level.dauer_sieb<0)
902 level.dauer_sieb = 0;
903 else if (level.dauer_sieb>255)
904 level.dauer_sieb = 255;
908 level.dauer_ablenk += step;
909 if (level.dauer_ablenk<0)
910 level.dauer_ablenk = 0;
911 else if (level.dauer_ablenk>255)
912 level.dauer_ablenk = 255;
916 level.edelsteine += step;
917 if (level.edelsteine<0)
918 level.edelsteine = 0;
919 else if (level.edelsteine>999)
920 level.edelsteine = 999;
927 else if (level.time>999)
933 if (lev_fieldx<MIN_LEV_FIELDX)
934 lev_fieldx = MIN_LEV_FIELDX;
935 else if (lev_fieldx>MAX_LEV_FIELDX)
936 lev_fieldx = MAX_LEV_FIELDX;
937 level.fieldx = lev_fieldx;
942 if (lev_fieldy<MIN_LEV_FIELDY)
943 lev_fieldy = MIN_LEV_FIELDY;
944 else if (lev_fieldy>MAX_LEV_FIELDY)
945 lev_fieldy = MAX_LEV_FIELDY;
946 level.fieldy = lev_fieldy;
950 DrawText(ED_COUNT_VALUE_XPOS,
951 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
952 int2str(level.score[choice],3),FS_SMALL,FC_YELLOW);
954 DrawText(ED_COUNT_VALUE_XPOS,
955 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
956 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
958 DrawText(ED_COUNT_VALUE_XPOS,
959 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
960 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
962 DrawText(ED_COUNT_VALUE_XPOS,
963 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
964 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
966 DrawText(ED_COUNT_VALUE_XPOS,
967 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
968 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
970 DrawText(ED_COUNT_VALUE_XPOS,
971 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
972 int2str(level.time,3),FS_SMALL,FC_YELLOW);
974 DrawText(ED_SIZE_VALUE_XPOS,
975 ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
976 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
978 DrawText(ED_SIZE_VALUE_XPOS,
979 ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
980 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
982 redraw_mask &= ~REDRAW_FIELD;
984 XCopyArea(display,drawto,window,gc,
986 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
987 3*FONT2_XSIZE,FONT2_YSIZE,
989 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE);
991 XCopyArea(display,drawto,window,gc,
993 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE,
994 3*FONT2_XSIZE,FONT2_YSIZE,
996 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE);
1000 switch(CheckCtrlButtons(mx,my,button))
1002 case ED_BUTTON_EDIT:
1003 CloseDoor(DOOR_CLOSE_2);
1004 AdjustLevelScrollPosition();
1005 DrawMiniLevel(level_xpos,level_ypos);
1006 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
1007 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
1009 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
1010 OpenDoor(DOOR_OPEN_2);
1013 case ED_BUTTON_CLEAR:
1014 if (AreYouSure("Are you sure to clear this level ?",AYS_ASK))
1016 for(x=0;x<MAX_LEV_FIELDX;x++)
1017 for(y=0;y<MAX_LEV_FIELDY;y++)
1018 Feld[x][y] = EL_ERDREICH;
1019 DrawMiniLevel(level_xpos,level_ypos);
1022 case ED_BUTTON_UNDO:
1023 if (leveldir[leveldir_nr].readonly ||
1024 AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN))
1026 CloseDoor(DOOR_CLOSE_BOTH);
1027 game_status=MAINMENU;
1032 CloseDoor(DOOR_CLOSE_1);
1033 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
1036 case ED_BUTTON_EXIT:
1038 int figur_vorhanden = FALSE;
1040 if (leveldir[leveldir_nr].readonly)
1042 AreYouSure("This level is read only !",AYS_CONFIRM);
1046 for(y=0;y<lev_fieldy;y++)
1047 for(x=0;x<lev_fieldx;x++)
1048 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
1049 figur_vorhanden = TRUE;
1051 if (!figur_vorhanden)
1052 AreYouSure("No Level without Gregor Mc Duffin please !",
1056 if (AreYouSure("Save this level and kill the old ?",
1057 AYS_ASK | AYS_STAY_OPEN))
1059 for(x=0;x<lev_fieldx;x++)
1060 for(y=0;y<lev_fieldy;y++)
1061 Ur[x][y]=Feld[x][y];
1062 SaveLevel(level_nr);
1064 CloseDoor(DOOR_CLOSE_BOTH);
1065 game_status=MAINMENU;
1074 if (mx>=ED_COUNT_GADGET_XPOS &&
1075 mx<ED_COUNT_GADGET_XPOS+31*FONT2_XSIZE+10 &&
1076 my>=ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE &&
1077 my<ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE+ED_WIN_COUNT_YSIZE)
1082 DrawText(ED_COUNT_GADGET_XPOS+5,
1083 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1084 level.name,FS_SMALL,FC_GREEN);
1085 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1086 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1087 "<",FS_SMALL,FC_RED);
1094 name_typing = FALSE;
1095 DrawText(ED_COUNT_GADGET_XPOS+5,
1096 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1097 level.name,FS_SMALL,FC_YELLOW);
1098 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1099 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1100 " ",FS_SMALL,FC_RED);
1104 if (mx>=SX+29*MINI_TILEX && mx<SX+30*MINI_TILEX &&
1105 my>=SY+26*MINI_TILEY && my<SY+27*MINI_TILEY)
1109 if (!button || button<1 || button>3)
1112 new_element = (button==1 ? new_element1 :
1113 button==2 ? new_element2 :
1114 button==3 ? new_element3 : 0);
1116 if (new_element != level.amoebe_inhalt)
1118 level.amoebe_inhalt = new_element;
1119 DrawMiniElement(29,26,new_element);
1123 if (mx>=SX+1*MINI_TILEX && mx<SX+(1+4*5)*MINI_TILEX &&
1124 my>=SY+2*MINI_TILEY && my<SY+(2+3)*MINI_TILEY)
1126 int x = (mx-SX-1*MINI_TILEX)/MINI_TILEX;
1127 int y = (my-SY-2*MINI_TILEY)/MINI_TILEY;
1132 if (i>=0 && i<43 && x>=0 && x<3 && y>=0 && y<3)
1134 if (button && !motion_status)
1135 in_field_pressed = TRUE;
1137 if (!button || !in_field_pressed || button<1 || button>3)
1140 new_element = (button==1 ? new_element1 :
1141 button==2 ? new_element2 :
1142 button==3 ? new_element3 : 0);
1144 if (new_element != level.mampfer_inhalt[i][x][y])
1146 level.mampfer_inhalt[i][x][y] = new_element;
1147 DrawMiniElement(1+5*i+x,2+y,new_element);
1150 else if (!motion_status)/* Mauszeiger nicht im Cruncher-Feld */
1151 in_field_pressed = FALSE;
1153 else if (!motion_status) /* Mauszeiger nicht im Cruncher-Feld */
1154 in_field_pressed = FALSE;
1158 last_button = button;
1163 void LevelNameTyping(KeySym key)
1165 unsigned char ascii = 0;
1166 int len = strlen(level.name);
1171 if (key>=XK_A && key<=XK_Z)
1172 ascii = 'A'+(char)(key-XK_A);
1173 else if (key>=XK_a && key<=XK_z)
1174 ascii = 'a'+(char)(key-XK_a);
1175 else if (key>=XK_0 && key<=XK_9)
1176 ascii = '0'+(char)(key-XK_0);
1178 else if (key>=XK_space && key<=XK_at)
1179 ascii = ' '+(char)(key-XK_space);
1180 else if (key==XK_Adiaeresis)
1182 else if (key==XK_Odiaeresis)
1184 else if (key==XK_Udiaeresis)
1186 else if (key==XK_adiaeresis)
1188 else if (key==XK_odiaeresis)
1190 else if (key==XK_udiaeresis)
1192 else if (key==XK_underscore)
1196 if (ascii && len<MAX_LEVNAMLEN-2)
1198 level.name[len] = ascii;
1199 level.name[len+1] = 0;
1202 DrawTextExt(drawto,gc,
1203 ED_COUNT_GADGET_XPOS+5,
1204 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1205 level.name,FS_SMALL,FC_GREEN);
1206 DrawTextExt(window,gc,
1207 ED_COUNT_GADGET_XPOS+5,
1208 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1209 level.name,FS_SMALL,FC_GREEN);
1210 DrawTextExt(drawto,gc,
1211 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1212 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1213 "<",FS_SMALL,FC_RED);
1214 DrawTextExt(window,gc,
1215 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1216 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1217 "<",FS_SMALL,FC_RED);
1219 else if ((key==XK_Delete || key==XK_BackSpace) && len>0)
1221 level.name[len-1] = 0;
1224 DrawTextExt(drawto,gc,
1225 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1226 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1227 "< ",FS_SMALL,FC_GREEN);
1228 DrawTextExt(window,gc,
1229 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1230 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1231 "< ",FS_SMALL,FC_GREEN);
1233 else if (key==XK_Return)
1235 DrawTextExt(drawto,gc,
1236 ED_COUNT_GADGET_XPOS+5,
1237 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1238 level.name,FS_SMALL,FC_YELLOW);
1239 DrawTextExt(window,gc,
1240 ED_COUNT_GADGET_XPOS+5,
1241 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1242 level.name,FS_SMALL,FC_YELLOW);
1243 DrawTextExt(drawto,gc,
1244 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1245 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1246 " ",FS_SMALL,FC_YELLOW);
1247 DrawTextExt(window,gc,
1248 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1249 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1250 " ",FS_SMALL,FC_YELLOW);
1252 name_typing = FALSE;