rnd-19981204-2
[rocksndiamonds.git] / src / editor.c
1 /***********************************************************
2 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
3 *----------------------------------------------------------*
4 *  (c) 1995-98 Artsoft Entertainment                       *
5 *              Holger Schemel                              *
6 *              Oststrasse 11a                              *
7 *              33604 Bielefeld                             *
8 *              phone: ++49 +521 290471                     *
9 *              email: aeglos@valinor.owl.de                *
10 *----------------------------------------------------------*
11 *  editor.c                                                *
12 ***********************************************************/
13
14 #include "editor.h"
15 #include "screens.h"
16 #include "tools.h"
17 #include "misc.h"
18 #include "buttons.h"
19 #include "files.h"
20
21 /* positions in the level editor */
22 #define ED_WIN_MB_LEFT_XPOS     7
23 #define ED_WIN_MB_LEFT_YPOS     6
24 #define ED_WIN_LEVELNR_XPOS     77
25 #define ED_WIN_LEVELNR_YPOS     7
26 #define ED_WIN_MB_MIDDLE_XPOS   7
27 #define ED_WIN_MB_MIDDLE_YPOS   258
28 #define ED_WIN_MB_RIGHT_XPOS    77
29 #define ED_WIN_MB_RIGHT_YPOS    258
30
31 /* other constants for the editor */
32 #define ED_SCROLL_NO            0
33 #define ED_SCROLL_LEFT          1
34 #define ED_SCROLL_RIGHT         2
35 #define ED_SCROLL_UP            4
36 #define ED_SCROLL_DOWN          8
37
38 /* delay value to avoid too fast scrolling etc. */
39 #define CHOICE_DELAY_VALUE      100
40
41 static int level_xpos,level_ypos;
42 static boolean edit_mode;
43 static boolean name_typing;
44 static int new_element1 = EL_MAUERWERK;
45 static int new_element2 = EL_LEERRAUM;
46 static int new_element3 = EL_ERDREICH;
47
48 int element_shift;
49 int editor_element[] =
50 {
51   EL_CHAR_A + ('B' - 'A'),
52   EL_CHAR_A + ('O' - 'A'),
53   EL_CHAR_A + ('U' - 'A'),
54   EL_CHAR_A + ('L' - 'A'),
55
56   EL_CHAR_MINUS,
57   EL_CHAR_A + ('D' - 'A'),
58   EL_CHAR_A + ('E' - 'A'),
59   EL_CHAR_A + ('R' - 'A'),
60
61   EL_CHAR_A + ('D' - 'A'),
62   EL_CHAR_A + ('A' - 'A'),
63   EL_CHAR_A + ('S' - 'A'),
64   EL_CHAR_A + ('H' - 'A'),
65
66   EL_SPIELFIGUR,
67   EL_LEERRAUM,
68   EL_ERDREICH,
69   EL_BETON,
70
71   EL_FELSBODEN,
72   EL_SIEB2_LEER,
73   EL_AUSGANG_ZU,
74   EL_AUSGANG_AUF,
75
76   EL_EDELSTEIN_BD,
77   EL_BUTTERFLY_O,
78   EL_FIREFLY_O,
79   EL_FELSBROCKEN,
80
81   EL_BUTTERFLY_L,
82   EL_FIREFLY_L,
83   EL_BUTTERFLY_R,
84   EL_FIREFLY_R,
85
86   EL_AMOEBE_BD,
87   EL_BUTTERFLY_U,
88   EL_FIREFLY_U,
89   EL_LEERRAUM,
90
91   EL_CHAR_A + ('E' - 'A'),
92   EL_CHAR_A + ('M' - 'A'),
93   EL_CHAR_A + ('E' - 'A'),
94   EL_CHAR_MINUS,
95
96   EL_CHAR_A + ('R' - 'A'),
97   EL_CHAR_A + ('A' - 'A'),
98   EL_CHAR_A + ('L' - 'A'),
99   EL_CHAR_A + ('D' - 'A'),
100
101   EL_CHAR_A + ('M' - 'A'),
102   EL_CHAR_A + ('I' - 'A'),
103   EL_CHAR_A + ('N' - 'A'),
104   EL_CHAR_A + ('E' - 'A'),
105
106   EL_SPIELER1,
107   EL_SPIELER2,
108   EL_SPIELER3,
109   EL_SPIELER4,
110
111   EL_SPIELFIGUR,
112   EL_LEERRAUM,
113   EL_ERDREICH,
114   EL_FELSBROCKEN,
115
116   EL_BETON,
117   EL_MAUERWERK,
118   EL_FELSBODEN,
119   EL_SIEB_LEER,
120
121   EL_EDELSTEIN,
122   EL_DIAMANT,
123   EL_KOKOSNUSS,
124   EL_BOMBE,
125
126   EL_ERZ_EDEL,
127   EL_ERZ_DIAM,
128   EL_MORAST_LEER,
129   EL_MORAST_VOLL,
130
131   EL_DYNAMIT_AUS,
132   EL_DYNAMIT,
133   EL_AUSGANG_ZU,
134   EL_AUSGANG_AUF,
135
136   EL_MAMPFER,
137   EL_KAEFER_O,
138   EL_FLIEGER_O,
139   EL_ROBOT,
140
141   EL_KAEFER_L,
142   EL_FLIEGER_L,
143   EL_KAEFER_R,
144   EL_FLIEGER_R,
145
146   EL_ABLENK_AUS,
147   EL_KAEFER_U,
148   EL_FLIEGER_U,
149   EL_UNSICHTBAR,
150
151   EL_BADEWANNE1,
152   EL_SALZSAEURE,
153   EL_BADEWANNE2,
154   EL_LEERRAUM,
155
156   EL_BADEWANNE3,
157   EL_BADEWANNE4,
158   EL_BADEWANNE5,
159   EL_LEERRAUM,
160
161   EL_TROPFEN,
162   EL_AMOEBE_TOT,
163   EL_AMOEBE_NASS,
164   EL_AMOEBE_NORM,
165
166   EL_SCHLUESSEL1,
167   EL_SCHLUESSEL2,
168   EL_SCHLUESSEL3,
169   EL_SCHLUESSEL4,
170
171   EL_PFORTE1,
172   EL_PFORTE2,
173   EL_PFORTE3,
174   EL_PFORTE4,
175
176   EL_PFORTE1X,
177   EL_PFORTE2X,
178   EL_PFORTE3X,
179   EL_PFORTE4X,
180
181   EL_CHAR_A + ('M' - 'A'),
182   EL_CHAR_A + ('O' - 'A'),
183   EL_CHAR_A + ('R' - 'A'),
184   EL_CHAR_A + ('E' - 'A'),
185
186   EL_PFEIL_L,
187   EL_PFEIL_R,
188   EL_PFEIL_O,
189   EL_PFEIL_U,
190
191   EL_AMOEBE_VOLL,
192   EL_EDELSTEIN_GELB,
193   EL_EDELSTEIN_ROT,
194   EL_EDELSTEIN_LILA,
195
196   EL_ERZ_EDEL_BD,
197   EL_ERZ_EDEL_GELB,
198   EL_ERZ_EDEL_ROT,
199   EL_ERZ_EDEL_LILA,
200
201   EL_LIFE,
202   EL_PACMAN_O,
203   EL_ZEIT_VOLL,
204   EL_ZEIT_LEER,
205
206   EL_PACMAN_L,
207   EL_MAMPFER2,
208   EL_PACMAN_R,
209   EL_MAUER_LEBT,
210
211   EL_LIFE_ASYNC,
212   EL_PACMAN_U,
213   EL_BIRNE_AUS,
214   EL_BIRNE_EIN,
215
216   EL_DYNABOMB_NR,
217   EL_DYNABOMB_SZ,
218   EL_DYNABOMB_XL,
219   EL_BADEWANNE,
220
221   EL_MAULWURF,
222   EL_PINGUIN,
223   EL_SCHWEIN,
224   EL_DRACHE,
225
226   EL_SONDE,
227   EL_MAUER_X,
228   EL_MAUER_Y,
229   EL_MAUER_XY,
230
231   EL_CHAR_A + ('S' - 'A'),
232   EL_CHAR_A + ('O' - 'A'),
233   EL_CHAR_A + ('K' - 'A'),
234   EL_CHAR_A + ('O' - 'A'),
235
236   EL_CHAR_MINUS,
237   EL_CHAR_A + ('B' - 'A'),
238   EL_CHAR_A + ('A' - 'A'),
239   EL_CHAR_A + ('N' - 'A'),
240
241   EL_SOKOBAN_OBJEKT,
242   EL_SOKOBAN_FELD_LEER,
243   EL_SOKOBAN_FELD_VOLL,
244   EL_BETON,
245
246 /*
247   EL_CHAR_A + ('D' - 'A'),
248   EL_CHAR_A + ('Y' - 'A'),
249   EL_CHAR_A + ('N' - 'A'),
250   EL_CHAR_A + ('A' - 'A'),
251
252   EL_CHAR_A + ('B' - 'A'),
253   EL_CHAR_A + ('L' - 'A'),
254   EL_CHAR_A + ('A' - 'A'),
255   EL_CHAR_A + ('S' - 'A'),
256
257   EL_CHAR_MINUS,
258   EL_CHAR_A + ('T' - 'A'),
259   EL_CHAR_A + ('E' - 'A'),
260   EL_CHAR_A + ('R' - 'A'),
261 */
262
263   EL_LEERRAUM,
264   EL_LEERRAUM,
265   EL_LEERRAUM,
266   EL_LEERRAUM,
267
268   EL_CHAR_AUSRUF,
269   EL_CHAR_ZOLL,
270   EL_CHAR_DOLLAR,
271   EL_CHAR_PROZ,
272
273   EL_CHAR_APOSTR,
274   EL_CHAR_KLAMM1,
275   EL_CHAR_KLAMM2,
276   EL_CHAR_PLUS,
277
278   EL_CHAR_KOMMA,
279   EL_CHAR_MINUS,
280   EL_CHAR_PUNKT,
281   EL_CHAR_SLASH,
282
283   EL_CHAR_0 + 0,
284   EL_CHAR_0 + 1,
285   EL_CHAR_0 + 2,
286   EL_CHAR_0 + 3,
287
288   EL_CHAR_0 + 4,
289   EL_CHAR_0 + 5,
290   EL_CHAR_0 + 6,
291   EL_CHAR_0 + 7,
292
293   EL_CHAR_0 + 8,
294   EL_CHAR_0 + 9,
295   EL_CHAR_DOPPEL,
296   EL_CHAR_SEMIKL,
297
298   EL_CHAR_LT,
299   EL_CHAR_GLEICH,
300   EL_CHAR_GT,
301   EL_CHAR_FRAGE,
302
303   EL_CHAR_AT,
304   EL_CHAR_A + 0,
305   EL_CHAR_A + 1,
306   EL_CHAR_A + 2,
307
308   EL_CHAR_A + 3,
309   EL_CHAR_A + 4,
310   EL_CHAR_A + 5,
311   EL_CHAR_A + 6,
312
313   EL_CHAR_A + 7,
314   EL_CHAR_A + 8,
315   EL_CHAR_A + 9,
316   EL_CHAR_A + 10,
317
318   EL_CHAR_A + 11,
319   EL_CHAR_A + 12,
320   EL_CHAR_A + 13,
321   EL_CHAR_A + 14,
322
323   EL_CHAR_A + 15,
324   EL_CHAR_A + 16,
325   EL_CHAR_A + 17,
326   EL_CHAR_A + 18,
327
328   EL_CHAR_A + 19,
329   EL_CHAR_A + 20,
330   EL_CHAR_A + 21,
331   EL_CHAR_A + 22,
332
333   EL_CHAR_A + 23,
334   EL_CHAR_A + 24,
335   EL_CHAR_A + 25,
336   EL_CHAR_AE,
337
338   EL_CHAR_OE,
339   EL_CHAR_UE,
340   EL_CHAR_COPY
341 };
342 int elements_in_list = sizeof(editor_element)/sizeof(int);
343
344 void DrawLevelEd()
345 {
346   int i, graphic;
347
348   level_xpos=-1;
349   level_ypos=-1;
350   edit_mode = TRUE;
351   name_typing = FALSE;
352   element_shift = 0;
353
354   CloseDoor(DOOR_CLOSE_2);
355
356   DrawMiniLevel(level_xpos,level_ypos);
357   FadeToFront();
358
359   XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
360             DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
361             DXSIZE,DYSIZE,
362             DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
363   XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
364             DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
365             DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
366             4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
367             DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
368             DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
369
370   for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
371   {
372     if (i < elements_in_list)
373       graphic = el2gfx(editor_element[i]);
374     else
375       graphic = GFX_LEERRAUM;
376
377     DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
378                        DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 + 
379                        (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
380                        DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
381                        (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
382                        graphic);
383   }
384
385   DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
386                      DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
387                      DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
388                      el2gfx(new_element1));
389   DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
390                      DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
391                      DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
392                      el2gfx(new_element2));
393   DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
394                      DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
395                      DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
396                      el2gfx(new_element3));
397   DrawTextExt(pix[PIX_DB_DOOR],gc,
398               DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
399               DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
400               int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
401   XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
402             DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
403             DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
404             7,FONT3_YSIZE,
405             DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
406             DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
407   XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
408             DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
409             DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
410             7,FONT3_YSIZE,
411             DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
412             DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
413
414   XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
415             DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
416             VXSIZE,VYSIZE,
417             DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
418
419   OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
420 }
421
422 void DrawControlWindow()
423 {
424   int i,x,y;
425
426   ClearWindow();
427
428   /* Inhalt der Mampfer */
429   DrawText(ED_COUNT_GADGET_XPOS+1,SY+6,
430            "Contents of a smashed cruncher:",FS_SMALL,FC_YELLOW);
431   for(i=0;i<4;i++) for(y=0;y<4;y++) for(x=0;x<4;x++)
432   {
433     DrawMiniElement(1+5*i+x,2+y,EL_ERDREICH);
434     XFillRectangle(display,drawto,gc,
435                    SX+(1+5*i)*MINI_TILEX+MINI_TILEX/2-1,
436                    SY+(2)*MINI_TILEY+MINI_TILEY/2-1,
437                    3*MINI_TILEX+2,3*MINI_TILEY+2);
438   }
439   XCopyArea(display,drawto,drawto,gc,
440             SX+1*MINI_TILEX,SY+2*MINI_TILEY,
441             4*5*MINI_TILEX,5*MINI_TILEY,
442             SX+1*MINI_TILEX-MINI_TILEX/2,SY+2*MINI_TILEY-MINI_TILEY/2);
443   for(i=0;i<4;i++)
444   {
445     for(y=0;y<3;y++) for(x=0;x<3;x++)
446       DrawMiniElement(1+5*i+x,2+y,level.mampfer_inhalt[i][x][y]);
447
448     DrawText(SX+MINI_TILEX+(5*i+1)*MINI_TILEX+1,
449              SY+2*MINI_TILEY+(4)*MINI_TILEY-4,
450              int2str(i+1,1),FS_SMALL,FC_YELLOW);
451   }
452
453   /* Inhalt der Amöbe */
454   for(y=0;y<2;y++) for(x=0;x<2;x++)
455   {
456     DrawMiniElement(29+x,26+y,EL_ERDREICH);
457     XFillRectangle(display,drawto,gc,
458                    SX+29*MINI_TILEX+MINI_TILEX/2-1,
459                    SY+26*MINI_TILEY+MINI_TILEY/2-1,
460                    MINI_TILEX+2,MINI_TILEY+2);
461   }
462   XCopyArea(display,drawto,drawto,gc,
463             SX+29*MINI_TILEX,SY+26*MINI_TILEY,
464             3*MINI_TILEX,3*MINI_TILEY,
465             SX+29*MINI_TILEX-MINI_TILEX/2,SY+26*MINI_TILEY-MINI_TILEY/2);
466   DrawMiniElement(29,26,level.amoebe_inhalt);
467
468   for(i=0;i<11+3+2;i++)
469   {
470     XCopyArea(display,pix[PIX_DOOR],drawto,gc,
471               DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
472               DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
473               DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
474               ED_COUNT_GADGET_XPOS,
475               ED_COUNT_GADGET_YPOS+i*ED_COUNT_GADGET_YSIZE);
476
477     if (i<11)
478       DrawText(ED_COUNT_VALUE_XPOS,
479                ED_COUNT_VALUE_YPOS+i*ED_COUNT_GADGET_YSIZE,
480                int2str(level.score[i],3),FS_SMALL,FC_YELLOW);
481     else if (i==11)
482       DrawText(ED_COUNT_VALUE_XPOS,
483                ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
484                int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
485     else if (i==12)
486       DrawText(ED_COUNT_VALUE_XPOS,
487                ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
488                int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
489     else if (i==13)
490       DrawText(ED_COUNT_VALUE_XPOS,
491                ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
492                int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
493     else if (i==14)
494       DrawText(ED_COUNT_VALUE_XPOS,
495                ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
496                int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
497     else if (i==15)
498       DrawText(ED_COUNT_VALUE_XPOS,
499                ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
500                int2str(level.time,3),FS_SMALL,FC_YELLOW);
501   }
502
503   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+0*ED_COUNT_TEXT_YSIZE,
504            "Score for Emerald",FS_SMALL,FC_YELLOW);
505   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+1*ED_COUNT_TEXT_YSIZE,
506            "Score for Diamond",FS_SMALL,FC_YELLOW);
507   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+2*ED_COUNT_TEXT_YSIZE,
508            "Score for smashing a Bug",FS_SMALL,FC_YELLOW);
509   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+3*ED_COUNT_TEXT_YSIZE,
510            "Score for smashing a Spaceship",FS_SMALL,FC_YELLOW);
511   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+4*ED_COUNT_TEXT_YSIZE,
512            "Score for smashing a Cruncher",FS_SMALL,FC_YELLOW);
513   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+5*ED_COUNT_TEXT_YSIZE,
514            "Score for smashing an Alien",FS_SMALL,FC_YELLOW);
515   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+6*ED_COUNT_TEXT_YSIZE,
516            "Score for smashing a Pacman",FS_SMALL,FC_YELLOW);
517   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+7*ED_COUNT_TEXT_YSIZE,
518            "Score for cracking a nut",FS_SMALL,FC_YELLOW);
519   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+8*ED_COUNT_TEXT_YSIZE,
520            "Score for dynamite",FS_SMALL,FC_YELLOW);
521   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+9*ED_COUNT_TEXT_YSIZE,
522            "Score for key",FS_SMALL,FC_YELLOW);
523   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+10*ED_COUNT_TEXT_YSIZE,
524            "Score for each 10 seconds left",FS_SMALL,FC_YELLOW);
525   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+11*ED_COUNT_TEXT_YSIZE,
526            "Speed of the amoeba / Content",FS_SMALL,FC_YELLOW);
527   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+12*ED_COUNT_TEXT_YSIZE,
528            "Time for magic wall",FS_SMALL,FC_YELLOW);
529   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+13*ED_COUNT_TEXT_YSIZE,
530            "Time for wheel",FS_SMALL,FC_YELLOW);
531   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+14*ED_COUNT_TEXT_YSIZE,
532            "Emeralds needed in this level",FS_SMALL,FC_YELLOW);
533   DrawText(ED_COUNT_TEXT_XPOS,ED_COUNT_TEXT_YPOS+15*ED_COUNT_TEXT_YSIZE,
534            "Time available for this level",FS_SMALL,FC_YELLOW);
535
536   XCopyArea(display,pix[PIX_DOOR],drawto,gc,
537             DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS,
538             DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
539             ED_WIN_COUNT_XSIZE,ED_WIN_COUNT_YSIZE,
540             ED_COUNT_GADGET_XPOS,
541             ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
542   for(i=1;i<31;i++)
543     XCopyArea(display,pix[PIX_DOOR],drawto,gc,
544               DOOR_GFX_PAGEX4+ED_WIN_COUNT_XPOS+3+2*FONT2_XSIZE,
545               DOOR_GFX_PAGEY1+ED_WIN_COUNT_YPOS,
546               ED_WIN_COUNT_XSIZE-3-2*FONT2_XSIZE,ED_WIN_COUNT_YSIZE,
547               ED_COUNT_GADGET_XPOS+3+i*FONT2_XSIZE,
548               ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE);
549   DrawText(ED_COUNT_GADGET_XPOS+5,
550            ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
551            level.name,FS_SMALL,FC_YELLOW);
552   DrawText(ED_COUNT_GADGET_XPOS+(30+3)*FONT2_XSIZE-5,
553            ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
554            "Title",FS_SMALL,FC_YELLOW);
555
556   DrawText(ED_SIZE_GADGET_XPOS,ED_SIZE_GADGET_YPOS-18,
557            "Playfield size:",FS_SMALL,FC_YELLOW);
558   XCopyArea(display,pix[PIX_DOOR],drawto,gc,
559             DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
560             DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
561             DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
562             ED_SIZE_GADGET_XPOS,
563             ED_SIZE_GADGET_YPOS+0*ED_COUNT_GADGET_YSIZE);
564   XCopyArea(display,pix[PIX_DOOR],drawto,gc,
565             DOOR_GFX_PAGEX4+ED_BUTTON_MINUS_XPOS,
566             DOOR_GFX_PAGEY1+ED_BUTTON_MINUS_YPOS,
567             DXSIZE-4,ED_BUTTON_MINUS_YSIZE,
568             ED_SIZE_GADGET_XPOS,
569             ED_SIZE_GADGET_YPOS+1*ED_COUNT_GADGET_YSIZE);
570   DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+0*ED_SIZE_TEXT_YSIZE,
571            "Width",FS_SMALL,FC_YELLOW);
572   DrawText(ED_SIZE_TEXT_XPOS,ED_SIZE_TEXT_YPOS+1*ED_SIZE_TEXT_YSIZE,
573            "Height",FS_SMALL,FC_YELLOW);
574   DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
575            int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
576   DrawText(ED_SIZE_VALUE_XPOS,ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
577            int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
578 }
579
580 void ScrollMiniLevel(int from_x, int from_y, int scroll)
581 {
582   int x,y;
583   int dx = (scroll==ED_SCROLL_LEFT ? -1 : scroll==ED_SCROLL_RIGHT ? 1 : 0);
584   int dy = (scroll==ED_SCROLL_UP   ? -1 : scroll==ED_SCROLL_DOWN  ? 1 : 0);
585
586   XCopyArea(display,drawto,drawto,gc,
587             SX+MINI_TILEX*(dx==-1),SY+MINI_TILEY*(dy==-1),
588             SXSIZE-MINI_TILEX*ABS(dx),SYSIZE-MINI_TILEY*ABS(dy),
589             SX+MINI_TILEX*(dx==+1),SY+MINI_TILEY*(dy==+1));
590   if (dx)
591   {
592     x = (dx==1 ? 0 : 2*SCR_FIELDX-1);
593     for(y=0;y<2*SCR_FIELDY;y++)
594       DrawMiniElementOrWall(x,y,from_x,from_y);
595   }
596   else if (dy)
597   {
598     y = (dy==1 ? 0 : 2*SCR_FIELDY-1);
599     for(x=0;x<2*SCR_FIELDX;x++)
600       DrawMiniElementOrWall(x,y,from_x,from_y);
601   }
602
603   redraw_mask |= REDRAW_FIELD;
604   BackToFront();
605 }
606
607 void AdjustLevelScrollPosition()
608 {
609   if (level_xpos<-1)
610     level_xpos = -1;
611   if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
612     level_xpos = lev_fieldx-2*SCR_FIELDX+1;
613   if (lev_fieldx<2*SCR_FIELDX-2)
614     level_xpos = -1;
615
616   if (level_ypos<-1)
617     level_ypos = -1;
618   if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
619     level_ypos = lev_fieldy-2*SCR_FIELDY+1;
620   if (lev_fieldy<2*SCR_FIELDY-2)
621     level_ypos = -1;
622 }
623
624 void FloodFill(int from_x, int from_y, int fill_element)
625 {
626   int i,x,y;
627   int old_element;
628   static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} };
629   static int safety = 0;
630
631   /* check if starting field still has the desired content */
632   if (Feld[from_x][from_y] == fill_element)
633     return;
634
635   safety++;
636
637   if (safety > lev_fieldx*lev_fieldy)
638     Error(ERR_EXIT, "Something went wrong in 'FloodFill()'. Please debug.");
639
640   old_element = Feld[from_x][from_y];
641   Feld[from_x][from_y] = fill_element;
642
643   for(i=0;i<4;i++)
644   {
645     x = from_x + check[i][0];
646     y = from_y + check[i][1];
647
648     if (IN_LEV_FIELD(x,y) && Feld[x][y] == old_element)
649       FloodFill(x, y, fill_element);
650   }
651
652   safety--;
653 }
654
655 void LevelEd(int mx, int my, int button)
656 {
657   static int last_button = 0;
658   static int in_field_pressed = FALSE;
659   static boolean use_floodfill = FALSE;
660   int x = (mx-SX)/MINI_TILEX; 
661   int y = (my-SY)/MINI_TILEY; 
662
663   if (use_floodfill)            /********** FLOOD FILL **********/
664   {
665     if (button)
666     {
667       if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
668       {
669         int from_x, from_y;
670         int fill_element;
671
672         if (x>lev_fieldx || y>lev_fieldy ||
673             (x==0 && level_xpos<0) ||
674             (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
675             (y==0 && level_ypos<0) ||
676             (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY))
677           return;
678
679         from_x = x+level_xpos;
680         from_y = y+level_ypos;
681         fill_element = (button==1 ? new_element1 :
682                         button==2 ? new_element2 :
683                         button==3 ? new_element3 : 0);
684
685         FloodFill(from_x,from_y,fill_element);
686         DrawMiniLevel(level_xpos,level_ypos);
687       }
688
689       use_floodfill = FALSE;
690       CloseDoor(DOOR_CLOSE_1);
691       OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
692     }
693     return;
694   }
695   else                          /********** EDIT/CTRL-FENSTER **********/
696   {
697     static unsigned long choice_delay = 0;
698     int choice = CheckElemButtons(mx,my,button);
699     int elem_pos = choice-ED_BUTTON_ELEM;
700
701     if (((choice == ED_BUTTON_EUP && element_shift>0) ||
702          (choice == ED_BUTTON_EDOWN &&
703           element_shift<elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)) &&
704         DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
705     {
706       int i, step;
707
708       step = (button==1 ? MAX_ELEM_X : button==2 ? 5*MAX_ELEM_X :
709               elements_in_list);
710       element_shift += (choice==ED_BUTTON_EUP ? -step : step);
711       if (element_shift<0)
712         element_shift = 0;
713       if (element_shift>elements_in_list-MAX_ELEM_X*MAX_ELEM_Y)
714         element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y;
715       if (element_shift % MAX_ELEM_X)
716         element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X);
717
718       for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
719         DrawElemButton(i+2,ED_BUTTON_RELEASED);
720     }
721     else if (elem_pos>=0 && elem_pos<MAX_ELEM_X*MAX_ELEM_Y)
722     {
723       int new_element;
724
725       if (elem_pos+element_shift < elements_in_list)
726         new_element = editor_element[elem_pos+element_shift];
727       else
728         new_element = EL_LEERRAUM;
729
730       if (last_button==1)
731         new_element1 = new_element;
732       else if (last_button==2)
733         new_element2 = new_element;
734       else if (last_button==3)
735         new_element3 = new_element;
736
737       DrawMiniGraphicExt(drawto,gc,
738                          DX+ED_WIN_MB_LEFT_XPOS,
739                          DY+ED_WIN_MB_LEFT_YPOS,
740                          el2gfx(new_element1));
741       DrawMiniGraphicExt(drawto,gc,
742                          DX+ED_WIN_MB_MIDDLE_XPOS,
743                          DY+ED_WIN_MB_MIDDLE_YPOS,
744                          el2gfx(new_element2));
745       DrawMiniGraphicExt(drawto,gc,
746                          DX+ED_WIN_MB_RIGHT_XPOS,
747                          DY+ED_WIN_MB_RIGHT_YPOS,
748                          el2gfx(new_element3));
749       redraw_mask |= REDRAW_DOOR_1;
750     }
751   
752     if (edit_mode)              /********** EDIT-FENSTER **********/
753     {
754       switch(CheckEditButtons(mx,my,button))
755       {
756         case ED_BUTTON_CTRL:
757           CloseDoor(DOOR_CLOSE_2);
758           DrawControlWindow();
759           XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
760                     DOOR_GFX_PAGEX4,DOOR_GFX_PAGEY1+80,
761                     VXSIZE,VYSIZE,
762                     DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
763           OpenDoor(DOOR_OPEN_2);
764           edit_mode = FALSE;
765           break;
766         case ED_BUTTON_FILL:
767           Request("Caution ! Flood fill mode ! Choose area !",REQ_OPEN);
768           use_floodfill = TRUE;
769           return;
770           break;
771         case ED_BUTTON_LEFT:
772           if (level_xpos>=0)
773           {
774             if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
775               break;
776             if (lev_fieldx<2*SCR_FIELDX-2)
777               break;
778
779             level_xpos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
780             if (level_xpos<-1)
781               level_xpos = -1;
782             if (button==1)
783               ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT);
784             else
785               DrawMiniLevel(level_xpos,level_ypos);
786           }
787           break;
788         case ED_BUTTON_RIGHT:
789           if (level_xpos<=lev_fieldx-2*SCR_FIELDX)
790           {
791             if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
792               break;
793             if (lev_fieldx<2*SCR_FIELDX-2)
794               break;
795
796             level_xpos += (button==1 ? 1 : button==2 ? 5 : lev_fieldx);
797             if (level_xpos>lev_fieldx-2*SCR_FIELDX+1)
798               level_xpos = lev_fieldx-2*SCR_FIELDX+1;
799             if (button==1)
800               ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT);
801             else
802               DrawMiniLevel(level_xpos,level_ypos);
803           }
804           break;
805         case ED_BUTTON_UP:
806           if (level_ypos>=0)
807           {
808             if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
809               break;
810             if (lev_fieldy<2*SCR_FIELDY-2)
811               break;
812
813             level_ypos -= (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
814             if (level_ypos<-1)
815               level_ypos = -1;
816             if (button==1)
817               ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN);
818             else
819               DrawMiniLevel(level_xpos,level_ypos);
820           }
821           break;
822         case ED_BUTTON_DOWN:
823           if (level_ypos<=lev_fieldy-2*SCR_FIELDY)
824           {
825             if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
826               break;
827             if (lev_fieldy<2*SCR_FIELDY-2)
828               break;
829
830             level_ypos += (button==1 ? 1 : button==2 ? 5 : lev_fieldy);
831             if (level_ypos>lev_fieldy-2*SCR_FIELDY+1)
832               level_ypos = lev_fieldy-2*SCR_FIELDY+1;
833             if (button==1)
834               ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP);
835             else
836               DrawMiniLevel(level_xpos,level_ypos);
837           }
838           break;
839         default:
840           break;
841       }
842
843       if (mx>=SX && mx<SX+SXSIZE && my>=SY && my<SY+SYSIZE)
844       {
845         int new_element;
846
847         if (button && !motion_status)
848           in_field_pressed = TRUE;
849
850         if (!button || !in_field_pressed || button<1 || button>3 ||
851             (y==0 && level_ypos<0) ||
852             (y==2*SCR_FIELDY-1 && level_ypos>lev_fieldy-2*SCR_FIELDY) ||
853             (x==0 && level_xpos<0) ||
854             (x==2*SCR_FIELDX-1 && level_xpos>lev_fieldx-2*SCR_FIELDX) ||
855             x>lev_fieldx || y>lev_fieldy)
856           return;
857
858         new_element = (button==1 ? new_element1 :
859                        button==2 ? new_element2 :
860                        button==3 ? new_element3 : 0);
861
862         if (new_element != Feld[x+level_xpos][y+level_ypos])
863         {
864           if (new_element==EL_SPIELFIGUR) /* Jeder nur EINE Figur bitte... */
865           {
866             int x,y;
867
868             for(x=0;x<lev_fieldx;x++) for(y=0;y<lev_fieldy;y++)
869             {
870               if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1)
871               {
872                 Feld[x][y] = EL_LEERRAUM;
873                 if (x-level_xpos>=0 && x-level_xpos<2*SCR_FIELDX &&
874                     y-level_ypos>=0 && y-level_ypos<2*SCR_FIELDY)
875                   DrawMiniElement(x-level_xpos,y-level_ypos,EL_LEERRAUM);
876               }
877             }
878           }
879
880           Feld[x+level_xpos][y+level_ypos] = new_element;
881           DrawMiniElement(x,y,new_element);
882         }
883       }
884       else if (!motion_status)  /* Mauszeiger nicht im Level-Feld */
885         in_field_pressed = FALSE;
886     }
887     else                        /********** KONTROLL-FENSTER **********/
888     {
889       int choice = CheckCountButtons(mx,my,button);
890       int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0);
891
892       if (choice >= 0 && choice < 36 &&
893           DelayReached(&choice_delay, CHOICE_DELAY_VALUE))
894       {
895         if (!(choice % 2))
896           step = -step;
897
898         choice /= 2;
899
900         if (choice<11)
901         {
902           level.score[choice] += step;
903           if (level.score[choice]<0)
904             level.score[choice] = 0;
905           else if (level.score[choice]>255)
906             level.score[choice] = 255;
907         }
908         else if (choice==11)
909         {
910           level.tempo_amoebe += step;
911           if (level.tempo_amoebe<0)
912             level.tempo_amoebe = 0;
913           else if (level.tempo_amoebe>255)
914             level.tempo_amoebe = 255;
915         }
916         else if (choice==12)
917         {
918           level.dauer_sieb += step;
919           if (level.dauer_sieb<0)
920             level.dauer_sieb = 0;
921           else if (level.dauer_sieb>255)
922             level.dauer_sieb = 255;
923         }
924         else if (choice==13)
925         {
926           level.dauer_ablenk += step;
927           if (level.dauer_ablenk<0)
928             level.dauer_ablenk = 0;
929           else if (level.dauer_ablenk>255)
930             level.dauer_ablenk = 255;
931         }
932         else if (choice==14)
933         {
934           level.edelsteine += step;
935           if (level.edelsteine<0)
936             level.edelsteine = 0;
937           else if (level.edelsteine>999)
938             level.edelsteine = 999;
939         }
940         else if (choice==15)
941         {
942           level.time += step;
943           if (level.time<0)
944             level.time = 0;
945           else if (level.time>999)
946             level.time = 999;
947         }
948         else if (choice==16)
949         {
950           lev_fieldx += step;
951           if (lev_fieldx<MIN_LEV_FIELDX)
952             lev_fieldx = MIN_LEV_FIELDX;
953           else if (lev_fieldx>MAX_LEV_FIELDX)
954             lev_fieldx = MAX_LEV_FIELDX;
955           level.fieldx = lev_fieldx;
956         }
957         else if (choice==17)
958         {
959           lev_fieldy += step;
960           if (lev_fieldy<MIN_LEV_FIELDY)
961             lev_fieldy = MIN_LEV_FIELDY;
962           else if (lev_fieldy>MAX_LEV_FIELDY)
963             lev_fieldy = MAX_LEV_FIELDY;
964           level.fieldy = lev_fieldy;
965         }
966
967         if (choice<11)
968           DrawText(ED_COUNT_VALUE_XPOS,
969                    ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
970                    int2str(level.score[choice],3),FS_SMALL,FC_YELLOW);
971         else if (choice==11)
972           DrawText(ED_COUNT_VALUE_XPOS,
973                    ED_COUNT_VALUE_YPOS+11*ED_COUNT_GADGET_YSIZE,
974                    int2str(level.tempo_amoebe,3),FS_SMALL,FC_YELLOW);
975         else if (choice==12)
976           DrawText(ED_COUNT_VALUE_XPOS,
977                    ED_COUNT_VALUE_YPOS+12*ED_COUNT_GADGET_YSIZE,
978                    int2str(level.dauer_sieb,3),FS_SMALL,FC_YELLOW);
979         else if (choice==13)
980           DrawText(ED_COUNT_VALUE_XPOS,
981                    ED_COUNT_VALUE_YPOS+13*ED_COUNT_GADGET_YSIZE,
982                    int2str(level.dauer_ablenk,3),FS_SMALL,FC_YELLOW);
983         else if (choice==14)
984           DrawText(ED_COUNT_VALUE_XPOS,
985                    ED_COUNT_VALUE_YPOS+14*ED_COUNT_GADGET_YSIZE,
986                    int2str(level.edelsteine,3),FS_SMALL,FC_YELLOW);
987         else if (choice==15)
988           DrawText(ED_COUNT_VALUE_XPOS,
989                    ED_COUNT_VALUE_YPOS+15*ED_COUNT_GADGET_YSIZE,
990                    int2str(level.time,3),FS_SMALL,FC_YELLOW);
991         else if (choice==16)
992           DrawText(ED_SIZE_VALUE_XPOS,
993                    ED_SIZE_VALUE_YPOS+0*ED_SIZE_GADGET_YSIZE,
994                    int2str(level.fieldx,3),FS_SMALL,FC_YELLOW);
995         else if (choice==17)
996           DrawText(ED_SIZE_VALUE_XPOS,
997                    ED_SIZE_VALUE_YPOS+1*ED_SIZE_GADGET_YSIZE,
998                    int2str(level.fieldy,3),FS_SMALL,FC_YELLOW);
999
1000         redraw_mask &= ~REDRAW_FIELD;
1001         if (choice<16)
1002           XCopyArea(display,drawto,window,gc,
1003                     ED_COUNT_VALUE_XPOS,
1004                     ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE,
1005                     3*FONT2_XSIZE,FONT2_YSIZE,
1006                     ED_COUNT_VALUE_XPOS,
1007                     ED_COUNT_VALUE_YPOS+choice*ED_COUNT_GADGET_YSIZE);
1008         else
1009           XCopyArea(display,drawto,window,gc,
1010                     ED_SIZE_VALUE_XPOS,
1011                     ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE,
1012                     3*FONT2_XSIZE,FONT2_YSIZE,
1013                     ED_SIZE_VALUE_XPOS,
1014                     ED_SIZE_VALUE_YPOS+(choice-16)*ED_SIZE_GADGET_YSIZE);
1015         XFlush(display);
1016       }
1017
1018       switch(CheckCtrlButtons(mx,my,button))
1019       {
1020         case ED_BUTTON_EDIT:
1021           CloseDoor(DOOR_CLOSE_2);
1022           AdjustLevelScrollPosition();
1023           DrawMiniLevel(level_xpos,level_ypos);
1024           XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
1025                     DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
1026                     VXSIZE,VYSIZE,
1027                     DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
1028           OpenDoor(DOOR_OPEN_2);
1029           edit_mode = TRUE;
1030           break;
1031         case ED_BUTTON_CLEAR:
1032           if (Request("Are you sure to clear this level ?",REQ_ASK))
1033           {
1034             for(x=0;x<MAX_LEV_FIELDX;x++) 
1035               for(y=0;y<MAX_LEV_FIELDY;y++) 
1036                 Feld[x][y] = EL_ERDREICH;
1037             DrawMiniLevel(level_xpos,level_ypos);
1038           }
1039           break;
1040         case ED_BUTTON_UNDO:
1041           if (leveldir[leveldir_nr].readonly ||
1042               Request("Exit without saving ?",REQ_ASK | REQ_STAY_OPEN))
1043           {
1044             CloseDoor(DOOR_CLOSE_BOTH);
1045             game_status=MAINMENU;
1046             DrawMainMenu();
1047           }
1048           else
1049           {
1050             CloseDoor(DOOR_CLOSE_1);
1051             OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
1052           }
1053           break;
1054         case ED_BUTTON_EXIT:
1055           {
1056             int figur_vorhanden = FALSE;
1057
1058             if (leveldir[leveldir_nr].readonly)
1059             {
1060               Request("This level is read only !",REQ_CONFIRM);
1061               break;
1062             }
1063
1064             for(y=0;y<lev_fieldy;y++) 
1065               for(x=0;x<lev_fieldx;x++)
1066                 if (Feld[x][y]==EL_SPIELFIGUR || Feld[x][y]==EL_SPIELER1) 
1067                   figur_vorhanden = TRUE;
1068
1069             if (!figur_vorhanden)
1070               Request("No Level without Gregor Mc Duffin please !",
1071                          REQ_CONFIRM);
1072             else
1073             {
1074               if (Request("Save this level and kill the old ?",
1075                              REQ_ASK | REQ_STAY_OPEN))
1076               {
1077                 for(x=0;x<lev_fieldx;x++)
1078                   for(y=0;y<lev_fieldy;y++) 
1079                     Ur[x][y]=Feld[x][y];
1080                 SaveLevel(level_nr);
1081               }
1082               CloseDoor(DOOR_CLOSE_BOTH);
1083               game_status=MAINMENU;
1084               DrawMainMenu();
1085             }
1086           }
1087           break;
1088         default:
1089           break;
1090       }
1091
1092       if (mx>=ED_COUNT_GADGET_XPOS &&
1093           mx<ED_COUNT_GADGET_XPOS+31*FONT2_XSIZE+10 &&
1094           my>=ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE &&
1095           my<ED_COUNT_GADGET_YPOS+16*ED_COUNT_GADGET_YSIZE+ED_WIN_COUNT_YSIZE)
1096       {
1097         if (!name_typing)
1098         {
1099           name_typing = TRUE;
1100           DrawText(ED_COUNT_GADGET_XPOS+5,
1101                    ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1102                    level.name,FS_SMALL,FC_GREEN);
1103           DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1104                    ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1105                    "<",FS_SMALL,FC_RED);
1106         }
1107       }
1108       else
1109       {
1110         if (name_typing)
1111         {
1112           name_typing = FALSE;
1113           DrawText(ED_COUNT_GADGET_XPOS+5,
1114                    ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1115                    level.name,FS_SMALL,FC_YELLOW);
1116           DrawText(ED_COUNT_GADGET_XPOS+5+strlen(level.name)*FONT2_XSIZE,
1117                    ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1118                    " ",FS_SMALL,FC_RED);
1119         }
1120       }
1121
1122       if (mx>=SX+29*MINI_TILEX && mx<SX+30*MINI_TILEX &&
1123           my>=SY+26*MINI_TILEY && my<SY+27*MINI_TILEY)
1124       {
1125         int new_element;
1126
1127         if (!button || button<1 || button>3)
1128           return;
1129
1130         new_element = (button==1 ? new_element1 :
1131                        button==2 ? new_element2 :
1132                        button==3 ? new_element3 : 0);
1133
1134         if (new_element != level.amoebe_inhalt)
1135         {
1136           level.amoebe_inhalt = new_element;
1137           DrawMiniElement(29,26,new_element);
1138         }
1139       }
1140
1141       if (mx>=SX+1*MINI_TILEX && mx<SX+(1+4*5)*MINI_TILEX &&
1142           my>=SY+2*MINI_TILEY && my<SY+(2+3)*MINI_TILEY)
1143       {
1144         int x = (mx-SX-1*MINI_TILEX)/MINI_TILEX;
1145         int y = (my-SY-2*MINI_TILEY)/MINI_TILEY;
1146         int i = x/5;
1147         int new_element;
1148
1149         x = x-i*5;
1150         if (i>=0 && i<43 && x>=0 && x<3 && y>=0 && y<3)
1151         {
1152           if (button && !motion_status)
1153             in_field_pressed = TRUE;
1154
1155           if (!button || !in_field_pressed || button<1 || button>3)
1156             return;
1157
1158           new_element = (button==1 ? new_element1 :
1159                          button==2 ? new_element2 :
1160                          button==3 ? new_element3 : 0);
1161
1162           if (new_element != level.mampfer_inhalt[i][x][y])
1163           {
1164             level.mampfer_inhalt[i][x][y] = new_element;
1165             DrawMiniElement(1+5*i+x,2+y,new_element);
1166           }
1167         }
1168         else if (!motion_status)/* Mauszeiger nicht im Cruncher-Feld */
1169           in_field_pressed = FALSE;
1170       }
1171       else if (!motion_status)  /* Mauszeiger nicht im Cruncher-Feld */
1172         in_field_pressed = FALSE;
1173     }
1174   }
1175
1176   last_button = button;
1177
1178   BackToFront();
1179 }
1180
1181 void LevelNameTyping(KeySym key)
1182 {
1183   unsigned char ascii = 0;
1184   int len = strlen(level.name);
1185
1186   if (!name_typing)
1187     return;
1188
1189   if (key>=XK_A && key<=XK_Z)
1190     ascii = 'A'+(char)(key-XK_A);
1191   else if (key>=XK_a && key<=XK_z)
1192     ascii = 'a'+(char)(key-XK_a);
1193   else if (key>=XK_0 && key<=XK_9)
1194     ascii = '0'+(char)(key-XK_0);
1195 #ifdef XK_LATIN1
1196   else if (key>=XK_space && key<=XK_at)
1197     ascii = ' '+(char)(key-XK_space);
1198   else if (key==XK_Adiaeresis)
1199     ascii = 'Ä';
1200   else if (key==XK_Odiaeresis)
1201     ascii = 'Ö';
1202   else if (key==XK_Udiaeresis)
1203     ascii = 'Ü';
1204   else if (key==XK_adiaeresis)
1205     ascii = 'ä';
1206   else if (key==XK_odiaeresis)
1207     ascii = 'ö';
1208   else if (key==XK_udiaeresis)
1209     ascii = 'ü';
1210   else if (key==XK_underscore)
1211     ascii = '_';
1212 #endif
1213
1214   if (ascii && len<MAX_LEVNAMLEN-2)
1215   {
1216     level.name[len] = ascii;
1217     level.name[len+1] = 0;
1218     len++;
1219
1220     DrawTextExt(drawto,gc,
1221                 ED_COUNT_GADGET_XPOS+5,
1222                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1223                 level.name,FS_SMALL,FC_GREEN);
1224     DrawTextExt(window,gc,
1225                 ED_COUNT_GADGET_XPOS+5,
1226                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1227                 level.name,FS_SMALL,FC_GREEN);
1228     DrawTextExt(drawto,gc,
1229                 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1230                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1231                 "<",FS_SMALL,FC_RED);
1232     DrawTextExt(window,gc,
1233                 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1234                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1235                 "<",FS_SMALL,FC_RED);
1236   }
1237   else if ((key==XK_Delete || key==XK_BackSpace) && len>0)
1238   {
1239     level.name[len-1] = 0;
1240     len--;
1241
1242     DrawTextExt(drawto,gc,
1243                 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1244                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1245                 "< ",FS_SMALL,FC_GREEN);
1246     DrawTextExt(window,gc,
1247                 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1248                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1249                 "< ",FS_SMALL,FC_GREEN);
1250   }
1251   else if (key==XK_Return)
1252   {
1253     DrawTextExt(drawto,gc,
1254                 ED_COUNT_GADGET_XPOS+5,
1255                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1256                 level.name,FS_SMALL,FC_YELLOW);
1257     DrawTextExt(window,gc,
1258                 ED_COUNT_GADGET_XPOS+5,
1259                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1260                 level.name,FS_SMALL,FC_YELLOW);
1261     DrawTextExt(drawto,gc,
1262                 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1263                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1264                 " ",FS_SMALL,FC_YELLOW);
1265     DrawTextExt(window,gc,
1266                 ED_COUNT_GADGET_XPOS+5+len*FONT2_XSIZE,
1267                 ED_COUNT_TEXT_YPOS+16*ED_COUNT_TEXT_YSIZE,
1268                 " ",FS_SMALL,FC_YELLOW);
1269
1270     name_typing = FALSE;
1271   }
1272 }