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'),
192 EL_CHAR_A + ('S' - 'A'),
193 EL_CHAR_A + ('O' - 'A'),
194 EL_CHAR_A + ('K' - 'A'),
195 EL_CHAR_A + ('O' - 'A'),
198 EL_CHAR_A + ('B' - 'A'),
199 EL_CHAR_A + ('A' - 'A'),
200 EL_CHAR_A + ('N' - 'A'),
203 EL_SOKOBAN_FELD_LEER,
204 EL_SOKOBAN_FELD_VOLL,
208 EL_CHAR_A + ('D' - 'A'),
209 EL_CHAR_A + ('Y' - 'A'),
210 EL_CHAR_A + ('N' - 'A'),
211 EL_CHAR_A + ('A' - 'A'),
213 EL_CHAR_A + ('B' - 'A'),
214 EL_CHAR_A + ('L' - 'A'),
215 EL_CHAR_A + ('A' - 'A'),
216 EL_CHAR_A + ('S' - 'A'),
219 EL_CHAR_A + ('T' - 'A'),
220 EL_CHAR_A + ('E' - 'A'),
221 EL_CHAR_A + ('R' - 'A'),
298 int elements_in_list = sizeof(editor_element)/sizeof(int);
310 CloseDoor(DOOR_CLOSE_2);
312 DrawMiniLevel(level_xpos,level_ypos);
315 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
316 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
318 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
319 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
320 DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
321 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
322 4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
323 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
324 DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
326 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
328 if (i < elements_in_list)
329 graphic = el2gfx(editor_element[i]);
331 graphic = GFX_LEERRAUM;
333 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
334 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 +
335 (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
336 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
337 (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
341 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
342 DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
343 DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
344 el2gfx(new_element1));
345 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
346 DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
347 DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
348 el2gfx(new_element2));
349 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
350 DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
351 DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
352 el2gfx(new_element3));
353 DrawTextExt(pix[PIX_DB_DOOR],gc,
354 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
355 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
356 int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
357 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
358 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
359 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
361 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
362 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
363 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
364 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
365 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
367 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
368 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
370 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
371 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
373 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
375 OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
378 void DrawControlWindow()
384 /* Inhalt der Mampfer */
385 DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
386 "Contents of a smashed cruncher:",FS_SMALL,FC_YELLOW);
387 for(i=0;i<4;i++) for(y=0;y<4;y++) for(x=0;x<4;x++)
389 DrawMiniElement(1+5*i+x,2+y,EL_ERDREICH);
390 XFillRectangle(display,drawto,gc,
391 SX+(1+5*i)*MINI_TILEX+MINI_TILEX/2-1,
392 SY+(2)*MINI_TILEY+MINI_TILEY/2-1,
393 3*MINI_TILEX+2,3*MINI_TILEY+2);
395 XCopyArea(display,drawto,drawto,gc,
396 SX+1*MINI_TILEX,SY+2*MINI_TILEY,
397 4*5*MINI_TILEX,5*MINI_TILEY,
398 SX+1*MINI_TILEX-MINI_TILEX/2,SY+2*MINI_TILEY-MINI_TILEY/2);
401 for(y=0;y<3;y++) for(x=0;x<3;x++)
402 DrawMiniElement(1+5*i+x,2+y,level.mampfer_inhalt[i][x][y]);
404 DrawText(SX+MINI_TILEX+(5*i+1)*MINI_TILEX+1,
405 SY+2*MINI_TILEY+(4)*MINI_TILEY-4,
406 int2str(i+1,1),FS_SMALL,FC_YELLOW);
409 /* Inhalt der Amöbe */
410 for(y=0;y<2;y++) for(x=0;x<2;x++)
412 DrawMiniElement(29+x,26+y,EL_ERDREICH);
413 XFillRectangle(display,drawto,gc,
414 SX+29*MINI_TILEX+MINI_TILEX/2-1,
415 SY+26*MINI_TILEY+MINI_TILEY/2-1,
416 MINI_TILEX+2,MINI_TILEY+2);
418 XCopyArea(display,drawto,drawto,gc,
419 SX+29*MINI_TILEX,SY+26*MINI_TILEY,
420 3*MINI_TILEX,3*MINI_TILEY,
421 SX+29*MINI_TILEX-MINI_TILEX/2,SY+26*MINI_TILEY-MINI_TILEY/2);
422 DrawMiniElement(29,26,level.amoebe_inhalt);
424 for(i=0;i<11+3+2;i++)
426 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
427 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
428 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
429 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
430 ED_COUNT_GADGET_XPOS,
431 ED_COUNT_GADGET_YPOS+i*ED_COUNT_GADGET_YSIZE);
434 DrawText(ED_COUNT_VALUE_XPOS,
435 ED_COUNT_VALUE_YPOS+i*ED_COUNT_GADGET_YSIZE,
436 int2str(level.score[i],3),FS_SMALL,FC_YELLOW);
438 DrawText(ED_COUNT_VALUE_XPOS,
439 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
440 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
442 DrawText(ED_COUNT_VALUE_XPOS,
443 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
444 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
446 DrawText(ED_COUNT_VALUE_XPOS,
447 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
448 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
450 DrawText(ED_COUNT_VALUE_XPOS,
451 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
452 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
454 DrawText(ED_COUNT_VALUE_XPOS,
455 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
456 int2str(level.time,3),FS_SMALL,FC_YELLOW);
459 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+0*ED_COUNT_TEXT_YSIZE,
460 "Score for Emerald",FS_SMALL,FC_YELLOW);
461 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+1*ED_COUNT_TEXT_YSIZE,
462 "Score for Diamond",FS_SMALL,FC_YELLOW);
463 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+2*ED_COUNT_TEXT_YSIZE,
464 "Score for smashing a Bug",FS_SMALL,FC_YELLOW);
465 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+3*ED_COUNT_TEXT_YSIZE,
466 "Score for smashing a Spaceship",FS_SMALL,FC_YELLOW);
467 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+4*ED_COUNT_TEXT_YSIZE,
468 "Score for smashing a Cruncher",FS_SMALL,FC_YELLOW);
469 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+5*ED_COUNT_TEXT_YSIZE,
470 "Score for smashing an Alien",FS_SMALL,FC_YELLOW);
471 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+6*ED_COUNT_TEXT_YSIZE,
472 "Score for smashing a Pacman",FS_SMALL,FC_YELLOW);
473 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+7*ED_COUNT_TEXT_YSIZE,
474 "Score for cracking a nut",FS_SMALL,FC_YELLOW);
475 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+8*ED_COUNT_TEXT_YSIZE,
476 "Score for dynamite",FS_SMALL,FC_YELLOW);
477 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+9*ED_COUNT_TEXT_YSIZE,
478 "Score for key",FS_SMALL,FC_YELLOW);
479 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+10*ED_COUNT_TEXT_YSIZE,
480 "Score for each 10 seconds left",FS_SMALL,FC_YELLOW);
481 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+11*ED_COUNT_TEXT_YSIZE,
482 "Speed of the amoeba / Content",FS_SMALL,FC_YELLOW);
483 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+12*ED_COUNT_TEXT_YSIZE,
484 "Time for magic wall",FS_SMALL,FC_YELLOW);
485 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+13*ED_COUNT_TEXT_YSIZE,
486 "Time for wheel",FS_SMALL,FC_YELLOW);
487 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+14*ED_COUNT_TEXT_YSIZE,
488 "Emeralds needed in this level",FS_SMALL,FC_YELLOW);
489 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+15*ED_COUNT_TEXT_YSIZE,
490 "Time available for this level",FS_SMALL,FC_YELLOW);
492 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
493 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS,
494 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
495 ED_WIN_COUNT_XSIZE,ED_WIN_COUNT_YSIZE,
496 ED_COUNT_GADGET_XPOS,
497 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
499 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
500 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS+3+2*FONT2_XSIZE,
501 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
502 ED_WIN_COUNT_XSIZE-3-2*FONT2_XSIZE,ED_WIN_COUNT_YSIZE,
503 ED_COUNT_GADGET_XPOS+3+i*FONT2_XSIZE,
504 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
505 DrawText(ED_COUNT_GADGET_XPOS+5,
506 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
507 level.name,FS_SMALL,FC_YELLOW);
508 DrawText(ED_COUNT_GADGET_XPOS+(30+3)*FONT2_XSIZE-5,
509 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
510 "Title",FS_SMALL,FC_YELLOW);
512 DrawText(ED_SIZE_GADGET_XPOS,ED_SIZE_GADGET_YPOS-18,
513 "Playfield size:",FS_SMALL,FC_YELLOW);
514 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
515 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
516 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
517 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
519 ED_SIZE_GADGET_YPOS+0*ED_COUNT_GADGET_YSIZE);
520 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
521 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
522 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
523 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
525 ED_SIZE_GADGET_YPOS+1*ED_COUNT_GADGET_YSIZE);
526 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+0*ED_SIZE_TEXT_YSIZE,
527 "Width",FS_SMALL,FC_YELLOW);
528 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+1*ED_SIZE_TEXT_YSIZE,
529 "Height",FS_SMALL,FC_YELLOW);
530 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
531 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
532 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
533 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
536 void ScrollMiniLevel(int from_x, int from_y, int scroll)
539 int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
540 int dy = (scroll==ED_SCROLL_UP ? -1 : scroll==ED_SCROLL_DOWN ? 1 : 0);
542 XCopyArea(display,drawto,drawto,gc,
543 SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
544 SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
545 SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
548 x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
549 for(y=0;y<2*SCR_FIELDY;y++)
550 DrawMiniElementOrWall(x,y,from_x,from_y);
554 y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
555 for(x=0;x<2*SCR_FIELDX;x++)
556 DrawMiniElementOrWall(x,y,from_x,from_y);
559 redraw_mask |= REDRAW_FIELD;
563 void AdjustLevelScrollPosition()
567 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
568 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
569 if (lev_fieldx<2*SCR_FIELDX-2)
574 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
575 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
576 if (lev_fieldy<2*SCR_FIELDY-2)
580 void FloodFill(int from_x, int from_y, int fill_element)
584 static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} };
585 static int safety = 0;
589 if (safety>lev_fieldx*lev_fieldy)
591 fprintf(stderr,"Something went wrong in 'FloodFill()'. Please debug.\n");
595 old_element = Feld[from_x][from_y];
596 Feld[from_x][from_y] = fill_element;
600 x = from_x+check[i][0];
601 y = from_y+check[i][1];
603 if (IN_LEV_FIELD(x,y) && Feld[x][y]==old_element)
604 FloodFill(x,y,fill_element);
610 void LevelEd(int mx, int my, int button)
612 static int last_button = 0;
613 static int in_field_pressed = FALSE;
614 static BOOL use_floodfill = FALSE;
615 int x = (mx-SX)/MINI_TILEX;
616 int y = (my-SY)/MINI_TILEY;
618 if (use_floodfill) /********** FLOOD FILL **********/
622 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
627 if (x>lev_fieldx || y>lev_fieldy ||
628 (x==0 && level_xpos<0) ||
629 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
630 (y==0 && level_ypos<0) ||
631 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY))
634 from_x = x+level_xpos;
635 from_y = y+level_ypos;
636 fill_element = (button==1 ? new_element1 :
637 button==2 ? new_element2 :
638 button==3 ? new_element3 : 0);
640 FloodFill(from_x,from_y,fill_element);
641 DrawMiniLevel(level_xpos,level_ypos);
644 use_floodfill = FALSE;
645 CloseDoor(DOOR_CLOSE_1);
646 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
650 else /********** EDIT/CTRL-FENSTER **********/
652 static long choice_delay = 0;
653 int choice = CheckElemButtons(mx,my,button);
654 int elem_pos = choice-ED_BUTTON_ELEM;
656 if (((choice == ED_BUTTON_EUP && element_shift>0) ||
657 (choice == ED_BUTTON_EDOWN &&
658 element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)) &&
659 DelayReached(&choice_delay,10))
663 step = (button==1 ? MAX_ELEM_X : button==2 ? 5*MAX_ELEM_X :
665 element_shift += (choice==ED_BUTTON_EUP ? -step : step);
668 if (element_shift>elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)
669 element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y;
670 if (element_shift % MAX_ELEM_X)
671 element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X);
673 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
674 DrawElemButton(i+2,ED_BUTTON_RELEASED);
676 else if (elem_pos>=0 && elem_pos<MAX_ELEM_X*MAX_ELEM_Y)
680 if (elem_pos+element_shift < elements_in_list)
681 new_element = editor_element[elem_pos+element_shift];
683 new_element = EL_LEERRAUM;
686 new_element1 = new_element;
687 else if (last_button==2)
688 new_element2 = new_element;
689 else if (last_button==3)
690 new_element3 = new_element;
692 DrawMiniGraphicExtHiRes(drawto,gc,
693 DX+ED_WIN_MB_LEFT_XPOS,
694 DY+ED_WIN_MB_LEFT_YPOS,
695 el2gfx(new_element1));
696 DrawMiniGraphicExtHiRes(drawto,gc,
697 DX+ED_WIN_MB_MIDDLE_XPOS,
698 DY+ED_WIN_MB_MIDDLE_YPOS,
699 el2gfx(new_element2));
700 DrawMiniGraphicExtHiRes(drawto,gc,
701 DX+ED_WIN_MB_RIGHT_XPOS,
702 DY+ED_WIN_MB_RIGHT_YPOS,
703 el2gfx(new_element3));
704 redraw_mask |= REDRAW_DOOR_1;
707 if (edit_mode) /********** EDIT-FENSTER **********/
709 switch(CheckEditButtons(mx,my,button))
712 CloseDoor(DOOR_CLOSE_2);
714 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
715 DOOR_GFX_PAGEX4,DOOR_GFX_PAGEY1+80,
717 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
718 OpenDoor(DOOR_OPEN_2);
722 AreYouSure("Caution ! Flood fill mode ! Choose area !",AYS_OPEN);
723 use_floodfill = TRUE;
729 if (!DelayReached(&choice_delay,10))
731 if (lev_fieldx<2*SCR_FIELDX-2)
734 level_xpos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
738 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT);
740 DrawMiniLevel(level_xpos,level_ypos);
743 case ED_BUTTON_RIGHT:
744 if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
746 if (!DelayReached(&choice_delay,10))
748 if (lev_fieldx<2*SCR_FIELDX-2)
751 level_xpos += (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
752 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
753 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
755 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT);
757 DrawMiniLevel(level_xpos,level_ypos);
763 if (!DelayReached(&choice_delay,10))
765 if (lev_fieldy<2*SCR_FIELDY-2)
768 level_ypos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
772 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN);
774 DrawMiniLevel(level_xpos,level_ypos);
778 if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
780 if (!DelayReached(&choice_delay,10))
782 if (lev_fieldy<2*SCR_FIELDY-2)
785 level_ypos += (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
786 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
787 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
789 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP);
791 DrawMiniLevel(level_xpos,level_ypos);
798 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
802 if (button && !motion_status)
803 in_field_pressed = TRUE;
805 if (!button || !in_field_pressed || button<1 || button>3 ||
806 (y==0 && level_ypos<0) ||
807 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY) ||
808 (x==0 && level_xpos<0) ||
809 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
810 x>lev_fieldx || y>lev_fieldy)
813 new_element = (button==1 ? new_element1 :
814 button==2 ? new_element2 :
815 button==3 ? new_element3 : 0);
817 if (new_element != Feld[x+level_xpos][y+level_ypos])
819 if (new_element==EL_SPIELFIGUR) /* Jeder nur EINE Figur bitte... */
823 for(x=0;x<lev_fieldx;x++) for(y=0;y<lev_fieldy;y++)
825 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
827 Feld[x][y] = EL_LEERRAUM;
828 if (x-level_xpos>=0 && x-level_xpos<2*SCR_FIELDX &&
829 y-level_ypos>=0 && y-level_ypos<2*SCR_FIELDY)
830 DrawMiniElement(x-level_xpos,y-level_ypos,EL_LEERRAUM);
835 Feld[x+level_xpos][y+level_ypos] = new_element;
836 DrawMiniElement(x,y,new_element);
839 else if (!motion_status) /* Mauszeiger nicht im Level-Feld */
840 in_field_pressed = FALSE;
842 else /********** KONTROLL-FENSTER **********/
844 int choice = CheckCountButtons(mx,my,button);
845 int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
847 if (choice>=0 && choice<36 && DelayReached(&choice_delay,10))
856 level.score[choice] += step;
857 if (level.score[choice]<0)
858 level.score[choice] = 0;
859 else if (level.score[choice]>255)
860 level.score[choice] = 255;
864 level.tempo_amoebe += step;
865 if (level.tempo_amoebe<0)
866 level.tempo_amoebe = 0;
867 else if (level.tempo_amoebe>255)
868 level.tempo_amoebe = 255;
872 level.dauer_sieb += step;
873 if (level.dauer_sieb<0)
874 level.dauer_sieb = 0;
875 else if (level.dauer_sieb>255)
876 level.dauer_sieb = 255;
880 level.dauer_ablenk += step;
881 if (level.dauer_ablenk<0)
882 level.dauer_ablenk = 0;
883 else if (level.dauer_ablenk>255)
884 level.dauer_ablenk = 255;
888 level.edelsteine += step;
889 if (level.edelsteine<0)
890 level.edelsteine = 0;
891 else if (level.edelsteine>999)
892 level.edelsteine = 999;
899 else if (level.time>999)
905 if (lev_fieldx<MIN_LEV_FIELDX)
906 lev_fieldx = MIN_LEV_FIELDX;
907 else if (lev_fieldx>MAX_LEV_FIELDX)
908 lev_fieldx = MAX_LEV_FIELDX;
909 level.fieldx = lev_fieldx;
914 if (lev_fieldy<MIN_LEV_FIELDY)
915 lev_fieldy = MIN_LEV_FIELDY;
916 else if (lev_fieldy>MAX_LEV_FIELDY)
917 lev_fieldy = MAX_LEV_FIELDY;
918 level.fieldy = lev_fieldy;
922 DrawText(ED_COUNT_VALUE_XPOS,
923 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
924 int2str(level.score[choice],3),FS_SMALL,FC_YELLOW);
926 DrawText(ED_COUNT_VALUE_XPOS,
927 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
928 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
930 DrawText(ED_COUNT_VALUE_XPOS,
931 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
932 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
934 DrawText(ED_COUNT_VALUE_XPOS,
935 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
936 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
938 DrawText(ED_COUNT_VALUE_XPOS,
939 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
940 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
942 DrawText(ED_COUNT_VALUE_XPOS,
943 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
944 int2str(level.time,3),FS_SMALL,FC_YELLOW);
946 DrawText(ED_SIZE_VALUE_XPOS,
947 ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
948 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
950 DrawText(ED_SIZE_VALUE_XPOS,
951 ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
952 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
954 redraw_mask &= ~REDRAW_FIELD;
956 XCopyArea(display,drawto,window,gc,
958 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
959 3*FONT2_XSIZE,FONT2_YSIZE,
961 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE);
963 XCopyArea(display,drawto,window,gc,
965 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE,
966 3*FONT2_XSIZE,FONT2_YSIZE,
968 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE);
972 switch(CheckCtrlButtons(mx,my,button))
975 CloseDoor(DOOR_CLOSE_2);
976 AdjustLevelScrollPosition();
977 DrawMiniLevel(level_xpos,level_ypos);
978 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
979 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
981 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
982 OpenDoor(DOOR_OPEN_2);
985 case ED_BUTTON_CLEAR:
986 if (AreYouSure("Are you sure to clear this level ?",AYS_ASK))
988 for(x=0;x<MAX_LEV_FIELDX;x++)
989 for(y=0;y<MAX_LEV_FIELDY;y++)
990 Feld[x][y] = EL_ERDREICH;
991 DrawMiniLevel(level_xpos,level_ypos);
995 if (leveldir[leveldir_nr].readonly ||
996 AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN))
998 CloseDoor(DOOR_CLOSE_BOTH);
999 game_status=MAINMENU;
1004 CloseDoor(DOOR_CLOSE_1);
1005 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
1008 case ED_BUTTON_EXIT:
1010 int figur_vorhanden = FALSE;
1012 if (leveldir[leveldir_nr].readonly)
1014 AreYouSure("This level is read only !",AYS_CONFIRM);
1018 for(y=0;y<lev_fieldy;y++)
1019 for(x=0;x<lev_fieldx;x++)
1020 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
1021 figur_vorhanden = TRUE;
1023 if (!figur_vorhanden)
1024 AreYouSure("No Level without Gregor Mc Duffin please !",
1028 if (AreYouSure("Save this level and kill the old ?",
1029 AYS_ASK | AYS_STAY_OPEN))
1031 for(x=0;x<lev_fieldx;x++)
1032 for(y=0;y<lev_fieldy;y++)
1033 Ur[x][y]=Feld[x][y];
1034 SaveLevel(level_nr);
1036 CloseDoor(DOOR_CLOSE_BOTH);
1037 game_status=MAINMENU;
1046 if (mx>=ED_COUNT_GADGET_XPOS &&
1047 mx<ED_COUNT_GADGET_XPOS+31*FONT2_XSIZE+10 &&
1048 my>=ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE &&
1049 my<ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE+ED_WIN_COUNT_YSIZE)
1054 DrawText(ED_COUNT_GADGET_XPOS+5,
1055 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1056 level.name,FS_SMALL,FC_GREEN);
1057 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1058 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1059 "<",FS_SMALL,FC_RED);
1066 name_typing = FALSE;
1067 DrawText(ED_COUNT_GADGET_XPOS+5,
1068 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1069 level.name,FS_SMALL,FC_YELLOW);
1070 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1071 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1072 " ",FS_SMALL,FC_RED);
1076 if (mx>=SX+29*MINI_TILEX && mx<SX+30*MINI_TILEX &&
1077 my>=SY+26*MINI_TILEY && my<SY+27*MINI_TILEY)
1081 if (!button || button<1 || button>3)
1084 new_element = (button==1 ? new_element1 :
1085 button==2 ? new_element2 :
1086 button==3 ? new_element3 : 0);
1088 if (new_element != level.amoebe_inhalt)
1090 level.amoebe_inhalt = new_element;
1091 DrawMiniElement(29,26,new_element);
1095 if (mx>=SX+1*MINI_TILEX && mx<SX+(1+4*5)*MINI_TILEX &&
1096 my>=SY+2*MINI_TILEY && my<SY+(2+3)*MINI_TILEY)
1098 int x = (mx-SX-1*MINI_TILEX)/MINI_TILEX;
1099 int y = (my-SY-2*MINI_TILEY)/MINI_TILEY;
1104 if (i>=0 && i<43 && x>=0 && x<3 && y>=0 && y<3)
1106 if (button && !motion_status)
1107 in_field_pressed = TRUE;
1109 if (!button || !in_field_pressed || 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.mampfer_inhalt[i][x][y])
1118 level.mampfer_inhalt[i][x][y] = new_element;
1119 DrawMiniElement(1+5*i+x,2+y,new_element);
1122 else if (!motion_status)/* Mauszeiger nicht im Cruncher-Feld */
1123 in_field_pressed = FALSE;
1125 else if (!motion_status) /* Mauszeiger nicht im Cruncher-Feld */
1126 in_field_pressed = FALSE;
1130 last_button = button;
1135 void LevelNameTyping(KeySym key)
1137 unsigned char ascii = 0;
1138 int len = strlen(level.name);
1143 if (key>=XK_A && key<=XK_Z)
1144 ascii = 'A'+(char)(key-XK_A);
1145 else if (key>=XK_a && key<=XK_z)
1146 ascii = 'a'+(char)(key-XK_a);
1147 else if (key>=XK_0 && key<=XK_9)
1148 ascii = '0'+(char)(key-XK_0);
1150 else if (key>=XK_space && key<=XK_at)
1151 ascii = ' '+(char)(key-XK_space);
1152 else if (key==XK_Adiaeresis)
1154 else if (key==XK_Odiaeresis)
1156 else if (key==XK_Udiaeresis)
1158 else if (key==XK_adiaeresis)
1160 else if (key==XK_odiaeresis)
1162 else if (key==XK_udiaeresis)
1164 else if (key==XK_underscore)
1168 if (ascii && len<MAX_LEVNAMLEN-2)
1170 level.name[len] = ascii;
1171 level.name[len+1] = 0;
1174 DrawTextExt(drawto,gc,
1175 ED_COUNT_GADGET_XPOS+5,
1176 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1177 level.name,FS_SMALL,FC_GREEN);
1178 DrawTextExt(window,gc,
1179 ED_COUNT_GADGET_XPOS+5,
1180 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1181 level.name,FS_SMALL,FC_GREEN);
1182 DrawTextExt(drawto,gc,
1183 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1184 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1185 "<",FS_SMALL,FC_RED);
1186 DrawTextExt(window,gc,
1187 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1188 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1189 "<",FS_SMALL,FC_RED);
1191 else if (key==XK_Delete && len>0)
1193 level.name[len-1] = 0;
1196 DrawTextExt(drawto,gc,
1197 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1198 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1199 "< ",FS_SMALL,FC_GREEN);
1200 DrawTextExt(window,gc,
1201 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1202 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1203 "< ",FS_SMALL,FC_GREEN);
1205 else if (key==XK_Return)
1207 DrawTextExt(drawto,gc,
1208 ED_COUNT_GADGET_XPOS+5,
1209 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1210 level.name,FS_SMALL,FC_YELLOW);
1211 DrawTextExt(window,gc,
1212 ED_COUNT_GADGET_XPOS+5,
1213 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1214 level.name,FS_SMALL,FC_YELLOW);
1215 DrawTextExt(drawto,gc,
1216 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1217 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1218 " ",FS_SMALL,FC_YELLOW);
1219 DrawTextExt(window,gc,
1220 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1221 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1222 " ",FS_SMALL,FC_YELLOW);
1224 name_typing = FALSE;