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