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'),
159 EL_CHAR_A + ('M' - 'A'),
160 EL_CHAR_A + ('O' - 'A'),
161 EL_CHAR_A + ('R' - 'A'),
162 EL_CHAR_A + ('E' - 'A'),
209 EL_CHAR_A + ('S' - 'A'),
210 EL_CHAR_A + ('O' - 'A'),
211 EL_CHAR_A + ('K' - 'A'),
212 EL_CHAR_A + ('O' - 'A'),
215 EL_CHAR_A + ('B' - 'A'),
216 EL_CHAR_A + ('A' - 'A'),
217 EL_CHAR_A + ('N' - 'A'),
220 EL_SOKOBAN_FELD_LEER,
221 EL_SOKOBAN_FELD_VOLL,
225 EL_CHAR_A + ('D' - 'A'),
226 EL_CHAR_A + ('Y' - 'A'),
227 EL_CHAR_A + ('N' - 'A'),
228 EL_CHAR_A + ('A' - 'A'),
230 EL_CHAR_A + ('B' - 'A'),
231 EL_CHAR_A + ('L' - 'A'),
232 EL_CHAR_A + ('A' - 'A'),
233 EL_CHAR_A + ('S' - 'A'),
236 EL_CHAR_A + ('T' - 'A'),
237 EL_CHAR_A + ('E' - 'A'),
238 EL_CHAR_A + ('R' - 'A'),
320 int elements_in_list = sizeof(editor_element)/sizeof(int);
332 CloseDoor(DOOR_CLOSE_2);
334 DrawMiniLevel(level_xpos,level_ypos);
337 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
338 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
340 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
341 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
342 DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
343 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
344 4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
345 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
346 DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
348 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
350 if (i < elements_in_list)
351 graphic = el2gfx(editor_element[i]);
353 graphic = GFX_LEERRAUM;
355 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
356 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 +
357 (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
358 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
359 (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
363 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
364 DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
365 DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
366 el2gfx(new_element1));
367 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
368 DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
369 DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
370 el2gfx(new_element2));
371 DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
372 DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
373 DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
374 el2gfx(new_element3));
375 DrawTextExt(pix[PIX_DB_DOOR],gc,
376 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
377 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
378 int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
379 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
380 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
381 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
383 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
384 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
385 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
386 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
387 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
389 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
390 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
392 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
393 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
395 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
397 OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
400 void DrawControlWindow()
406 /* Inhalt der Mampfer */
407 DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
408 "Contents of a smashed cruncher:",FS_SMALL,FC_YELLOW);
409 for(i=0;i<4;i++) for(y=0;y<4;y++) for(x=0;x<4;x++)
411 DrawMiniElement(1+5*i+x,2+y,EL_ERDREICH);
412 XFillRectangle(display,drawto,gc,
413 SX+(1+5*i)*MINI_TILEX+MINI_TILEX/2-1,
414 SY+(2)*MINI_TILEY+MINI_TILEY/2-1,
415 3*MINI_TILEX+2,3*MINI_TILEY+2);
417 XCopyArea(display,drawto,drawto,gc,
418 SX+1*MINI_TILEX,SY+2*MINI_TILEY,
419 4*5*MINI_TILEX,5*MINI_TILEY,
420 SX+1*MINI_TILEX-MINI_TILEX/2,SY+2*MINI_TILEY-MINI_TILEY/2);
423 for(y=0;y<3;y++) for(x=0;x<3;x++)
424 DrawMiniElement(1+5*i+x,2+y,level.mampfer_inhalt[i][x][y]);
426 DrawText(SX+MINI_TILEX+(5*i+1)*MINI_TILEX+1,
427 SY+2*MINI_TILEY+(4)*MINI_TILEY-4,
428 int2str(i+1,1),FS_SMALL,FC_YELLOW);
431 /* Inhalt der Amöbe */
432 for(y=0;y<2;y++) for(x=0;x<2;x++)
434 DrawMiniElement(29+x,26+y,EL_ERDREICH);
435 XFillRectangle(display,drawto,gc,
436 SX+29*MINI_TILEX+MINI_TILEX/2-1,
437 SY+26*MINI_TILEY+MINI_TILEY/2-1,
438 MINI_TILEX+2,MINI_TILEY+2);
440 XCopyArea(display,drawto,drawto,gc,
441 SX+29*MINI_TILEX,SY+26*MINI_TILEY,
442 3*MINI_TILEX,3*MINI_TILEY,
443 SX+29*MINI_TILEX-MINI_TILEX/2,SY+26*MINI_TILEY-MINI_TILEY/2);
444 DrawMiniElement(29,26,level.amoebe_inhalt);
446 for(i=0;i<11+3+2;i++)
448 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
449 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
450 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
451 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
452 ED_COUNT_GADGET_XPOS,
453 ED_COUNT_GADGET_YPOS+i*ED_COUNT_GADGET_YSIZE);
456 DrawText(ED_COUNT_VALUE_XPOS,
457 ED_COUNT_VALUE_YPOS+i*ED_COUNT_GADGET_YSIZE,
458 int2str(level.score[i],3),FS_SMALL,FC_YELLOW);
460 DrawText(ED_COUNT_VALUE_XPOS,
461 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
462 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
464 DrawText(ED_COUNT_VALUE_XPOS,
465 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
466 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
468 DrawText(ED_COUNT_VALUE_XPOS,
469 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
470 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
472 DrawText(ED_COUNT_VALUE_XPOS,
473 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
474 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
476 DrawText(ED_COUNT_VALUE_XPOS,
477 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
478 int2str(level.time,3),FS_SMALL,FC_YELLOW);
481 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+0*ED_COUNT_TEXT_YSIZE,
482 "Score for Emerald",FS_SMALL,FC_YELLOW);
483 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+1*ED_COUNT_TEXT_YSIZE,
484 "Score for Diamond",FS_SMALL,FC_YELLOW);
485 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+2*ED_COUNT_TEXT_YSIZE,
486 "Score for smashing a Bug",FS_SMALL,FC_YELLOW);
487 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+3*ED_COUNT_TEXT_YSIZE,
488 "Score for smashing a Spaceship",FS_SMALL,FC_YELLOW);
489 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+4*ED_COUNT_TEXT_YSIZE,
490 "Score for smashing a Cruncher",FS_SMALL,FC_YELLOW);
491 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+5*ED_COUNT_TEXT_YSIZE,
492 "Score for smashing an Alien",FS_SMALL,FC_YELLOW);
493 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+6*ED_COUNT_TEXT_YSIZE,
494 "Score for smashing a Pacman",FS_SMALL,FC_YELLOW);
495 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+7*ED_COUNT_TEXT_YSIZE,
496 "Score for cracking a nut",FS_SMALL,FC_YELLOW);
497 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+8*ED_COUNT_TEXT_YSIZE,
498 "Score for dynamite",FS_SMALL,FC_YELLOW);
499 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+9*ED_COUNT_TEXT_YSIZE,
500 "Score for key",FS_SMALL,FC_YELLOW);
501 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+10*ED_COUNT_TEXT_YSIZE,
502 "Score for each 10 seconds left",FS_SMALL,FC_YELLOW);
503 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+11*ED_COUNT_TEXT_YSIZE,
504 "Speed of the amoeba / Content",FS_SMALL,FC_YELLOW);
505 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+12*ED_COUNT_TEXT_YSIZE,
506 "Time for magic wall",FS_SMALL,FC_YELLOW);
507 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+13*ED_COUNT_TEXT_YSIZE,
508 "Time for wheel",FS_SMALL,FC_YELLOW);
509 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+14*ED_COUNT_TEXT_YSIZE,
510 "Emeralds needed in this level",FS_SMALL,FC_YELLOW);
511 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+15*ED_COUNT_TEXT_YSIZE,
512 "Time available for this level",FS_SMALL,FC_YELLOW);
514 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
515 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS,
516 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
517 ED_WIN_COUNT_XSIZE,ED_WIN_COUNT_YSIZE,
518 ED_COUNT_GADGET_XPOS,
519 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
521 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
522 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS+3+2*FONT2_XSIZE,
523 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
524 ED_WIN_COUNT_XSIZE-3-2*FONT2_XSIZE,ED_WIN_COUNT_YSIZE,
525 ED_COUNT_GADGET_XPOS+3+i*FONT2_XSIZE,
526 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
527 DrawText(ED_COUNT_GADGET_XPOS+5,
528 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
529 level.name,FS_SMALL,FC_YELLOW);
530 DrawText(ED_COUNT_GADGET_XPOS+(30+3)*FONT2_XSIZE-5,
531 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
532 "Title",FS_SMALL,FC_YELLOW);
534 DrawText(ED_SIZE_GADGET_XPOS,ED_SIZE_GADGET_YPOS-18,
535 "Playfield size:",FS_SMALL,FC_YELLOW);
536 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
537 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
538 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
539 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
541 ED_SIZE_GADGET_YPOS+0*ED_COUNT_GADGET_YSIZE);
542 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
543 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
544 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
545 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
547 ED_SIZE_GADGET_YPOS+1*ED_COUNT_GADGET_YSIZE);
548 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+0*ED_SIZE_TEXT_YSIZE,
549 "Width",FS_SMALL,FC_YELLOW);
550 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+1*ED_SIZE_TEXT_YSIZE,
551 "Height",FS_SMALL,FC_YELLOW);
552 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
553 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
554 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
555 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
558 void ScrollMiniLevel(int from_x, int from_y, int scroll)
561 int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
562 int dy = (scroll==ED_SCROLL_UP ? -1 : scroll==ED_SCROLL_DOWN ? 1 : 0);
564 XCopyArea(display,drawto,drawto,gc,
565 SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
566 SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
567 SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
570 x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
571 for(y=0;y<2*SCR_FIELDY;y++)
572 DrawMiniElementOrWall(x,y,from_x,from_y);
576 y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
577 for(x=0;x<2*SCR_FIELDX;x++)
578 DrawMiniElementOrWall(x,y,from_x,from_y);
581 redraw_mask |= REDRAW_FIELD;
585 void AdjustLevelScrollPosition()
589 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
590 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
591 if (lev_fieldx<2*SCR_FIELDX-2)
596 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
597 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
598 if (lev_fieldy<2*SCR_FIELDY-2)
602 void FloodFill(int from_x, int from_y, int fill_element)
606 static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} };
607 static int safety = 0;
611 if (safety>lev_fieldx*lev_fieldy)
613 fprintf(stderr,"Something went wrong in 'FloodFill()'. Please debug.\n");
617 old_element = Feld[from_x][from_y];
618 Feld[from_x][from_y] = fill_element;
622 x = from_x+check[i][0];
623 y = from_y+check[i][1];
625 if (IN_LEV_FIELD(x,y) && Feld[x][y]==old_element)
626 FloodFill(x,y,fill_element);
632 void LevelEd(int mx, int my, int button)
634 static int last_button = 0;
635 static int in_field_pressed = FALSE;
636 static BOOL use_floodfill = FALSE;
637 int x = (mx-SX)/MINI_TILEX;
638 int y = (my-SY)/MINI_TILEY;
640 if (use_floodfill) /********** FLOOD FILL **********/
644 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
649 if (x>lev_fieldx || y>lev_fieldy ||
650 (x==0 && level_xpos<0) ||
651 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
652 (y==0 && level_ypos<0) ||
653 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY))
656 from_x = x+level_xpos;
657 from_y = y+level_ypos;
658 fill_element = (button==1 ? new_element1 :
659 button==2 ? new_element2 :
660 button==3 ? new_element3 : 0);
662 FloodFill(from_x,from_y,fill_element);
663 DrawMiniLevel(level_xpos,level_ypos);
666 use_floodfill = FALSE;
667 CloseDoor(DOOR_CLOSE_1);
668 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
672 else /********** EDIT/CTRL-FENSTER **********/
674 static long choice_delay = 0;
675 int choice = CheckElemButtons(mx,my,button);
676 int elem_pos = choice-ED_BUTTON_ELEM;
678 if (((choice == ED_BUTTON_EUP && element_shift>0) ||
679 (choice == ED_BUTTON_EDOWN &&
680 element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)) &&
681 DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
685 step = (button==1 ? MAX_ELEM_X : button==2 ? 5*MAX_ELEM_X :
687 element_shift += (choice==ED_BUTTON_EUP ? -step : step);
690 if (element_shift>elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)
691 element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y;
692 if (element_shift % MAX_ELEM_X)
693 element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X);
695 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
696 DrawElemButton(i+2,ED_BUTTON_RELEASED);
698 else if (elem_pos>=0 && elem_pos<MAX_ELEM_X*MAX_ELEM_Y)
702 if (elem_pos+element_shift < elements_in_list)
703 new_element = editor_element[elem_pos+element_shift];
705 new_element = EL_LEERRAUM;
708 new_element1 = new_element;
709 else if (last_button==2)
710 new_element2 = new_element;
711 else if (last_button==3)
712 new_element3 = new_element;
714 DrawMiniGraphicExt(drawto,gc,
715 DX+ED_WIN_MB_LEFT_XPOS,
716 DY+ED_WIN_MB_LEFT_YPOS,
717 el2gfx(new_element1));
718 DrawMiniGraphicExt(drawto,gc,
719 DX+ED_WIN_MB_MIDDLE_XPOS,
720 DY+ED_WIN_MB_MIDDLE_YPOS,
721 el2gfx(new_element2));
722 DrawMiniGraphicExt(drawto,gc,
723 DX+ED_WIN_MB_RIGHT_XPOS,
724 DY+ED_WIN_MB_RIGHT_YPOS,
725 el2gfx(new_element3));
726 redraw_mask |= REDRAW_DOOR_1;
729 if (edit_mode) /********** EDIT-FENSTER **********/
731 switch(CheckEditButtons(mx,my,button))
734 CloseDoor(DOOR_CLOSE_2);
736 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
737 DOOR_GFX_PAGEX4,DOOR_GFX_PAGEY1+80,
739 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
740 OpenDoor(DOOR_OPEN_2);
744 AreYouSure("Caution ! Flood fill mode ! Choose area !",AYS_OPEN);
745 use_floodfill = TRUE;
751 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
753 if (lev_fieldx<2*SCR_FIELDX-2)
756 level_xpos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
760 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT);
762 DrawMiniLevel(level_xpos,level_ypos);
765 case ED_BUTTON_RIGHT:
766 if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
768 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
770 if (lev_fieldx<2*SCR_FIELDX-2)
773 level_xpos += (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
774 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
775 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
777 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT);
779 DrawMiniLevel(level_xpos,level_ypos);
785 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
787 if (lev_fieldy<2*SCR_FIELDY-2)
790 level_ypos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
794 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN);
796 DrawMiniLevel(level_xpos,level_ypos);
800 if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
802 if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
804 if (lev_fieldy<2*SCR_FIELDY-2)
807 level_ypos += (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
808 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
809 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
811 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP);
813 DrawMiniLevel(level_xpos,level_ypos);
820 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
824 if (button && !motion_status)
825 in_field_pressed = TRUE;
827 if (!button || !in_field_pressed || button<1 || button>3 ||
828 (y==0 && level_ypos<0) ||
829 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY) ||
830 (x==0 && level_xpos<0) ||
831 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
832 x>lev_fieldx || y>lev_fieldy)
835 new_element = (button==1 ? new_element1 :
836 button==2 ? new_element2 :
837 button==3 ? new_element3 : 0);
839 if (new_element != Feld[x+level_xpos][y+level_ypos])
841 if (new_element==EL_SPIELFIGUR) /* Jeder nur EINE Figur bitte... */
845 for(x=0;x<lev_fieldx;x++) for(y=0;y<lev_fieldy;y++)
847 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
849 Feld[x][y] = EL_LEERRAUM;
850 if (x-level_xpos>=0 && x-level_xpos<2*SCR_FIELDX &&
851 y-level_ypos>=0 && y-level_ypos<2*SCR_FIELDY)
852 DrawMiniElement(x-level_xpos,y-level_ypos,EL_LEERRAUM);
857 Feld[x+level_xpos][y+level_ypos] = new_element;
858 DrawMiniElement(x,y,new_element);
861 else if (!motion_status) /* Mauszeiger nicht im Level-Feld */
862 in_field_pressed = FALSE;
864 else /********** KONTROLL-FENSTER **********/
866 int choice = CheckCountButtons(mx,my,button);
867 int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
869 if (choice >= 0 && choice < 36 &&
870 DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
879 level.score[choice] += step;
880 if (level.score[choice]<0)
881 level.score[choice] = 0;
882 else if (level.score[choice]>255)
883 level.score[choice] = 255;
887 level.tempo_amoebe += step;
888 if (level.tempo_amoebe<0)
889 level.tempo_amoebe = 0;
890 else if (level.tempo_amoebe>255)
891 level.tempo_amoebe = 255;
895 level.dauer_sieb += step;
896 if (level.dauer_sieb<0)
897 level.dauer_sieb = 0;
898 else if (level.dauer_sieb>255)
899 level.dauer_sieb = 255;
903 level.dauer_ablenk += step;
904 if (level.dauer_ablenk<0)
905 level.dauer_ablenk = 0;
906 else if (level.dauer_ablenk>255)
907 level.dauer_ablenk = 255;
911 level.edelsteine += step;
912 if (level.edelsteine<0)
913 level.edelsteine = 0;
914 else if (level.edelsteine>999)
915 level.edelsteine = 999;
922 else if (level.time>999)
928 if (lev_fieldx<MIN_LEV_FIELDX)
929 lev_fieldx = MIN_LEV_FIELDX;
930 else if (lev_fieldx>MAX_LEV_FIELDX)
931 lev_fieldx = MAX_LEV_FIELDX;
932 level.fieldx = lev_fieldx;
937 if (lev_fieldy<MIN_LEV_FIELDY)
938 lev_fieldy = MIN_LEV_FIELDY;
939 else if (lev_fieldy>MAX_LEV_FIELDY)
940 lev_fieldy = MAX_LEV_FIELDY;
941 level.fieldy = lev_fieldy;
945 DrawText(ED_COUNT_VALUE_XPOS,
946 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
947 int2str(level.score[choice],3),FS_SMALL,FC_YELLOW);
949 DrawText(ED_COUNT_VALUE_XPOS,
950 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
951 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
953 DrawText(ED_COUNT_VALUE_XPOS,
954 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
955 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
957 DrawText(ED_COUNT_VALUE_XPOS,
958 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
959 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
961 DrawText(ED_COUNT_VALUE_XPOS,
962 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
963 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
965 DrawText(ED_COUNT_VALUE_XPOS,
966 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
967 int2str(level.time,3),FS_SMALL,FC_YELLOW);
969 DrawText(ED_SIZE_VALUE_XPOS,
970 ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
971 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
973 DrawText(ED_SIZE_VALUE_XPOS,
974 ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
975 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
977 redraw_mask &= ~REDRAW_FIELD;
979 XCopyArea(display,drawto,window,gc,
981 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
982 3*FONT2_XSIZE,FONT2_YSIZE,
984 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE);
986 XCopyArea(display,drawto,window,gc,
988 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE,
989 3*FONT2_XSIZE,FONT2_YSIZE,
991 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE);
995 switch(CheckCtrlButtons(mx,my,button))
998 CloseDoor(DOOR_CLOSE_2);
999 AdjustLevelScrollPosition();
1000 DrawMiniLevel(level_xpos,level_ypos);
1001 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
1002 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
1004 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
1005 OpenDoor(DOOR_OPEN_2);
1008 case ED_BUTTON_CLEAR:
1009 if (AreYouSure("Are you sure to clear this level ?",AYS_ASK))
1011 for(x=0;x<MAX_LEV_FIELDX;x++)
1012 for(y=0;y<MAX_LEV_FIELDY;y++)
1013 Feld[x][y] = EL_ERDREICH;
1014 DrawMiniLevel(level_xpos,level_ypos);
1017 case ED_BUTTON_UNDO:
1018 if (leveldir[leveldir_nr].readonly ||
1019 AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN))
1021 CloseDoor(DOOR_CLOSE_BOTH);
1022 game_status=MAINMENU;
1027 CloseDoor(DOOR_CLOSE_1);
1028 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
1031 case ED_BUTTON_EXIT:
1033 int figur_vorhanden = FALSE;
1035 if (leveldir[leveldir_nr].readonly)
1037 AreYouSure("This level is read only !",AYS_CONFIRM);
1041 for(y=0;y<lev_fieldy;y++)
1042 for(x=0;x<lev_fieldx;x++)
1043 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
1044 figur_vorhanden = TRUE;
1046 if (!figur_vorhanden)
1047 AreYouSure("No Level without Gregor Mc Duffin please !",
1051 if (AreYouSure("Save this level and kill the old ?",
1052 AYS_ASK | AYS_STAY_OPEN))
1054 for(x=0;x<lev_fieldx;x++)
1055 for(y=0;y<lev_fieldy;y++)
1056 Ur[x][y]=Feld[x][y];
1057 SaveLevel(level_nr);
1059 CloseDoor(DOOR_CLOSE_BOTH);
1060 game_status=MAINMENU;
1069 if (mx>=ED_COUNT_GADGET_XPOS &&
1070 mx<ED_COUNT_GADGET_XPOS+31*FONT2_XSIZE+10 &&
1071 my>=ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE &&
1072 my<ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE+ED_WIN_COUNT_YSIZE)
1077 DrawText(ED_COUNT_GADGET_XPOS+5,
1078 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1079 level.name,FS_SMALL,FC_GREEN);
1080 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1081 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1082 "<",FS_SMALL,FC_RED);
1089 name_typing = FALSE;
1090 DrawText(ED_COUNT_GADGET_XPOS+5,
1091 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1092 level.name,FS_SMALL,FC_YELLOW);
1093 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1094 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1095 " ",FS_SMALL,FC_RED);
1099 if (mx>=SX+29*MINI_TILEX && mx<SX+30*MINI_TILEX &&
1100 my>=SY+26*MINI_TILEY && my<SY+27*MINI_TILEY)
1104 if (!button || button<1 || button>3)
1107 new_element = (button==1 ? new_element1 :
1108 button==2 ? new_element2 :
1109 button==3 ? new_element3 : 0);
1111 if (new_element != level.amoebe_inhalt)
1113 level.amoebe_inhalt = new_element;
1114 DrawMiniElement(29,26,new_element);
1118 if (mx>=SX+1*MINI_TILEX && mx<SX+(1+4*5)*MINI_TILEX &&
1119 my>=SY+2*MINI_TILEY && my<SY+(2+3)*MINI_TILEY)
1121 int x = (mx-SX-1*MINI_TILEX)/MINI_TILEX;
1122 int y = (my-SY-2*MINI_TILEY)/MINI_TILEY;
1127 if (i>=0 && i<43 && x>=0 && x<3 && y>=0 && y<3)
1129 if (button && !motion_status)
1130 in_field_pressed = TRUE;
1132 if (!button || !in_field_pressed || button<1 || button>3)
1135 new_element = (button==1 ? new_element1 :
1136 button==2 ? new_element2 :
1137 button==3 ? new_element3 : 0);
1139 if (new_element != level.mampfer_inhalt[i][x][y])
1141 level.mampfer_inhalt[i][x][y] = new_element;
1142 DrawMiniElement(1+5*i+x,2+y,new_element);
1145 else if (!motion_status)/* Mauszeiger nicht im Cruncher-Feld */
1146 in_field_pressed = FALSE;
1148 else if (!motion_status) /* Mauszeiger nicht im Cruncher-Feld */
1149 in_field_pressed = FALSE;
1153 last_button = button;
1158 void LevelNameTyping(KeySym key)
1160 unsigned char ascii = 0;
1161 int len = strlen(level.name);
1166 if (key>=XK_A && key<=XK_Z)
1167 ascii = 'A'+(char)(key-XK_A);
1168 else if (key>=XK_a && key<=XK_z)
1169 ascii = 'a'+(char)(key-XK_a);
1170 else if (key>=XK_0 && key<=XK_9)
1171 ascii = '0'+(char)(key-XK_0);
1173 else if (key>=XK_space && key<=XK_at)
1174 ascii = ' '+(char)(key-XK_space);
1175 else if (key==XK_Adiaeresis)
1177 else if (key==XK_Odiaeresis)
1179 else if (key==XK_Udiaeresis)
1181 else if (key==XK_adiaeresis)
1183 else if (key==XK_odiaeresis)
1185 else if (key==XK_udiaeresis)
1187 else if (key==XK_underscore)
1191 if (ascii && len<MAX_LEVNAMLEN-2)
1193 level.name[len] = ascii;
1194 level.name[len+1] = 0;
1197 DrawTextExt(drawto,gc,
1198 ED_COUNT_GADGET_XPOS+5,
1199 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1200 level.name,FS_SMALL,FC_GREEN);
1201 DrawTextExt(window,gc,
1202 ED_COUNT_GADGET_XPOS+5,
1203 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1204 level.name,FS_SMALL,FC_GREEN);
1205 DrawTextExt(drawto,gc,
1206 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1207 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1208 "<",FS_SMALL,FC_RED);
1209 DrawTextExt(window,gc,
1210 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1211 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1212 "<",FS_SMALL,FC_RED);
1214 else if ((key==XK_Delete || key==XK_BackSpace) && len>0)
1216 level.name[len-1] = 0;
1219 DrawTextExt(drawto,gc,
1220 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1221 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1222 "< ",FS_SMALL,FC_GREEN);
1223 DrawTextExt(window,gc,
1224 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1225 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1226 "< ",FS_SMALL,FC_GREEN);
1228 else if (key==XK_Return)
1230 DrawTextExt(drawto,gc,
1231 ED_COUNT_GADGET_XPOS+5,
1232 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1233 level.name,FS_SMALL,FC_YELLOW);
1234 DrawTextExt(window,gc,
1235 ED_COUNT_GADGET_XPOS+5,
1236 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1237 level.name,FS_SMALL,FC_YELLOW);
1238 DrawTextExt(drawto,gc,
1239 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1240 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1241 " ",FS_SMALL,FC_YELLOW);
1242 DrawTextExt(window,gc,
1243 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1244 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1245 " ",FS_SMALL,FC_YELLOW);
1247 name_typing = FALSE;