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