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[] =
196 int elements_in_list = sizeof(editor_element)/sizeof(int);
208 CloseDoor(DOOR_CLOSE_2);
210 DrawMiniLevel(level_xpos,level_ypos);
213 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
214 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
216 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
217 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
218 DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
219 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
220 4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
221 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
222 DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
224 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
226 if (i < elements_in_list)
227 graphic = el2gfx(editor_element[i]);
229 graphic = GFX_LEERRAUM;
231 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
232 DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 +
233 (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
234 DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
235 (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
239 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
240 DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
241 DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
242 el2gfx(new_element1));
243 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
244 DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
245 DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
246 el2gfx(new_element2));
247 DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc,
248 DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
249 DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
250 el2gfx(new_element3));
251 DrawTextExt(pix[PIX_DB_DOOR],gc,
252 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
253 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
254 int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
255 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
256 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
257 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
259 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
260 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
261 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
262 DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
263 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
265 DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
266 DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
268 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
269 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
271 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
273 OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
276 void DrawControlWindow()
282 /* Inhalt der Mampfer */
283 DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
284 "Contents of a smashed cruncher:",FS_SMALL,FC_YELLOW);
285 for(i=0;i<4;i++) for(y=0;y<4;y++) for(x=0;x<4;x++)
287 DrawMiniElement(1+5*i+x,2+y,EL_ERDREICH);
288 XFillRectangle(display,drawto,gc,
289 SX+(1+5*i)*MINI_TILEX+MINI_TILEX/2-1,
290 SY+(2)*MINI_TILEY+MINI_TILEY/2-1,
291 3*MINI_TILEX+2,3*MINI_TILEY+2);
293 XCopyArea(display,drawto,drawto,gc,
294 SX+1*MINI_TILEX,SY+2*MINI_TILEY,
295 4*5*MINI_TILEX,5*MINI_TILEY,
296 SX+1*MINI_TILEX-MINI_TILEX/2,SY+2*MINI_TILEY-MINI_TILEY/2);
299 for(y=0;y<3;y++) for(x=0;x<3;x++)
300 DrawMiniElement(1+5*i+x,2+y,level.mampfer_inhalt[i][x][y]);
302 DrawText(SX+MINI_TILEX+(5*i+1)*MINI_TILEX+1,
303 SY+2*MINI_TILEY+(4)*MINI_TILEY-4,
304 int2str(i+1,1),FS_SMALL,FC_YELLOW);
307 /* Inhalt der Amöbe */
308 for(y=0;y<2;y++) for(x=0;x<2;x++)
310 DrawMiniElement(29+x,26+y,EL_ERDREICH);
311 XFillRectangle(display,drawto,gc,
312 SX+29*MINI_TILEX+MINI_TILEX/2-1,
313 SY+26*MINI_TILEY+MINI_TILEY/2-1,
314 MINI_TILEX+2,MINI_TILEY+2);
316 XCopyArea(display,drawto,drawto,gc,
317 SX+29*MINI_TILEX,SY+26*MINI_TILEY,
318 3*MINI_TILEX,3*MINI_TILEY,
319 SX+29*MINI_TILEX-MINI_TILEX/2,SY+26*MINI_TILEY-MINI_TILEY/2);
320 DrawMiniElement(29,26,level.amoebe_inhalt);
322 for(i=0;i<11+3+2;i++)
324 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
325 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
326 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
327 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
328 ED_COUNT_GADGET_XPOS,
329 ED_COUNT_GADGET_YPOS+i*ED_COUNT_GADGET_YSIZE);
332 DrawText(ED_COUNT_VALUE_XPOS,
333 ED_COUNT_VALUE_YPOS+i*ED_COUNT_GADGET_YSIZE,
334 int2str(level.score[i],3),FS_SMALL,FC_YELLOW);
336 DrawText(ED_COUNT_VALUE_XPOS,
337 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
338 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
340 DrawText(ED_COUNT_VALUE_XPOS,
341 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
342 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
344 DrawText(ED_COUNT_VALUE_XPOS,
345 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
346 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
348 DrawText(ED_COUNT_VALUE_XPOS,
349 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
350 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
352 DrawText(ED_COUNT_VALUE_XPOS,
353 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
354 int2str(level.time,3),FS_SMALL,FC_YELLOW);
357 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+0*ED_COUNT_TEXT_YSIZE,
358 "Score for Emerald",FS_SMALL,FC_YELLOW);
359 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+1*ED_COUNT_TEXT_YSIZE,
360 "Score for Diamond",FS_SMALL,FC_YELLOW);
361 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+2*ED_COUNT_TEXT_YSIZE,
362 "Score for smashing a Bug",FS_SMALL,FC_YELLOW);
363 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+3*ED_COUNT_TEXT_YSIZE,
364 "Score for smashing a Spaceship",FS_SMALL,FC_YELLOW);
365 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+4*ED_COUNT_TEXT_YSIZE,
366 "Score for smashing a Cruncher",FS_SMALL,FC_YELLOW);
367 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+5*ED_COUNT_TEXT_YSIZE,
368 "Score for smashing an Alien",FS_SMALL,FC_YELLOW);
369 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+6*ED_COUNT_TEXT_YSIZE,
370 "Score for smashing a Pacman",FS_SMALL,FC_YELLOW);
371 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+7*ED_COUNT_TEXT_YSIZE,
372 "Score for cracking a nut",FS_SMALL,FC_YELLOW);
373 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+8*ED_COUNT_TEXT_YSIZE,
374 "Score for dynamite",FS_SMALL,FC_YELLOW);
375 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+9*ED_COUNT_TEXT_YSIZE,
376 "Score for key",FS_SMALL,FC_YELLOW);
377 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+10*ED_COUNT_TEXT_YSIZE,
378 "Score for each 10 seconds left",FS_SMALL,FC_YELLOW);
379 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+11*ED_COUNT_TEXT_YSIZE,
380 "Speed of the amoeba / Content",FS_SMALL,FC_YELLOW);
381 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+12*ED_COUNT_TEXT_YSIZE,
382 "Time for magic wall",FS_SMALL,FC_YELLOW);
383 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+13*ED_COUNT_TEXT_YSIZE,
384 "Time for wheel",FS_SMALL,FC_YELLOW);
385 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+14*ED_COUNT_TEXT_YSIZE,
386 "Emeralds needed in this level",FS_SMALL,FC_YELLOW);
387 DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+15*ED_COUNT_TEXT_YSIZE,
388 "Time available for this level",FS_SMALL,FC_YELLOW);
390 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
391 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS,
392 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
393 ED_WIN_COUNT_XSIZE,ED_WIN_COUNT_YSIZE,
394 ED_COUNT_GADGET_XPOS,
395 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
397 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
398 DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS+3+2*FONT2_XSIZE,
399 DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
400 ED_WIN_COUNT_XSIZE-3-2*FONT2_XSIZE,ED_WIN_COUNT_YSIZE,
401 ED_COUNT_GADGET_XPOS+3+i*FONT2_XSIZE,
402 ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
403 DrawText(ED_COUNT_GADGET_XPOS+5,
404 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
405 level.name,FS_SMALL,FC_YELLOW);
406 DrawText(ED_COUNT_GADGET_XPOS+(30+3)*FONT2_XSIZE-5,
407 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
408 "Title",FS_SMALL,FC_YELLOW);
410 DrawText(ED_SIZE_GADGET_XPOS,ED_SIZE_GADGET_YPOS-18,
411 "Playfield size:",FS_SMALL,FC_YELLOW);
412 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
413 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
414 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
415 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
417 ED_SIZE_GADGET_YPOS+0*ED_COUNT_GADGET_YSIZE);
418 XCopyArea(display,pix[PIX_DOOR],drawto,gc,
419 DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
420 DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
421 DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
423 ED_SIZE_GADGET_YPOS+1*ED_COUNT_GADGET_YSIZE);
424 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+0*ED_SIZE_TEXT_YSIZE,
425 "Width",FS_SMALL,FC_YELLOW);
426 DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+1*ED_SIZE_TEXT_YSIZE,
427 "Height",FS_SMALL,FC_YELLOW);
428 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
429 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
430 DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
431 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
434 void ScrollMiniLevel(int from_x, int from_y, int scroll)
437 int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
438 int dy = (scroll==ED_SCROLL_UP ? -1 : scroll==ED_SCROLL_DOWN ? 1 : 0);
440 XCopyArea(display,drawto,drawto,gc,
441 SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
442 SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
443 SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
446 x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
447 for(y=0;y<2*SCR_FIELDY;y++)
448 DrawMiniElementOrWall(x,y,from_x,from_y);
452 y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
453 for(x=0;x<2*SCR_FIELDX;x++)
454 DrawMiniElementOrWall(x,y,from_x,from_y);
457 redraw_mask |= REDRAW_FIELD;
461 void AdjustLevelScrollPosition()
465 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
466 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
467 if (lev_fieldx<2*SCR_FIELDX-2)
472 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
473 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
474 if (lev_fieldy<2*SCR_FIELDY-2)
478 void FloodFill(int from_x, int from_y, int fill_element)
482 static int check[4][2] = { -1,0, 0,-1, 1,0, 0,1 };
483 static int safety = 0;
487 if (safety>lev_fieldx*lev_fieldy)
489 fprintf(stderr,"Something went wrong in 'FloodFill()'. Please debug.\n");
493 old_element = Feld[from_x][from_y];
494 Feld[from_x][from_y] = fill_element;
498 x = from_x+check[i][0];
499 y = from_y+check[i][1];
501 if (IN_LEV_FIELD(x,y) && Feld[x][y]==old_element)
502 FloodFill(x,y,fill_element);
508 void LevelEd(int mx, int my, int button)
510 static int last_button = 0;
511 static int in_field_pressed = FALSE;
512 static BOOL use_floodfill = FALSE;
513 int x = (mx-SX)/MINI_TILEX;
514 int y = (my-SY)/MINI_TILEY;
516 if (use_floodfill) /********** FLOOD FILL **********/
520 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
525 if (x>lev_fieldx || y>lev_fieldy ||
526 (x==0 && level_xpos<0) ||
527 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
528 (y==0 && level_ypos<0) ||
529 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY))
532 from_x = x+level_xpos;
533 from_y = y+level_ypos;
534 fill_element = (button==1 ? new_element1 :
535 button==2 ? new_element2 :
536 button==3 ? new_element3 : 0);
538 FloodFill(from_x,from_y,fill_element);
539 DrawMiniLevel(level_xpos,level_ypos);
542 use_floodfill = FALSE;
543 CloseDoor(DOOR_CLOSE_1);
544 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
548 else /********** EDIT/CTRL-FENSTER **********/
550 int choice = CheckElemButtons(mx,my,button);
551 int elem_pos = choice-ED_BUTTON_ELEM;
556 case ED_BUTTON_EDOWN:
557 if ((choice==ED_BUTTON_EUP && element_shift>0) ||
558 (choice==ED_BUTTON_EDOWN &&
559 element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y))
563 step = (button==1 ? MAX_ELEM_X : button==2 ? 5*MAX_ELEM_X :
565 element_shift += (choice==ED_BUTTON_EUP ? -step : step);
568 if (element_shift>elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)
569 element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y;
570 if (element_shift % MAX_ELEM_X)
571 element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X);
573 for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
574 DrawElemButton(i+2,ED_BUTTON_RELEASED);
580 if (elem_pos>=0 && elem_pos<MAX_ELEM_X*MAX_ELEM_Y)
584 if (elem_pos+element_shift < elements_in_list)
585 new_element = editor_element[elem_pos+element_shift];
587 new_element = EL_LEERRAUM;
590 new_element1 = new_element;
591 else if (last_button==2)
592 new_element2 = new_element;
593 else if (last_button==3)
594 new_element3 = new_element;
596 DrawMiniGraphicExtHiRes(drawto,gc,
597 DX+ED_WIN_MB_LEFT_XPOS,
598 DY+ED_WIN_MB_LEFT_YPOS,
599 el2gfx(new_element1));
600 DrawMiniGraphicExtHiRes(drawto,gc,
601 DX+ED_WIN_MB_MIDDLE_XPOS,
602 DY+ED_WIN_MB_MIDDLE_YPOS,
603 el2gfx(new_element2));
604 DrawMiniGraphicExtHiRes(drawto,gc,
605 DX+ED_WIN_MB_RIGHT_XPOS,
606 DY+ED_WIN_MB_RIGHT_YPOS,
607 el2gfx(new_element3));
608 redraw_mask |= REDRAW_DOOR_1;
613 if (edit_mode) /********** EDIT-FENSTER **********/
615 switch(CheckEditButtons(mx,my,button))
618 CloseDoor(DOOR_CLOSE_2);
620 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
621 DOOR_GFX_PAGEX4,DOOR_GFX_PAGEY1+80,
623 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
624 OpenDoor(DOOR_OPEN_2);
628 AreYouSure("Caution ! Flood fill mode ! Choose area !",AYS_OPEN);
629 use_floodfill = TRUE;
635 if (lev_fieldx<2*SCR_FIELDX-2)
638 level_xpos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
642 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT);
644 DrawMiniLevel(level_xpos,level_ypos);
649 case ED_BUTTON_RIGHT:
650 if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
652 if (lev_fieldx<2*SCR_FIELDX-2)
655 level_xpos += (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
656 if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
657 level_xpos = lev_fieldx-2*SCR_FIELDX+1;
659 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT);
661 DrawMiniLevel(level_xpos,level_ypos);
669 if (lev_fieldy<2*SCR_FIELDY-2)
672 level_ypos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
676 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN);
678 DrawMiniLevel(level_xpos,level_ypos);
684 if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
686 if (lev_fieldy<2*SCR_FIELDY-2)
689 level_ypos += (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
690 if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
691 level_ypos = lev_fieldy-2*SCR_FIELDY+1;
693 ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP);
695 DrawMiniLevel(level_xpos,level_ypos);
704 if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
708 if (button && !motion_status)
709 in_field_pressed = TRUE;
711 if (!button || !in_field_pressed || button<1 || button>3 ||
712 (y==0 && level_ypos<0) ||
713 (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY) ||
714 (x==0 && level_xpos<0) ||
715 (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
716 x>lev_fieldx || y>lev_fieldy)
719 new_element = (button==1 ? new_element1 :
720 button==2 ? new_element2 :
721 button==3 ? new_element3 : 0);
723 if (new_element != Feld[x+level_xpos][y+level_ypos])
725 if (new_element==EL_SPIELFIGUR) /* Jeder nur EINE Figur bitte... */
729 for(x=0;x<lev_fieldx;x++) for(y=0;y<lev_fieldy;y++)
731 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
733 Feld[x][y] = EL_LEERRAUM;
734 if (x-level_xpos>=0 && x-level_xpos<2*SCR_FIELDX &&
735 y-level_ypos>=0 && y-level_ypos<2*SCR_FIELDY)
736 DrawMiniElement(x-level_xpos,y-level_ypos,EL_LEERRAUM);
741 Feld[x+level_xpos][y+level_ypos] = new_element;
742 DrawMiniElement(x,y,new_element);
745 else if (!motion_status) /* Mauszeiger nicht im Level-Feld */
746 in_field_pressed = FALSE;
748 else /********** KONTROLL-FENSTER **********/
750 static long choice_delay = 0;
751 int choice = CheckCountButtons(mx,my,button);
752 int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
754 if (choice>=0 && choice<36 && DelayReached(&choice_delay,10))
763 level.score[choice] += step;
764 if (level.score[choice]<0)
765 level.score[choice] = 0;
766 else if (level.score[choice]>255)
767 level.score[choice] = 255;
771 level.tempo_amoebe += step;
772 if (level.tempo_amoebe<0)
773 level.tempo_amoebe = 0;
774 else if (level.tempo_amoebe>255)
775 level.tempo_amoebe = 255;
779 level.dauer_sieb += step;
780 if (level.dauer_sieb<0)
781 level.dauer_sieb = 0;
782 else if (level.dauer_sieb>255)
783 level.dauer_sieb = 255;
787 level.dauer_ablenk += step;
788 if (level.dauer_ablenk<0)
789 level.dauer_ablenk = 0;
790 else if (level.dauer_ablenk>255)
791 level.dauer_ablenk = 255;
795 level.edelsteine += step;
796 if (level.edelsteine<0)
797 level.edelsteine = 0;
798 else if (level.edelsteine>999)
799 level.edelsteine = 999;
806 else if (level.time>999)
812 if (lev_fieldx<MIN_LEV_FIELDX)
813 lev_fieldx = MIN_LEV_FIELDX;
814 else if (lev_fieldx>MAX_LEV_FIELDX)
815 lev_fieldx = MAX_LEV_FIELDX;
816 level.fieldx = lev_fieldx;
821 if (lev_fieldy<MIN_LEV_FIELDY)
822 lev_fieldy = MIN_LEV_FIELDY;
823 else if (lev_fieldy>MAX_LEV_FIELDY)
824 lev_fieldy = MAX_LEV_FIELDY;
825 level.fieldy = lev_fieldy;
829 DrawText(ED_COUNT_VALUE_XPOS,
830 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
831 int2str(level.score[choice],3),FS_SMALL,FC_YELLOW);
833 DrawText(ED_COUNT_VALUE_XPOS,
834 ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
835 int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
837 DrawText(ED_COUNT_VALUE_XPOS,
838 ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
839 int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
841 DrawText(ED_COUNT_VALUE_XPOS,
842 ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
843 int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
845 DrawText(ED_COUNT_VALUE_XPOS,
846 ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
847 int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
849 DrawText(ED_COUNT_VALUE_XPOS,
850 ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
851 int2str(level.time,3),FS_SMALL,FC_YELLOW);
853 DrawText(ED_SIZE_VALUE_XPOS,
854 ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
855 int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
857 DrawText(ED_SIZE_VALUE_XPOS,
858 ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
859 int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
861 redraw_mask &= ~REDRAW_FIELD;
863 XCopyArea(display,drawto,window,gc,
865 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
866 3*FONT2_XSIZE,FONT2_YSIZE,
868 ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE);
870 XCopyArea(display,drawto,window,gc,
872 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE,
873 3*FONT2_XSIZE,FONT2_YSIZE,
875 ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE);
879 switch(CheckCtrlButtons(mx,my,button))
882 CloseDoor(DOOR_CLOSE_2);
883 AdjustLevelScrollPosition();
884 DrawMiniLevel(level_xpos,level_ypos);
885 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
886 DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
888 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
889 OpenDoor(DOOR_OPEN_2);
892 case ED_BUTTON_CLEAR:
893 if (AreYouSure("Are you sure to clear this level ?",AYS_ASK))
895 for(x=0;x<MAX_LEV_FIELDX;x++)
896 for(y=0;y<MAX_LEV_FIELDY;y++)
897 Feld[x][y] = EL_ERDREICH;
898 DrawMiniLevel(level_xpos,level_ypos);
902 if (AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN))
904 CloseDoor(DOOR_CLOSE_BOTH);
905 game_status=MAINMENU;
910 CloseDoor(DOOR_CLOSE_1);
911 OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
916 int figur_vorhanden = FALSE;
917 for(y=0;y<lev_fieldy;y++)
918 for(x=0;x<lev_fieldx;x++)
919 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
920 figur_vorhanden = TRUE;
922 if (!figur_vorhanden)
923 AreYouSure("No Level without Gregor Mc Duffin please !",
927 if (AreYouSure("Save this level and kill the old ?",
928 AYS_ASK | AYS_STAY_OPEN))
930 for(x=0;x<lev_fieldx;x++)
931 for(y=0;y<lev_fieldy;y++)
935 CloseDoor(DOOR_CLOSE_BOTH);
936 game_status=MAINMENU;
945 if (mx>=ED_COUNT_GADGET_XPOS &&
946 mx<ED_COUNT_GADGET_XPOS+31*FONT2_XSIZE+10 &&
947 my>=ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE &&
948 my<ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE+ED_WIN_COUNT_YSIZE)
953 DrawText(ED_COUNT_GADGET_XPOS+5,
954 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
955 level.name,FS_SMALL,FC_GREEN);
956 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
957 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
958 "<",FS_SMALL,FC_RED);
966 DrawText(ED_COUNT_GADGET_XPOS+5,
967 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
968 level.name,FS_SMALL,FC_YELLOW);
969 DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
970 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
971 " ",FS_SMALL,FC_RED);
975 if (mx>=SX+29*MINI_TILEX && mx<SX+30*MINI_TILEX &&
976 my>=SY+26*MINI_TILEY && my<SY+27*MINI_TILEY)
980 if (!button || button<1 || button>3)
983 new_element = (button==1 ? new_element1 :
984 button==2 ? new_element2 :
985 button==3 ? new_element3 : 0);
987 if (new_element != level.amoebe_inhalt)
989 level.amoebe_inhalt = new_element;
990 DrawMiniElement(29,26,new_element);
994 if (mx>=SX+1*MINI_TILEX && mx<SX+(1+4*5)*MINI_TILEX &&
995 my>=SY+2*MINI_TILEY && my<SY+(2+3)*MINI_TILEY)
997 int x = (mx-SX-1*MINI_TILEX)/MINI_TILEX;
998 int y = (my-SY-2*MINI_TILEY)/MINI_TILEY;
1003 if (i>=0 && i<43 && x>=0 && x<3 && y>=0 && y<3)
1005 if (button && !motion_status)
1006 in_field_pressed = TRUE;
1008 if (!button || !in_field_pressed || button<1 || button>3)
1011 new_element = (button==1 ? new_element1 :
1012 button==2 ? new_element2 :
1013 button==3 ? new_element3 : 0);
1015 if (new_element != level.mampfer_inhalt[i][x][y])
1017 level.mampfer_inhalt[i][x][y] = new_element;
1018 DrawMiniElement(1+5*i+x,2+y,new_element);
1021 else if (!motion_status)/* Mauszeiger nicht im Cruncher-Feld */
1022 in_field_pressed = FALSE;
1024 else if (!motion_status) /* Mauszeiger nicht im Cruncher-Feld */
1025 in_field_pressed = FALSE;
1029 last_button = button;
1034 void LevelNameTyping(KeySym key)
1036 unsigned char ascii = 0;
1037 int len = strlen(level.name);
1042 if (key>=XK_A && key<=XK_Z)
1043 ascii = 'A'+(char)(key-XK_A);
1044 else if (key>=XK_a && key<=XK_z)
1045 ascii = 'a'+(char)(key-XK_a);
1046 else if (key>=XK_0 && key<=XK_9)
1047 ascii = '0'+(char)(key-XK_0);
1049 else if (key>=XK_space && key<=XK_at)
1050 ascii = ' '+(char)(key-XK_space);
1051 else if (key==XK_Adiaeresis)
1053 else if (key==XK_Odiaeresis)
1055 else if (key==XK_Udiaeresis)
1057 else if (key==XK_adiaeresis)
1059 else if (key==XK_odiaeresis)
1061 else if (key==XK_udiaeresis)
1063 else if (key==XK_underscore)
1067 if (ascii && len<MAX_LEVNAMLEN-2)
1069 level.name[len] = ascii;
1070 level.name[len+1] = 0;
1073 DrawTextExt(drawto,gc,
1074 ED_COUNT_GADGET_XPOS+5,
1075 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1076 level.name,FS_SMALL,FC_GREEN);
1077 DrawTextExt(window,gc,
1078 ED_COUNT_GADGET_XPOS+5,
1079 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1080 level.name,FS_SMALL,FC_GREEN);
1081 DrawTextExt(drawto,gc,
1082 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1083 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1084 "<",FS_SMALL,FC_RED);
1085 DrawTextExt(window,gc,
1086 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1087 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1088 "<",FS_SMALL,FC_RED);
1090 else if (key==XK_Delete && len>0)
1092 level.name[len-1] = 0;
1095 DrawTextExt(drawto,gc,
1096 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1097 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1098 "< ",FS_SMALL,FC_GREEN);
1099 DrawTextExt(window,gc,
1100 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1101 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1102 "< ",FS_SMALL,FC_GREEN);
1104 else if (key==XK_Return)
1106 DrawTextExt(drawto,gc,
1107 ED_COUNT_GADGET_XPOS+5,
1108 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1109 level.name,FS_SMALL,FC_YELLOW);
1110 DrawTextExt(window,gc,
1111 ED_COUNT_GADGET_XPOS+5,
1112 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1113 level.name,FS_SMALL,FC_YELLOW);
1114 DrawTextExt(drawto,gc,
1115 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1116 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1117 " ",FS_SMALL,FC_YELLOW);
1118 DrawTextExt(window,gc,
1119 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1120 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1121 " ",FS_SMALL,FC_YELLOW);
1123 name_typing = FALSE;