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