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 static int level_xpos,level_ypos;
23 static BOOL edit_mode;
24 static BOOL name_typing;
25 static int new_element1 = EL_MAUERWERK;
26 static int new_element2 = EL_LEERRAUM;
27 static int new_element3 = EL_ERDREICH;
30 int editor_element[] =
32 EL_CHAR_A + ('B' - 'A'),
33 EL_CHAR_A + ('O' - 'A'),
34 EL_CHAR_A + ('U' - 'A'),
35 EL_CHAR_A + ('L' - 'A'),
38 EL_CHAR_A + ('D' - 'A'),
39 EL_CHAR_A + ('E' - 'A'),
40 EL_CHAR_A + ('R' - 'A'),
42 EL_CHAR_A + ('D' - 'A'),
43 EL_CHAR_A + ('A' - 'A'),
44 EL_CHAR_A + ('S' - 'A'),
45 EL_CHAR_A + ('H' - 'A'),
72 EL_CHAR_A + ('E' - 'A'),
73 EL_CHAR_A + ('M' - 'A'),
74 EL_CHAR_A + ('E' - 'A'),
77 EL_CHAR_A + ('R' - 'A'),
78 EL_CHAR_A + ('A' - 'A'),
79 EL_CHAR_A + ('L' - 'A'),
80 EL_CHAR_A + ('D' - 'A'),
82 EL_CHAR_A + ('M' - 'A'),
83 EL_CHAR_A + ('I' - 'A'),
84 EL_CHAR_A + ('N' - 'A'),
85 EL_CHAR_A + ('E' - 'A'),
157 EL_CHAR_A + ('M' - 'A'),
158 EL_CHAR_A + ('O' - 'A'),
159 EL_CHAR_A + ('R' - 'A'),
160 EL_CHAR_A + ('E' - 'A'),
207 EL_CHAR_A + ('S' - 'A'),
208 EL_CHAR_A + ('O' - 'A'),
209 EL_CHAR_A + ('K' - 'A'),
210 EL_CHAR_A + ('O' - 'A'),
213 EL_CHAR_A + ('B' - 'A'),
214 EL_CHAR_A + ('A' - 'A'),
215 EL_CHAR_A + ('N' - 'A'),
218 EL_SOKOBAN_FELD_LEER,
219 EL_SOKOBAN_FELD_VOLL,
223 EL_CHAR_A + ('D' - 'A'),
224 EL_CHAR_A + ('Y' - 'A'),
225 EL_CHAR_A + ('N' - 'A'),
226 EL_CHAR_A + ('A' - 'A'),
228 EL_CHAR_A + ('B' - 'A'),
229 EL_CHAR_A + ('L' - 'A'),
230 EL_CHAR_A + ('A' - 'A'),
231 EL_CHAR_A + ('S' - 'A'),
234 EL_CHAR_A + ('T' - 'A'),
235 EL_CHAR_A + ('E' - 'A'),
236 EL_CHAR_A + ('R' - 'A'),
318 int elements_in_list = sizeof(editor_element)/sizeof(int);
330 CloseDoor(DOOR_CLOSE_2);
332 DrawMiniLevel(level_xpos,level_ypos);
335 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
336 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
338 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
339 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
340 DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
341 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
342 4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
343 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
344 DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
346 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
348 if (i < elements_in_list)
349 graphic = el2gfx(editor_element[i]);
351 graphic = GFX_LEERRAUM;
353 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
354 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 +
355 (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
356 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
357 (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
361 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
362 DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
363 DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
364 el2gfx(new_element1));
365 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
366 DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
367 DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
368 el2gfx(new_element2));
369 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
370 DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
371 DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
372 el2gfx(new_element3));
373 DrawTextExt(pix[PIX_DB_DOOR],gc,
374 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
375 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
376 int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
377 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
378 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
379 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
381 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
382 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
383 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
384 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
385 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
387 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
388 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
390 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
391 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
393 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
395 OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
398 void DrawControlWindow()
404 /* Inhalt der Mampfer */
405 DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
406 "Contents of a smashed cruncher:",FS_SMALL,FC_YELLOW);
407 for(i=0;i<4;i++) for(y=0;y<4;y++) for(x=0;x<4;x++)
409 DrawMiniElement(1+5*i+x,2+y,EL_ERDREICH);
410 XFillRectangle(display,drawto,gc,
411 SX+(1+5*i)*MINI_TILEX+MINI_TILEX/2-1,
412 SY+(2)*MINI_TILEY+MINI_TILEY/2-1,
413 3*MINI_TILEX+2,3*MINI_TILEY+2);
415 XCopyArea(display,drawto,drawto,gc,
416 SX+1*MINI_TILEX,SY+2*MINI_TILEY,
417 4*5*MINI_TILEX,5*MINI_TILEY,
418 SX+1*MINI_TILEX-MINI_TILEX/2,SY+2*MINI_TILEY-MINI_TILEY/2);
421 for(y=0;y<3;y++) for(x=0;x<3;x++)
422 DrawMiniElement(1+5*i+x,2+y,level.mampfer_inhalt[i][x][y]);
424 DrawText(SX+MINI_TILEX+(5*i+1)*MINI_TILEX+1,
425 SY+2*MINI_TILEY+(4)*MINI_TILEY-4,
426 int2str(i+1,1),FS_SMALL,FC_YELLOW);
429 /* Inhalt der Amöbe */
430 for(y=0;y<2;y++) for(x=0;x<2;x++)
432 DrawMiniElement(29+x,26+y,EL_ERDREICH);
433 XFillRectangle(display,drawto,gc,
434 SX+29*MINI_TILEX+MINI_TILEX/2-1,
435 SY+26*MINI_TILEY+MINI_TILEY/2-1,
436 MINI_TILEX+2,MINI_TILEY+2);
438 XCopyArea(display,drawto,drawto,gc,
439 SX+29*MINI_TILEX,SY+26*MINI_TILEY,
440 3*MINI_TILEX,3*MINI_TILEY,
441 SX+29*MINI_TILEX-MINI_TILEX/2,SY+26*MINI_TILEY-MINI_TILEY/2);
442 DrawMiniElement(29,26,level.amoebe_inhalt);
444 for(i=0;i<11+3+2;i++)
446 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
447 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
448 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
449 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
450 ED_COUNT_GADGET_XPOS,
451 ED_COUNT_GADGET_YPOS+i*ED_COUNT_GADGET_YSIZE);
454 DrawText(ED_COUNT_VALUE_XPOS,
455 ED_COUNT_VALUE_YPOS+i*ED_COUNT_GADGET_YSIZE,
456 int2str(level.score[i],3),FS_SMALL,FC_YELLOW);
458 DrawText(ED_COUNT_VALUE_XPOS,
459 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
460 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
462 DrawText(ED_COUNT_VALUE_XPOS,
463 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
464 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
466 DrawText(ED_COUNT_VALUE_XPOS,
467 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
468 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
470 DrawText(ED_COUNT_VALUE_XPOS,
471 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
472 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
474 DrawText(ED_COUNT_VALUE_XPOS,
475 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
476 int2str(level.time,3),FS_SMALL,FC_YELLOW);
479 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+0*ED_COUNT_TEXT_YSIZE,
480 "Score for Emerald",FS_SMALL,FC_YELLOW);
481 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+1*ED_COUNT_TEXT_YSIZE,
482 "Score for Diamond",FS_SMALL,FC_YELLOW);
483 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+2*ED_COUNT_TEXT_YSIZE,
484 "Score for smashing a Bug",FS_SMALL,FC_YELLOW);
485 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+3*ED_COUNT_TEXT_YSIZE,
486 "Score for smashing a Spaceship",FS_SMALL,FC_YELLOW);
487 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+4*ED_COUNT_TEXT_YSIZE,
488 "Score for smashing a Cruncher",FS_SMALL,FC_YELLOW);
489 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+5*ED_COUNT_TEXT_YSIZE,
490 "Score for smashing an Alien",FS_SMALL,FC_YELLOW);
491 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+6*ED_COUNT_TEXT_YSIZE,
492 "Score for smashing a Pacman",FS_SMALL,FC_YELLOW);
493 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+7*ED_COUNT_TEXT_YSIZE,
494 "Score for cracking a nut",FS_SMALL,FC_YELLOW);
495 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+8*ED_COUNT_TEXT_YSIZE,
496 "Score for dynamite",FS_SMALL,FC_YELLOW);
497 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+9*ED_COUNT_TEXT_YSIZE,
498 "Score for key",FS_SMALL,FC_YELLOW);
499 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+10*ED_COUNT_TEXT_YSIZE,
500 "Score for each 10 seconds left",FS_SMALL,FC_YELLOW);
501 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+11*ED_COUNT_TEXT_YSIZE,
502 "Speed of the amoeba / Content",FS_SMALL,FC_YELLOW);
503 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+12*ED_COUNT_TEXT_YSIZE,
504 "Time for magic wall",FS_SMALL,FC_YELLOW);
505 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+13*ED_COUNT_TEXT_YSIZE,
506 "Time for wheel",FS_SMALL,FC_YELLOW);
507 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+14*ED_COUNT_TEXT_YSIZE,
508 "Emeralds needed in this level",FS_SMALL,FC_YELLOW);
509 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+15*ED_COUNT_TEXT_YSIZE,
510 "Time available for this level",FS_SMALL,FC_YELLOW);
512 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
513 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS,
514 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
515 ED_WIN_COUNT_XSIZE,ED_WIN_COUNT_YSIZE,
516 ED_COUNT_GADGET_XPOS,
517 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
519 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
520 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS+3+2*FONT2_XSIZE,
521 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
522 ED_WIN_COUNT_XSIZE-3-2*FONT2_XSIZE,ED_WIN_COUNT_YSIZE,
523 ED_COUNT_GADGET_XPOS+3+i*FONT2_XSIZE,
524 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
525 DrawText(ED_COUNT_GADGET_XPOS+5,
526 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
527 level.name,FS_SMALL,FC_YELLOW);
528 DrawText(ED_COUNT_GADGET_XPOS+(30+3)*FONT2_XSIZE-5,
529 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
530 "Title",FS_SMALL,FC_YELLOW);
532 DrawText(ED_SIZE_GADGET_XPOS,ED_SIZE_GADGET_YPOS-18,
533 "Playfield size:",FS_SMALL,FC_YELLOW);
534 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
535 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
536 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
537 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
539 ED_SIZE_GADGET_YPOS+0*ED_COUNT_GADGET_YSIZE);
540 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
541 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
542 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
543 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
545 ED_SIZE_GADGET_YPOS+1*ED_COUNT_GADGET_YSIZE);
546 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+0*ED_SIZE_TEXT_YSIZE,
547 "Width",FS_SMALL,FC_YELLOW);
548 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+1*ED_SIZE_TEXT_YSIZE,
549 "Height",FS_SMALL,FC_YELLOW);
550 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
551 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
552 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
553 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
556 void ScrollMiniLevel(int from_x, int from_y, int scroll)
559 int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
560 int dy = (scroll==ED_SCROLL_UP ? -1 : scroll==ED_SCROLL_DOWN ? 1 : 0);
562 XCopyArea(display,drawto,drawto,gc,
563 SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
564 SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
565 SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
568 x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
569 for(y=0;y<2*SCR_FIELDY;y++)
570 DrawMiniElementOrWall(x,y,from_x,from_y);
574 y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
575 for(x=0;x<2*SCR_FIELDX;x++)
576 DrawMiniElementOrWall(x,y,from_x,from_y);
579 redraw_mask |= REDRAW_FIELD;
583 void AdjustLevelScrollPosition()
587 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
588 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
589 if (lev_fieldx<2*SCR_FIELDX-2)
594 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
595 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
596 if (lev_fieldy<2*SCR_FIELDY-2)
600 void FloodFill(int from_x, int from_y, int fill_element)
604 static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} };
605 static int safety = 0;
609 if (safety>lev_fieldx*lev_fieldy)
611 fprintf(stderr,"Something went wrong in 'FloodFill()'. Please debug.\n");
615 old_element = Feld[from_x][from_y];
616 Feld[from_x][from_y] = fill_element;
620 x = from_x+check[i][0];
621 y = from_y+check[i][1];
623 if (IN_LEV_FIELD(x,y) && Feld[x][y]==old_element)
624 FloodFill(x,y,fill_element);
630 void LevelEd(int mx, int my, int button)
632 static int last_button = 0;
633 static int in_field_pressed = FALSE;
634 static BOOL use_floodfill = FALSE;
635 int x = (mx-SX)/MINI_TILEX;
636 int y = (my-SY)/MINI_TILEY;
638 if (use_floodfill) /********** FLOOD FILL **********/
642 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
647 if (x>lev_fieldx || y>lev_fieldy ||
648 (x==0 && level_xpos<0) ||
649 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
650 (y==0 && level_ypos<0) ||
651 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY))
654 from_x = x+level_xpos;
655 from_y = y+level_ypos;
656 fill_element = (button==1 ? new_element1 :
657 button==2 ? new_element2 :
658 button==3 ? new_element3 : 0);
660 FloodFill(from_x,from_y,fill_element);
661 DrawMiniLevel(level_xpos,level_ypos);
664 use_floodfill = FALSE;
665 CloseDoor(DOOR_CLOSE_1);
666 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
670 else /********** EDIT/CTRL-FENSTER **********/
672 static long choice_delay = 0;
673 int choice = CheckElemButtons(mx,my,button);
674 int elem_pos = choice-ED_BUTTON_ELEM;
676 if (((choice == ED_BUTTON_EUP && element_shift>0) ||
677 (choice == ED_BUTTON_EDOWN &&
678 element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)) &&
679 DelayReached(&choice_delay,10))
683 step = (button==1 ? MAX_ELEM_X : button==2 ? 5*MAX_ELEM_X :
685 element_shift += (choice==ED_BUTTON_EUP ? -step : step);
688 if (element_shift>elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)
689 element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y;
690 if (element_shift % MAX_ELEM_X)
691 element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X);
693 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
694 DrawElemButton(i+2,ED_BUTTON_RELEASED);
696 else if (elem_pos>=0 && elem_pos<MAX_ELEM_X*MAX_ELEM_Y)
700 if (elem_pos+element_shift < elements_in_list)
701 new_element = editor_element[elem_pos+element_shift];
703 new_element = EL_LEERRAUM;
706 new_element1 = new_element;
707 else if (last_button==2)
708 new_element2 = new_element;
709 else if (last_button==3)
710 new_element3 = new_element;
712 DrawMiniGraphicExtHiRes(drawto,gc,
713 DX+ED_WIN_MB_LEFT_XPOS,
714 DY+ED_WIN_MB_LEFT_YPOS,
715 el2gfx(new_element1));
716 DrawMiniGraphicExtHiRes(drawto,gc,
717 DX+ED_WIN_MB_MIDDLE_XPOS,
718 DY+ED_WIN_MB_MIDDLE_YPOS,
719 el2gfx(new_element2));
720 DrawMiniGraphicExtHiRes(drawto,gc,
721 DX+ED_WIN_MB_RIGHT_XPOS,
722 DY+ED_WIN_MB_RIGHT_YPOS,
723 el2gfx(new_element3));
724 redraw_mask |= REDRAW_DOOR_1;
727 if (edit_mode) /********** EDIT-FENSTER **********/
729 switch(CheckEditButtons(mx,my,button))
732 CloseDoor(DOOR_CLOSE_2);
734 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
735 DOOR_GFX_PAGEX4,DOOR_GFX_PAGEY1+80,
737 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
738 OpenDoor(DOOR_OPEN_2);
742 AreYouSure("Caution ! Flood fill mode ! Choose area !",AYS_OPEN);
743 use_floodfill = TRUE;
749 if (!DelayReached(&choice_delay,10))
751 if (lev_fieldx<2*SCR_FIELDX-2)
754 level_xpos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
758 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT);
760 DrawMiniLevel(level_xpos,level_ypos);
763 case ED_BUTTON_RIGHT:
764 if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
766 if (!DelayReached(&choice_delay,10))
768 if (lev_fieldx<2*SCR_FIELDX-2)
771 level_xpos += (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
772 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
773 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
775 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT);
777 DrawMiniLevel(level_xpos,level_ypos);
783 if (!DelayReached(&choice_delay,10))
785 if (lev_fieldy<2*SCR_FIELDY-2)
788 level_ypos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
792 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN);
794 DrawMiniLevel(level_xpos,level_ypos);
798 if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
800 if (!DelayReached(&choice_delay,10))
802 if (lev_fieldy<2*SCR_FIELDY-2)
805 level_ypos += (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
806 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
807 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
809 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP);
811 DrawMiniLevel(level_xpos,level_ypos);
818 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
822 if (button && !motion_status)
823 in_field_pressed = TRUE;
825 if (!button || !in_field_pressed || button<1 || button>3 ||
826 (y==0 && level_ypos<0) ||
827 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY) ||
828 (x==0 && level_xpos<0) ||
829 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
830 x>lev_fieldx || y>lev_fieldy)
833 new_element = (button==1 ? new_element1 :
834 button==2 ? new_element2 :
835 button==3 ? new_element3 : 0);
837 if (new_element != Feld[x+level_xpos][y+level_ypos])
839 if (new_element==EL_SPIELFIGUR) /* Jeder nur EINE Figur bitte... */
843 for(x=0;x<lev_fieldx;x++) for(y=0;y<lev_fieldy;y++)
845 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
847 Feld[x][y] = EL_LEERRAUM;
848 if (x-level_xpos>=0 && x-level_xpos<2*SCR_FIELDX &&
849 y-level_ypos>=0 && y-level_ypos<2*SCR_FIELDY)
850 DrawMiniElement(x-level_xpos,y-level_ypos,EL_LEERRAUM);
855 Feld[x+level_xpos][y+level_ypos] = new_element;
856 DrawMiniElement(x,y,new_element);
859 else if (!motion_status) /* Mauszeiger nicht im Level-Feld */
860 in_field_pressed = FALSE;
862 else /********** KONTROLL-FENSTER **********/
864 int choice = CheckCountButtons(mx,my,button);
865 int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
867 if (choice>=0 && choice<36 && DelayReached(&choice_delay,10))
876 level.score[choice] += step;
877 if (level.score[choice]<0)
878 level.score[choice] = 0;
879 else if (level.score[choice]>255)
880 level.score[choice] = 255;
884 level.tempo_amoebe += step;
885 if (level.tempo_amoebe<0)
886 level.tempo_amoebe = 0;
887 else if (level.tempo_amoebe>255)
888 level.tempo_amoebe = 255;
892 level.dauer_sieb += step;
893 if (level.dauer_sieb<0)
894 level.dauer_sieb = 0;
895 else if (level.dauer_sieb>255)
896 level.dauer_sieb = 255;
900 level.dauer_ablenk += step;
901 if (level.dauer_ablenk<0)
902 level.dauer_ablenk = 0;
903 else if (level.dauer_ablenk>255)
904 level.dauer_ablenk = 255;
908 level.edelsteine += step;
909 if (level.edelsteine<0)
910 level.edelsteine = 0;
911 else if (level.edelsteine>999)
912 level.edelsteine = 999;
919 else if (level.time>999)
925 if (lev_fieldx<MIN_LEV_FIELDX)
926 lev_fieldx = MIN_LEV_FIELDX;
927 else if (lev_fieldx>MAX_LEV_FIELDX)
928 lev_fieldx = MAX_LEV_FIELDX;
929 level.fieldx = lev_fieldx;
934 if (lev_fieldy<MIN_LEV_FIELDY)
935 lev_fieldy = MIN_LEV_FIELDY;
936 else if (lev_fieldy>MAX_LEV_FIELDY)
937 lev_fieldy = MAX_LEV_FIELDY;
938 level.fieldy = lev_fieldy;
942 DrawText(ED_COUNT_VALUE_XPOS,
943 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
944 int2str(level.score[choice],3),FS_SMALL,FC_YELLOW);
946 DrawText(ED_COUNT_VALUE_XPOS,
947 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
948 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
950 DrawText(ED_COUNT_VALUE_XPOS,
951 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
952 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
954 DrawText(ED_COUNT_VALUE_XPOS,
955 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
956 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
958 DrawText(ED_COUNT_VALUE_XPOS,
959 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
960 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
962 DrawText(ED_COUNT_VALUE_XPOS,
963 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
964 int2str(level.time,3),FS_SMALL,FC_YELLOW);
966 DrawText(ED_SIZE_VALUE_XPOS,
967 ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
968 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
970 DrawText(ED_SIZE_VALUE_XPOS,
971 ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
972 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
974 redraw_mask &= ~REDRAW_FIELD;
976 XCopyArea(display,drawto,window,gc,
978 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
979 3*FONT2_XSIZE,FONT2_YSIZE,
981 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE);
983 XCopyArea(display,drawto,window,gc,
985 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE,
986 3*FONT2_XSIZE,FONT2_YSIZE,
988 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE);
992 switch(CheckCtrlButtons(mx,my,button))
995 CloseDoor(DOOR_CLOSE_2);
996 AdjustLevelScrollPosition();
997 DrawMiniLevel(level_xpos,level_ypos);
998 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
999 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
1001 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
1002 OpenDoor(DOOR_OPEN_2);
1005 case ED_BUTTON_CLEAR:
1006 if (AreYouSure("Are you sure to clear this level ?",AYS_ASK))
1008 for(x=0;x<MAX_LEV_FIELDX;x++)
1009 for(y=0;y<MAX_LEV_FIELDY;y++)
1010 Feld[x][y] = EL_ERDREICH;
1011 DrawMiniLevel(level_xpos,level_ypos);
1014 case ED_BUTTON_UNDO:
1015 if (leveldir[leveldir_nr].readonly ||
1016 AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN))
1018 CloseDoor(DOOR_CLOSE_BOTH);
1019 game_status=MAINMENU;
1024 CloseDoor(DOOR_CLOSE_1);
1025 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
1028 case ED_BUTTON_EXIT:
1030 int figur_vorhanden = FALSE;
1032 if (leveldir[leveldir_nr].readonly)
1034 AreYouSure("This level is read only !",AYS_CONFIRM);
1038 for(y=0;y<lev_fieldy;y++)
1039 for(x=0;x<lev_fieldx;x++)
1040 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
1041 figur_vorhanden = TRUE;
1043 if (!figur_vorhanden)
1044 AreYouSure("No Level without Gregor Mc Duffin please !",
1048 if (AreYouSure("Save this level and kill the old ?",
1049 AYS_ASK | AYS_STAY_OPEN))
1051 for(x=0;x<lev_fieldx;x++)
1052 for(y=0;y<lev_fieldy;y++)
1053 Ur[x][y]=Feld[x][y];
1054 SaveLevel(level_nr);
1056 CloseDoor(DOOR_CLOSE_BOTH);
1057 game_status=MAINMENU;
1066 if (mx>=ED_COUNT_GADGET_XPOS &&
1067 mx<ED_COUNT_GADGET_XPOS+31*FONT2_XSIZE+10 &&
1068 my>=ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE &&
1069 my<ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE+ED_WIN_COUNT_YSIZE)
1074 DrawText(ED_COUNT_GADGET_XPOS+5,
1075 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1076 level.name,FS_SMALL,FC_GREEN);
1077 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1078 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1079 "<",FS_SMALL,FC_RED);
1086 name_typing = FALSE;
1087 DrawText(ED_COUNT_GADGET_XPOS+5,
1088 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1089 level.name,FS_SMALL,FC_YELLOW);
1090 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1091 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1092 " ",FS_SMALL,FC_RED);
1096 if (mx>=SX+29*MINI_TILEX && mx<SX+30*MINI_TILEX &&
1097 my>=SY+26*MINI_TILEY && my<SY+27*MINI_TILEY)
1101 if (!button || button<1 || button>3)
1104 new_element = (button==1 ? new_element1 :
1105 button==2 ? new_element2 :
1106 button==3 ? new_element3 : 0);
1108 if (new_element != level.amoebe_inhalt)
1110 level.amoebe_inhalt = new_element;
1111 DrawMiniElement(29,26,new_element);
1115 if (mx>=SX+1*MINI_TILEX && mx<SX+(1+4*5)*MINI_TILEX &&
1116 my>=SY+2*MINI_TILEY && my<SY+(2+3)*MINI_TILEY)
1118 int x = (mx-SX-1*MINI_TILEX)/MINI_TILEX;
1119 int y = (my-SY-2*MINI_TILEY)/MINI_TILEY;
1124 if (i>=0 && i<43 && x>=0 && x<3 && y>=0 && y<3)
1126 if (button && !motion_status)
1127 in_field_pressed = TRUE;
1129 if (!button || !in_field_pressed || button<1 || button>3)
1132 new_element = (button==1 ? new_element1 :
1133 button==2 ? new_element2 :
1134 button==3 ? new_element3 : 0);
1136 if (new_element != level.mampfer_inhalt[i][x][y])
1138 level.mampfer_inhalt[i][x][y] = new_element;
1139 DrawMiniElement(1+5*i+x,2+y,new_element);
1142 else if (!motion_status)/* Mauszeiger nicht im Cruncher-Feld */
1143 in_field_pressed = FALSE;
1145 else if (!motion_status) /* Mauszeiger nicht im Cruncher-Feld */
1146 in_field_pressed = FALSE;
1150 last_button = button;
1155 void LevelNameTyping(KeySym key)
1157 unsigned char ascii = 0;
1158 int len = strlen(level.name);
1163 if (key>=XK_A && key<=XK_Z)
1164 ascii = 'A'+(char)(key-XK_A);
1165 else if (key>=XK_a && key<=XK_z)
1166 ascii = 'a'+(char)(key-XK_a);
1167 else if (key>=XK_0 && key<=XK_9)
1168 ascii = '0'+(char)(key-XK_0);
1170 else if (key>=XK_space && key<=XK_at)
1171 ascii = ' '+(char)(key-XK_space);
1172 else if (key==XK_Adiaeresis)
1174 else if (key==XK_Odiaeresis)
1176 else if (key==XK_Udiaeresis)
1178 else if (key==XK_adiaeresis)
1180 else if (key==XK_odiaeresis)
1182 else if (key==XK_udiaeresis)
1184 else if (key==XK_underscore)
1188 if (ascii && len<MAX_LEVNAMLEN-2)
1190 level.name[len] = ascii;
1191 level.name[len+1] = 0;
1194 DrawTextExt(drawto,gc,
1195 ED_COUNT_GADGET_XPOS+5,
1196 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1197 level.name,FS_SMALL,FC_GREEN);
1198 DrawTextExt(window,gc,
1199 ED_COUNT_GADGET_XPOS+5,
1200 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1201 level.name,FS_SMALL,FC_GREEN);
1202 DrawTextExt(drawto,gc,
1203 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1204 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1205 "<",FS_SMALL,FC_RED);
1206 DrawTextExt(window,gc,
1207 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1208 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1209 "<",FS_SMALL,FC_RED);
1211 else if ((key==XK_Delete || key==XK_BackSpace) && len>0)
1213 level.name[len-1] = 0;
1216 DrawTextExt(drawto,gc,
1217 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1218 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1219 "< ",FS_SMALL,FC_GREEN);
1220 DrawTextExt(window,gc,
1221 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1222 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1223 "< ",FS_SMALL,FC_GREEN);
1225 else if (key==XK_Return)
1227 DrawTextExt(drawto,gc,
1228 ED_COUNT_GADGET_XPOS+5,
1229 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1230 level.name,FS_SMALL,FC_YELLOW);
1231 DrawTextExt(window,gc,
1232 ED_COUNT_GADGET_XPOS+5,
1233 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1234 level.name,FS_SMALL,FC_YELLOW);
1235 DrawTextExt(drawto,gc,
1236 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1237 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1238 " ",FS_SMALL,FC_YELLOW);
1239 DrawTextExt(window,gc,
1240 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1241 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1242 " ",FS_SMALL,FC_YELLOW);
1244 name_typing = FALSE;