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