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[] =
207 int elements_in_list = sizeof(editor_element)/sizeof(int);
219 CloseDoor(DOOR_CLOSE_2);
221 DrawMiniLevel(level_xpos,level_ypos);
224 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
225 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
227 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
228 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
229 DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
230 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
231 4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
232 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
233 DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
235 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
237 if (i < elements_in_list)
238 graphic = el2gfx(editor_element[i]);
240 graphic = GFX_LEERRAUM;
242 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
243 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 +
244 (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
245 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
246 (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
250 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
251 DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
252 DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
253 el2gfx(new_element1));
254 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
255 DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
256 DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
257 el2gfx(new_element2));
258 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
259 DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
260 DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
261 el2gfx(new_element3));
262 DrawTextExt(pix[PIX_DB_DOOR],gc,
263 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
264 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
265 int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
266 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
267 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
268 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
270 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
271 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
272 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
273 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
274 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
276 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
277 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
279 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
280 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
282 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
284 OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
287 void DrawControlWindow()
293 /* Inhalt der Mampfer */
294 DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
295 "Contents of a smashed cruncher:",FS_SMALL,FC_YELLOW);
296 for(i=0;i<4;i++) for(y=0;y<4;y++) for(x=0;x<4;x++)
298 DrawMiniElement(1+5*i+x,2+y,EL_ERDREICH);
299 XFillRectangle(display,drawto,gc,
300 SX+(1+5*i)*MINI_TILEX+MINI_TILEX/2-1,
301 SY+(2)*MINI_TILEY+MINI_TILEY/2-1,
302 3*MINI_TILEX+2,3*MINI_TILEY+2);
304 XCopyArea(display,drawto,drawto,gc,
305 SX+1*MINI_TILEX,SY+2*MINI_TILEY,
306 4*5*MINI_TILEX,5*MINI_TILEY,
307 SX+1*MINI_TILEX-MINI_TILEX/2,SY+2*MINI_TILEY-MINI_TILEY/2);
310 for(y=0;y<3;y++) for(x=0;x<3;x++)
311 DrawMiniElement(1+5*i+x,2+y,level.mampfer_inhalt[i][x][y]);
313 DrawText(SX+MINI_TILEX+(5*i+1)*MINI_TILEX+1,
314 SY+2*MINI_TILEY+(4)*MINI_TILEY-4,
315 int2str(i+1,1),FS_SMALL,FC_YELLOW);
318 /* Inhalt der Amöbe */
319 for(y=0;y<2;y++) for(x=0;x<2;x++)
321 DrawMiniElement(29+x,26+y,EL_ERDREICH);
322 XFillRectangle(display,drawto,gc,
323 SX+29*MINI_TILEX+MINI_TILEX/2-1,
324 SY+26*MINI_TILEY+MINI_TILEY/2-1,
325 MINI_TILEX+2,MINI_TILEY+2);
327 XCopyArea(display,drawto,drawto,gc,
328 SX+29*MINI_TILEX,SY+26*MINI_TILEY,
329 3*MINI_TILEX,3*MINI_TILEY,
330 SX+29*MINI_TILEX-MINI_TILEX/2,SY+26*MINI_TILEY-MINI_TILEY/2);
331 DrawMiniElement(29,26,level.amoebe_inhalt);
333 for(i=0;i<11+3+2;i++)
335 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
336 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
337 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
338 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
339 ED_COUNT_GADGET_XPOS,
340 ED_COUNT_GADGET_YPOS+i*ED_COUNT_GADGET_YSIZE);
343 DrawText(ED_COUNT_VALUE_XPOS,
344 ED_COUNT_VALUE_YPOS+i*ED_COUNT_GADGET_YSIZE,
345 int2str(level.score[i],3),FS_SMALL,FC_YELLOW);
347 DrawText(ED_COUNT_VALUE_XPOS,
348 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
349 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
351 DrawText(ED_COUNT_VALUE_XPOS,
352 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
353 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
355 DrawText(ED_COUNT_VALUE_XPOS,
356 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
357 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
359 DrawText(ED_COUNT_VALUE_XPOS,
360 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
361 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
363 DrawText(ED_COUNT_VALUE_XPOS,
364 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
365 int2str(level.time,3),FS_SMALL,FC_YELLOW);
368 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+0*ED_COUNT_TEXT_YSIZE,
369 "Score for Emerald",FS_SMALL,FC_YELLOW);
370 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+1*ED_COUNT_TEXT_YSIZE,
371 "Score for Diamond",FS_SMALL,FC_YELLOW);
372 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+2*ED_COUNT_TEXT_YSIZE,
373 "Score for smashing a Bug",FS_SMALL,FC_YELLOW);
374 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+3*ED_COUNT_TEXT_YSIZE,
375 "Score for smashing a Spaceship",FS_SMALL,FC_YELLOW);
376 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+4*ED_COUNT_TEXT_YSIZE,
377 "Score for smashing a Cruncher",FS_SMALL,FC_YELLOW);
378 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+5*ED_COUNT_TEXT_YSIZE,
379 "Score for smashing an Alien",FS_SMALL,FC_YELLOW);
380 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+6*ED_COUNT_TEXT_YSIZE,
381 "Score for smashing a Pacman",FS_SMALL,FC_YELLOW);
382 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+7*ED_COUNT_TEXT_YSIZE,
383 "Score for cracking a nut",FS_SMALL,FC_YELLOW);
384 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+8*ED_COUNT_TEXT_YSIZE,
385 "Score for dynamite",FS_SMALL,FC_YELLOW);
386 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+9*ED_COUNT_TEXT_YSIZE,
387 "Score for key",FS_SMALL,FC_YELLOW);
388 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+10*ED_COUNT_TEXT_YSIZE,
389 "Score for each 10 seconds left",FS_SMALL,FC_YELLOW);
390 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+11*ED_COUNT_TEXT_YSIZE,
391 "Speed of the amoeba / Content",FS_SMALL,FC_YELLOW);
392 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+12*ED_COUNT_TEXT_YSIZE,
393 "Time for magic wall",FS_SMALL,FC_YELLOW);
394 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+13*ED_COUNT_TEXT_YSIZE,
395 "Time for wheel",FS_SMALL,FC_YELLOW);
396 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+14*ED_COUNT_TEXT_YSIZE,
397 "Emeralds needed in this level",FS_SMALL,FC_YELLOW);
398 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+15*ED_COUNT_TEXT_YSIZE,
399 "Time available for this level",FS_SMALL,FC_YELLOW);
401 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
402 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS,
403 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
404 ED_WIN_COUNT_XSIZE,ED_WIN_COUNT_YSIZE,
405 ED_COUNT_GADGET_XPOS,
406 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
408 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
409 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS+3+2*FONT2_XSIZE,
410 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
411 ED_WIN_COUNT_XSIZE-3-2*FONT2_XSIZE,ED_WIN_COUNT_YSIZE,
412 ED_COUNT_GADGET_XPOS+3+i*FONT2_XSIZE,
413 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
414 DrawText(ED_COUNT_GADGET_XPOS+5,
415 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
416 level.name,FS_SMALL,FC_YELLOW);
417 DrawText(ED_COUNT_GADGET_XPOS+(30+3)*FONT2_XSIZE-5,
418 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
419 "Title",FS_SMALL,FC_YELLOW);
421 DrawText(ED_SIZE_GADGET_XPOS,ED_SIZE_GADGET_YPOS-18,
422 "Playfield size:",FS_SMALL,FC_YELLOW);
423 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
424 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
425 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
426 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
428 ED_SIZE_GADGET_YPOS+0*ED_COUNT_GADGET_YSIZE);
429 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
430 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
431 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
432 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
434 ED_SIZE_GADGET_YPOS+1*ED_COUNT_GADGET_YSIZE);
435 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+0*ED_SIZE_TEXT_YSIZE,
436 "Width",FS_SMALL,FC_YELLOW);
437 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+1*ED_SIZE_TEXT_YSIZE,
438 "Height",FS_SMALL,FC_YELLOW);
439 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
440 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
441 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
442 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
445 void ScrollMiniLevel(int from_x, int from_y, int scroll)
448 int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
449 int dy = (scroll==ED_SCROLL_UP ? -1 : scroll==ED_SCROLL_DOWN ? 1 : 0);
451 XCopyArea(display,drawto,drawto,gc,
452 SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
453 SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
454 SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
457 x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
458 for(y=0;y<2*SCR_FIELDY;y++)
459 DrawMiniElementOrWall(x,y,from_x,from_y);
463 y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
464 for(x=0;x<2*SCR_FIELDX;x++)
465 DrawMiniElementOrWall(x,y,from_x,from_y);
468 redraw_mask |= REDRAW_FIELD;
472 void AdjustLevelScrollPosition()
476 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
477 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
478 if (lev_fieldx<2*SCR_FIELDX-2)
483 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
484 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
485 if (lev_fieldy<2*SCR_FIELDY-2)
489 void FloodFill(int from_x, int from_y, int fill_element)
493 static int check[4][2] = { -1,0, 0,-1, 1,0, 0,1 };
494 static int safety = 0;
498 if (safety>lev_fieldx*lev_fieldy)
500 fprintf(stderr,"Something went wrong in 'FloodFill()'. Please debug.\n");
504 old_element = Feld[from_x][from_y];
505 Feld[from_x][from_y] = fill_element;
509 x = from_x+check[i][0];
510 y = from_y+check[i][1];
512 if (IN_LEV_FIELD(x,y) && Feld[x][y]==old_element)
513 FloodFill(x,y,fill_element);
519 void LevelEd(int mx, int my, int button)
521 static int last_button = 0;
522 static int in_field_pressed = FALSE;
523 static BOOL use_floodfill = FALSE;
524 int x = (mx-SX)/MINI_TILEX;
525 int y = (my-SY)/MINI_TILEY;
527 if (use_floodfill) /********** FLOOD FILL **********/
531 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
536 if (x>lev_fieldx || y>lev_fieldy ||
537 (x==0 && level_xpos<0) ||
538 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
539 (y==0 && level_ypos<0) ||
540 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY))
543 from_x = x+level_xpos;
544 from_y = y+level_ypos;
545 fill_element = (button==1 ? new_element1 :
546 button==2 ? new_element2 :
547 button==3 ? new_element3 : 0);
549 FloodFill(from_x,from_y,fill_element);
550 DrawMiniLevel(level_xpos,level_ypos);
553 use_floodfill = FALSE;
554 CloseDoor(DOOR_CLOSE_1);
555 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
559 else /********** EDIT/CTRL-FENSTER **********/
561 int choice = CheckElemButtons(mx,my,button);
562 int elem_pos = choice-ED_BUTTON_ELEM;
567 case ED_BUTTON_EDOWN:
568 if ((choice==ED_BUTTON_EUP && element_shift>0) ||
569 (choice==ED_BUTTON_EDOWN &&
570 element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y))
574 step = (button==1 ? MAX_ELEM_X : button==2 ? 5*MAX_ELEM_X :
576 element_shift += (choice==ED_BUTTON_EUP ? -step : step);
579 if (element_shift>elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)
580 element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y;
581 if (element_shift % MAX_ELEM_X)
582 element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X);
584 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
585 DrawElemButton(i+2,ED_BUTTON_RELEASED);
591 if (elem_pos>=0 && elem_pos<MAX_ELEM_X*MAX_ELEM_Y)
595 if (elem_pos+element_shift < elements_in_list)
596 new_element = editor_element[elem_pos+element_shift];
598 new_element = EL_LEERRAUM;
601 new_element1 = new_element;
602 else if (last_button==2)
603 new_element2 = new_element;
604 else if (last_button==3)
605 new_element3 = new_element;
607 DrawMiniGraphicExtHiRes(drawto,gc,
608 DX+ED_WIN_MB_LEFT_XPOS,
609 DY+ED_WIN_MB_LEFT_YPOS,
610 el2gfx(new_element1));
611 DrawMiniGraphicExtHiRes(drawto,gc,
612 DX+ED_WIN_MB_MIDDLE_XPOS,
613 DY+ED_WIN_MB_MIDDLE_YPOS,
614 el2gfx(new_element2));
615 DrawMiniGraphicExtHiRes(drawto,gc,
616 DX+ED_WIN_MB_RIGHT_XPOS,
617 DY+ED_WIN_MB_RIGHT_YPOS,
618 el2gfx(new_element3));
619 redraw_mask |= REDRAW_DOOR_1;
624 if (edit_mode) /********** EDIT-FENSTER **********/
626 switch(CheckEditButtons(mx,my,button))
629 CloseDoor(DOOR_CLOSE_2);
631 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
632 DOOR_GFX_PAGEX4,DOOR_GFX_PAGEY1+80,
634 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
635 OpenDoor(DOOR_OPEN_2);
639 AreYouSure("Caution ! Flood fill mode ! Choose area !",AYS_OPEN);
640 use_floodfill = TRUE;
646 if (lev_fieldx<2*SCR_FIELDX-2)
649 level_xpos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
653 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT);
655 DrawMiniLevel(level_xpos,level_ypos);
660 case ED_BUTTON_RIGHT:
661 if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
663 if (lev_fieldx<2*SCR_FIELDX-2)
666 level_xpos += (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
667 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
668 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
670 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT);
672 DrawMiniLevel(level_xpos,level_ypos);
680 if (lev_fieldy<2*SCR_FIELDY-2)
683 level_ypos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
687 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN);
689 DrawMiniLevel(level_xpos,level_ypos);
695 if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
697 if (lev_fieldy<2*SCR_FIELDY-2)
700 level_ypos += (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
701 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
702 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
704 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP);
706 DrawMiniLevel(level_xpos,level_ypos);
715 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
719 if (button && !motion_status)
720 in_field_pressed = TRUE;
722 if (!button || !in_field_pressed || button<1 || button>3 ||
723 (y==0 && level_ypos<0) ||
724 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY) ||
725 (x==0 && level_xpos<0) ||
726 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
727 x>lev_fieldx || y>lev_fieldy)
730 new_element = (button==1 ? new_element1 :
731 button==2 ? new_element2 :
732 button==3 ? new_element3 : 0);
734 if (new_element != Feld[x+level_xpos][y+level_ypos])
736 if (new_element==EL_SPIELFIGUR) /* Jeder nur EINE Figur bitte... */
740 for(x=0;x<lev_fieldx;x++) for(y=0;y<lev_fieldy;y++)
742 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
744 Feld[x][y] = EL_LEERRAUM;
745 if (x-level_xpos>=0 && x-level_xpos<2*SCR_FIELDX &&
746 y-level_ypos>=0 && y-level_ypos<2*SCR_FIELDY)
747 DrawMiniElement(x-level_xpos,y-level_ypos,EL_LEERRAUM);
752 Feld[x+level_xpos][y+level_ypos] = new_element;
753 DrawMiniElement(x,y,new_element);
756 else if (!motion_status) /* Mauszeiger nicht im Level-Feld */
757 in_field_pressed = FALSE;
759 else /********** KONTROLL-FENSTER **********/
761 static long choice_delay = 0;
762 int choice = CheckCountButtons(mx,my,button);
763 int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
765 if (choice>=0 && choice<36 && DelayReached(&choice_delay,10))
774 level.score[choice] += step;
775 if (level.score[choice]<0)
776 level.score[choice] = 0;
777 else if (level.score[choice]>255)
778 level.score[choice] = 255;
782 level.tempo_amoebe += step;
783 if (level.tempo_amoebe<0)
784 level.tempo_amoebe = 0;
785 else if (level.tempo_amoebe>255)
786 level.tempo_amoebe = 255;
790 level.dauer_sieb += step;
791 if (level.dauer_sieb<0)
792 level.dauer_sieb = 0;
793 else if (level.dauer_sieb>255)
794 level.dauer_sieb = 255;
798 level.dauer_ablenk += step;
799 if (level.dauer_ablenk<0)
800 level.dauer_ablenk = 0;
801 else if (level.dauer_ablenk>255)
802 level.dauer_ablenk = 255;
806 level.edelsteine += step;
807 if (level.edelsteine<0)
808 level.edelsteine = 0;
809 else if (level.edelsteine>999)
810 level.edelsteine = 999;
817 else if (level.time>999)
823 if (lev_fieldx<MIN_LEV_FIELDX)
824 lev_fieldx = MIN_LEV_FIELDX;
825 else if (lev_fieldx>MAX_LEV_FIELDX)
826 lev_fieldx = MAX_LEV_FIELDX;
827 level.fieldx = lev_fieldx;
832 if (lev_fieldy<MIN_LEV_FIELDY)
833 lev_fieldy = MIN_LEV_FIELDY;
834 else if (lev_fieldy>MAX_LEV_FIELDY)
835 lev_fieldy = MAX_LEV_FIELDY;
836 level.fieldy = lev_fieldy;
840 DrawText(ED_COUNT_VALUE_XPOS,
841 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
842 int2str(level.score[choice],3),FS_SMALL,FC_YELLOW);
844 DrawText(ED_COUNT_VALUE_XPOS,
845 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
846 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
848 DrawText(ED_COUNT_VALUE_XPOS,
849 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
850 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
852 DrawText(ED_COUNT_VALUE_XPOS,
853 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
854 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
856 DrawText(ED_COUNT_VALUE_XPOS,
857 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
858 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
860 DrawText(ED_COUNT_VALUE_XPOS,
861 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
862 int2str(level.time,3),FS_SMALL,FC_YELLOW);
864 DrawText(ED_SIZE_VALUE_XPOS,
865 ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
866 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
868 DrawText(ED_SIZE_VALUE_XPOS,
869 ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
870 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
872 redraw_mask &= ~REDRAW_FIELD;
874 XCopyArea(display,drawto,window,gc,
876 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
877 3*FONT2_XSIZE,FONT2_YSIZE,
879 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE);
881 XCopyArea(display,drawto,window,gc,
883 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE,
884 3*FONT2_XSIZE,FONT2_YSIZE,
886 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE);
890 switch(CheckCtrlButtons(mx,my,button))
893 CloseDoor(DOOR_CLOSE_2);
894 AdjustLevelScrollPosition();
895 DrawMiniLevel(level_xpos,level_ypos);
896 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
897 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
899 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
900 OpenDoor(DOOR_OPEN_2);
903 case ED_BUTTON_CLEAR:
904 if (AreYouSure("Are you sure to clear this level ?",AYS_ASK))
906 for(x=0;x<MAX_LEV_FIELDX;x++)
907 for(y=0;y<MAX_LEV_FIELDY;y++)
908 Feld[x][y] = EL_ERDREICH;
909 DrawMiniLevel(level_xpos,level_ypos);
913 if (AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN))
915 CloseDoor(DOOR_CLOSE_BOTH);
916 game_status=MAINMENU;
921 CloseDoor(DOOR_CLOSE_1);
922 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
927 int figur_vorhanden = FALSE;
928 for(y=0;y<lev_fieldy;y++)
929 for(x=0;x<lev_fieldx;x++)
930 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
931 figur_vorhanden = TRUE;
933 if (!figur_vorhanden)
934 AreYouSure("No Level without Gregor Mc Duffin please !",
938 if (AreYouSure("Save this level and kill the old ?",
939 AYS_ASK | AYS_STAY_OPEN))
941 for(x=0;x<lev_fieldx;x++)
942 for(y=0;y<lev_fieldy;y++)
946 CloseDoor(DOOR_CLOSE_BOTH);
947 game_status=MAINMENU;
956 if (mx>=ED_COUNT_GADGET_XPOS &&
957 mx<ED_COUNT_GADGET_XPOS+31*FONT2_XSIZE+10 &&
958 my>=ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE &&
959 my<ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE+ED_WIN_COUNT_YSIZE)
964 DrawText(ED_COUNT_GADGET_XPOS+5,
965 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
966 level.name,FS_SMALL,FC_GREEN);
967 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
968 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
969 "<",FS_SMALL,FC_RED);
977 DrawText(ED_COUNT_GADGET_XPOS+5,
978 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
979 level.name,FS_SMALL,FC_YELLOW);
980 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
981 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
982 " ",FS_SMALL,FC_RED);
986 if (mx>=SX+29*MINI_TILEX && mx<SX+30*MINI_TILEX &&
987 my>=SY+26*MINI_TILEY && my<SY+27*MINI_TILEY)
991 if (!button || button<1 || button>3)
994 new_element = (button==1 ? new_element1 :
995 button==2 ? new_element2 :
996 button==3 ? new_element3 : 0);
998 if (new_element != level.amoebe_inhalt)
1000 level.amoebe_inhalt = new_element;
1001 DrawMiniElement(29,26,new_element);
1005 if (mx>=SX+1*MINI_TILEX && mx<SX+(1+4*5)*MINI_TILEX &&
1006 my>=SY+2*MINI_TILEY && my<SY+(2+3)*MINI_TILEY)
1008 int x = (mx-SX-1*MINI_TILEX)/MINI_TILEX;
1009 int y = (my-SY-2*MINI_TILEY)/MINI_TILEY;
1014 if (i>=0 && i<43 && x>=0 && x<3 && y>=0 && y<3)
1016 if (button && !motion_status)
1017 in_field_pressed = TRUE;
1019 if (!button || !in_field_pressed || button<1 || button>3)
1022 new_element = (button==1 ? new_element1 :
1023 button==2 ? new_element2 :
1024 button==3 ? new_element3 : 0);
1026 if (new_element != level.mampfer_inhalt[i][x][y])
1028 level.mampfer_inhalt[i][x][y] = new_element;
1029 DrawMiniElement(1+5*i+x,2+y,new_element);
1032 else if (!motion_status)/* Mauszeiger nicht im Cruncher-Feld */
1033 in_field_pressed = FALSE;
1035 else if (!motion_status) /* Mauszeiger nicht im Cruncher-Feld */
1036 in_field_pressed = FALSE;
1040 last_button = button;
1045 void LevelNameTyping(KeySym key)
1047 unsigned char ascii = 0;
1048 int len = strlen(level.name);
1053 if (key>=XK_A && key<=XK_Z)
1054 ascii = 'A'+(char)(key-XK_A);
1055 else if (key>=XK_a && key<=XK_z)
1056 ascii = 'a'+(char)(key-XK_a);
1057 else if (key>=XK_0 && key<=XK_9)
1058 ascii = '0'+(char)(key-XK_0);
1060 else if (key>=XK_space && key<=XK_at)
1061 ascii = ' '+(char)(key-XK_space);
1062 else if (key==XK_Adiaeresis)
1064 else if (key==XK_Odiaeresis)
1066 else if (key==XK_Udiaeresis)
1068 else if (key==XK_adiaeresis)
1070 else if (key==XK_odiaeresis)
1072 else if (key==XK_udiaeresis)
1074 else if (key==XK_underscore)
1078 if (ascii && len<MAX_LEVNAMLEN-2)
1080 level.name[len] = ascii;
1081 level.name[len+1] = 0;
1084 DrawTextExt(drawto,gc,
1085 ED_COUNT_GADGET_XPOS+5,
1086 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1087 level.name,FS_SMALL,FC_GREEN);
1088 DrawTextExt(window,gc,
1089 ED_COUNT_GADGET_XPOS+5,
1090 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1091 level.name,FS_SMALL,FC_GREEN);
1092 DrawTextExt(drawto,gc,
1093 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1094 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1095 "<",FS_SMALL,FC_RED);
1096 DrawTextExt(window,gc,
1097 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1098 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1099 "<",FS_SMALL,FC_RED);
1101 else if (key==XK_Delete && len>0)
1103 level.name[len-1] = 0;
1106 DrawTextExt(drawto,gc,
1107 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1108 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1109 "< ",FS_SMALL,FC_GREEN);
1110 DrawTextExt(window,gc,
1111 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1112 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1113 "< ",FS_SMALL,FC_GREEN);
1115 else if (key==XK_Return)
1117 DrawTextExt(drawto,gc,
1118 ED_COUNT_GADGET_XPOS+5,
1119 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1120 level.name,FS_SMALL,FC_YELLOW);
1121 DrawTextExt(window,gc,
1122 ED_COUNT_GADGET_XPOS+5,
1123 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1124 level.name,FS_SMALL,FC_YELLOW);
1125 DrawTextExt(drawto,gc,
1126 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1127 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1128 " ",FS_SMALL,FC_YELLOW);
1129 DrawTextExt(window,gc,
1130 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1131 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1132 " ",FS_SMALL,FC_YELLOW);
1134 name_typing = FALSE;