OSDN Git Service

wwww
[proj16/16.git] / 16 / v2 / source / MAPED / GUI.C
1 /*\r
2 Copyright (C) 1998 BJ Eirich (aka vecna)\r
3 This program is free software; you can redistribute it and/or\r
4 modify it under the terms of the GNU General Public License\r
5 as published by the Free Software Foundation; either version 2\r
6 of the License, or (at your option) any later version.\r
7 This program is distributed in the hope that it will be useful,\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
10 See the GNU General Public Lic\r
11 See the GNU General Public License for more details.\r
12 You should have received a copy of the GNU General Public License\r
13 along with this program; if not, write to the Free Software\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
15 */\r
16 \r
17 #include <stdio.h>\r
18 #include <string.h>\r
19 #include <stdarg.h>\r
20 #include <malloc.h>\r
21 #include <stdlib.h>\r
22 \r
23 #include "config.h"\r
24 #include "guicomp.h"\r
25 #include "maped.h"\r
26 #include "mouse.h"\r
27 #include "render.h"\r
28 #include "timer.h"\r
29 #include "vdriver.h"\r
30 #include "keyboard.h"\r
31 \r
32 #include "smalfont.h"\r
33 #include "columns.h"\r
34 #include "tilesel.h"\r
35 \r
36 // ================================= Data ====================================\r
37 \r
38 struct message\r
39 {\r
40   char text[44];                     // message text\r
41   int exptime;                       // message expire time\r
42 };\r
43 \r
44 struct message messages[6];          // 5-message buffer\r
45 char num_msgs=0;                     // number of active messages\r
46 char playingmod[80];                 // currently playing mod.\r
47 extern char scrollmode;\r
48 \r
49 // ================================= Code ====================================\r
50 \r
51 void CheckMessageExpirations()\r
52 { int i;\r
53 \r
54   for (i=0; i<num_msgs; i++)\r
55     if (systemtime>messages[i].exptime)\r
56     {\r
57        memcpy(messages[i].text, messages[i+1].text, (48*(num_msgs-i+1)));\r
58        num_msgs--;\r
59     }\r
60 }\r
61 \r
62 void Message(char *text, int duration)\r
63 {\r
64   if (num_msgs<5)\r
65   {\r
66     memcpy(messages[num_msgs].text, text, strlen(text));\r
67     messages[num_msgs].exptime=systemtime+duration;\r
68     num_msgs++;\r
69     return;\r
70   }\r
71 \r
72   memcpy(&messages[0].text, &messages[1].text, 192);\r
73   memcpy(messages[4].text, text, strlen(text)+1);\r
74   messages[num_msgs].exptime=systemtime+duration;\r
75 }\r
76 \r
77 void DrawScreenControls()\r
78 { int i;\r
79   byte c;\r
80 \r
81   if (el<6)\r
82   {\r
83     if (pasting)\r
84     {\r
85       GotoXY(298-5,tsy-19+13);\r
86       printstring("P");\r
87     }\r
88   }\r
89 \r
90   // Put current-tile boxes if applicable.\r
91   if (el<6)\r
92   {\r
93     FilledBox(298,tsy-19,18,18,white);\r
94     FilledBox(317,tsy-19,18,18,white);\r
95     CopySprite(299,tsy-18,16,16,vsp+(256*lt));\r
96     CopySprite(318,tsy-18,16,16,vsp+(256*rt));\r
97   }\r
98 \r
99   if (el==7)\r
100   {\r
101     sprintf(strbuf,"Zone %d",curzone);\r
102     GotoXY(280,tsy-16);\r
103     printstring(strbuf);\r
104     GotoXY(280,tsy-10);\r
105     printstring(zones[curzone].name);\r
106 \r
107     c=zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
108                layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)/16)];\r
109 \r
110     if (c)\r
111     {\r
112        sprintf(strbuf,"zone %d",c);\r
113        GotoXY(280,17);\r
114        printstring(strbuf);\r
115        GotoXY(280,23);\r
116        printstring(zones[c].name);\r
117     }\r
118   }\r
119 \r
120   if (el==8)\r
121   {\r
122     sprintf(strbuf,"%d entities",entities);\r
123     GotoXY(285,17); printstring(strbuf);\r
124 \r
125     if (c=EntityThere((mx+xwin-16)/16,(my+ywin-16)/16))\r
126     {\r
127       c--;\r
128       GotoXY(285,tsy-10);\r
129       printstring(entity[c].desc);\r
130     }\r
131   }\r
132 \r
133   // Put the current-tile mouse thingy.\r
134   GotoXY(17,17);\r
135   dec_to_asciiz((xwin+mx-16)/16,strbuf);\r
136   printstring(strbuf); printstring(", ");\r
137   dec_to_asciiz((ywin+my-16)/16,strbuf);\r
138   printstring(strbuf);\r
139 \r
140   // Put the layer editor/selector.\r
141 \r
142   for (i=0; i<6; i++)\r
143   {\r
144     if (el==i) c=white; else c=darkw;\r
145     FilledBox(17+(i*10),tsy-7,9,7,c);\r
146     if (layertoggle[i]) c=darkred; else c=0;\r
147     FilledBox(18+(i*10),tsy-6,7,6,c);\r
148     GotoXY(20+(i*10),tsy-5); dec_to_asciiz(i+1,strbuf);\r
149     if (i<numlayers) printstring(strbuf);\r
150   }\r
151 \r
152   for (i=6; i<10; i++)\r
153   {\r
154     if (el==i) c=white; else c=darkw;\r
155     FilledBox(17+(i*10),tsy-7,9,7,c);\r
156     if (layertoggle[i]) c=darkred; else c=0;\r
157     FilledBox(18+(i*10),tsy-6,7,6,c);\r
158     GotoXY(20+(i*10),tsy-5);\r
159     switch (i)\r
160     {\r
161       case 6: printstring("O"); break;\r
162       case 7: printstring("N"); break;\r
163       case 8: printstring("E"); break;\r
164       case 9: printstring("T"); break;\r
165     }\r
166   }\r
167 }\r
168 \r
169 void RenderMessages()\r
170 { int i;\r
171 \r
172   CheckMessageExpirations();\r
173   for (i=0; i<num_msgs; i++)\r
174   {\r
175     GotoXY(17,23+(i*6));\r
176     printstring(messages[i].text);\r
177   }\r
178 }\r
179 \r
180 void RenderGUI()\r
181 {\r
182   RenderMessages();\r
183   DrawScreenControls();\r
184   DrawMouse();\r
185 }\r
186 \r
187 // ============================= Dialog Code =================================\r
188 \r
189 int mmxofs=60, mmyofs=50;\r
190 \r
191 void DoMainMenu()\r
192 {\r
193   key[SCAN_ESC]=0;\r
194   MainMenu(mmxofs, mmyofs);\r
195 }\r
196 \r
197 void MainMenu(int dx, int dy)\r
198 { char done=0;\r
199   //int mxo, myo, cursorblink;\r
200 \r
201   mmxofs=dx;\r
202   mmyofs=dy;\r
203   do\r
204   {\r
205     if (dx<16) dx=16;\r
206     if (dy<16) dy=16;\r
207     if (dx+80>335) dx=336-80;\r
208     if (dy+89>sy+16) dy=(sy+16)-89;\r
209 \r
210     RenderMap();\r
211     RenderGUI();\r
212     stdwindow(dx, dy, dx+80, dy+89);\r
213 \r
214     if (mx>dx && mx<dx+80)\r
215     {\r
216        if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
217        if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
218        if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
219        if (my>dy+20 && my<dy+26) FilledBox(dx+2, dy+20, 76, 7, darkw);\r
220        if (my>dy+29 && my<dy+36) FilledBox(dx+2, dy+29, 76, 7, darkw);\r
221        if (my>dy+35 && my<dy+42) FilledBox(dx+2, dy+35, 76, 7, darkw);\r
222        if (my>dy+41 && my<dy+48) FilledBox(dx+2, dy+41, 76, 7, darkw);\r
223        if (my>dy+47 && my<dy+54) FilledBox(dx+2, dy+47, 76, 7, darkw);\r
224        if (my>dy+53 && my<dy+60) FilledBox(dx+2, dy+53, 76, 7, darkw);\r
225        if (my>dy+59 && my<dy+66) FilledBox(dx+2, dy+59, 76, 7, darkw);\r
226        if (my>dy+65 && my<dy+72) FilledBox(dx+2, dy+65, 76, 7, darkw);\r
227        if (my>dy+71 && my<dy+78) FilledBox(dx+2, dy+71, 76, 7, darkw);\r
228        if (my>dy+80 && my<dy+87) FilledBox(dx+2, dy+80, 76, 7, darkw);\r
229     }\r
230 \r
231     GotoXY(dx+3, dy+3); printstring("New MAP");\r
232     GotoXY(dx+3, dy+9); printstring("Load MAP");\r
233     GotoXY(dx+3, dy+15); printstring("Save MAP");\r
234     GotoXY(dx+3, dy+21); printstring("Load VSP");\r
235     HLine(dx+2, dy+28, 76, white);\r
236     GotoXY(dx+3, dy+30); printstring("MAP Properties");\r
237     GotoXY(dx+3, dy+36); printstring("Layers"); GotoXY(dx+73, dy+36); printstring(">");\r
238     GotoXY(dx+3, dy+42); printstring("Options");\r
239     GotoXY(dx+3, dy+48); printstring("MOD Player");\r
240     GotoXY(dx+3, dy+54); printstring("CD Player");\r
241     GotoXY(dx+3, dy+60); printstring("Columns");\r
242     GotoXY(dx+3, dy+66); printstring("Execute"); GotoXY(dx+73, dy+66); printstring(">");\r
243     GotoXY(dx+3, dy+72); printstring("Exit to DOS");\r
244     HLine(dx+2, dy+79, 76, white);\r
245     GotoXY(dx+3, dy+81); printstring("About MapEd");\r
246 \r
247     DrawMouse();\r
248     ShowPage();\r
249     CheckTimerStuff();\r
250 \r
251     if (mb==1 && mx>dx && mx<dx+80)\r
252     {\r
253        if (my>dy+2 && my<dy+9) { NewMAP(); done=1; WaitRelease(); break; }\r
254        if (my>dy+8 && my<dy+15) { done=1; WaitRelease(); LoadMAPDialog(); break; }\r
255        if (my>dy+14 && my<dy+21) { done=1; WaitRelease(); key[SCAN_F10]=1; break; }\r
256        if (my>dy+20 && my<dy+26) { done=1; WaitRelease(); LoadVSPDialog(); break; }\r
257        if (my>dy+29 && my<dy+36) { done=1; WaitRelease(); MapPropertiesDialog(); break; }\r
258        if (my>dy+35 && my<dy+42) { done=1; WaitRelease(); LayersSubMenu(dx,dy); break; }\r
259        if (my>dy+41 && my<dy+48) { done=1; WaitRelease(); OptionsDialog(); break; }\r
260        if (my>dy+47 && my<dy+54) { done=1; WaitRelease(); MPDialog(); break; }\r
261        if (my>dy+53 && my<dy+60) { done=1; WaitRelease(); CDDialog(); break; }\r
262        if (my>dy+59 && my<dy+66) { done=1; WaitRelease(); Columns(); break; }\r
263        if (my>dy+65 && my<dy+72) { done=1; WaitRelease(); ExecuteSubMenu(0, 0); break; }\r
264        if (my>dy+71 && my<dy+78) { done=1; WaitRelease(); key[SCAN_X]=1; key[SCAN_ALT]=1; break; }\r
265        if (my>dy+80 && my<dy+87) { done=1; About(); break; }\r
266     }\r
267 \r
268     if (mb==1)\r
269     {\r
270       WaitRelease();\r
271       done=1;\r
272     }\r
273     if (key[SCAN_ESC]==1) done=1;\r
274   } while (!done);\r
275   key[SCAN_ESC]=0;\r
276 }\r
277 \r
278 // tilesel.c\r
279 extern FILE *pcxf;\r
280 extern int width, depth;\r
281 extern int vidoffset;\r
282 extern char *ovsp;\r
283 extern char *t;\r
284 extern word ontiles;\r
285 \r
286 static int TileMatch(int a, int b)\r
287   { return !memcmp(ovsp+(a*256), ovsp+(b*256), 256); }\r
288 \r
289 int ilxsize=145, ilysize=122+10;\r
290 int ilxofs=16, ilyofs=16;\r
291 \r
292 // make this configurable at some point\r
293 #define MIN_TILE_X 50\r
294 #define MIN_TILE_Y 50\r
295 \r
296 static int BitToNum(int num)\r
297 {\r
298   int i;\r
299 \r
300   if (!num)\r
301     return 0;\r
302 \r
303   for (i=0; i<32; i++)\r
304   {\r
305     if (num & (1<<i))\r
306       break;\r
307   }\r
308 \r
309   return i+1;\r
310 }\r
311 \r
312 //zero\r
313 byte TileCmp(byte *one, byte *two)\r
314   { return !memcmp(one,two, 256); }\r
315 \r
316 void ImageToLayer()\r
317 { char done=0, moving=0;\r
318   int mxo, myo, cursorblink;\r
319   char ctf=0, cb=0, c, tt, *str;\r
320   char nstr1[80], nstr2[80];\r
321 \r
322   int i,j,k,m;\r
323   FILE *f=0;\r
324   int num_padx=0,num_pady=0; // in tiles\r
325   int minpadx=0,minpady=0; // in tiles\r
326   int tilesx=0,tilesy=0; // in tiles\r
327   int totalx=0,totaly=0; // in tiles\r
328   int excessx=0,excessy=0; // in pixels\r
329   //int chk_1=1,chk_2=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0; // radio control\r
330   int chk_layer=1;\r
331   int chk_grabexcess=0,chk_centerinpad=0,chk_nodup=1; //,chk_padisblank=1;\r
332   char txt_imagename[80];\r
333         // ...\r
334         int ly=0;\r
335         int wide=0,deep=0;\r
336         int lsz=0;\r
337         int matched=0,plot=0; //,mapat=0;\r
338         int tilesripped=0;\r
339         int startx=0,starty=0;\r
340   memset(txt_imagename,0,80);\r
341   bmode=0; // for browser; update map/gui\r
342   width=0; depth=0; // for pcx loading code\r
343 \r
344   sprintf(nstr1, "%d", num_padx);\r
345   sprintf(nstr2, "%d", num_pady);\r
346   last_pressed=0;\r
347   do\r
348   {\r
349     RenderMap();\r
350     RenderGUI();\r
351 \r
352     if (ctf && systemtime >= cursorblink)\r
353     {\r
354       cb ^= 1;\r
355       cursorblink = systemtime+40;\r
356     }\r
357     if (moving)\r
358     {\r
359       ilxofs = (mx-mxo);\r
360       ilyofs = (my-myo);\r
361       if (!mb) moving=0;\r
362       if (ilxofs<16) ilxofs = 16;\r
363       if (ilyofs<16) ilyofs = 16;\r
364       if (ilxofs+ilxsize>335) ilxofs = 336-ilxsize;\r
365       if (ilyofs+ilysize>sy+16) ilyofs = (sy+16)-ilysize;\r
366     }\r
367 \r
368     Window(ilxofs, ilyofs, ilxofs+ilxsize, ilyofs+ilysize, "Import Image As Layer");\r
369     Button(ilxofs+109, ilyofs+12, "Browse");\r
370     Button(ilxofs+109, ilyofs+30, "OK");\r
371     GotoXY(ilxofs+5, ilyofs+25); printstring("Layer:");\r
372     // layer select radio buttons\r
373     for (i=0; i<6; i++)\r
374     {\r
375       CheckBox(ilxofs+29+(i*10), ilyofs+33, chk_layer & (1<<i));\r
376       GotoXY(ilxofs+31+(i*10), ilyofs+25);\r
377       sprintf(strbuf, "%i", i+1); printstring(strbuf);\r
378     }\r
379     GotoXY(ilxofs+5, ilyofs+14); printstring("Image:");\r
380     //TextField(ilxofs+29, ilyofs+12, 75, txt_imagename, ctf == 1 ? cb : 0);\r
381     GotoXY(ilxofs+29, ilyofs+14); printstring(txt_imagename);\r
382     HLine(ilxofs+1, ilyofs+44, 143, white);\r
383     GotoXY(ilxofs+5, ilyofs+49); printstring("Image Dimensions:");\r
384     if (width+depth)\r
385     {\r
386       GotoXY(ilxofs+5+pixels("Image Dimensions:")+3, ilyofs+49);\r
387       sprintf(strbuf, "%dx%d", width, depth);\r
388       printstring(strbuf);\r
389     }\r
390     GotoXY(ilxofs+5, ilyofs+60); printstring("Tiles X:");\r
391     if (width+depth)\r
392     {\r
393       GotoXY(ilxofs+5+pixels("Tiles X:")+3, ilyofs+60);\r
394       sprintf(strbuf, "%d", tilesx);\r
395       printstring(strbuf);\r
396     }\r
397     GotoXY(ilxofs+5, ilyofs+71); printstring("Tiles Y:");\r
398     if (width+depth)\r
399     {\r
400       GotoXY(ilxofs+5+pixels("Tiles Y:")+3, ilyofs+71);\r
401       sprintf(strbuf, "%d", tilesy);\r
402       printstring(strbuf);\r
403     }\r
404     GotoXY(ilxofs+51, ilyofs+60); printstring("Pad X:");\r
405     GotoXY(ilxofs+51, ilyofs+71); printstring("Pad Y:");\r
406     TextField(ilxofs+74, ilyofs+58, 12, nstr1, ctf == 1 ? cb : 0);\r
407     TextField(ilxofs+74, ilyofs+69, 12, nstr2, ctf == 2 ? cb : 0);\r
408     GotoXY(ilxofs+95, ilyofs+60); printstring("Total X:");\r
409     if (width+depth)\r
410     {\r
411       GotoXY(ilxofs+95+pixels("Total X:")+3, ilyofs+60);\r
412       sprintf(strbuf, "%d", totalx);\r
413       printstring(strbuf);\r
414     }\r
415     GotoXY(ilxofs+95, ilyofs+71); printstring("Total Y:");\r
416     if (width+depth)\r
417     {\r
418       GotoXY(ilxofs+95+pixels("Total Y:")+3, ilyofs+71);\r
419       sprintf(strbuf, "%d", totaly);\r
420       printstring(strbuf);\r
421     }\r
422     GotoXY(ilxofs+5, ilyofs+81); printstring("Excess Pixels X:");\r
423     if (width+depth)\r
424     {\r
425       GotoXY(ilxofs+5+pixels("Excess Pixels X:")+3, ilyofs+81);\r
426       sprintf(strbuf, "%d", excessx);\r
427       printstring(strbuf);\r
428     }\r
429     GotoXY(ilxofs+5, ilyofs+91); printstring("Excess Pixels Y:");\r
430     if (width+depth)\r
431     {\r
432       GotoXY(ilxofs+5+pixels("Excess Pixels Y:")+3, ilyofs+91);\r
433       sprintf(strbuf, "%d", excessy);\r
434       printstring(strbuf);\r
435     }\r
436     CheckBox(ilxofs+5, ilyofs+101, chk_grabexcess);\r
437     GotoXY(ilxofs+17, ilyofs+102); printstring("Grab Excess");\r
438     CheckBox(ilxofs+5, ilyofs+110, chk_centerinpad);\r
439     GotoXY(ilxofs+17, ilyofs+111); printstring("Center Within Padding");\r
440     CheckBox(ilxofs+5, ilyofs+119, chk_nodup);\r
441     GotoXY(ilxofs+17, ilyofs+120); printstring("Eliminate Duplicates");\r
442 \r
443     DrawMouse();\r
444     ShowPage();\r
445     CheckTimerStuff();\r
446 \r
447     // input phase\r
448     if ((mb==1 && mx>ilxofs+109 && mx<ilxofs+30+109 && my>ilyofs+12 && my<ilyofs+10+12 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
449     {\r
450       // insert code for button "Browse" here\r
451       ButtonPressed(ilxofs+109, ilyofs+12, "Browse");\r
452       DrawMouse();\r
453       while (mb)\r
454       {\r
455         ReadMouse();\r
456         ShowPage();\r
457         ReadMouse();\r
458       }\r
459       Browse(1, "*.pcx", "", "", "", txt_imagename);\r
460       key[SCAN_ESC]=0; // just in case ESC exited\r
461       f=fopen(txt_imagename, "rb");\r
462       if (f)\r
463       {\r
464         LoadPCXHeaderNP(txt_imagename);\r
465         fclose(pcxf);\r
466 \r
467         if (chk_grabexcess) i=15; else i=0;\r
468         tilesx=((width+i)&~15)/16;\r
469         tilesy=((depth+i)&~15)/16;\r
470         excessx=width & 15;\r
471         excessy=depth & 15;\r
472         if (tilesx<MIN_TILE_X) { minpadx=MIN_TILE_X-tilesx; num_padx=minpadx; }\r
473         if (tilesy<MIN_TILE_Y) { minpady=MIN_TILE_Y-tilesy; num_pady=minpady; }\r
474         sprintf(nstr1, "%d", minpadx);\r
475         sprintf(nstr2, "%d", minpady);\r
476         totalx=tilesx+minpadx;\r
477         totaly=tilesy+minpady;\r
478       }\r
479       WaitRelease(); continue;\r
480     }\r
481 \r
482     if ((mb==1 && mx>ilxofs+109 && mx<ilxofs+30+109 && my>ilyofs+30 && my<ilyofs+10+30 && !moving) || (key[SCAN_ENTER] && !ctf))\r
483     {\r
484       // insert code for button "OK" here\r
485       ButtonPressed(ilxofs+109, ilyofs+30, "OK");\r
486       DrawMouse();\r
487       while (mb)\r
488       {\r
489         ReadMouse();\r
490         ShowPage();\r
491         ReadMouse();\r
492       }\r
493 \r
494       if (strlen(txt_imagename))\r
495       {\r
496         done=1;\r
497 \r
498         ly=BitToNum(chk_layer) -1;\r
499 \r
500         startx=0;\r
501         starty=0;\r
502         if (chk_centerinpad)\r
503         {\r
504           startx=(totalx-tilesx)/2;\r
505           starty=(totaly-tilesy)/2;\r
506         }\r
507 \r
508         LoadPCXHeaderNP(txt_imagename);\r
509 \r
510         wide=width;\r
511         deep=depth;\r
512         if (chk_grabexcess)\r
513         {\r
514           // round up to the nearest multiple of 16 if grabbing excess\r
515           wide=(width+15)&~15;\r
516           deep=(depth+15)&~15;\r
517         }\r
518         // allocate transit image bay, which may have padding ^\r
519         t=(char *) valloc(wide * deep,"img2layer",0);\r
520 \r
521         for (i=0; i<depth; i++)\r
522         {\r
523           vidoffset=wide*i;\r
524           ReadPCXLine(t);\r
525         }\r
526         fclose(pcxf);\r
527 \r
528         deep=tilesy;\r
529         wide=tilesx;\r
530         ontiles=(wide*deep)+1; // +1 for our empty tile\r
531 \r
532         ovsp=(char *) valloc(ontiles*256,"img2layer2",0);\r
533 \r
534         layer[ly].pmultx=1;     layer[ly].pmulty=1;\r
535         layer[ly].pdivx=1;      layer[ly].pdivy=1;\r
536         // totalx & totaly are the sum of tilesx/tilesy & num_padx/num_pady\r
537         layer[ly].sizex=totalx; layer[ly].sizey=totaly;\r
538         layer[ly].trans=0;      layer[ly].hline=0;\r
539 \r
540         lsz = totalx * totaly;\r
541 \r
542         if (layers[ly]) vfree(layers[ly]);\r
543         layers[ly]=(unsigned short *) valloc((lsz*2)+4,"layer data",ly);\r
544 \r
545         tilesripped=0;\r
546         memset(ovsp,0,256);\r
547         tilesripped++;\r
548 \r
549         for (i=0; i<deep; i++)\r
550         {\r
551           for (j=0; j<wide; j++)\r
552           {\r
553             GrabTileAt((j*16), (i*16), tilesripped, 0);\r
554             plot=tilesripped;\r
555 \r
556             // eliminate duplicates?\r
557             if (chk_nodup)\r
558             {\r
559               matched=0;\r
560               for (k=0; k<tilesripped; k++)\r
561               {\r
562                 if (TileMatch(tilesripped, k))\r
563                 {\r
564                   matched=1;\r
565                   plot=k;\r
566                   break;\r
567                 }\r
568               }\r
569                 //begin zero\r
570               for(m=0; m<numtiles; m++)\r
571               {\r
572                 if(TileCmp(vsp+m*256,ovsp+tilesripped*256))\r
573                 {\r
574                   matched=1;\r
575                   plot=m-numtiles;\r
576 //                  plot=0;\r
577                   break;\r
578                 }\r
579               }\r
580               //end zero!\r
581               if (!matched) tilesripped++;\r
582             }\r
583             // grabbing all; keep it regardless\r
584             else tilesripped++;\r
585 \r
586             layers[ly][((i+starty)*totalx)+j+startx]=plot;\r
587           }\r
588         }\r
589 \r
590         // adjust indices past current tile amount\r
591         for (i=0; i<(totalx*totaly); i++)\r
592           layers[ly][i]+=numtiles;\r
593 \r
594         if (!ly)\r
595         {\r
596           if (obstruct) vfree(obstruct);\r
597           obstruct=(char *) valloc(lsz+4,"obstruct",0);\r
598           if (zone) vfree(zone);\r
599           zone=(char *) valloc(lsz+4,"zone", 0);\r
600         }\r
601 \r
602         // reallocate tilebay and patch in ovsp\r
603         str=(char *)valloc((numtiles+tilesripped)*256,"vsp data",0);\r
604         memcpy(str, vsp, (numtiles*256));\r
605         vfree(vsp); vsp=str; str=0;\r
606         memcpy(vsp+(numtiles*256), ovsp, (tilesripped*256));\r
607         numtiles+=tilesripped;\r
608 \r
609         // did we make a new layer?\r
610         if (ly+1>numlayers)\r
611         {\r
612           numlayers++;\r
613           sprintf(rstring, "%s%i", rstring, ly+1); // update render-order\r
614         }\r
615 \r
616         vfree(t);\r
617         vfree(ovsp);\r
618       }\r
619       // ...\r
620       WaitRelease(); continue;\r
621     }\r
622 \r
623     if (mb==1 && mx>ilxofs+29 && mx<ilxofs+8+29 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
624     {\r
625       chk_layer ^= 1;\r
626       chk_layer &= 1;\r
627       //chk_1 ^= 1;\r
628       //chk_2=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0;\r
629       WaitRelease(); continue;\r
630     }\r
631 \r
632     if (mb==1 && mx>ilxofs+39 && mx<ilxofs+8+39 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
633     {\r
634       if (numlayers+1 >= 2)\r
635       {\r
636       chk_layer ^= 2;\r
637       chk_layer &= 2;\r
638       //chk_2 ^= 1;\r
639       //chk_1=0,chk_3=0,chk_4=0,chk_5=0,chk_6=0;\r
640       WaitRelease(); continue;\r
641       }\r
642     }\r
643 \r
644     if (mb==1 && mx>ilxofs+49 && mx<ilxofs+8+49 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
645     {\r
646       if (numlayers+1 >= 3)\r
647       {\r
648       chk_layer ^= 4;\r
649       chk_layer &= 4;\r
650       //chk_3 ^= 1;\r
651       //chk_1=0,chk_2=0,chk_4=0,chk_5=0,chk_6=0;\r
652       WaitRelease(); continue;\r
653       }\r
654     }\r
655 \r
656     if (mb==1 && mx>ilxofs+59 && mx<ilxofs+8+59 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
657     {\r
658       if (numlayers+1 >= 4)\r
659       {\r
660       chk_layer ^= 8;\r
661       chk_layer &= 8;\r
662       //chk_4 ^= 1;\r
663       //chk_1=0,chk_2=0,chk_3=0,chk_5=0,chk_6=0;\r
664       WaitRelease(); continue;\r
665       }\r
666     }\r
667 \r
668     if (mb==1 && mx>ilxofs+69 && mx<ilxofs+8+69 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
669     {\r
670       if (numlayers+1 >= 5)\r
671       {\r
672       chk_layer ^= 16;\r
673       chk_layer &= 16;\r
674       //chk_5 ^= 1;\r
675       //chk_1=0,chk_2=0,chk_3=0,chk_4=0,chk_6=0;\r
676       WaitRelease(); continue;\r
677       }\r
678     }\r
679 \r
680     if (mb==1 && mx>ilxofs+79 && mx<ilxofs+8+79 && my>ilyofs+33 && my<ilyofs+7+33 && !moving)\r
681     {\r
682       if (numlayers+1 >= 6)\r
683       {\r
684       chk_layer ^= 32;\r
685       chk_layer &= 32;\r
686       //chk_6 ^= 1;\r
687       //chk_1=0,chk_2=0,chk_3=0,chk_4=0,chk_5=0;\r
688       WaitRelease(); continue;\r
689       }\r
690     }\r
691 \r
692     // if no checkboxes are marked, mark the first.\r
693     //if (!(chk_1+chk_2+chk_3+chk_4+chk_5+chk_6)) chk_1=1;\r
694     if (!chk_layer) chk_layer=1;\r
695 \r
696 //    if (mb==1 && mx>ilxofs+29 && mx<ilxofs+75+29 && my>ilyofs+12 && my<ilyofs+9+12 && !moving)\r
697 //    {\r
698 //      ctf=1; str=txt_imagename; cb=1;\r
699 //      cursorblink=systemtime+40; continue;\r
700 //    }\r
701 \r
702     if (mb==1)\r
703     {\r
704       if (mx>ilxofs+74 && mx<ilxofs+12+74 && my>ilyofs+58 && my<ilyofs+9+58 && !moving)\r
705       {\r
706         if (ctf==2)\r
707         {\r
708           if (atoi(str)<minpady)\r
709             sprintf(str, "%d", minpady);\r
710         }\r
711         ctf=1; str=nstr1; cb=1;\r
712         cursorblink=systemtime+40; continue;\r
713       }\r
714 \r
715       if (mx>ilxofs+74 && mx<ilxofs+12+74 && my>ilyofs+69 && my<ilyofs+9+69 && !moving)\r
716       {\r
717         if (ctf==1)\r
718         {\r
719           if (atoi(str)<minpadx)\r
720             sprintf(str, "%d", minpadx);\r
721         }\r
722         ctf=2; str=nstr2; cb=1;\r
723         cursorblink=systemtime+40; continue;\r
724       }\r
725 \r
726       switch (ctf)\r
727       {\r
728         case 1: if (atoi(str) < minpadx) sprintf(str, "%d", minpadx); break;\r
729         case 2: if (atoi(str) < minpady) sprintf(str, "%d", minpady); break;\r
730       }\r
731     }\r
732 \r
733     if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+101 && my<ilyofs+7+101 && !moving)\r
734     {\r
735       chk_grabexcess ^= 1;\r
736       // <barf>\r
737       if (excessx+excessy)\r
738       {\r
739         if (chk_grabexcess)\r
740         {\r
741           if (excessx) tilesx++;\r
742           if (excessy) tilesy++;\r
743         }\r
744         else\r
745         {\r
746           if (excessx) tilesx--;\r
747           if (excessy) tilesy--;\r
748         }\r
749         if (tilesx<MIN_TILE_X) { minpadx=MIN_TILE_X-tilesx; num_padx=minpadx; }\r
750         if (tilesy<MIN_TILE_Y) { minpady=MIN_TILE_Y-tilesy; num_pady=minpady; }\r
751         sprintf(nstr1, "%d", minpadx);\r
752         sprintf(nstr2, "%d", minpady);\r
753         totalx=tilesx+minpadx;\r
754         totaly=tilesy+minpady;\r
755       }\r
756       WaitRelease(); continue;\r
757     }\r
758 \r
759     if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+110 && my<ilyofs+7+110 && !moving)\r
760     {\r
761       chk_centerinpad ^= 1; WaitRelease(); continue;\r
762     }\r
763 \r
764     if (mb==1 && mx>ilxofs+5 && mx<ilxofs+8+5 && my>ilyofs+119 && my<ilyofs+7+119 && !moving)\r
765     {\r
766       chk_nodup ^= 1; WaitRelease(); continue;\r
767     }\r
768 \r
769     if (mb==1 && mx>(ilxofs+ilxsize-9) && (mx<ilxofs+ilxsize-2)\r
770     && my>(ilyofs+1) && (my<ilyofs+8) && !moving)\r
771     {\r
772       done=1;\r
773       WaitRelease();\r
774       break;\r
775     }\r
776 \r
777     if (mb==1 && mx>ilxofs && mx<ilxofs+ilxsize && my>ilyofs && my<(ilyofs+9) && !moving)\r
778     {\r
779       moving=1;\r
780       mxo=mx-ilxofs;\r
781       myo=my-ilyofs;\r
782       continue;\r
783     }\r
784 \r
785     if (mb==1 && !moving)\r
786     {\r
787       ctf=0;\r
788       cb=0;\r
789       str=0;\r
790       WaitRelease();\r
791     }\r
792 \r
793     if (last_pressed)\r
794     {\r
795       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
796       else c=key_ascii_tbl[last_pressed];\r
797 \r
798       if (last_pressed==SCAN_ESC)\r
799       {\r
800         key[SCAN_ESC]=0;\r
801         done=1;\r
802         break;\r
803       }\r
804 \r
805       if (last_pressed==SCAN_ENTER)\r
806       {\r
807         key[SCAN_ENTER]=0;\r
808 \r
809         // keep minimally required padding\r
810         if (ctf==1)\r
811         {\r
812           if (atoi(str)<minpadx)\r
813             sprintf(str, "%d", minpadx);\r
814         }\r
815         if (ctf==2)\r
816         {\r
817           if (atoi(str)<minpady)\r
818             sprintf(str, "%d", minpady);\r
819         }\r
820 \r
821         ctf=0;\r
822         str=0;\r
823         last_pressed=0;\r
824         continue;\r
825       }\r
826 \r
827       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
828       {\r
829         switch (ctf)\r
830         {\r
831           case 0: ctf=1; str=nstr1; break;\r
832           case 1: ctf=2; str=nstr2; break;\r
833           case 2: ctf=0; str=0; break;\r
834           //case 3: ctf=0; str=0; break;\r
835         }\r
836         key[SCAN_TAB]=0;\r
837         last_pressed=0;\r
838         cb=1; cursorblink=systemtime+40;\r
839         continue;\r
840       }\r
841 \r
842       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
843       {\r
844         switch (ctf)\r
845         {\r
846           case 0: ctf=2; str=nstr2; break;\r
847           case 1: ctf=0; str=0; break;\r
848           case 2: ctf=1; str=nstr1; break;\r
849           //case 3: ctf=2; str=nstr1; break;\r
850         }\r
851         key[SCAN_TAB]=0;\r
852         last_pressed=0;\r
853         cb=1; cursorblink=systemtime+40;\r
854         continue;\r
855       }\r
856 \r
857       if (!ctf)\r
858         continue;\r
859 \r
860       if (last_pressed==SCAN_BACKSP && strlen(str))\r
861       {\r
862         str[strlen(str)-1]=0;\r
863         key[SCAN_BACKSP]=0;\r
864         last_pressed=0;\r
865         continue;\r
866       }\r
867       else if (last_pressed==SCAN_BACKSP)\r
868       {\r
869         last_pressed=0;\r
870         continue;\r
871       }\r
872 \r
873       tt=strlen(str);\r
874       str[tt]=c;\r
875       str[tt+1]=0;\r
876       last_pressed=0;\r
877     }\r
878 \r
879   } while (!done);\r
880 \r
881   //num_padx=atoi(nstr1);\r
882   //num_pady=atoi(nstr2);\r
883 }\r
884 \r
885 int dtxsize=102, dtysize=52;\r
886 int dtxofs=100, dtyofs=70;\r
887 // aen\r
888 void Destroyer()\r
889 { char done=0, moving=0;\r
890   int mxo, myo, cursorblink;\r
891   char ctf=0, cb=0, c, t, *str;\r
892   int zn_check=0,zd_check=0,ob_check=0,ent_check=0;\r
893 \r
894   last_pressed=0;\r
895   do\r
896   {\r
897     RenderMap();\r
898     RenderGUI();\r
899 \r
900     if (ctf && systemtime >= cursorblink)\r
901     {\r
902       cb ^= 1;\r
903       cursorblink = systemtime+40;\r
904     }\r
905     if (moving)\r
906     {\r
907       dtxofs = (mx-mxo);\r
908       dtyofs = (my-myo);\r
909       if (!mb) moving=0;\r
910       if (dtxofs<16) dtxofs = 16;\r
911       if (dtyofs<16) dtyofs = 16;\r
912       if (dtxofs+dtxsize>335) dtxofs = 336-dtxsize;\r
913       if (dtyofs+dtysize>sy+16) dtyofs = (sy+16)-dtysize;\r
914     }\r
915 \r
916     Window(dtxofs, dtyofs, dtxofs+dtxsize, dtyofs+dtysize, "Destroyer");\r
917     CheckBox(dtxofs+4, dtyofs+11, zn_check);\r
918     CheckBox(dtxofs+4, dtyofs+31, ob_check);\r
919     CheckBox(dtxofs+4, dtyofs+21, zd_check);\r
920     GotoXY(dtxofs+15, dtyofs+12); printstring("Zones");\r
921     GotoXY(dtxofs+15, dtyofs+32); printstring("Obstructions");\r
922     GotoXY(dtxofs+15, dtyofs+22); printstring("Zone Data");\r
923     Button(dtxofs+68, dtyofs+11, "ok");\r
924     Button(dtxofs+68, dtyofs+24, "cancel");\r
925     CheckBox(dtxofs+4, dtyofs+41, ent_check);\r
926     GotoXY(dtxofs+15, dtyofs+42); printstring("Entities");\r
927 \r
928     DrawMouse();\r
929     ShowPage();\r
930     CheckTimerStuff();\r
931 \r
932     // input phase\r
933     if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+11 && my<dtyofs+7+11 && !moving)\r
934     {\r
935       zn_check ^= 1; WaitRelease(); continue;\r
936     }\r
937 \r
938     if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+21 && my<dtyofs+7+21 && !moving)\r
939     {\r
940       zd_check ^= 1; WaitRelease(); continue;\r
941     }\r
942 \r
943     if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+31 && my<dtyofs+7+31 && !moving)\r
944     {\r
945       ob_check ^= 1; WaitRelease(); continue;\r
946     }\r
947 \r
948     if (mb==1 && mx>dtxofs+4 && mx<dtxofs+8+4 && my>dtyofs+41 && my<dtyofs+7+41 && !moving)\r
949     {\r
950       ent_check ^= 1; WaitRelease(); continue;\r
951     }\r
952 \r
953     if (mb==1 && mx>dtxofs+68 && mx<dtxofs+30+68 && my>dtyofs+11 && my<dtyofs+10+11 && !moving)\r
954     {\r
955       // insert code for button "ok" here\r
956       ButtonPressed(dtxofs+68, dtyofs+11, "ok");\r
957       DrawMouse();\r
958       while (mb)\r
959       {\r
960         ReadMouse();\r
961         ShowPage();\r
962         ReadMouse();\r
963       }\r
964 \r
965       if (Confirm("Are you sure?"))\r
966       {\r
967         done=1;\r
968         if (ob_check) memset(obstruct, 0, (layer[0].sizex*layer[0].sizey)+4);\r
969         if (zn_check) memset(zone, 0, (layer[0].sizex*layer[0].sizey)+4);\r
970         if (zd_check)\r
971         {\r
972           numzones=0;\r
973           memset(&zones, 0, sizeof zones);\r
974         }\r
975         if (ent_check)\r
976         {\r
977           entities=0;\r
978           nmchr=0;\r
979           nms=0;\r
980           memset(&ms, 0, sizeof ms);\r
981           memset(&entity, 0, sizeof entities);\r
982           memset(&chrlist, 0, sizeof chrlist);\r
983         }\r
984       }\r
985       WaitRelease(); continue;\r
986     }\r
987 \r
988     if (mb==1 && mx>dtxofs+68 && mx<dtxofs+30+68 && my>dtyofs+24 && my<dtyofs+10+24 && !moving)\r
989     {\r
990       done=1;\r
991       // insert code for button "cancel" here\r
992       ButtonPressed(dtxofs+68, dtyofs+24, "cancel");\r
993       DrawMouse();\r
994       while (mb)\r
995       {\r
996         ReadMouse();\r
997         ShowPage();\r
998         ReadMouse();\r
999       }\r
1000       WaitRelease(); continue;\r
1001     }\r
1002 \r
1003     if (mb==1 && mx>(dtxofs+dtxsize-9) && (mx<dtxofs+dtxsize-2)\r
1004     && my>(dtyofs+1) && (my<dtyofs+8) && !moving)\r
1005     {\r
1006       done=1;\r
1007       WaitRelease();\r
1008       break;\r
1009     }\r
1010 \r
1011     if (mb==1 && mx>dtxofs && mx<dtxofs+dtxsize && my>dtyofs && my<(dtyofs+9) && !moving)\r
1012     {\r
1013       moving=1;\r
1014       mxo=mx-dtxofs;\r
1015       myo=my-dtyofs;\r
1016       continue;\r
1017     }\r
1018 \r
1019     if (mb==1 && !moving)\r
1020     {\r
1021       ctf=0;\r
1022       cb=0;\r
1023       str=0;\r
1024       WaitRelease();\r
1025     }\r
1026 \r
1027     if (last_pressed)\r
1028     {\r
1029       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
1030       else c=key_ascii_tbl[last_pressed];\r
1031 \r
1032       if (last_pressed==SCAN_ESC)\r
1033       {\r
1034         key[SCAN_ESC]=0;\r
1035         done=1;\r
1036         break;\r
1037       }\r
1038 \r
1039       if (last_pressed==SCAN_ENTER)\r
1040       {\r
1041         key[SCAN_ENTER]=0;\r
1042         ctf=0;\r
1043         str=0;\r
1044         last_pressed=0;\r
1045         continue;\r
1046       }\r
1047 \r
1048       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
1049       {\r
1050         switch (ctf)\r
1051         {\r
1052           case 0: ctf=0; str=0; break;\r
1053         }\r
1054         key[SCAN_TAB]=0;\r
1055         last_pressed=0;\r
1056         cb=1; cursorblink=systemtime+40;\r
1057         continue;\r
1058       }\r
1059 \r
1060       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
1061       {\r
1062         switch (ctf)\r
1063         {\r
1064           case 0: ctf=0; str=0; break;\r
1065         }\r
1066         key[SCAN_TAB]=0;\r
1067         last_pressed=0;\r
1068         cb=1; cursorblink=systemtime+40;\r
1069         continue;\r
1070       }\r
1071 \r
1072       if (!ctf)\r
1073         continue;\r
1074 \r
1075       if (last_pressed==SCAN_BACKSP && strlen(str))\r
1076       {\r
1077         str[strlen(str)-1]=0;\r
1078         key[SCAN_BACKSP]=0;\r
1079         last_pressed=0;\r
1080         continue;\r
1081       }\r
1082       else if (last_pressed==SCAN_BACKSP)\r
1083       {\r
1084         last_pressed=0;\r
1085         continue;\r
1086       }\r
1087 \r
1088       t=strlen(str);\r
1089       str[t]=c;\r
1090       str[t+1]=0;\r
1091       last_pressed=0;\r
1092     }\r
1093   } while (!done);\r
1094 }\r
1095 \r
1096 void LayersSubMenu(int dx, int dy)\r
1097 { char done=0;\r
1098   //int mxo, myo, cursorblink;\r
1099 \r
1100   do\r
1101   {\r
1102     if (dx<16) dx=16;\r
1103     if (dy<16) dy=16;\r
1104     if (dx+80>335) dx=336-80;\r
1105     if (dy+89>sy+16) dy=(sy+16)-89;\r
1106 \r
1107     RenderMap();\r
1108     RenderGUI();\r
1109     stdwindow(dx, dy, dx+80, dy+29);\r
1110 \r
1111     if (mx>dx && mx<dx+80)\r
1112     {\r
1113        if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
1114        if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
1115        if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
1116        if (my>dy+20 && my<dy+26) FilledBox(dx+2, dy+20, 76, 7, darkw);\r
1117     }\r
1118 \r
1119     GotoXY(dx+3, dy+3); printstring("Add Layer");\r
1120     GotoXY(dx+3, dy+9); printstring("Edit Layer");\r
1121     GotoXY(dx+3, dy+15); printstring("Import Image");\r
1122     GotoXY(dx+3, dy+21); printstring("Destroyer");\r
1123 \r
1124     DrawMouse();\r
1125     ShowPage();\r
1126     CheckTimerStuff();\r
1127 \r
1128     if (mb==1 && mx>dx && mx<dx+80)\r
1129     {\r
1130        if (my>dy+2 && my<dy+9) { AddLayer(); NoticeDialog(); done=1; WaitRelease(); break; }\r
1131        if (my>dy+8 && my<dy+15) { EditLayerProperties(); done=1; WaitRelease(); break; }\r
1132        if (my>dy+14 && my<dy+21) { ImageToLayer(); done=1; WaitRelease(); break; }\r
1133        if (my>dy+20 && my<dy+26) { Destroyer(); done=1; WaitRelease(); break; }\r
1134     }\r
1135 \r
1136     if (mb==1)\r
1137     {\r
1138       WaitRelease();\r
1139       done=1;\r
1140     }\r
1141     if (key[SCAN_ESC]==1) done=1;\r
1142   } while (!done);\r
1143   key[SCAN_ESC]=0;\r
1144 }\r
1145 \r
1146 void ExecuteSubMenu(int dx, int dy)\r
1147 { char done=0;\r
1148   //int mxo, myo, cursorblink;\r
1149 \r
1150   do\r
1151   {\r
1152     if (dx<16) dx=16;\r
1153     if (dy<16) dy=16;\r
1154     if (dx+80>335) dx=336-80;\r
1155     if (dy+89>sy+16) dy=(sy+16)-89;\r
1156 \r
1157     RenderMap();\r
1158     RenderGUI();\r
1159     stdwindow(dx, dy, dx+80, dy+23);\r
1160 \r
1161     if (mx>dx && mx<dx+80)\r
1162     {\r
1163        if (my>dy+2 && my<dy+9) FilledBox(dx+2, dy+2, 76, 7, darkw);\r
1164        if (my>dy+8 && my<dy+15) FilledBox(dx+2, dy+8, 76, 7, darkw);\r
1165        if (my>dy+14 && my<dy+21) FilledBox(dx+2, dy+14, 76, 7, darkw);\r
1166     }\r
1167 \r
1168     GotoXY(dx+3, dy+3); printstring("MAP");\r
1169     GotoXY(dx+3, dy+9); printstring("VERGE");\r
1170     GotoXY(dx+3, dy+15); printstring("DOS");\r
1171 \r
1172     DrawMouse();\r
1173     ShowPage();\r
1174     CheckTimerStuff();\r
1175 \r
1176     if (mb==1 && mx>dx && mx<dx+80)\r
1177     {\r
1178        if (my>dy+2 && my<dy+9)   { ShellMAP();   done=1; WaitRelease(); break; }\r
1179        if (my>dy+8 && my<dy+15)  { ShellVERGE(); done=1; WaitRelease(); break; }\r
1180        if (my>dy+14 && my<dy+21) { ShellToDOS(); done=1; WaitRelease(); break; }\r
1181     }\r
1182 \r
1183     if (mb==1)\r
1184     {\r
1185       WaitRelease();\r
1186       done=1;\r
1187     }\r
1188     if (key[SCAN_ESC]==1) done=1;\r
1189   } while (!done);\r
1190   key[SCAN_ESC]=0;\r
1191 }\r
1192 \r
1193 void AddLayer()\r
1194 {\r
1195   layers[numlayers]=(word *) valloc(layer[0].sizex * layer[0].sizey * 2,"layer data",numlayers);\r
1196   //memset(layers[numlayers], 0, layer[0].sizex * layer[0].sizey * 2);\r
1197   layer[numlayers].pmultx=1; layer[numlayers].pmulty=1;\r
1198   layer[numlayers].pdivx=1;  layer[numlayers].pdivy=1;\r
1199   layer[numlayers].sizex=layer[0].sizex;\r
1200   layer[numlayers].sizey=layer[0].sizey;\r
1201   layer[numlayers].trans=0;\r
1202   layer[numlayers].hline=0;\r
1203   numlayers++;\r
1204 }\r
1205 \r
1206 int lpxsize=190, lpysize=68;\r
1207 int lpxofs=40, lpyofs=60;\r
1208 \r
1209 void EditLayerProperties()\r
1210 { char done=0, moving=0;\r
1211   int mxo, myo, cursorblink, i;\r
1212   char ctf=0, cb=0, c, t, *str;\r
1213   char nstr1[80], nstr2[80], nstr3[80], nstr4[80], nstr5[80],nstr6[80];\r
1214 \r
1215   i=el;\r
1216   if (i>5) i=0;\r
1217   if (i>=numlayers) i=0;\r
1218 \r
1219   sprintf(nstr1, "%d", layer[i].pmultx);\r
1220   sprintf(nstr2, "%d", layer[i].pdivx);\r
1221   sprintf(nstr3, "%d", layer[i].pmulty);\r
1222   sprintf(nstr4, "%d", layer[i].pdivy);\r
1223   sprintf(nstr5, "%d", layer[i].trans);\r
1224   sprintf(nstr6, "%d", layer[i].hline);\r
1225   last_pressed=0;\r
1226   do\r
1227   {\r
1228     RenderMap();\r
1229     RenderGUI();\r
1230 \r
1231     if (ctf && systemtime >= cursorblink)\r
1232     {\r
1233       cb ^= 1;\r
1234       cursorblink = systemtime+40;\r
1235     }\r
1236     if (moving)\r
1237     {\r
1238       lpxofs = (mx-mxo);\r
1239       lpyofs = (my-myo);\r
1240       if (!mb) moving=0;\r
1241       if (lpxofs<16) lpxofs = 16;\r
1242       if (lpyofs<16) lpyofs = 16;\r
1243       if (lpxofs+lpxsize>335) lpxofs = 336-lpxsize;\r
1244       if (lpyofs+lpysize>sy+16) lpyofs = (sy+16)-lpysize;\r
1245     }\r
1246 \r
1247     Window(lpxofs, lpyofs, lpxofs+lpxsize, lpyofs+lpysize, "Edit Layer Properties");\r
1248     GotoXY(lpxofs+3, lpyofs+10); printstring("Parallax controls:");\r
1249     GotoXY(lpxofs+4, lpyofs+21); printstring("MultX:");\r
1250     GotoXY(lpxofs+12, lpyofs+31); printstring("DivX:");\r
1251     GotoXY(lpxofs+93, lpyofs+21); printstring("MultY:");\r
1252     GotoXY(lpxofs+101, lpyofs+31); printstring("DivY:");\r
1253     TextField(lpxofs+29, lpyofs+19, 60, nstr1, ctf == 1 ? cb : 0);\r
1254     TextField(lpxofs+29, lpyofs+29, 60, nstr2, ctf == 2 ? cb : 0);\r
1255     TextField(lpxofs+118, lpyofs+19, 60, nstr3, ctf == 3 ? cb : 0);\r
1256     TextField(lpxofs+118, lpyofs+29, 60, nstr4, ctf == 4 ? cb : 0);\r
1257     HLine(lpxofs+1, lpyofs+43, 188, white);\r
1258     GotoXY(lpxofs+9, lpyofs+48); printstring("Transparent");\r
1259     GotoXY(lpxofs+36, lpyofs+58); printstring("HLine");\r
1260     TextField(lpxofs+56, lpyofs+46, 60, nstr5, ctf == 5 ? cb : 0);\r
1261     TextField(lpxofs+56, lpyofs+56, 60, nstr6, ctf == 6 ? cb : 0);\r
1262     Button(lpxofs+156, lpyofs+55, "OK");\r
1263     GotoXY(lpxofs+144, lpyofs+47); printstring("Layer");\r
1264     sprintf(strbuf,"%d",i); GotoXY(lpxofs+168, lpyofs+47); printstring(strbuf);\r
1265 \r
1266     DrawMouse();\r
1267     ShowPage();\r
1268     CheckTimerStuff();\r
1269 \r
1270     // input phase\r
1271     if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
1272     {\r
1273       ctf=1; str=nstr1; cb=1;\r
1274       cursorblink=systemtime+40; continue;\r
1275     }\r
1276 \r
1277     if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
1278     {\r
1279       ctf=2; str=nstr2; cb=1;\r
1280       cursorblink=systemtime+40; continue;\r
1281     }\r
1282 \r
1283     if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
1284     {\r
1285       ctf=3; str=nstr3; cb=1;\r
1286       cursorblink=systemtime+40; continue;\r
1287     }\r
1288 \r
1289     if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
1290     {\r
1291       ctf=4; str=nstr4; cb=1;\r
1292       cursorblink=systemtime+40; continue;\r
1293     }\r
1294 \r
1295     if (mb==1 && mx>lpxofs+56 && mx<lpxofs+60+56 && my>lpyofs+46 && my<lpyofs+9+46 && !moving)\r
1296     {\r
1297       ctf=5; str=nstr5; cb=1;\r
1298       cursorblink=systemtime+40; continue;\r
1299     }\r
1300 \r
1301     if (mb==1 && mx>lpxofs+56 && mx<lpxofs+60+56 && my>lpyofs+56 && my<lpyofs+9+56 && !moving)\r
1302     {\r
1303       ctf=6; str=nstr6; cb=1;\r
1304       cursorblink=systemtime+40; continue;\r
1305     }\r
1306 \r
1307     if ((mb==1 && mx>lpxofs+156 && mx<lpxofs+30+156 && my>lpyofs+55 && my<lpyofs+10+55 && !moving) || (key[SCAN_ENTER] && !ctf))\r
1308     {\r
1309       // insert code for button "OK" here\r
1310       ButtonPressed(lpxofs+156, lpyofs+55, "OK");\r
1311       DrawMouse(); done=1;\r
1312       while (mb)\r
1313       {\r
1314         ReadMouse();\r
1315         ShowPage();\r
1316         ReadMouse();\r
1317       }\r
1318       WaitRelease(); continue;\r
1319     }\r
1320 \r
1321     if (mb==1 && mx>(lpxofs+lpxsize-9) && (mx<lpxofs+lpxsize-2)\r
1322     && my>(lpyofs+1) && (my<lpyofs+8) && !moving)\r
1323     {\r
1324       done=1;\r
1325       WaitRelease();\r
1326       break;\r
1327     }\r
1328 \r
1329     if (mb==1 && mx>lpxofs && mx<lpxofs+lpxsize && my>lpyofs && my<(lpyofs+9) && !moving)\r
1330     {\r
1331       moving=1;\r
1332       mxo=mx-lpxofs;\r
1333       myo=my-lpyofs;\r
1334       continue;\r
1335     }\r
1336 \r
1337     if (mb==1 && !moving)\r
1338     {\r
1339       ctf=0;\r
1340       cb=0;\r
1341       str=0;\r
1342       WaitRelease();\r
1343     }\r
1344 \r
1345     if (last_pressed)\r
1346     {\r
1347       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
1348       else c=key_ascii_tbl[last_pressed];\r
1349 \r
1350       if (last_pressed==SCAN_ESC)\r
1351       {\r
1352         key[SCAN_ESC]=0;\r
1353         done=1;\r
1354         break;\r
1355       }\r
1356 \r
1357       if (last_pressed==SCAN_UP)\r
1358       {\r
1359         layer[i].pmultx=atoi(nstr1);\r
1360         layer[i].pdivx=atoi(nstr2);\r
1361         layer[i].pmulty=atoi(nstr3);\r
1362         layer[i].pdivy=atoi(nstr4);\r
1363         layer[i].trans=atoi(nstr5);\r
1364         layer[i].hline=atoi(nstr6);\r
1365         last_pressed=0; key[SCAN_UP]=0;\r
1366         if (i) i--; else i=numlayers-1;\r
1367         sprintf(nstr1, "%d", layer[i].pmultx);\r
1368         sprintf(nstr2, "%d", layer[i].pdivx);\r
1369         sprintf(nstr3, "%d", layer[i].pmulty);\r
1370         sprintf(nstr4, "%d", layer[i].pdivy);\r
1371         sprintf(nstr5, "%d", layer[i].trans);\r
1372         sprintf(nstr6, "%d", layer[i].hline);\r
1373       }\r
1374       if (last_pressed==SCAN_DOWN)\r
1375       {\r
1376         layer[i].pmultx=atoi(nstr1);\r
1377         layer[i].pdivx=atoi(nstr2);\r
1378         layer[i].pmulty=atoi(nstr3);\r
1379         layer[i].pdivy=atoi(nstr4);\r
1380         layer[i].trans=atoi(nstr5);\r
1381         layer[i].hline=atoi(nstr6);\r
1382         last_pressed=0; key[SCAN_DOWN]=0;\r
1383         if (i<numlayers-1) i++; else i=0;\r
1384         sprintf(nstr1, "%d", layer[i].pmultx);\r
1385         sprintf(nstr2, "%d", layer[i].pdivx);\r
1386         sprintf(nstr3, "%d", layer[i].pmulty);\r
1387         sprintf(nstr4, "%d", layer[i].pdivy);\r
1388         sprintf(nstr5, "%d", layer[i].trans);\r
1389         sprintf(nstr6, "%d", layer[i].hline);\r
1390       }\r
1391 \r
1392       if (last_pressed==SCAN_ENTER)\r
1393       {\r
1394         key[SCAN_ENTER]=0;\r
1395         ctf=0;\r
1396         str=0;\r
1397         last_pressed=0;\r
1398         continue;\r
1399       }\r
1400 \r
1401       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
1402       {\r
1403         switch (ctf)\r
1404         {\r
1405           case 0: ctf=1; str=nstr1; break;\r
1406           case 1: ctf=2; str=nstr2; break;\r
1407           case 2: ctf=3; str=nstr3; break;\r
1408           case 3: ctf=4; str=nstr4; break;\r
1409           case 4: ctf=5; str=nstr5; break;\r
1410           case 5: ctf=6; str=nstr6; break;\r
1411           case 6: ctf=0; str=0; break;\r
1412         }\r
1413         key[SCAN_TAB]=0;\r
1414         last_pressed=0;\r
1415         cb=1; cursorblink=systemtime+40;\r
1416         continue;\r
1417       }\r
1418 \r
1419       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
1420       {\r
1421         switch (ctf)\r
1422         {\r
1423           case 0: ctf=6; str=nstr6; break;\r
1424           case 1: ctf=0; str=0; break;\r
1425           case 2: ctf=1; str=nstr1; break;\r
1426           case 3: ctf=2; str=nstr2; break;\r
1427           case 4: ctf=3; str=nstr3; break;\r
1428           case 5: ctf=4; str=nstr4; break;\r
1429           case 6: ctf=5; str=nstr5; break;\r
1430         }\r
1431         key[SCAN_TAB]=0;\r
1432         last_pressed=0;\r
1433         cb=1; cursorblink=systemtime+40;\r
1434         continue;\r
1435       }\r
1436 \r
1437       if (!ctf)\r
1438         continue;\r
1439 \r
1440       if (last_pressed==SCAN_BACKSP && strlen(str))\r
1441       {\r
1442         str[strlen(str)-1]=0;\r
1443         key[SCAN_BACKSP]=0;\r
1444         last_pressed=0;\r
1445         continue;\r
1446       }\r
1447       else if (last_pressed==SCAN_BACKSP)\r
1448       {\r
1449         last_pressed=0;\r
1450         continue;\r
1451       }\r
1452 \r
1453       t=strlen(str);\r
1454       str[t]=c;\r
1455       str[t+1]=0;\r
1456       last_pressed=0;\r
1457     }\r
1458   } while (!done);\r
1459   layer[i].pmultx=atoi(nstr1);\r
1460   layer[i].pdivx=atoi(nstr2);\r
1461   layer[i].pmulty=atoi(nstr3);\r
1462   layer[i].pdivy=atoi(nstr4);\r
1463   layer[i].trans=atoi(nstr5);\r
1464   layer[i].hline=atoi(nstr6);\r
1465 }\r
1466 /*\r
1467 int lpxsize=190, lpysize=68;\r
1468 int lpxofs=40, lpyofs=60;\r
1469 \r
1470 void EditLayerProperties()\r
1471 { char done=0, moving=0;\r
1472   int mxo, myo, cursorblink, i;\r
1473   char ctf=0, cb=0, c, t, *str;\r
1474   char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
1475 \r
1476   i=el;\r
1477   if (i>5) i=0;\r
1478   if (i>=numlayers) i=0;\r
1479 \r
1480   sprintf(nstr1, "%d", layer[i].pmultx);\r
1481   sprintf(nstr2, "%d", layer[i].pdivx);\r
1482   sprintf(nstr3, "%d", layer[i].pmulty);\r
1483   sprintf(nstr4, "%d", layer[i].pdivy);\r
1484   last_pressed=0;\r
1485   do\r
1486   {\r
1487     RenderMap();\r
1488     RenderGUI();\r
1489 \r
1490     if (ctf && systemtime >= cursorblink)\r
1491     {\r
1492       cb ^= 1;\r
1493       cursorblink = systemtime+40;\r
1494     }\r
1495     if (moving)\r
1496     {\r
1497       lpxofs = (mx-mxo);\r
1498       lpyofs = (my-myo);\r
1499       if (!mb) moving=0;\r
1500       if (lpxofs<16) lpxofs = 16;\r
1501       if (lpyofs<16) lpyofs = 16;\r
1502       if (lpxofs+lpxsize>335) lpxofs = 336-lpxsize;\r
1503       if (lpyofs+lpysize>sy+16) lpyofs = (sy+16)-lpysize;\r
1504     }\r
1505 \r
1506     Window(lpxofs, lpyofs, lpxofs+lpxsize, lpyofs+lpysize, "Edit Layer Properties");\r
1507     GotoXY(lpxofs+3, lpyofs+10); printstring("Parallax controls:");\r
1508     GotoXY(lpxofs+4, lpyofs+21); printstring("MultX:");\r
1509     GotoXY(lpxofs+12, lpyofs+31); printstring("DivX:");\r
1510     GotoXY(lpxofs+93, lpyofs+21); printstring("MultY:");\r
1511     GotoXY(lpxofs+101, lpyofs+31); printstring("DivY:");\r
1512     TextField(lpxofs+29, lpyofs+19, 60, nstr1, ctf == 1 ? cb : 0);\r
1513     TextField(lpxofs+29, lpyofs+29, 60, nstr2, ctf == 2 ? cb : 0);\r
1514     TextField(lpxofs+118, lpyofs+19, 60, nstr3, ctf == 3 ? cb : 0);\r
1515     TextField(lpxofs+118, lpyofs+29, 60, nstr4, ctf == 4 ? cb : 0);\r
1516     HLine(lpxofs+1, lpyofs+43, 188, white);\r
1517     GotoXY(lpxofs+6, lpyofs+49); printstring("Transparent");\r
1518     GotoXY(lpxofs+32, lpyofs+56); printstring("HLine");\r
1519     CheckBox(lpxofs+56, lpyofs+48, layer[i].trans);\r
1520     CheckBox(lpxofs+56, lpyofs+56, layer[i].hline);\r
1521     Button(lpxofs+156, lpyofs+55, "OK");\r
1522     GotoXY(lpxofs+144, lpyofs+47); printstring("Layer");\r
1523     sprintf(strbuf,"%d",i); GotoXY(lpxofs+168, lpyofs+47); printstring(strbuf);\r
1524 \r
1525     DrawMouse();\r
1526     ShowPage();\r
1527     CheckTimerStuff();\r
1528 \r
1529     // input phase\r
1530     if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
1531     {\r
1532       ctf=1; str=nstr1; cb=1;\r
1533       cursorblink=systemtime+40; continue;\r
1534     }\r
1535 \r
1536     if (mb==1 && mx>lpxofs+29 && mx<lpxofs+60+29 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
1537     {\r
1538       ctf=2; str=nstr2; cb=1;\r
1539       cursorblink=systemtime+40; continue;\r
1540     }\r
1541 \r
1542     if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+19 && my<lpyofs+9+19 && !moving)\r
1543     {\r
1544       ctf=3; str=nstr3; cb=1;\r
1545       cursorblink=systemtime+40; continue;\r
1546     }\r
1547 \r
1548     if (mb==1 && mx>lpxofs+118 && mx<lpxofs+60+118 && my>lpyofs+29 && my<lpyofs+9+29 && !moving)\r
1549     {\r
1550       ctf=4; str=nstr4; cb=1;\r
1551       cursorblink=systemtime+40; continue;\r
1552     }\r
1553 \r
1554     if (mb==1 && mx>lpxofs+56 && mx<lpxofs+8+56 && my>lpyofs+48 && my<lpyofs+7+48 && !moving)\r
1555     {\r
1556       layer[i].trans ^= 1; WaitRelease(); continue;\r
1557     }\r
1558 \r
1559     if (mb==1 && mx>lpxofs+56 && mx<lpxofs+8+56 && my>lpyofs+56 && my<lpyofs+7+56 && !moving)\r
1560     {\r
1561       layer[i].hline ^= 1; WaitRelease(); continue;\r
1562     }\r
1563 \r
1564     if ((mb==1 && mx>lpxofs+156 && mx<lpxofs+30+156 && my>lpyofs+55 && my<lpyofs+10+55 && !moving) || (key[SCAN_ENTER] && !ctf))\r
1565     {\r
1566       // insert code for button "OK" here\r
1567       done=1;\r
1568       ButtonPressed(lpxofs+156, lpyofs+55, "OK");\r
1569       DrawMouse();\r
1570       while (mb)\r
1571       {\r
1572         ReadMouse();\r
1573         ShowPage();\r
1574         ReadMouse();\r
1575       }\r
1576       WaitRelease(); continue;\r
1577     }\r
1578 \r
1579     if (mb==1 && mx>(lpxofs+lpxsize-9) && (mx<lpxofs+lpxsize-2)\r
1580     && my>(lpyofs+1) && (my<lpyofs+8) && !moving)\r
1581     {\r
1582       done=1;\r
1583       WaitRelease();\r
1584       break;\r
1585     }\r
1586 \r
1587     if (mb==1 && mx>lpxofs && mx<lpxofs+lpxsize && my>lpyofs && my<(lpyofs+9) && !moving)\r
1588     {\r
1589       moving=1;\r
1590       mxo=mx-lpxofs;\r
1591       myo=my-lpyofs;\r
1592       continue;\r
1593     }\r
1594 \r
1595     if (mb==1 && !moving)\r
1596     {\r
1597       ctf=0;\r
1598       cb=0;\r
1599       str=0;\r
1600       WaitRelease();\r
1601     }\r
1602 \r
1603     if (last_pressed)\r
1604     {\r
1605       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
1606       else c=key_ascii_tbl[last_pressed];\r
1607 \r
1608       if (last_pressed==SCAN_ESC)\r
1609       {\r
1610         key[SCAN_ESC]=0;\r
1611         done=1;\r
1612         break;\r
1613       }\r
1614 \r
1615       if (last_pressed==SCAN_UP)\r
1616       {\r
1617         layer[i].pmultx=atoi(nstr1);\r
1618         layer[i].pdivx=atoi(nstr2);\r
1619         layer[i].pmulty=atoi(nstr3);\r
1620         layer[i].pdivy=atoi(nstr4);\r
1621         last_pressed=0; key[SCAN_UP]=0;\r
1622         if (i) i--; else i=numlayers-1;\r
1623         sprintf(nstr1, "%d", layer[i].pmultx);\r
1624         sprintf(nstr2, "%d", layer[i].pdivx);\r
1625         sprintf(nstr3, "%d", layer[i].pmulty);\r
1626         sprintf(nstr4, "%d", layer[i].pdivy);\r
1627       }\r
1628       if (last_pressed==SCAN_DOWN)\r
1629       {\r
1630         layer[i].pmultx=atoi(nstr1);\r
1631         layer[i].pdivx=atoi(nstr2);\r
1632         layer[i].pmulty=atoi(nstr3);\r
1633         layer[i].pdivy=atoi(nstr4);\r
1634         last_pressed=0; key[SCAN_DOWN]=0;\r
1635         if (i<numlayers-1) i++; else i=0;\r
1636         sprintf(nstr1, "%d", layer[i].pmultx);\r
1637         sprintf(nstr2, "%d", layer[i].pdivx);\r
1638         sprintf(nstr3, "%d", layer[i].pmulty);\r
1639         sprintf(nstr4, "%d", layer[i].pdivy);\r
1640       }\r
1641 \r
1642       if (last_pressed==SCAN_ENTER)\r
1643       {\r
1644         key[SCAN_ENTER]=0;\r
1645         ctf=0;\r
1646         str=0;\r
1647         last_pressed=0;\r
1648         continue;\r
1649       }\r
1650 \r
1651       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
1652       {\r
1653         switch (ctf)\r
1654         {\r
1655           case 0: ctf=1; str=nstr1; break;\r
1656           case 1: ctf=2; str=nstr2; break;\r
1657           case 2: ctf=3; str=nstr3; break;\r
1658           case 3: ctf=4; str=nstr4; break;\r
1659           case 4: ctf=0; str=0; break;\r
1660         }\r
1661         key[SCAN_TAB]=0;\r
1662         last_pressed=0;\r
1663         cb=1; cursorblink=systemtime+40;\r
1664         continue;\r
1665       }\r
1666 \r
1667       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
1668       {\r
1669         switch (ctf)\r
1670         {\r
1671           case 0: ctf=4; str=nstr4; break;\r
1672           case 1: ctf=0; str=0; break;\r
1673           case 2: ctf=1; str=nstr1; break;\r
1674           case 3: ctf=2; str=nstr2; break;\r
1675           case 4: ctf=3; str=nstr3; break;\r
1676         }\r
1677         key[SCAN_TAB]=0;\r
1678         last_pressed=0;\r
1679         cb=1; cursorblink=systemtime+40;\r
1680         continue;\r
1681       }\r
1682 \r
1683       if (!ctf)\r
1684         continue;\r
1685 \r
1686       if (last_pressed==SCAN_BACKSP && strlen(str))\r
1687       {\r
1688         str[strlen(str)-1]=0;\r
1689         key[SCAN_BACKSP]=0;\r
1690         last_pressed=0;\r
1691         continue;\r
1692       }\r
1693       else if (last_pressed==SCAN_BACKSP)\r
1694       {\r
1695         last_pressed=0;\r
1696         continue;\r
1697       }\r
1698 \r
1699       t=strlen(str);\r
1700       str[t]=c;\r
1701       str[t+1]=0;\r
1702       last_pressed=0;\r
1703     }\r
1704   } while (!done);\r
1705 \r
1706   layer[i].pmultx=atoi(nstr1);\r
1707   layer[i].pdivx=atoi(nstr2);\r
1708   layer[i].pmulty=atoi(nstr3);\r
1709   layer[i].pdivy=atoi(nstr4);\r
1710 }\r
1711    */\r
1712 void NewMAP()\r
1713 { int cursorblink;\r
1714 \r
1715     if (Confirm("Lose existing MAP?"))\r
1716     {\r
1717       for (cursorblink=0; cursorblink<numlayers; cursorblink++)\r
1718         vfree(layers[cursorblink]);\r
1719       memcpy(mapname,"UNTITLED.MAP",13);\r
1720       memcpy(vspname,"UNTITLED.VSP",13);\r
1721       memcpy(musname,"\0",1);\r
1722       memcpy(rstring,"1E",2);\r
1723       xstart=1; ystart=1;\r
1724       numlayers=1;\r
1725       wrap=0;\r
1726 \r
1727       // aen: default newmap dimensions set to 100x100\r
1728       layer[0].pmultx=1;  layer[0].pmulty=1;\r
1729       layer[0].pdivx=1;   layer[0].pdivy=1;\r
1730       layer[0].sizex=100; layer[0].sizey=100;\r
1731       layer[0].trans=0;   layer[0].hline=0;\r
1732 \r
1733       layers[0] = (unsigned short *)valloc((layer[0].sizex*layer[0].sizey*2)+4,"layer data",0);\r
1734       vfree(obstruct);\r
1735       obstruct=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"obstruct",0);\r
1736       vfree(zone);\r
1737       zone=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"zone",0);\r
1738       entities=0; // Mordred\r
1739 \r
1740       // aen: default number of tiles set to 100\r
1741       numtiles=100;\r
1742       vfree(vsp);\r
1743       vsp=(char *) valloc(256 * numtiles,"vsp data",0);\r
1744 \r
1745       // zero: was re-allocating same memory so gfx still visible in some places\r
1746       memset(vsp,0,256*numtiles);\r
1747       // zero: gotta clear that anim stuff man!\r
1748       memset(vspanim,0,800);\r
1749       InitTileIDX();\r
1750 \r
1751 \r
1752 \r
1753       layertoggle[0]=1; layertoggle[1]=0; layertoggle[2]=0; layertoggle[3]=0;\r
1754       layertoggle[4]=0; layertoggle[5]=0; layertoggle[6]=0; layertoggle[7]=0;\r
1755       xwin=0; ywin=0;\r
1756     }\r
1757 }\r
1758 \r
1759 int amxsize=150, amysize=88;\r
1760 int amxofs=60, amyofs=60;\r
1761 \r
1762 void About()\r
1763 {\r
1764   char done=0, moving=0;\r
1765   int mxo, myo, cursorblink;\r
1766   char ctf=0, cb=0, c, t, *str;\r
1767 \r
1768   last_pressed=0;\r
1769 \r
1770   do\r
1771   {\r
1772     RenderMap();\r
1773     RenderGUI();\r
1774 \r
1775     if (ctf && systemtime >= cursorblink)\r
1776     {\r
1777       cb ^= 1;\r
1778       cursorblink = systemtime+40;\r
1779     }\r
1780     if (moving)\r
1781     {\r
1782       amxofs = (mx-mxo);\r
1783       amyofs = (my-myo);\r
1784       if (!mb) moving=0;\r
1785       if (amxofs<16) amxofs = 16;\r
1786       if (amyofs<16) amyofs = 16;\r
1787       if (amxofs+amxsize>335) amxofs = 336-amxsize;\r
1788       if (amyofs+amysize>sy+16) amyofs = (sy+16)-amysize;\r
1789     }\r
1790 \r
1791     sprintf(strbuf, "About MapEd %s", ME2_VERSION);\r
1792     Window(amxofs, amyofs, amxofs+amxsize, amyofs+amysize, strbuf);\r
1793     sprintf(strbuf, "MapEd v.%s", ME2_VERSION);\r
1794     GotoXY(amxofs+52, amyofs+16); printstring(strbuf);\r
1795     GotoXY(amxofs+31, amyofs+22); printstring("Copyright (C) 1998 vecna");\r
1796     GotoXY(amxofs+40, amyofs+28); printstring("All Rights Reserved");\r
1797     GotoXY(amxofs+(75-pixels("Additional code by Ric")/2), amyofs+41);\r
1798     printstring("Additional code by Ric");\r
1799     GotoXY(amxofs+(75-pixels("Additional code by aen")/2), amyofs+47);\r
1800     printstring("Additional code by aen");\r
1801     GotoXY(amxofs+(75-pixels("Additional code by zeromus")/2), amyofs+53);\r
1802     printstring("Additional code by zeromus");\r
1803     Button(amxofs+60, amyofs+68, "OK");\r
1804 \r
1805     DrawMouse();\r
1806     ShowPage();\r
1807     CheckTimerStuff();\r
1808 \r
1809     // input phase\r
1810     if ((mb==1 && mx>amxofs+66 && mx<amxofs+30+66 && my>amyofs+68 && my<amyofs+10+68 && !moving) || (key[SCAN_ENTER] && !ctf))\r
1811     {\r
1812       // insert code for button "OK" here\r
1813       done=1;\r
1814       ButtonPressed(amxofs+60, amyofs+68, "OK");\r
1815       DrawMouse();\r
1816       while (mb)\r
1817       {\r
1818         ReadMouse();\r
1819         ShowPage();\r
1820         ReadMouse();\r
1821       }\r
1822       WaitRelease(); continue;\r
1823     }\r
1824 \r
1825     if (mb==1 && mx>(amxofs+amxsize-9) && (mx<amxofs+amxsize-2) &&\r
1826         my>(amyofs+1) && (my<amyofs+8) && !moving)\r
1827     {\r
1828       done=1;\r
1829       WaitRelease();\r
1830       break;\r
1831     }\r
1832 \r
1833     if (mb==1 && mx>amxofs && mx<amxofs+amxsize && my>amyofs && my<(amyofs+9) && !moving)\r
1834     {\r
1835       moving=1;\r
1836       mxo=mx-amxofs;\r
1837       myo=my-amyofs;\r
1838       continue;\r
1839     }\r
1840 \r
1841     if (mb==1 && !moving)\r
1842     {\r
1843       ctf=0;\r
1844       cb=0;\r
1845       str=0;\r
1846       WaitRelease();\r
1847     }\r
1848 \r
1849     if (last_pressed)\r
1850     {\r
1851       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
1852       else c=key_ascii_tbl[last_pressed];\r
1853 \r
1854       if (last_pressed==SCAN_ESC)\r
1855       {\r
1856         key[SCAN_ESC]=0;\r
1857         done=1;\r
1858         break;\r
1859       }\r
1860 \r
1861       if (last_pressed==SCAN_ENTER)\r
1862       {\r
1863         key[SCAN_ENTER]=0;\r
1864         ctf=0;\r
1865         str=0;\r
1866         last_pressed=0;\r
1867         continue;\r
1868       }\r
1869 \r
1870       if (last_pressed==SCAN_TAB)\r
1871       {\r
1872         switch (ctf)\r
1873         {\r
1874           case 0: ctf=0; str=0; break;\r
1875         }\r
1876         key[SCAN_TAB]=0;\r
1877         last_pressed=0;\r
1878         cb=1; cursorblink=systemtime+40;\r
1879         continue;\r
1880       }\r
1881 \r
1882       if (!ctf)\r
1883         continue;\r
1884 \r
1885       if (last_pressed==SCAN_BACKSP && strlen(str))\r
1886       {\r
1887         str[strlen(str)-1]=0;\r
1888         key[SCAN_BACKSP]=0;\r
1889         last_pressed=0;\r
1890         continue;\r
1891       }\r
1892       else if (last_pressed==SCAN_BACKSP)\r
1893       {\r
1894         last_pressed=0;\r
1895         continue;\r
1896       }\r
1897 \r
1898       t=strlen(str);\r
1899       str[t]=c;\r
1900       str[t+1]=0;\r
1901       last_pressed=0;\r
1902     }\r
1903 \r
1904   } while (!done);\r
1905 }\r
1906 \r
1907 int cnxsize=125, cnysize=50;\r
1908 int cnxofs=114, cnyofs=70;\r
1909 \r
1910 int Confirm(char *message)\r
1911 { char done=0, moving=0;\r
1912   int mxo, myo, cursorblink;\r
1913   char ctf=0, cb=0, c, t, *str;\r
1914 \r
1915   last_pressed=0;\r
1916   WaitRelease();\r
1917   do\r
1918   {\r
1919     RenderMap();\r
1920     RenderGUI();\r
1921 \r
1922     if (ctf && systemtime >= cursorblink)\r
1923     {\r
1924       cb ^= 1;\r
1925       cursorblink = systemtime+40;\r
1926     }\r
1927     if (moving)\r
1928     {\r
1929       cnxofs = (mx-mxo);\r
1930       cnyofs = (my-myo);\r
1931       if (!mb) moving=0;\r
1932       if (cnxofs<16) cnxofs = 16;\r
1933       if (cnyofs<16) cnyofs = 16;\r
1934       if (cnxofs+cnxsize>335) cnxofs = 336-cnxsize;\r
1935       if (cnyofs+cnysize>sy+16) cnyofs = (sy+16)-cnysize;\r
1936     }\r
1937 \r
1938     Window(cnxofs, cnyofs, cnxofs+cnxsize, cnyofs+cnysize, "Confirm? (Y/N)");\r
1939     GotoXY(cnxofs+125/2-(pixels(message)/2), cnyofs+15);  printstring(message);\r
1940 \r
1941     Button(cnxofs+24, cnyofs+30, "Yes");\r
1942     Button(cnxofs+69, cnyofs+30, "No");\r
1943 \r
1944     DrawMouse();\r
1945     ShowPage();\r
1946     CheckTimerStuff();\r
1947 \r
1948     // input phase\r
1949     if (mb==1 && mx>cnxofs+24 && mx<cnxofs+30+24 && my>cnyofs+30 && my<cnyofs+10+30 && !moving)\r
1950     {\r
1951       // insert code for button "Yes" here\r
1952       ButtonPressed(cnxofs+24, cnyofs+30, "Yes");\r
1953       DrawMouse();\r
1954       while (mb)\r
1955       {\r
1956         ReadMouse();\r
1957         ShowPage();\r
1958         ReadMouse();\r
1959       }\r
1960       WaitRelease();\r
1961       return 1;\r
1962     }\r
1963 \r
1964     if (mb==1 && mx>cnxofs+69 && mx<cnxofs+30+69 && my>cnyofs+30 && my<cnyofs+10+30 && !moving)\r
1965     {\r
1966       ButtonPressed(cnxofs+69, cnyofs+30, "No");\r
1967       DrawMouse();\r
1968       while (mb)\r
1969       {\r
1970         ReadMouse();\r
1971         ShowPage();\r
1972         ReadMouse();\r
1973       }\r
1974       WaitRelease();\r
1975       return 0;\r
1976     }\r
1977 \r
1978     if (mb==1 && mx>(cnxofs+cnxsize-9) && (mx<cnxofs+cnxsize-2)\r
1979         && my>(cnyofs+1) && (my<cnyofs+8) && !moving)\r
1980     {\r
1981       done=1;\r
1982       WaitRelease();\r
1983       break;\r
1984     }\r
1985 \r
1986     if (mb==1 && mx>cnxofs && mx<cnxofs+cnxsize && my>cnyofs && my<(cnyofs+9) && !moving)\r
1987     {\r
1988       moving=1;\r
1989       mxo=mx-cnxofs;\r
1990       myo=my-cnyofs;\r
1991       continue;\r
1992     }\r
1993 \r
1994     if (mb==1 && !moving)\r
1995     {\r
1996       ctf=0;\r
1997       cb=0;\r
1998       str=0;\r
1999       WaitRelease();\r
2000     }\r
2001 \r
2002     if (last_pressed)\r
2003     {\r
2004       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
2005       else c=key_ascii_tbl[last_pressed];\r
2006 \r
2007       if (last_pressed==SCAN_ESC)\r
2008       {\r
2009         key[SCAN_ESC]=0;\r
2010         done=1;\r
2011         break;\r
2012       }\r
2013       if (last_pressed==SCAN_N)\r
2014       {\r
2015         key[SCAN_N]=0;\r
2016         done=1;\r
2017         break;\r
2018       }\r
2019       if (last_pressed==SCAN_Y)\r
2020       {\r
2021         key[SCAN_Y]=0;\r
2022         return 1;\r
2023       }\r
2024 \r
2025       if (last_pressed==SCAN_ENTER)\r
2026       {\r
2027         key[SCAN_ENTER]=0;\r
2028         ctf=0;\r
2029         str=0;\r
2030         last_pressed=0;\r
2031         continue;\r
2032       }\r
2033 \r
2034       if (last_pressed==SCAN_TAB)\r
2035       {\r
2036         switch (ctf)\r
2037         {\r
2038           case 0: ctf=0; str=0; break;\r
2039         }\r
2040         key[SCAN_TAB]=0;\r
2041         last_pressed=0;\r
2042         cb=1; cursorblink=systemtime+40;\r
2043         continue;\r
2044       }\r
2045 \r
2046       if (!ctf)\r
2047         continue;\r
2048 \r
2049       if (last_pressed==SCAN_BACKSP && strlen(str))\r
2050       {\r
2051         str[strlen(str)-1]=0;\r
2052         key[SCAN_BACKSP]=0;\r
2053         last_pressed=0;\r
2054         continue;\r
2055       }\r
2056       else if (last_pressed==SCAN_BACKSP)\r
2057       {\r
2058         last_pressed=0;\r
2059         continue;\r
2060       }\r
2061 \r
2062       t=strlen(str);\r
2063       str[t]=c;\r
2064       str[t+1]=0;\r
2065       last_pressed=0;\r
2066     }\r
2067 \r
2068   } while (!done);\r
2069   return 0;\r
2070 }\r
2071 \r
2072 int lmxsize=145, lmysize=36;\r
2073 int lmxofs=80, lmyofs=50;\r
2074 \r
2075 void LoadMAPDialog()\r
2076 { char lmapname[80];\r
2077   char done=0, moving=0;\r
2078   int mxo, myo, cursorblink;\r
2079   char ctf=0, cb=0, c, t, *str;\r
2080 \r
2081   memset(lmapname, 0, 80);\r
2082   last_pressed=0;\r
2083   do\r
2084   {\r
2085     RenderMap();\r
2086     RenderGUI();\r
2087 \r
2088     if (ctf && systemtime >= cursorblink)\r
2089     {\r
2090       cb ^= 1;\r
2091       cursorblink = systemtime+40;\r
2092     }\r
2093     if (moving)\r
2094     {\r
2095       lmxofs = (mx-mxo);\r
2096       lmyofs = (my-myo);\r
2097       if (!mb) moving=0;\r
2098       if (lmxofs<16) lmxofs = 16;\r
2099       if (lmyofs<16) lmyofs = 16;\r
2100       if (lmxofs+lmxsize>335) lmxofs = 336-lmxsize;\r
2101       if (lmyofs+lmysize>sy+16) lmyofs = (sy+16)-lmysize;\r
2102     }\r
2103 \r
2104     Window(lmxofs, lmyofs, lmxofs+lmxsize, lmyofs+lmysize, "Load MAP");\r
2105     GotoXY(lmxofs+2, lmyofs+13); printstring("Load MAP:");\r
2106     TextField(lmxofs+38, lmyofs+11, 70, lmapname, ctf == 1 ? cb : 0);\r
2107     Button(lmxofs+79, lmyofs+22, "OK");\r
2108     Button(lmxofs+111, lmyofs+22, "Cancel");\r
2109     Button(lmxofs+111, lmyofs+11, "Browse");\r
2110 \r
2111     DrawMouse();\r
2112     ShowPage();\r
2113     CheckTimerStuff();\r
2114 \r
2115     // input phase\r
2116     if (mb==1 && mx>lmxofs+38 && mx<lmxofs+70+38 && my>lmyofs+11 && my<lmyofs+9+11 && !moving)\r
2117     {\r
2118       ctf=1; str=lmapname; cb=1;\r
2119       cursorblink=systemtime+40; continue;\r
2120     }\r
2121 \r
2122     if ((mb==1 && mx>lmxofs+79 && mx<lmxofs+30+79 && my>lmyofs+22 && my<lmyofs+10+22 && !moving) || (key[SCAN_ENTER] && !ctf))\r
2123     {\r
2124       // insert code for button "OK" here\r
2125       if (modified)\r
2126          if (!Confirm("Lose unsaved changes?")) { done=1; continue; }\r
2127       for (cursorblink=0; cursorblink<numlayers; cursorblink++)\r
2128            vfree(layers[cursorblink]);\r
2129       vfree(obstruct);\r
2130       vfree(zone);\r
2131       vfree(vsp);\r
2132 \r
2133       memcpy(mapname, lmapname, strlen(lmapname)+1);\r
2134       LoadMAP(mapname);\r
2135       InitTileIDX();\r
2136       xwin=0; ywin=0; done=1;\r
2137 \r
2138       ButtonPressed(lmxofs+79, lmyofs+22, "OK");\r
2139       DrawMouse();\r
2140       while (mb)\r
2141       {\r
2142         ReadMouse();\r
2143         ShowPage();\r
2144         ReadMouse();\r
2145       }\r
2146       WaitRelease(); continue;\r
2147     }\r
2148 \r
2149     if (mb==1 && mx>lmxofs+111 && mx<lmxofs+30+111 && my>lmyofs+22 && my<lmyofs+10+22 && !moving)\r
2150     {\r
2151       // insert code for button "Cancel" here\r
2152       ButtonPressed(lmxofs+111, lmyofs+22, "Cancel");\r
2153       DrawMouse(); done=1;\r
2154       while (mb)\r
2155       {\r
2156         ReadMouse();\r
2157         ShowPage();\r
2158         ReadMouse();\r
2159       }\r
2160       WaitRelease(); continue;\r
2161     }\r
2162 \r
2163     if ((mb==1 && mx>lmxofs+111 && mx<lmxofs+30+111 && my>lmyofs+11 && my<lmyofs+10+11 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
2164     {\r
2165       // insert code for button "Browse" here\r
2166       ButtonPressed(lmxofs+111, lmyofs+11, "Browse");\r
2167       DrawMouse();\r
2168       while (mb)\r
2169       {\r
2170         ReadMouse();\r
2171         ShowPage();\r
2172         ReadMouse();\r
2173       }\r
2174       WaitRelease();\r
2175       Browse(1,"*.map","","","",lmapname);\r
2176       continue;\r
2177     }\r
2178 \r
2179     if (mb==1 && mx>(lmxofs+lmxsize-9) && (mx<lmxofs+lmxsize-2)\r
2180     && my>(lmyofs+1) && (my<lmyofs+8) && !moving)\r
2181     {\r
2182       done=1;\r
2183       WaitRelease();\r
2184       break;\r
2185     }\r
2186 \r
2187     if (mb==1 && mx>lmxofs && mx<lmxofs+lmxsize && my>lmyofs && my<(lmyofs+9) && !moving)\r
2188     {\r
2189       moving=1;\r
2190       mxo=mx-lmxofs;\r
2191       myo=my-lmyofs;\r
2192       continue;\r
2193     }\r
2194 \r
2195     if (mb==1 && !moving)\r
2196     {\r
2197       ctf=0;\r
2198       cb=0;\r
2199       str=0;\r
2200       WaitRelease();\r
2201     }\r
2202 \r
2203     if (last_pressed)\r
2204     {\r
2205       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
2206       else c=key_ascii_tbl[last_pressed];\r
2207 \r
2208       if (last_pressed==SCAN_ESC)\r
2209       {\r
2210         key[SCAN_ESC]=0;\r
2211         done=1;\r
2212         break;\r
2213       }\r
2214 \r
2215       if (last_pressed==SCAN_ENTER)\r
2216       {\r
2217         key[SCAN_ENTER]=0;\r
2218         ctf=0;\r
2219         str=0;\r
2220         last_pressed=0;\r
2221         continue;\r
2222       }\r
2223 \r
2224       if (last_pressed==SCAN_TAB)\r
2225       {\r
2226         switch (ctf)\r
2227         {\r
2228           case 0: ctf=1; str=lmapname; break;\r
2229           case 1: ctf=0; str=0; break;\r
2230         }\r
2231         key[SCAN_TAB]=0;\r
2232         last_pressed=0;\r
2233         cb=1; cursorblink=systemtime+40;\r
2234         continue;\r
2235       }\r
2236 \r
2237       if (!ctf)\r
2238         continue;\r
2239 \r
2240       if (last_pressed==SCAN_BACKSP && strlen(str))\r
2241       {\r
2242         str[strlen(str)-1]=0;\r
2243         key[SCAN_BACKSP]=0;\r
2244         last_pressed=0;\r
2245         continue;\r
2246       }\r
2247       else if (last_pressed==SCAN_BACKSP)\r
2248       {\r
2249         last_pressed=0;\r
2250         continue;\r
2251       }\r
2252 \r
2253       t=strlen(str);\r
2254       str[t]=c;\r
2255       str[t+1]=0;\r
2256       last_pressed=0;\r
2257     }\r
2258 \r
2259   } while (!done);\r
2260 }\r
2261 \r
2262 int lvxsize=145, lvysize=35;\r
2263 int lvxofs=80, lvyofs=50;\r
2264 \r
2265 void LoadVSPDialog()\r
2266 { char done=0, moving=0;\r
2267   int mxo, myo, cursorblink;\r
2268   char ctf=0, cb=0, c, t, *str;\r
2269   char lvspname[80];\r
2270 \r
2271   last_pressed=0;\r
2272   memset(lvspname,0,80);\r
2273   do\r
2274   {\r
2275     RenderMap();\r
2276     RenderGUI();\r
2277 \r
2278     if (ctf && systemtime >= cursorblink)\r
2279     {\r
2280       cb ^= 1;\r
2281       cursorblink = systemtime+40;\r
2282     }\r
2283     if (moving)\r
2284     {\r
2285       lvxofs = (mx-mxo);\r
2286       lvyofs = (my-myo);\r
2287       if (!mb) moving=0;\r
2288       if (lvxofs<16) lvxofs = 16;\r
2289       if (lvyofs<16) lvyofs = 16;\r
2290       if (lvxofs+lvxsize>335) lvxofs = 336-lvxsize;\r
2291       if (lvyofs+lvysize>sy+16) lvyofs = (sy+16)-lvysize;\r
2292     }\r
2293 \r
2294     Window(lvxofs, lvyofs, lvxofs+lvxsize, lvyofs+lvysize, "Load VSP");\r
2295     GotoXY(lvxofs+2, lvyofs+13); printstring("Load VSP:");\r
2296     TextField(lvxofs+38, lvyofs+11, 70, lvspname, ctf == 1 ? cb : 0);\r
2297     Button(lvxofs+79, lvyofs+21, "OK");\r
2298     Button(lvxofs+111, lvyofs+21, "Cancel");\r
2299     Button(lvxofs+111, lvyofs+10, "Browse");\r
2300 \r
2301     DrawMouse();\r
2302     ShowPage();\r
2303     CheckTimerStuff();\r
2304 \r
2305     // input phase\r
2306     if (mb==1 && mx>lvxofs+38 && mx<lvxofs+70+38 && my>lvyofs+11 && my<lvyofs+9+11 && !moving)\r
2307     {\r
2308       ctf=1; str=lvspname; cb=1;\r
2309       cursorblink=systemtime+40; continue;\r
2310     }\r
2311 \r
2312     if ((mb==1 && mx>lvxofs+79 && mx<lvxofs+30+79 && my>lvyofs+21 && my<lvyofs+10+21 && !moving) || (key[SCAN_ENTER] && !ctf))\r
2313     {\r
2314       // insert code for button "OK" here\r
2315       vfree(vsp);\r
2316       memcpy(vspname, lvspname, strlen(lvspname)+1);\r
2317       LoadVSP(vspname);\r
2318       InitTileIDX();\r
2319       ButtonPressed(lvxofs+79, lvyofs+21, "OK");\r
2320       DrawMouse();\r
2321       while (mb)\r
2322       {\r
2323         ReadMouse();\r
2324         ShowPage();\r
2325         ReadMouse();\r
2326       }\r
2327       done=1;\r
2328       WaitRelease(); continue;\r
2329     }\r
2330 \r
2331     if (mb==1 && mx>lvxofs+111 && mx<lvxofs+30+111 && my>lvyofs+21 && my<lvyofs+10+21 && !moving)\r
2332     {\r
2333       // insert code for button "Cancel" here\r
2334       ButtonPressed(lvxofs+111, lvyofs+21, "Cancel");\r
2335       DrawMouse(); done=1;\r
2336       while (mb)\r
2337       {\r
2338         ReadMouse();\r
2339         ShowPage();\r
2340         ReadMouse();\r
2341       }\r
2342       WaitRelease(); continue;\r
2343     }\r
2344 \r
2345     if ((mb==1 && mx>lvxofs+111 && mx<lvxofs+30+111 && my>lvyofs+10 && my<lvyofs+10+10 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
2346     {\r
2347       // insert code for button "Browse" here\r
2348       ButtonPressed(lvxofs+111, lvyofs+10, "Browse");\r
2349       DrawMouse();\r
2350       while (mb)\r
2351       {\r
2352         ReadMouse();\r
2353         ShowPage();\r
2354         ReadMouse();\r
2355       }\r
2356       Browse(1,"*.vsp","","","",lvspname);\r
2357       WaitRelease(); continue;\r
2358     }\r
2359 \r
2360     if (mb==1 && mx>(lvxofs+lvxsize-9) && (mx<lvxofs+lvxsize-2)\r
2361     && my>(lvyofs+1) && (my<lvyofs+8) && !moving)\r
2362     {\r
2363       done=1;\r
2364       WaitRelease();\r
2365       break;\r
2366     }\r
2367 \r
2368     if (mb==1 && mx>lvxofs && mx<lvxofs+lvxsize && my>lvyofs && my<(lvyofs+9) && !moving)\r
2369     {\r
2370       moving=1;\r
2371       mxo=mx-lvxofs;\r
2372       myo=my-lvyofs;\r
2373       continue;\r
2374     }\r
2375 \r
2376     if (mb==1 && !moving)\r
2377     {\r
2378       ctf=0;\r
2379       cb=0;\r
2380       str=0;\r
2381       WaitRelease();\r
2382     }\r
2383 \r
2384     if (last_pressed)\r
2385     {\r
2386       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
2387       else c=key_ascii_tbl[last_pressed];\r
2388 \r
2389       if (last_pressed==SCAN_ESC)\r
2390       {\r
2391         key[SCAN_ESC]=0;\r
2392         done=1;\r
2393         break;\r
2394       }\r
2395 \r
2396       if (last_pressed==SCAN_ENTER)\r
2397       {\r
2398         key[SCAN_ENTER]=0;\r
2399         ctf=0;\r
2400         str=0;\r
2401         last_pressed=0;\r
2402         continue;\r
2403       }\r
2404 \r
2405       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
2406       {\r
2407         switch (ctf)\r
2408         {\r
2409           case 0: ctf=1; str=lvspname; break;\r
2410           case 1: ctf=0; str=0; break;\r
2411         }\r
2412         key[SCAN_TAB]=0;\r
2413         last_pressed=0;\r
2414         cb=1; cursorblink=systemtime+40;\r
2415         continue;\r
2416       }\r
2417 \r
2418       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
2419       {\r
2420         switch (ctf)\r
2421         {\r
2422           case 0: ctf=1; str=lvspname; break;\r
2423           case 1: ctf=0; str=lvspname; break;\r
2424         }\r
2425         key[SCAN_TAB]=0;\r
2426         last_pressed=0;\r
2427         cb=1; cursorblink=systemtime+40;\r
2428         continue;\r
2429       }\r
2430 \r
2431       if (!ctf)\r
2432         continue;\r
2433 \r
2434       if (last_pressed==SCAN_BACKSP && strlen(str))\r
2435       {\r
2436         str[strlen(str)-1]=0;\r
2437         key[SCAN_BACKSP]=0;\r
2438         last_pressed=0;\r
2439         continue;\r
2440       }\r
2441       else if (last_pressed==SCAN_BACKSP)\r
2442       {\r
2443         last_pressed=0;\r
2444         continue;\r
2445       }\r
2446 \r
2447       t=strlen(str);\r
2448       str[t]=c;\r
2449       str[t+1]=0;\r
2450       last_pressed=0;\r
2451     }\r
2452   } while (!done);\r
2453 }\r
2454 int mpxsize=175, mpysize=37;\r
2455 int mpxofs=60, mpyofs=60;\r
2456 \r
2457 void MPDialog()\r
2458 { char done=0, moving=0, playmod[80];\r
2459   int mxo, myo, cursorblink;\r
2460   char ctf=0, cb=0, c, t, *str;\r
2461 \r
2462   last_pressed=0;\r
2463   memset(playmod, 0, 80);\r
2464   do\r
2465   {\r
2466     RenderMap();\r
2467     RenderGUI();\r
2468 \r
2469     if (ctf && systemtime >= cursorblink)\r
2470     {\r
2471       cb ^= 1;\r
2472       cursorblink = systemtime+40;\r
2473     }\r
2474     if (moving)\r
2475     {\r
2476       mpxofs = (mx-mxo);\r
2477       mpyofs = (my-myo);\r
2478       if (!mb) moving=0;\r
2479       if (mpxofs<16) mpxofs = 16;\r
2480       if (mpyofs<16) mpyofs = 16;\r
2481       if (mpxofs+mpxsize>335) mpxofs = 336-mpxsize;\r
2482       if (mpyofs+mpysize>sy+16) mpyofs = (sy+16)-mpysize;\r
2483     }\r
2484 \r
2485     Window(mpxofs, mpyofs, mpxofs+mpxsize, mpyofs+mpysize, "MOD Player Controls");\r
2486     GotoXY(mpxofs+2, mpyofs+15); printstring("MOD Playing:");\r
2487     TextField(mpxofs+49, mpyofs+13, 90, playmod, ctf == 1 ? cb : 0);\r
2488     Button(mpxofs+110, mpyofs+24, "Play");\r
2489     Button(mpxofs+142, mpyofs+24, "Stop");\r
2490     Button(mpxofs+78, mpyofs+24, "OK");\r
2491     Button(mpxofs+142, mpyofs+12, "Browse");\r
2492 \r
2493     DrawMouse();\r
2494     ShowPage();\r
2495     CheckTimerStuff();\r
2496 \r
2497     // input phase\r
2498     if (mb==1 && mx>mpxofs+49 && mx<mpxofs+90+49 && my>mpyofs+13 && my<mpyofs+9+13 && !moving)\r
2499     {\r
2500       ctf=1; str=playmod; cb=1;\r
2501       cursorblink=systemtime+40; continue;\r
2502     }\r
2503 \r
2504     if (mb==1 && mx>mpxofs+110 && mx<mpxofs+30+110 && my>mpyofs+24 && my<mpyofs+10+24 && !moving)\r
2505     {\r
2506       // insert code for button "Play" here\r
2507       ButtonPressed(mpxofs+110, mpyofs+24, "Play");\r
2508       PlayMusic(playmod);\r
2509       DrawMouse();\r
2510       while (mb)\r
2511       {\r
2512         ReadMouse();\r
2513         ShowPage();\r
2514         ReadMouse();\r
2515       }\r
2516       WaitRelease(); continue;\r
2517     }\r
2518 \r
2519     if (mb==1 && mx>mpxofs+142 && mx<mpxofs+30+142 && my>mpyofs+24 && my<mpyofs+10+24 && !moving)\r
2520     {\r
2521       // insert code for button "Stop" here\r
2522       memset(playingmod, 0, 80);\r
2523       memset(playmod, 0, 80);\r
2524       StopMusic();\r
2525       ButtonPressed(mpxofs+142, mpyofs+24, "Stop");\r
2526       DrawMouse();\r
2527       while (mb)\r
2528       {\r
2529         ReadMouse();\r
2530         ShowPage();\r
2531         ReadMouse();\r
2532       }\r
2533       WaitRelease(); continue;\r
2534     }\r
2535 \r
2536     if ((mb==1 && mx>mpxofs+78 && mx<mpxofs+30+78 && my>mpyofs+24 && my<mpyofs+10+24 && !moving) || (key[SCAN_ENTER] && !ctf))\r
2537     {\r
2538       // insert code for button "OK" here\r
2539       done=1;\r
2540       ButtonPressed(mpxofs+78, mpyofs+24, "OK");\r
2541       DrawMouse();\r
2542       while (mb)\r
2543       {\r
2544         ReadMouse();\r
2545         ShowPage();\r
2546         ReadMouse();\r
2547       }\r
2548       WaitRelease(); continue;\r
2549     }\r
2550 \r
2551     if ((mb==1 && mx>mpxofs+142 && mx<mpxofs+30+142 && my>mpyofs+12 && my<mpyofs+10+12 && !moving) || (key[SCAN_ALT] && key[SCAN_B]))\r
2552     {\r
2553       // insert code for button "Browse" here\r
2554       ButtonPressed(mpxofs+142, mpyofs+12, "Browse");\r
2555       DrawMouse();\r
2556       while (mb)\r
2557       {\r
2558         ReadMouse();\r
2559         ShowPage();\r
2560         ReadMouse();\r
2561       }\r
2562       Browse(4,"*.s3m","*.mod","*.xm",".it",playmod);\r
2563       WaitRelease(); continue;\r
2564     }\r
2565 \r
2566     if (mb==1 && mx>(mpxofs+mpxsize-9) && (mx<mpxofs+mpxsize-2)\r
2567     && my>(mpyofs+1) && (my<mpyofs+8) && !moving)\r
2568     {\r
2569       done=1;\r
2570       WaitRelease();\r
2571       break;\r
2572     }\r
2573 \r
2574     if (mb==1 && mx>mpxofs && mx<mpxofs+mpxsize && my>mpyofs && my<(mpyofs+9) && !moving)\r
2575     {\r
2576       moving=1;\r
2577       mxo=mx-mpxofs;\r
2578       myo=my-mpyofs;\r
2579       continue;\r
2580     }\r
2581 \r
2582     if (mb==1 && !moving)\r
2583     {\r
2584       ctf=0;\r
2585       cb=0;\r
2586       str=0;\r
2587       WaitRelease();\r
2588     }\r
2589 \r
2590     if (last_pressed)\r
2591     {\r
2592       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
2593       else c=key_ascii_tbl[last_pressed];\r
2594 \r
2595       if (last_pressed==SCAN_ESC)\r
2596       {\r
2597         key[SCAN_ESC]=0;\r
2598         done=1;\r
2599         break;\r
2600       }\r
2601 \r
2602       if (last_pressed==SCAN_ENTER)\r
2603       {\r
2604         key[SCAN_ENTER]=0;\r
2605         ctf=0;\r
2606         str=0;\r
2607         last_pressed=0;\r
2608         continue;\r
2609       }\r
2610 \r
2611       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
2612       {\r
2613         switch (ctf)\r
2614         {\r
2615           case 0: ctf=1; str=playmod; break;\r
2616           case 1: ctf=0; str=0; break;\r
2617         }\r
2618         key[SCAN_TAB]=0;\r
2619         last_pressed=0;\r
2620         cb=1; cursorblink=systemtime+40;\r
2621         continue;\r
2622       }\r
2623 \r
2624       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
2625       {\r
2626         switch (ctf)\r
2627         {\r
2628           case 0: ctf=1; str=playmod; break;\r
2629           case 1: ctf=0; str=playmod; break;\r
2630         }\r
2631         key[SCAN_TAB]=0;\r
2632         last_pressed=0;\r
2633         cb=1; cursorblink=systemtime+40;\r
2634         continue;\r
2635       }\r
2636 \r
2637       if (!ctf)\r
2638         continue;\r
2639 \r
2640       if (last_pressed==SCAN_BACKSP && strlen(str))\r
2641       {\r
2642         str[strlen(str)-1]=0;\r
2643         key[SCAN_BACKSP]=0;\r
2644         last_pressed=0;\r
2645         continue;\r
2646       }\r
2647       else if (last_pressed==SCAN_BACKSP)\r
2648       {\r
2649         last_pressed=0;\r
2650         continue;\r
2651       }\r
2652 \r
2653       t=strlen(str);\r
2654       str[t]=c;\r
2655       str[t+1]=0;\r
2656       last_pressed=0;\r
2657     }\r
2658   } while (!done);\r
2659 }\r
2660 \r
2661 int zexsize=135, zeysize=86;\r
2662 int zexofs=80, zeyofs=40;\r
2663 \r
2664 void ZoneEdDialog()\r
2665 { char done=0, moving=0;\r
2666   int mxo, myo, cursorblink, i=0;\r
2667   char ctf=0, cb=0, c, t, *str;\r
2668   char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
2669 \r
2670   i=curzone;\r
2671   sprintf(nstr1, "%d", zones[i].script);\r
2672   sprintf(nstr2, "%d", zones[i].percent);\r
2673   sprintf(nstr3, "%d", zones[i].delay);\r
2674   sprintf(nstr4, "%d", zones[i].entityscript);\r
2675   last_pressed=0;\r
2676   do\r
2677   {\r
2678     RenderMap();\r
2679     RenderGUI();\r
2680 \r
2681     if (ctf && systemtime >= cursorblink)\r
2682     {\r
2683       cb ^= 1;\r
2684       cursorblink = systemtime+40;\r
2685     }\r
2686     if (moving)\r
2687     {\r
2688       zexofs = (mx-mxo);\r
2689       zeyofs = (my-myo);\r
2690       if (!mb) moving=0;\r
2691       if (zexofs<16) zexofs = 16;\r
2692       if (zeyofs<16) zeyofs = 16;\r
2693       if (zexofs+zexsize>335) zexofs = 336-zexsize;\r
2694       if (zeyofs+zeysize>sy+16) zeyofs = (sy+16)-zeysize;\r
2695     }\r
2696 \r
2697     Window(zexofs, zeyofs, zexofs+zexsize, zeyofs+zeysize, "Zone Editor");\r
2698     GotoXY(zexofs+8, zeyofs+12); printstring("Name:");\r
2699     TextField(zexofs+30, zeyofs+10, 100, zones[i].name, ctf == 1 ? cb : 0);\r
2700     GotoXY(zexofs+5, zeyofs+22); printstring("Script:");\r
2701     TextField(zexofs+30, zeyofs+20, 100, nstr1, ctf == 2 ? cb : 0);\r
2702     GotoXY(zexofs+2, zeyofs+32); printstring("Chance:");\r
2703     TextField(zexofs+30, zeyofs+30, 100, nstr2, ctf == 3 ? cb : 0);\r
2704     GotoXY(zexofs+7, zeyofs+42); printstring("Delay:");\r
2705     TextField(zexofs+30, zeyofs+40, 100, nstr3, ctf == 4 ? cb : 0);\r
2706     GotoXY(zexofs+4, zeyofs+52); printstring("Entity:");\r
2707     TextField(zexofs+30, zeyofs+50, 100, nstr4, ctf == 5 ? cb : 0);\r
2708     CheckBox(zexofs+20, zeyofs+61, zones[i].aaa);\r
2709     GotoXY(zexofs+31, zeyofs+62); printstring("Allow Adjacent Activation");\r
2710     Button(zexofs+99, zeyofs+71, "OK");\r
2711     GotoXY(zexofs+12, zeyofs+73); printstring("Zone");\r
2712     GotoXY(zexofs+30, zeyofs+73);\r
2713     sprintf(strbuf,"%d",i); printstring(strbuf);\r
2714 \r
2715     DrawMouse();\r
2716     ShowPage();\r
2717     CheckTimerStuff();\r
2718 \r
2719     // input phase\r
2720     if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+10 && my<zeyofs+9+10 && !moving)\r
2721     {\r
2722       ctf=1; str=zones[i].name; cb=1;\r
2723       cursorblink=systemtime+40; continue;\r
2724     }\r
2725 \r
2726     if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+20 && my<zeyofs+9+20 && !moving)\r
2727     {\r
2728       ctf=2; str=nstr1; cb=1;\r
2729       cursorblink=systemtime+40; continue;\r
2730     }\r
2731 \r
2732     if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+30 && my<zeyofs+9+30 && !moving)\r
2733     {\r
2734       ctf=3; str=nstr2; cb=1;\r
2735       cursorblink=systemtime+40; continue;\r
2736     }\r
2737 \r
2738     if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+40 && my<zeyofs+9+40 && !moving)\r
2739     {\r
2740       ctf=4; str=nstr3; cb=1;\r
2741       cursorblink=systemtime+40; continue;\r
2742     }\r
2743 \r
2744     if (mb==1 && mx>zexofs+30 && mx<zexofs+100+30 && my>zeyofs+50 && my<zeyofs+9+50 && !moving)\r
2745     {\r
2746       ctf=5; str=nstr4; cb=1;\r
2747       cursorblink=systemtime+40; continue;\r
2748     }\r
2749 \r
2750     if (mb==1 && mx>zexofs+20 && mx<zexofs+8+20 && my>zeyofs+61 && my<zeyofs+7+61 && !moving)\r
2751     {\r
2752       zones[i].aaa ^= 1; WaitRelease(); continue;\r
2753     }\r
2754 \r
2755     if ((mb==1 && mx>zexofs+99 && mx<zexofs+30+99 && my>zeyofs+71 && my<zeyofs+10+71 && !moving) || (key[SCAN_ENTER] && !ctf))\r
2756     {\r
2757       // insert code for button "OK" here\r
2758       done=1;\r
2759       ButtonPressed(zexofs+99, zeyofs+71, "OK");\r
2760       DrawMouse();\r
2761       while (mb)\r
2762       {\r
2763         ReadMouse();\r
2764         ShowPage();\r
2765         ReadMouse();\r
2766       }\r
2767       WaitRelease(); continue;\r
2768     }\r
2769 \r
2770     if (mb==1 && mx>(zexofs+zexsize-9) && (mx<zexofs+zexsize-2)\r
2771     && my>(zeyofs+1) && (my<zeyofs+8) && !moving)\r
2772     {\r
2773       done=1;\r
2774       WaitRelease();\r
2775       break;\r
2776     }\r
2777 \r
2778     if (mb==1 && mx>zexofs && mx<zexofs+zexsize && my>zeyofs && my<(zeyofs+9) && !moving)\r
2779     {\r
2780       moving=1;\r
2781       mxo=mx-zexofs;\r
2782       myo=my-zeyofs;\r
2783       continue;\r
2784     }\r
2785 \r
2786     if (mb==1 && !moving)\r
2787     {\r
2788       ctf=0;\r
2789       cb=0;\r
2790       str=0;\r
2791       WaitRelease();\r
2792     }\r
2793 \r
2794     if (last_pressed)\r
2795     {\r
2796       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
2797       else c=key_ascii_tbl[last_pressed];\r
2798 \r
2799       if (last_pressed==SCAN_ESC)\r
2800       {\r
2801         key[SCAN_ESC]=0;\r
2802         done=1;\r
2803         break;\r
2804       }\r
2805       if (last_pressed==SCAN_UP)\r
2806       {\r
2807         zones[i].script=atoi(nstr1);\r
2808         zones[i].percent=atoi(nstr2);\r
2809         zones[i].delay=atoi(nstr3);\r
2810         zones[i].entityscript=atoi(nstr4);\r
2811         if (i<255) i++; else i=0;\r
2812         last_pressed=0; key[SCAN_UP]=0;\r
2813         sprintf(nstr1, "%d", zones[i].script);\r
2814         sprintf(nstr2, "%d", zones[i].percent);\r
2815         sprintf(nstr3, "%d", zones[i].delay);\r
2816         sprintf(nstr4, "%d", zones[i].entityscript);\r
2817         continue;\r
2818       }\r
2819       if (last_pressed==SCAN_DOWN)\r
2820       {\r
2821         zones[i].script=atoi(nstr1);\r
2822         zones[i].percent=atoi(nstr2);\r
2823         zones[i].delay=atoi(nstr3);\r
2824         zones[i].entityscript=atoi(nstr4);\r
2825         if (i) i--; else i=255;\r
2826         last_pressed=0; key[SCAN_DOWN]=0;\r
2827         sprintf(nstr1, "%d", zones[i].script);\r
2828         sprintf(nstr2, "%d", zones[i].percent);\r
2829         sprintf(nstr3, "%d", zones[i].delay);\r
2830         sprintf(nstr4, "%d", zones[i].entityscript);\r
2831         continue;\r
2832       }\r
2833       if (last_pressed==SCAN_ENTER)\r
2834       {\r
2835         key[SCAN_ENTER]=0;\r
2836         ctf=0;\r
2837         str=0;\r
2838         last_pressed=0;\r
2839         continue;\r
2840       }\r
2841 \r
2842       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
2843       {\r
2844         switch (ctf)\r
2845         {\r
2846           case 0: ctf=1; str=zones[i].name; break;\r
2847           case 1: ctf=2; str=nstr1; break;\r
2848           case 2: ctf=3; str=nstr2; break;\r
2849           case 3: ctf=4; str=nstr3; break;\r
2850           case 4: ctf=5; str=nstr4; break;\r
2851           case 5: ctf=0; str=0; break;\r
2852         }\r
2853         key[SCAN_TAB]=0;\r
2854         last_pressed=0;\r
2855         cb=1; cursorblink=systemtime+40;\r
2856         continue;\r
2857       }\r
2858 \r
2859       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
2860       {\r
2861         switch (ctf)\r
2862         {\r
2863           case 0: ctf=5; str=nstr4; break;\r
2864           case 1: ctf=0; str=0; break;\r
2865           case 2: ctf=1; str=zones[i].name; break;\r
2866           case 3: ctf=2; str=nstr1; break;\r
2867           case 4: ctf=3; str=nstr2; break;\r
2868           case 5: ctf=4; str=nstr3; break;\r
2869         }\r
2870         key[SCAN_TAB]=0;\r
2871         last_pressed=0;\r
2872         cb=1; cursorblink=systemtime+40;\r
2873         continue;\r
2874       }\r
2875 \r
2876       if (!ctf)\r
2877         continue;\r
2878 \r
2879       if (last_pressed==SCAN_BACKSP && strlen(str))\r
2880       {\r
2881         str[strlen(str)-1]=0;\r
2882         key[SCAN_BACKSP]=0;\r
2883         last_pressed=0;\r
2884         continue;\r
2885       }\r
2886       else if (last_pressed==SCAN_BACKSP)\r
2887       {\r
2888         last_pressed=0;\r
2889         continue;\r
2890       }\r
2891 \r
2892       t=strlen(str);\r
2893       str[t]=c;\r
2894       str[t+1]=0;\r
2895       last_pressed=0;\r
2896     }\r
2897 \r
2898   } while (!done);\r
2899   curzone=i;\r
2900   zones[i].script=atoi(nstr1);\r
2901   zones[i].percent=atoi(nstr2);\r
2902   zones[i].delay=atoi(nstr3);\r
2903   zones[i].entityscript=atoi(nstr4);\r
2904 }\r
2905 \r
2906 int exsize=180, eysize=175;\r
2907 int exofs=70, eyofs=30;\r
2908 \r
2909 void EntityEditor(int i)\r
2910 { char done=0, moving=0;\r
2911   int mxo, myo, cursorblink;\r
2912   char ctf=0, cb=0, c, t, *str;\r
2913   char nstr1[80], nstr2[80], nstr3[80], nstr4[80], nstr5[80], nstr6[80], nstr7[80], nstr8[80], nstr9[80], nstr10[80], nstr11[80], nstr12[80], nstr13[80];\r
2914 \r
2915   sprintf(nstr1, "%d", entity[i].x);\r
2916   sprintf(nstr2, "%d", entity[i].y);\r
2917   sprintf(nstr3, "%d", entity[i].chrindex);\r
2918   sprintf(nstr4, "%d", entity[i].speed);\r
2919   sprintf(nstr5, "%d", entity[i].actscript);\r
2920   sprintf(nstr6, "%d", entity[i].movecode);\r
2921   sprintf(nstr7, "%d", entity[i].step);\r
2922   sprintf(nstr8, "%d", entity[i].data2);\r
2923   sprintf(nstr9, "%d", entity[i].data3);\r
2924   sprintf(nstr10, "%d", entity[i].delay);\r
2925   sprintf(nstr11, "%d", entity[i].data5);\r
2926   sprintf(nstr12, "%d", entity[i].data6);\r
2927   sprintf(nstr13, "%d", entity[i].movescript);\r
2928   last_pressed=0;\r
2929   do\r
2930   {\r
2931     RenderMap();\r
2932     RenderGUI();\r
2933 \r
2934     if (ctf && systemtime >= cursorblink)\r
2935     {\r
2936       cb ^= 1;\r
2937       cursorblink = systemtime+40;\r
2938     }\r
2939     if (moving)\r
2940     {\r
2941       exofs = (mx-mxo);\r
2942       eyofs = (my-myo);\r
2943       if (!mb) moving=0;\r
2944       if (exofs<16) exofs = 16;\r
2945       if (eyofs<16) eyofs = 16;\r
2946       if (exofs+exsize>335) exofs = 336-exsize;\r
2947       if (eyofs+eysize>sy+16) eyofs = (sy+16)-eysize;\r
2948     }\r
2949 \r
2950     Window(exofs, eyofs, exofs+exsize, eyofs+eysize, "Entity Editor");\r
2951     GotoXY(exofs+7, eyofs+13); printstring("Desc:");\r
2952     TextField(exofs+26, eyofs+11, 80, entity[i].desc, ctf == 1 ? cb : 0);\r
2953     GotoXY(exofs+19, eyofs+23); printstring("X:");\r
2954     TextField(exofs+26, eyofs+21, 80, nstr1, ctf == 2 ? cb : 0);\r
2955     GotoXY(exofs+19, eyofs+33); printstring("Y:");\r
2956     TextField(exofs+26, eyofs+31, 80, nstr2, ctf == 3 ? cb : 0);\r
2957     GotoXY(exofs+11, eyofs+43); printstring("CHR:");\r
2958     TextField(exofs+26, eyofs+41, 80, nstr3, ctf == 4 ? cb : 0);\r
2959 \r
2960     // ***\r
2961     // entity image goes here (just above chr list button)\r
2962     // ***\r
2963 \r
2964     BigButton(exofs+116, eyofs+61, "CHR List");\r
2965     BigButton(exofs+115, eyofs+153, "Scripts");\r
2966     GotoXY(exofs+2, eyofs+155); printstring("Movescript:");\r
2967     HLine(exofs+1, eyofs+73, 178, white);\r
2968     GotoXY(exofs+3, eyofs+53); printstring("Speed:");\r
2969     TextField(exofs+26, eyofs+51, 80, nstr4, ctf == 5 ? cb : 0);\r
2970     TextField(exofs+26, eyofs+61, 80, nstr5, ctf == 6 ? cb : 0);\r
2971     GotoXY(exofs+107, eyofs+79); printstring("Is Obstruction");\r
2972     CheckBox(exofs+161, eyofs+87, entity[i].obsmode1);\r
2973     GotoXY(exofs+102, eyofs+88); printstring("Is Obstructable");\r
2974     CheckBox(exofs+161, eyofs+78, entity[i].obsmode2);\r
2975     GotoXY(exofs+24, eyofs+79); printstring("Auto Face");\r
2976     CheckBox(exofs+61, eyofs+78, entity[i].face);\r
2977     GotoXY(exofs+10, eyofs+88); printstring("Activ. Method");\r
2978     CheckBox(exofs+61, eyofs+87, entity[i].actm);\r
2979     HLine(exofs+1, eyofs+98, 178, white);\r
2980     GotoXY(exofs+126, eyofs+166); printstring("Entity");\r
2981     GotoXY(exofs+6, eyofs+104); printstring("Move Code:");\r
2982     TextField(exofs+47, eyofs+103, 80, nstr6, ctf == 7 ? cb : 0);\r
2983     TextField(exofs+30, eyofs+115, 40, nstr7, ctf == 8 ? cb : 0);\r
2984     TextField(exofs+30, eyofs+125, 40, nstr8, ctf == 9 ? cb : 0);\r
2985     TextField(exofs+30, eyofs+135, 40, nstr9, ctf == 10 ? cb : 0);\r
2986     TextField(exofs+113, eyofs+115, 40, nstr10, ctf == 11 ? cb : 0);\r
2987     TextField(exofs+113, eyofs+125, 40, nstr11, ctf == 12 ? cb : 0);\r
2988     TextField(exofs+113, eyofs+135, 40, nstr12, ctf == 13 ? cb : 0);\r
2989     HLine(exofs+1, eyofs+148, 178, white);\r
2990     TextField(exofs+46, eyofs+153, 60, nstr13, ctf == 14 ? cb : 0);\r
2991     GotoXY(exofs+5, eyofs+63); printstring("Activ:");\r
2992     GotoXY(exofs+152, eyofs+166);\r
2993     sprintf(strbuf, "%d/%d", i, entities-1); printstring(strbuf);\r
2994     entity[i].movecode=atoi(nstr6);\r
2995     if (ctf!=4) entity[i].chrindex=atoi(nstr3);\r
2996 \r
2997     switch (entity[i].movecode)\r
2998     {\r
2999       case 0: GotoXY(exofs+131, eyofs+104); printstring("Stopped"); break;\r
3000       case 1: GotoXY(exofs+131, eyofs+104); printstring("Wander");\r
3001               GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
3002               GotoXY(exofs+90, eyofs+116); printstring("Delay:"); break;\r
3003       case 2: GotoXY(exofs+131, eyofs+104); printstring("Wander Zone");\r
3004               GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
3005               GotoXY(exofs+90, eyofs+116); printstring("Delay:");\r
3006               GotoXY(exofs+10, eyofs+126); printstring("Zone:"); break;\r
3007       case 3: GotoXY(exofs+131, eyofs+104); printstring("Wander Box");\r
3008               GotoXY(exofs+11, eyofs+116); printstring("Step:");\r
3009               GotoXY(exofs+90, eyofs+116); printstring("Delay:");\r
3010               GotoXY(exofs+21, eyofs+126); printstring("X1:");\r
3011               GotoXY(exofs+21, eyofs+136); printstring("Y1:");\r
3012               GotoXY(exofs+102, eyofs+126); printstring("X2:");\r
3013               GotoXY(exofs+102, eyofs+136); printstring("Y2:"); break;\r
3014       case 4: GotoXY(exofs+131, eyofs+104); printstring("Scripted"); break;\r
3015     }\r
3016     switch (entity[i].actm)\r
3017     {\r
3018       case 0: GotoXY(exofs+72, eyofs+88); printstring("Actv"); break;\r
3019       case 1: GotoXY(exofs+72, eyofs+88); printstring("Adjc"); break;\r
3020     }\r
3021 \r
3022     if (chrs[entity[i].chrindex].frame)\r
3023       TCopySprite(exofs+143-(chrs[entity[i].chrindex].fx/2),\r
3024                   eyofs+31-(chrs[entity[i].chrindex].fy/2),\r
3025                   chrs[entity[i].chrindex].fx, chrs[entity[i].chrindex].fy,\r
3026                   chrs[entity[i].chrindex].frame);\r
3027 \r
3028     DrawMouse();\r
3029     ShowPage();\r
3030     CheckTimerStuff();\r
3031 \r
3032     // input phase\r
3033     if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+11 && my<eyofs+9+11 && !moving)\r
3034     {\r
3035       ctf=1; str=entity[i].desc; cb=1;\r
3036       cursorblink=systemtime+40; continue;\r
3037     }\r
3038 \r
3039     if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+21 && my<eyofs+9+21 && !moving)\r
3040     {\r
3041       ctf=2; str=nstr1; cb=1;\r
3042       cursorblink=systemtime+40; continue;\r
3043     }\r
3044 \r
3045     if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+31 && my<eyofs+9+31 && !moving)\r
3046     {\r
3047       ctf=3; str=nstr2; cb=1;\r
3048       cursorblink=systemtime+40; continue;\r
3049     }\r
3050 \r
3051     if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+41 && my<eyofs+9+41 && !moving)\r
3052     {\r
3053       ctf=4; str=nstr3; cb=1;\r
3054       cursorblink=systemtime+40; continue;\r
3055     }\r
3056 \r
3057     if (mb==1 && mx>exofs+116 && mx<exofs+50+116 && my>eyofs+61 && my<eyofs+10+61 && !moving)\r
3058     {\r
3059       // insert code for button "CHR List" here\r
3060       BigButtonPressed(exofs+116, eyofs+61, "CHR List");\r
3061       DrawMouse();\r
3062       while (mb)\r
3063       {\r
3064         ReadMouse();\r
3065         ShowPage();\r
3066         ReadMouse();\r
3067       }\r
3068       CHRList();\r
3069 //      DoCHRdealy();\r
3070       WaitRelease(); continue;\r
3071     }\r
3072 \r
3073     if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+51 && my<eyofs+9+51 && !moving)\r
3074     {\r
3075       ctf=5; str=nstr4; cb=1;\r
3076       cursorblink=systemtime+40; continue;\r
3077     }\r
3078 \r
3079     if (mb==1 && mx>exofs+26 && mx<exofs+80+26 && my>eyofs+61 && my<eyofs+9+61 && !moving)\r
3080     {\r
3081       ctf=6; str=nstr5; cb=1;\r
3082       cursorblink=systemtime+40; continue;\r
3083     }\r
3084 \r
3085     if (mb==1 && mx>exofs+115 && mx<exofs+50+115 && my>eyofs+153 && my<eyofs+10+153 && !moving)\r
3086     {\r
3087       // insert code for button "Scripts..." here\r
3088       BigButtonPressed(exofs+115, eyofs+153, "Scripts");\r
3089       DrawMouse();\r
3090       while (mb)\r
3091       {\r
3092         ReadMouse();\r
3093         ShowPage();\r
3094         ReadMouse();\r
3095       }\r
3096       MoveScriptDialog();\r
3097       WaitRelease(); continue;\r
3098     }\r
3099 \r
3100     if (mb==1 && mx>exofs+161 && mx<exofs+8+161 && my>eyofs+87 && my<eyofs+7+87 && !moving)\r
3101     {\r
3102       entity[i].obsmode1 ^= 1; WaitRelease(); continue;\r
3103     }\r
3104 \r
3105     if (mb==1 && mx>exofs+161 && mx<exofs+8+161 && my>eyofs+78 && my<eyofs+7+78 && !moving)\r
3106     {\r
3107       entity[i].obsmode2 ^= 1; WaitRelease(); continue;\r
3108     }\r
3109 \r
3110     if (mb==1 && mx>exofs+61 && mx<exofs+8+61 && my>eyofs+78 && my<eyofs+7+78 && !moving)\r
3111     {\r
3112       entity[i].face ^= 1; WaitRelease(); continue;\r
3113     }\r
3114 \r
3115     if (mb==1 && mx>exofs+61 && mx<exofs+8+61 && my>eyofs+87 && my<eyofs+7+87 && !moving)\r
3116     {\r
3117       entity[i].actm ^= 1; WaitRelease(); continue;\r
3118     }\r
3119 \r
3120     if (mb==1 && mx>exofs+47 && mx<exofs+80+47 && my>eyofs+103 && my<eyofs+9+103 && !moving)\r
3121     {\r
3122       ctf=7; str=nstr6; cb=1;\r
3123       cursorblink=systemtime+40; continue;\r
3124     }\r
3125 \r
3126     if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+115 && my<eyofs+9+115 && !moving)\r
3127     {\r
3128       ctf=8; str=nstr7; cb=1;\r
3129       cursorblink=systemtime+40; continue;\r
3130     }\r
3131 \r
3132     if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+125 && my<eyofs+9+125 && !moving)\r
3133     {\r
3134       ctf=9; str=nstr8; cb=1;\r
3135       cursorblink=systemtime+40; continue;\r
3136     }\r
3137 \r
3138     if (mb==1 && mx>exofs+30 && mx<exofs+40+30 && my>eyofs+135 && my<eyofs+9+135 && !moving)\r
3139     {\r
3140       ctf=10; str=nstr9; cb=1;\r
3141       cursorblink=systemtime+40; continue;\r
3142     }\r
3143 \r
3144     if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+115 && my<eyofs+9+115 && !moving)\r
3145     {\r
3146       ctf=11; str=nstr10; cb=1;\r
3147       cursorblink=systemtime+40; continue;\r
3148     }\r
3149 \r
3150     if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+125 && my<eyofs+9+125 && !moving)\r
3151     {\r
3152       ctf=12; str=nstr11; cb=1;\r
3153       cursorblink=systemtime+40; continue;\r
3154     }\r
3155 \r
3156     if (mb==1 && mx>exofs+113 && mx<exofs+40+113 && my>eyofs+135 && my<eyofs+9+135 && !moving)\r
3157     {\r
3158       ctf=13; str=nstr12; cb=1;\r
3159       cursorblink=systemtime+40; continue;\r
3160     }\r
3161 \r
3162     if (mb==1 && mx>exofs+46 && mx<exofs+60+46 && my>eyofs+153 && my<eyofs+9+153 && !moving)\r
3163     {\r
3164       ctf=14; str=nstr13; cb=1;\r
3165       cursorblink=systemtime+40; continue;\r
3166     }\r
3167 \r
3168     if (mb==1 && mx>(exofs+exsize-9) && (mx<exofs+exsize-2)\r
3169     && my>(eyofs+1) && (my<eyofs+8) && !moving)\r
3170     {\r
3171       done=1;\r
3172       WaitRelease();\r
3173       break;\r
3174     }\r
3175 \r
3176     if (mb==1 && mx>exofs && mx<exofs+exsize && my>eyofs && my<(eyofs+9) && !moving)\r
3177     {\r
3178       moving=1;\r
3179       mxo=mx-exofs;\r
3180       myo=my-eyofs;\r
3181       continue;\r
3182     }\r
3183 \r
3184     if (mb==1 && !moving)\r
3185     {\r
3186       ctf=0;\r
3187       cb=0;\r
3188       str=0;\r
3189       WaitRelease();\r
3190     }\r
3191 \r
3192     if (last_pressed)\r
3193     {\r
3194       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
3195       else c=key_ascii_tbl[last_pressed];\r
3196 \r
3197       if (last_pressed==SCAN_ESC)\r
3198       {\r
3199         key[SCAN_ESC]=0;\r
3200         done=1;\r
3201         break;\r
3202       }\r
3203 \r
3204       if (last_pressed==SCAN_UP)\r
3205       {\r
3206         entity[i].x=atoi(nstr1);\r
3207         entity[i].y=atoi(nstr2);\r
3208         entity[i].chrindex=atoi(nstr3);\r
3209         entity[i].speed=atoi(nstr4);\r
3210         entity[i].actscript=atoi(nstr5);\r
3211         entity[i].movecode=atoi(nstr6);\r
3212         entity[i].step=atoi(nstr7);\r
3213         entity[i].data2=atoi(nstr8);\r
3214         entity[i].data3=atoi(nstr9);\r
3215         entity[i].delay=atoi(nstr10);\r
3216         entity[i].data5=atoi(nstr11);\r
3217         entity[i].data6=atoi(nstr12);\r
3218         entity[i].movescript=atoi(nstr13);\r
3219 \r
3220         if (i<entities-1) i++; else i=0;\r
3221         last_pressed=0; key[SCAN_UP]=0;\r
3222 \r
3223         sprintf(nstr1, "%d", entity[i].x);\r
3224         sprintf(nstr2, "%d", entity[i].y);\r
3225         sprintf(nstr3, "%d", entity[i].chrindex);\r
3226         sprintf(nstr4, "%d", entity[i].speed);\r
3227         sprintf(nstr5, "%d", entity[i].actscript);\r
3228         sprintf(nstr6, "%d", entity[i].movecode);\r
3229         sprintf(nstr7, "%d", entity[i].step);\r
3230         sprintf(nstr8, "%d", entity[i].data2);\r
3231         sprintf(nstr9, "%d", entity[i].data3);\r
3232         sprintf(nstr10, "%d", entity[i].delay);\r
3233         sprintf(nstr11, "%d", entity[i].data5);\r
3234         sprintf(nstr12, "%d", entity[i].data6);\r
3235         sprintf(nstr13, "%d", entity[i].movescript);\r
3236         continue;\r
3237       }\r
3238       if (last_pressed==SCAN_DOWN)\r
3239       {\r
3240         entity[i].x=atoi(nstr1);\r
3241         entity[i].y=atoi(nstr2);\r
3242         entity[i].chrindex=atoi(nstr3);\r
3243         entity[i].speed=atoi(nstr4);\r
3244         entity[i].actscript=atoi(nstr5);\r
3245         entity[i].movecode=atoi(nstr6);\r
3246         entity[i].step=atoi(nstr7);\r
3247         entity[i].data2=atoi(nstr8);\r
3248         entity[i].data3=atoi(nstr9);\r
3249         entity[i].delay=atoi(nstr10);\r
3250         entity[i].data5=atoi(nstr11);\r
3251         entity[i].data6=atoi(nstr12);\r
3252         entity[i].movescript=atoi(nstr13);\r
3253 \r
3254         if (i) i--; else i=entities-1;\r
3255         last_pressed=0; key[SCAN_DOWN]=0;\r
3256 \r
3257         sprintf(nstr1, "%d", entity[i].x);\r
3258         sprintf(nstr2, "%d", entity[i].y);\r
3259         sprintf(nstr3, "%d", entity[i].chrindex);\r
3260         sprintf(nstr4, "%d", entity[i].speed);\r
3261         sprintf(nstr5, "%d", entity[i].actscript);\r
3262         sprintf(nstr6, "%d", entity[i].movecode);\r
3263         sprintf(nstr7, "%d", entity[i].step);\r
3264         sprintf(nstr8, "%d", entity[i].data2);\r
3265         sprintf(nstr9, "%d", entity[i].data3);\r
3266         sprintf(nstr10, "%d", entity[i].delay);\r
3267         sprintf(nstr11, "%d", entity[i].data5);\r
3268         sprintf(nstr12, "%d", entity[i].data6);\r
3269         sprintf(nstr13, "%d", entity[i].movescript);\r
3270         continue;\r
3271       }\r
3272 \r
3273       if (last_pressed==SCAN_ENTER)\r
3274       {\r
3275         key[SCAN_ENTER]=0;\r
3276         ctf=0;\r
3277         str=0;\r
3278         last_pressed=0;\r
3279         continue;\r
3280       }\r
3281 \r
3282       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
3283       {\r
3284         switch (ctf)\r
3285         {\r
3286           case 0: ctf=1; str=entity[i].desc; break;\r
3287           case 1: ctf=2; str=nstr1; break;\r
3288           case 2: ctf=3; str=nstr2; break;\r
3289           case 3: ctf=4; str=nstr3; break;\r
3290           case 4: ctf=5; str=nstr4; break;\r
3291           case 5: ctf=6; str=nstr5; break;\r
3292           case 6: ctf=7; str=nstr6; break;\r
3293           case 7: ctf=8; str=nstr7; break;\r
3294           case 8: ctf=9; str=nstr8; break;\r
3295           case 9: ctf=10; str=nstr9; break;\r
3296           case 10: ctf=11; str=nstr10; break;\r
3297           case 11: ctf=12; str=nstr11; break;\r
3298           case 12: ctf=13; str=nstr12; break;\r
3299           case 13: ctf=14; str=nstr13; break;\r
3300           case 14: ctf=0; str=0; break;\r
3301         }\r
3302         key[SCAN_TAB]=0;\r
3303         last_pressed=0;\r
3304         cb=1; cursorblink=systemtime+40;\r
3305         continue;\r
3306       }\r
3307 \r
3308       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
3309       {\r
3310         switch (ctf)\r
3311         {\r
3312           case 0: ctf=13; str=nstr12; break;\r
3313           case 1: ctf=0; str=0; break;\r
3314           case 2: ctf=1; str=entity[i].desc; break;\r
3315           case 3: ctf=2; str=nstr1; break;\r
3316           case 4: ctf=3; str=nstr2; break;\r
3317           case 5: ctf=4; str=nstr3; break;\r
3318           case 6: ctf=5; str=nstr4; break;\r
3319           case 7: ctf=6; str=nstr5; break;\r
3320           case 8: ctf=7; str=nstr6; break;\r
3321           case 9: ctf=8; str=nstr7; break;\r
3322           case 10: ctf=9; str=nstr8; break;\r
3323           case 11: ctf=10; str=nstr9; break;\r
3324           case 12: ctf=11; str=nstr10; break;\r
3325           case 13: ctf=12; str=nstr11; break;\r
3326         }\r
3327         key[SCAN_TAB]=0;\r
3328         last_pressed=0;\r
3329         cb=1; cursorblink=systemtime+40;\r
3330         continue;\r
3331       }\r
3332 \r
3333       if (!ctf)\r
3334         continue;\r
3335 \r
3336       if (last_pressed==SCAN_BACKSP && strlen(str))\r
3337       {\r
3338         str[strlen(str)-1]=0;\r
3339         key[SCAN_BACKSP]=0;\r
3340         last_pressed=0;\r
3341         continue;\r
3342       }\r
3343       else if (last_pressed==SCAN_BACKSP)\r
3344       {\r
3345         last_pressed=0;\r
3346         continue;\r
3347       }\r
3348 \r
3349       t=strlen(str);\r
3350       str[t]=c;\r
3351       str[t+1]=0;\r
3352       last_pressed=0;\r
3353     }\r
3354   } while (!done);\r
3355   entity[i].x=atoi(nstr1);\r
3356   entity[i].y=atoi(nstr2);\r
3357   entity[i].chrindex=atoi(nstr3);\r
3358   entity[i].speed=atoi(nstr4);\r
3359   entity[i].actscript=atoi(nstr5);\r
3360   entity[i].movecode=atoi(nstr6);\r
3361   entity[i].step=atoi(nstr7);\r
3362   entity[i].data2=atoi(nstr8);\r
3363   entity[i].data3=atoi(nstr9);\r
3364   entity[i].delay=atoi(nstr10);\r
3365   entity[i].data5=atoi(nstr11);\r
3366   entity[i].data6=atoi(nstr12);\r
3367   entity[i].movescript=atoi(nstr13);\r
3368 }\r
3369 \r
3370 int clxsize=170, clysize=78;\r
3371 int clxofs=105, clyofs=80;\r
3372 char base=0;\r
3373 \r
3374 void CHRList()\r
3375 { char done=0, moving=0;\r
3376   int mxo, myo, cursorblink;\r
3377   char ctf=0, cb=0, c, t, *str;\r
3378 \r
3379   last_pressed=0;\r
3380   do\r
3381   {\r
3382     RenderMap();\r
3383     RenderGUI();\r
3384 \r
3385     if (ctf && systemtime >= cursorblink)\r
3386     {\r
3387       cb ^= 1;\r
3388       cursorblink = systemtime+40;\r
3389     }\r
3390     if (moving)\r
3391     {\r
3392       clxofs = (mx-mxo);\r
3393       clyofs = (my-myo);\r
3394       if (!mb) moving=0;\r
3395       if (clxofs<16) clxofs = 16;\r
3396       if (clyofs<16) clyofs = 16;\r
3397       if (clxofs+clxsize>335) clxofs = 336-clxsize;\r
3398       if (clyofs+clysize>sy+16) clyofs = (sy+16)-clysize;\r
3399     }\r
3400 \r
3401     Window(clxofs, clyofs, clxofs+clxsize, clyofs+clysize, "Entity CHR Reference Index");\r
3402     TextField(clxofs+14, clyofs+11, 120, chrlist[base].t, ctf == 1 ? cb : 0);\r
3403     TextField(clxofs+14, clyofs+22, 120, chrlist[base+1].t, ctf == 2 ? cb : 0);\r
3404     TextField(clxofs+14, clyofs+33, 120, chrlist[base+2].t, ctf == 3 ? cb : 0);\r
3405     TextField(clxofs+14, clyofs+44, 120, chrlist[base+3].t, ctf == 4 ? cb : 0);\r
3406     TextField(clxofs+14, clyofs+55, 120, chrlist[base+4].t, ctf == 5 ? cb : 0);\r
3407     Button(clxofs+137, clyofs+65, "OK");\r
3408     Button(clxofs+137, clyofs+10, "Browse");\r
3409     Button(clxofs+137, clyofs+21, "Browse");\r
3410     Button(clxofs+137, clyofs+32, "Browse");\r
3411     Button(clxofs+137, clyofs+43, "Browse");\r
3412     Button(clxofs+137, clyofs+54, "Browse");\r
3413     GotoXY(clxofs+3, clyofs+11); sprintf(strbuf,"%d:", base); printstring(strbuf);\r
3414     GotoXY(clxofs+3, clyofs+22); sprintf(strbuf,"%d:", base+1); printstring(strbuf);\r
3415     GotoXY(clxofs+3, clyofs+33); sprintf(strbuf,"%d:", base+2); printstring(strbuf);\r
3416     GotoXY(clxofs+3, clyofs+44); sprintf(strbuf,"%d:", base+3); printstring(strbuf);\r
3417     GotoXY(clxofs+3, clyofs+55); sprintf(strbuf,"%d:", base+4); printstring(strbuf);\r
3418 \r
3419     DrawMouse();\r
3420     ShowPage();\r
3421     CheckTimerStuff();\r
3422 \r
3423     // input phase\r
3424     if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+11 && my<clyofs+9+11 && !moving)\r
3425     {\r
3426       ctf=1; str=chrlist[base].t; cb=1;\r
3427       cursorblink=systemtime+40; continue;\r
3428     }\r
3429 \r
3430     if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+22 && my<clyofs+9+22 && !moving)\r
3431     {\r
3432       ctf=2; str=chrlist[base+1].t; cb=1;\r
3433       cursorblink=systemtime+40; continue;\r
3434     }\r
3435 \r
3436     if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+33 && my<clyofs+9+33 && !moving)\r
3437     {\r
3438       ctf=3; str=chrlist[base+2].t; cb=1;\r
3439       cursorblink=systemtime+40; continue;\r
3440     }\r
3441 \r
3442     if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+44 && my<clyofs+9+44 && !moving)\r
3443     {\r
3444       ctf=4; str=chrlist[base+3].t; cb=1;\r
3445       cursorblink=systemtime+40; continue;\r
3446     }\r
3447 \r
3448     if (mb==1 && mx>clxofs+14 && mx<clxofs+120+14 && my>clyofs+55 && my<clyofs+9+55 && !moving)\r
3449     {\r
3450       ctf=5; str=chrlist[base+4].t; cb=1;\r
3451       cursorblink=systemtime+40; continue;\r
3452     }\r
3453 \r
3454     if ((mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+65 && my<clyofs+10+65 && !moving) || (key[SCAN_ENTER] && !ctf))\r
3455     {\r
3456       // insert code for button "OK" here\r
3457       done=1;\r
3458       ButtonPressed(clxofs+137, clyofs+65, "OK");\r
3459       DrawMouse();\r
3460       while (mb)\r
3461       {\r
3462         ReadMouse();\r
3463         ShowPage();\r
3464         ReadMouse();\r
3465       }\r
3466       WaitRelease(); continue;\r
3467     }\r
3468 \r
3469     if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+10 && my<clyofs+10+10 && !moving)\r
3470     {\r
3471       // insert code for button "Browse" here\r
3472       ButtonPressed(clxofs+137, clyofs+10, "Browse");\r
3473       DrawMouse();\r
3474       while (mb)\r
3475       {\r
3476         ReadMouse();\r
3477         ShowPage();\r
3478         ReadMouse();\r
3479       }\r
3480       Browse(1,"*.chr","","","",chrlist[base].t);\r
3481       WaitRelease(); continue;\r
3482     }\r
3483 \r
3484     if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+21 && my<clyofs+10+21 && !moving)\r
3485     {\r
3486       // insert code for button "Browse" here\r
3487       ButtonPressed(clxofs+137, clyofs+21, "Browse");\r
3488       DrawMouse();\r
3489       while (mb)\r
3490       {\r
3491         ReadMouse();\r
3492         ShowPage();\r
3493         ReadMouse();\r
3494       }\r
3495       Browse(1,"*.chr","","","",chrlist[base+1].t);\r
3496       WaitRelease(); continue;\r
3497     }\r
3498 \r
3499     if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+32 && my<clyofs+10+32 && !moving)\r
3500     {\r
3501       // insert code for button "Browse" here\r
3502       ButtonPressed(clxofs+137, clyofs+32, "Browse");\r
3503       DrawMouse();\r
3504       while (mb)\r
3505       {\r
3506         ReadMouse();\r
3507         ShowPage();\r
3508         ReadMouse();\r
3509       }\r
3510       Browse(1,"*.chr","","","",chrlist[base+2].t);\r
3511       WaitRelease(); continue;\r
3512     }\r
3513 \r
3514     if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+43 && my<clyofs+10+43 && !moving)\r
3515     {\r
3516       // insert code for button "Browse" here\r
3517       ButtonPressed(clxofs+137, clyofs+43, "Browse");\r
3518       DrawMouse();\r
3519       while (mb)\r
3520       {\r
3521         ReadMouse();\r
3522         ShowPage();\r
3523         ReadMouse();\r
3524       }\r
3525       Browse(1,"*.chr","","","",chrlist[base+3].t);\r
3526       WaitRelease(); continue;\r
3527     }\r
3528 \r
3529     if (mb==1 && mx>clxofs+137 && mx<clxofs+30+137 && my>clyofs+54 && my<clyofs+10+54 && !moving)\r
3530     {\r
3531       // insert code for button "Browse" here\r
3532       ButtonPressed(clxofs+137, clyofs+54, "Browse");\r
3533       DrawMouse();\r
3534       while (mb)\r
3535       {\r
3536         ReadMouse();\r
3537         ShowPage();\r
3538         ReadMouse();\r
3539       }\r
3540       Browse(1,"*.chr","","","",chrlist[base+4].t);\r
3541       WaitRelease(); continue;\r
3542     }\r
3543 \r
3544     if (mb==1 && mx>(clxofs+clxsize-9) && (mx<clxofs+clxsize-2)\r
3545     && my>(clyofs+1) && (my<clyofs+8) && !moving)\r
3546     {\r
3547       done=1;\r
3548       WaitRelease();\r
3549       break;\r
3550     }\r
3551 \r
3552     if (mb==1 && mx>clxofs && mx<clxofs+clxsize && my>clyofs && my<(clyofs+9) && !moving)\r
3553     {\r
3554       moving=1;\r
3555       mxo=mx-clxofs;\r
3556       myo=my-clyofs;\r
3557       continue;\r
3558     }\r
3559 \r
3560     if (mb==1 && !moving)\r
3561     {\r
3562       ctf=0;\r
3563       cb=0;\r
3564       str=0;\r
3565       WaitRelease();\r
3566     }\r
3567 \r
3568     if (last_pressed)\r
3569     {\r
3570       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
3571       else c=key_ascii_tbl[last_pressed];\r
3572 \r
3573       if (last_pressed==SCAN_ESC)\r
3574       {\r
3575         key[SCAN_ESC]=0;\r
3576         done=1;\r
3577         break;\r
3578       }\r
3579       if (key[SCAN_UP])\r
3580       {\r
3581         key[SCAN_UP]=0;\r
3582         if (base) base--;\r
3583         last_pressed=0;\r
3584         continue;\r
3585       }\r
3586       if (key[SCAN_DOWN])\r
3587       {\r
3588         key[SCAN_DOWN]=0;\r
3589         if (base<95) base++;\r
3590         last_pressed=0;\r
3591         continue;\r
3592       }\r
3593       if (last_pressed==SCAN_ENTER)\r
3594       {\r
3595         key[SCAN_ENTER]=0;\r
3596         ctf=0;\r
3597         str=0;\r
3598         last_pressed=0;\r
3599         continue;\r
3600       }\r
3601 \r
3602       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
3603       {\r
3604         switch (ctf)\r
3605         {\r
3606           case 0: ctf=1; str=chrlist[base].t; break;\r
3607           case 1: ctf=2; str=chrlist[base+1].t; break;\r
3608           case 2: ctf=3; str=chrlist[base+2].t; break;\r
3609           case 3: ctf=4; str=chrlist[base+3].t; break;\r
3610           case 4: ctf=5; str=chrlist[base+4].t; break;\r
3611           case 5: ctf=0; str=0; break;\r
3612         }\r
3613         key[SCAN_TAB]=0;\r
3614         last_pressed=0;\r
3615         cb=1; cursorblink=systemtime+40;\r
3616         continue;\r
3617       }\r
3618 \r
3619       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
3620       {\r
3621         switch (ctf)\r
3622         {\r
3623           case 0: ctf=5; str=chrlist[base].t; break;\r
3624           case 1: ctf=0; str=chrlist[base].t; break;\r
3625           case 2: ctf=1; str=chrlist[base+1].t; break;\r
3626           case 3: ctf=2; str=chrlist[base+2].t; break;\r
3627           case 4: ctf=3; str=chrlist[base+3].t; break;\r
3628           case 5: ctf=4; str=chrlist[base+4].t; break;\r
3629         }\r
3630         key[SCAN_TAB]=0;\r
3631         last_pressed=0;\r
3632         cb=1; cursorblink=systemtime+40;\r
3633         continue;\r
3634       }\r
3635 \r
3636       if (!ctf)\r
3637         continue;\r
3638 \r
3639       if (last_pressed==SCAN_BACKSP && strlen(str))\r
3640       {\r
3641         str[strlen(str)-1]=0;\r
3642         key[SCAN_BACKSP]=0;\r
3643         last_pressed=0;\r
3644         continue;\r
3645       }\r
3646       else if (last_pressed==SCAN_BACKSP)\r
3647       {\r
3648         last_pressed=0;\r
3649         continue;\r
3650       }\r
3651 \r
3652       t=strlen(str);\r
3653       str[t]=c;\r
3654       str[t+1]=0;\r
3655       last_pressed=0;\r
3656     }\r
3657   } while (!done);\r
3658 }\r
3659 \r
3660 int msxsize=181, msysize=77;\r
3661 int msxofs=70, msyofs=50;\r
3662 char base1=0;\r
3663 \r
3664 void MoveScriptDialog()\r
3665 { char done=0, moving=0;\r
3666   int mxo, myo, cursorblink;\r
3667   char ctf=0, cb=0, c, t, *str;\r
3668 \r
3669   last_pressed=0;\r
3670   do\r
3671   {\r
3672     RenderMap();\r
3673     RenderGUI();\r
3674 \r
3675     if (ctf && systemtime >= cursorblink)\r
3676     {\r
3677       cb ^= 1;\r
3678       cursorblink = systemtime+40;\r
3679     }\r
3680     if (moving)\r
3681     {\r
3682       msxofs = (mx-mxo);\r
3683       msyofs = (my-myo);\r
3684       if (!mb) moving=0;\r
3685       if (msxofs<16) msxofs = 16;\r
3686       if (msyofs<16) msyofs = 16;\r
3687       if (msxofs+msxsize>335) msxofs = 336-msxsize;\r
3688       if (msyofs+msysize>sy+16) msyofs = (sy+16)-msysize;\r
3689     }\r
3690 \r
3691     Window(msxofs, msyofs, msxofs+msxsize, msyofs+msysize, "Movement Script Editor");\r
3692     TextField(msxofs+15, msyofs+12, 160, ms[base1].t, ctf == 1 ? cb : 0);\r
3693     TextField(msxofs+15, msyofs+22, 160, ms[base1+1].t, ctf == 2 ? cb : 0);\r
3694     TextField(msxofs+15, msyofs+32, 160, ms[base1+2].t, ctf == 3 ? cb : 0);\r
3695     TextField(msxofs+15, msyofs+42, 160, ms[base1+3].t, ctf == 4 ? cb : 0);\r
3696     TextField(msxofs+15, msyofs+52, 160, ms[base1+4].t, ctf == 5 ? cb : 0);\r
3697     Button(msxofs+146, msyofs+63, "OK");\r
3698     GotoXY(msxofs+3, msyofs+11); sprintf(strbuf,"%d:", base1); printstring(strbuf);\r
3699     GotoXY(msxofs+3, msyofs+22); sprintf(strbuf,"%d:", base1+1); printstring(strbuf);\r
3700     GotoXY(msxofs+3, msyofs+33); sprintf(strbuf,"%d:", base1+2); printstring(strbuf);\r
3701     GotoXY(msxofs+3, msyofs+44); sprintf(strbuf,"%d:", base1+3); printstring(strbuf);\r
3702     GotoXY(msxofs+3, msyofs+55); sprintf(strbuf,"%d:", base1+4); printstring(strbuf);\r
3703 \r
3704     DrawMouse();\r
3705     ShowPage();\r
3706     CheckTimerStuff();\r
3707 \r
3708     // input phase\r
3709     if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+12 && my<msyofs+10+12 && !moving)\r
3710     {\r
3711       ctf=1; str=ms[base1].t; cb=1;\r
3712       cursorblink=systemtime+40; continue;\r
3713     }\r
3714 \r
3715     if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+22 && my<msyofs+9+22 && !moving)\r
3716     {\r
3717       ctf=2; str=ms[base1+1].t; cb=1;\r
3718       cursorblink=systemtime+40; continue;\r
3719     }\r
3720 \r
3721     if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+32 && my<msyofs+9+32 && !moving)\r
3722     {\r
3723       ctf=3; str=ms[base1+2].t; cb=1;\r
3724       cursorblink=systemtime+40; continue;\r
3725     }\r
3726 \r
3727     if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+42 && my<msyofs+9+42 && !moving)\r
3728     {\r
3729       ctf=4; str=ms[base1+3].t; cb=1;\r
3730       cursorblink=systemtime+40; continue;\r
3731     }\r
3732 \r
3733     if (mb==1 && mx>msxofs+15 && mx<msxofs+160+15 && my>msyofs+52 && my<msyofs+9+52 && !moving)\r
3734     {\r
3735       ctf=5; str=ms[base1+4].t; cb=1;\r
3736       cursorblink=systemtime+40; continue;\r
3737     }\r
3738 \r
3739     if ((mb==1 && mx>msxofs+146 && mx<msxofs+30+146 && my>msyofs+63 && my<msyofs+10+63 && !moving) || (key[SCAN_ENTER] && !ctf))\r
3740     {\r
3741       // insert code for button "OK" here\r
3742       done=1;\r
3743       ButtonPressed(msxofs+146, msyofs+63, "OK");\r
3744       DrawMouse();\r
3745       while (mb)\r
3746       {\r
3747         ReadMouse();\r
3748         ShowPage();\r
3749         ReadMouse();\r
3750       }\r
3751       WaitRelease(); continue;\r
3752     }\r
3753 \r
3754     if (mb==1 && mx>(msxofs+msxsize-9) && (mx<msxofs+msxsize-2)\r
3755     && my>(msyofs+1) && (my<msyofs+8) && !moving)\r
3756     {\r
3757       done=1;\r
3758       WaitRelease();\r
3759       break;\r
3760     }\r
3761 \r
3762     if (mb==1 && mx>msxofs && mx<msxofs+msxsize && my>msyofs && my<(msyofs+9) && !moving)\r
3763     {\r
3764       moving=1;\r
3765       mxo=mx-msxofs;\r
3766       myo=my-msyofs;\r
3767       continue;\r
3768     }\r
3769 \r
3770     if (mb==1 && !moving)\r
3771     {\r
3772       ctf=0;\r
3773       cb=0;\r
3774       str=0;\r
3775       WaitRelease();\r
3776     }\r
3777 \r
3778     if (last_pressed)\r
3779     {\r
3780       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
3781       else c=key_ascii_tbl[last_pressed];\r
3782 \r
3783       if (last_pressed==SCAN_ESC)\r
3784       {\r
3785         key[SCAN_ESC]=0;\r
3786         done=1;\r
3787         break;\r
3788       }\r
3789       if (key[SCAN_UP])\r
3790       {\r
3791         key[SCAN_UP]=0;\r
3792         if (base1) base1--;\r
3793         last_pressed=0;\r
3794         continue;\r
3795       }\r
3796       if (key[SCAN_DOWN])\r
3797       {\r
3798         key[SCAN_DOWN]=0;\r
3799         if (base1<95) base1++;\r
3800         last_pressed=0;\r
3801         continue;\r
3802       }\r
3803 \r
3804       if (last_pressed==SCAN_ENTER)\r
3805       {\r
3806         key[SCAN_ENTER]=0;\r
3807         ctf=0;\r
3808         str=0;\r
3809         last_pressed=0;\r
3810         continue;\r
3811       }\r
3812 \r
3813       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
3814       {\r
3815         switch (ctf)\r
3816         {\r
3817           case 0: ctf=1; str=ms[base1].t; break;\r
3818           case 1: ctf=2; str=ms[base1+1].t; break;\r
3819           case 2: ctf=3; str=ms[base1+2].t; break;\r
3820           case 3: ctf=4; str=ms[base1+3].t; break;\r
3821           case 4: ctf=5; str=ms[base1+4].t; break;\r
3822           case 5: ctf=0; str=0; break;\r
3823         }\r
3824         key[SCAN_TAB]=0;\r
3825         last_pressed=0;\r
3826         cb=1; cursorblink=systemtime+40;\r
3827         continue;\r
3828       }\r
3829 \r
3830       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
3831       {\r
3832         switch (ctf)\r
3833         {\r
3834           case 0: ctf=5; str=ms[base1+4].t; break;\r
3835           case 1: ctf=0; str=0; break;\r
3836           case 2: ctf=1; str=ms[base1].t; break;\r
3837           case 3: ctf=2; str=ms[base1+1].t; break;\r
3838           case 4: ctf=3; str=ms[base1+2].t; break;\r
3839           case 5: ctf=4; str=ms[base1+3].t; break;\r
3840         }\r
3841         key[SCAN_TAB]=0;\r
3842         last_pressed=0;\r
3843         cb=1; cursorblink=systemtime+40;\r
3844         continue;\r
3845       }\r
3846 \r
3847       if (!ctf)\r
3848         continue;\r
3849 \r
3850       if (last_pressed==SCAN_BACKSP && strlen(str))\r
3851       {\r
3852         str[strlen(str)-1]=0;\r
3853         key[SCAN_BACKSP]=0;\r
3854         last_pressed=0;\r
3855         continue;\r
3856       }\r
3857       else if (last_pressed==SCAN_BACKSP)\r
3858       {\r
3859         last_pressed=0;\r
3860         continue;\r
3861       }\r
3862 \r
3863       t=strlen(str);\r
3864       str[t]=c;\r
3865       str[t+1]=0;\r
3866       last_pressed=0;\r
3867     }\r
3868   } while (!done);\r
3869 }\r
3870 \r
3871 int prxsize=150, prysize=80;\r
3872 int prxofs=50, pryofs=60;\r
3873 \r
3874 void MapPropertiesDialog()\r
3875 { char done=0, moving=0;\r
3876   int mxo, myo, cursorblink;\r
3877   char ctf=0, cb=0, c, t, *str;\r
3878 \r
3879   last_pressed=0;\r
3880   do\r
3881   {\r
3882     RenderMap();\r
3883     RenderGUI();\r
3884 \r
3885     if (ctf && systemtime >= cursorblink)\r
3886     {\r
3887       cb ^= 1;\r
3888       cursorblink = systemtime+40;\r
3889     }\r
3890     if (moving)\r
3891     {\r
3892       prxofs = (mx-mxo);\r
3893       pryofs = (my-myo);\r
3894       if (!mb) moving=0;\r
3895       if (prxofs<16) prxofs = 16;\r
3896       if (pryofs<16) pryofs = 16;\r
3897       if (prxofs+prxsize>335) prxofs = 336-prxsize;\r
3898       if (pryofs+prysize>sy+16) pryofs = (sy+16)-prysize;\r
3899     }\r
3900 \r
3901     Window(prxofs, pryofs, prxofs+prxsize, pryofs+prysize, "MAP Properties");\r
3902     GotoXY(prxofs+10, pryofs+23); printstring("Music:");\r
3903     TextField(prxofs+33, pryofs+11, 112, mapname, ctf == 1 ? cb : 0);\r
3904     TextField(prxofs+33, pryofs+21, 112, musname, ctf == 2 ? cb : 0);\r
3905     GotoXY(prxofs+18, pryofs+33); printstring("VSP:");\r
3906     TextField(prxofs+33, pryofs+31, 112, vspname, ctf == 3 ? cb : 0);\r
3907     GotoXY(prxofs+3, pryofs+43); printstring("rstring:");\r
3908     TextField(prxofs+33, pryofs+41, 112, rstring, ctf == 4 ? cb : 0);\r
3909     BigButton(prxofs+97, pryofs+56, "Resize MAP");\r
3910     HLine(prxofs+1, pryofs+53, 148, white);\r
3911     GotoXY(prxofs+3, pryofs+58); printstring("xsize:");\r
3912     sprintf(strbuf,"%d",layer[0].sizex); printstring(strbuf);\r
3913     GotoXY(prxofs+49, pryofs+58); printstring("ysize:");\r
3914     sprintf(strbuf,"%d",layer[0].sizey); printstring(strbuf);\r
3915     Button(prxofs+117, pryofs+67, "OK");\r
3916     GotoXY(prxofs+16, pryofs+13); printstring("MAP:");\r
3917 \r
3918     DrawMouse();\r
3919     ShowPage();\r
3920     CheckTimerStuff();\r
3921 \r
3922     // input phase\r
3923     if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+11 && my<pryofs+9+11 && !moving)\r
3924     {\r
3925       ctf=1; str=mapname; cb=1;\r
3926       cursorblink=systemtime+40; continue;\r
3927     }\r
3928 \r
3929     if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+21 && my<pryofs+9+21 && !moving)\r
3930     {\r
3931       ctf=2; str=musname; cb=1;\r
3932       cursorblink=systemtime+40; continue;\r
3933     }\r
3934 \r
3935     if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+31 && my<pryofs+9+31 && !moving)\r
3936     {\r
3937       ctf=3; str=vspname; cb=1;\r
3938       cursorblink=systemtime+40; continue;\r
3939     }\r
3940 \r
3941     if (mb==1 && mx>prxofs+33 && mx<prxofs+112+33 && my>pryofs+41 && my<pryofs+9+41 && !moving)\r
3942     {\r
3943       ctf=4; str=rstring; cb=1;\r
3944       cursorblink=systemtime+40; continue;\r
3945     }\r
3946 \r
3947     if (mb==1 && mx>prxofs+97 && mx<prxofs+30+97 && my>pryofs+56 && my<pryofs+10+56 && !moving)\r
3948     {\r
3949       // insert code for button "Resize MAP" here\r
3950       BigButtonPressed(prxofs+97, pryofs+56, "Resize MAP");\r
3951       DrawMouse();\r
3952       while (mb)\r
3953       {\r
3954         ReadMouse();\r
3955         ShowPage();\r
3956         ReadMouse();\r
3957       }\r
3958       WaitRelease();\r
3959       ResizeMapDialog();\r
3960       WaitRelease(); continue;\r
3961     }\r
3962 \r
3963     if ((mb==1 && mx>prxofs+117 && mx<prxofs+30+117 && my>pryofs+67 && my<pryofs+10+67 && !moving) || (key[SCAN_ENTER] && !ctf))\r
3964     {\r
3965       // insert code for button "OK" here\r
3966       ButtonPressed(prxofs+117, pryofs+67, "OK");\r
3967       DrawMouse();\r
3968       while (mb)\r
3969       {\r
3970         ReadMouse();\r
3971         ShowPage();\r
3972         ReadMouse();\r
3973       }\r
3974       done=1;\r
3975       WaitRelease(); continue;\r
3976     }\r
3977 \r
3978     if (mb==1 && mx>(prxofs+prxsize-9) && (mx<prxofs+prxsize-2)\r
3979     && my>(pryofs+1) && (my<pryofs+8) && !moving)\r
3980     {\r
3981       done=1;\r
3982       WaitRelease();\r
3983       break;\r
3984     }\r
3985 \r
3986     if (mb==1 && mx>prxofs && mx<prxofs+prxsize && my>pryofs && my<(pryofs+9) && !moving)\r
3987     {\r
3988       moving=1;\r
3989       mxo=mx-prxofs;\r
3990       myo=my-pryofs;\r
3991       continue;\r
3992     }\r
3993 \r
3994     if (mb==1 && !moving)\r
3995     {\r
3996       ctf=0;\r
3997       cb=0;\r
3998       str=0;\r
3999       WaitRelease();\r
4000     }\r
4001 \r
4002     if (last_pressed)\r
4003     {\r
4004       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
4005       else c=key_ascii_tbl[last_pressed];\r
4006 \r
4007       if (last_pressed==SCAN_ESC)\r
4008       {\r
4009         key[SCAN_ESC]=0;\r
4010         done=1;\r
4011         break;\r
4012       }\r
4013 \r
4014       if (last_pressed==SCAN_ENTER)\r
4015       {\r
4016         key[SCAN_ENTER]=0;\r
4017         ctf=0;\r
4018         str=0;\r
4019         last_pressed=0;\r
4020         continue;\r
4021       }\r
4022 \r
4023       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
4024       {\r
4025         switch (ctf)\r
4026         {\r
4027           case 0: ctf=1; str=mapname; break;\r
4028           case 1: ctf=2; str=musname; break;\r
4029           case 2: ctf=3; str=vspname; break;\r
4030           case 3: ctf=4; str=rstring; break;\r
4031           case 4: ctf=0; str=0; break;\r
4032         }\r
4033         key[SCAN_TAB]=0;\r
4034         last_pressed=0;\r
4035         cb=1; cursorblink=systemtime+40;\r
4036         continue;\r
4037       }\r
4038 \r
4039       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
4040       {\r
4041         switch (ctf)\r
4042         {\r
4043           case 0: ctf=4; str=rstring; break;\r
4044           case 1: ctf=0; str=0; break;\r
4045           case 2: ctf=1; str=mapname; break;\r
4046           case 3: ctf=2; str=musname; break;\r
4047           case 4: ctf=3; str=vspname; break;\r
4048         }\r
4049         key[SCAN_TAB]=0;\r
4050         last_pressed=0;\r
4051         cb=1; cursorblink=systemtime+40;\r
4052         continue;\r
4053       }\r
4054 \r
4055       if (!ctf)\r
4056         continue;\r
4057 \r
4058       if (last_pressed==SCAN_BACKSP && strlen(str))\r
4059       {\r
4060         str[strlen(str)-1]=0;\r
4061         key[SCAN_BACKSP]=0;\r
4062         last_pressed=0;\r
4063         continue;\r
4064       }\r
4065       else if (last_pressed==SCAN_BACKSP)\r
4066       {\r
4067         last_pressed=0;\r
4068         continue;\r
4069       }\r
4070 \r
4071       t=strlen(str);\r
4072       str[t]=c;\r
4073       str[t+1]=0;\r
4074       last_pressed=0;\r
4075     }\r
4076 \r
4077   } while (!done);\r
4078 \r
4079 }\r
4080 \r
4081 int rsxsize=134, rsysize=44;\r
4082 int rsxofs=20, rsyofs=20;\r
4083 \r
4084 static void PutByte(byte *to, byte v, int x, int y, int w, int h)\r
4085 {\r
4086   if (x<0 || x>=w || y<0 || y>=h)\r
4087     return;\r
4088 \r
4089   to[(y*w)+x]=v;\r
4090 }\r
4091 \r
4092 static byte GetByte(byte *from, int x, int y, int w, int h)\r
4093 {\r
4094   if (x<0 || x>=w || y<0 || y>=h)\r
4095     return 0;\r
4096 \r
4097   return from[(y*w)+x];\r
4098 }\r
4099 \r
4100 static void PutWord(word *to, word v, int x, int y, int w, int h)\r
4101 {\r
4102   if (x<0 || x>=w || y<0 || y>=h)\r
4103     return;\r
4104 \r
4105   to[(y*w)+x]=v;\r
4106 }\r
4107 \r
4108 static word GetWord(word *from, int x, int y, int w, int h)\r
4109 {\r
4110   if (x<0 || x>=w || y<0 || y>=h)\r
4111     return 0;\r
4112 \r
4113   return from[(y*w)+x];\r
4114 }\r
4115 \r
4116 void ResizeMapDialog()\r
4117 { char done=0, moving=0;\r
4118   int mxo, myo, cursorblink, basex, basey, i; //, xl, yl;\r
4119   char ctf=0, cb=0, c, t;\r
4120   char *str, *tb; //, *s1, *d1;\r
4121   char nstr1[80], nstr2[80];\r
4122   word *tbw; //, *s=NULL,*d=NULL;\r
4123   //int temp_width;\r
4124   int a,b;\r
4125 \r
4126   basex=layer[0].sizex;\r
4127   basey=layer[0].sizey;\r
4128   sprintf(nstr1, "%d", basex);\r
4129   sprintf(nstr2, "%d", basey);\r
4130   last_pressed=0;\r
4131   do\r
4132   {\r
4133     RenderMap();\r
4134     RenderGUI();\r
4135 \r
4136     if (ctf && systemtime >= cursorblink)\r
4137     {\r
4138       cb ^= 1;\r
4139       cursorblink = systemtime+40;\r
4140     }\r
4141     if (moving)\r
4142     {\r
4143       rsxofs = (mx-mxo);\r
4144       rsyofs = (my-myo);\r
4145       if (!mb) moving=0;\r
4146       if (rsxofs<16) rsxofs = 16;\r
4147       if (rsyofs<16) rsyofs = 16;\r
4148       if (rsxofs+rsxsize>335) rsxofs = 336-rsxsize;\r
4149       if (rsyofs+rsysize>sy+16) rsyofs = (sy+16)-rsysize;\r
4150     }\r
4151 \r
4152     Window(rsxofs, rsyofs, rsxofs+rsxsize, rsyofs+rsysize, "Resize MAP");\r
4153     GotoXY(rsxofs+4, rsyofs+12); printstring("Base X:");\r
4154     GotoXY(rsxofs+4, rsyofs+22); printstring("Base Y:");\r
4155     TextField(rsxofs+30, rsyofs+10, 100, nstr1, ctf == 1 ? cb : 0);\r
4156     TextField(rsxofs+30, rsyofs+20, 100, nstr2, ctf == 2 ? cb : 0);\r
4157     Button(rsxofs+69, rsyofs+31, "Resize");\r
4158     Button(rsxofs+101, rsyofs+31, "Cancel");\r
4159 \r
4160     DrawMouse();\r
4161     ShowPage();\r
4162     CheckTimerStuff();\r
4163 \r
4164     // input phase\r
4165     if (mb==1 && mx>rsxofs+30 && mx<rsxofs+100+30 && my>rsyofs+10 && my<rsyofs+9+10 && !moving)\r
4166     {\r
4167       ctf=1; str=nstr1; cb=1;\r
4168       cursorblink=systemtime+40; continue;\r
4169     }\r
4170 \r
4171     if (mb==1 && mx>rsxofs+30 && mx<rsxofs+100+30 && my>rsyofs+20 && my<rsyofs+9+20 && !moving)\r
4172     {\r
4173       ctf=2; str=nstr2; cb=1;\r
4174       cursorblink=systemtime+40; continue;\r
4175     }\r
4176 \r
4177     if (mb==1 && mx>rsxofs+69 && mx<rsxofs+30+69 && my>rsyofs+31 && my<rsyofs+10+31 && !moving)\r
4178     {\r
4179       printf("&");\r
4180       fflush(stdout);\r
4181       // insert code for button "Resize" here\r
4182       ButtonPressed(rsxofs+69, rsyofs+31, "Resize");\r
4183       DrawMouse();\r
4184       while (mb)\r
4185       {\r
4186         ReadMouse();\r
4187         ShowPage();\r
4188         ReadMouse();\r
4189       }\r
4190       done=1;\r
4191       basex=atoi(nstr1);\r
4192       basey=atoi(nstr2);\r
4193 \r
4194       tb = (char *)valloc(basex*basey,"tilebuf",0);\r
4195       for (b=0; b<basey; ++b)\r
4196         for (a=0; a<basex; ++a)\r
4197           PutByte(tb,\r
4198             GetByte(obstruct,a,b,layer[0].sizex,layer[0].sizey),\r
4199             a,b,basex,basey);\r
4200       vfree(obstruct);\r
4201       obstruct=tb;\r
4202 \r
4203       tb = (char *)valloc(basex*basey,"tilebuf",0);\r
4204       for (b=0; b<basey; ++b)\r
4205         for (a=0; a<basex; ++a)\r
4206           PutByte(tb,\r
4207             GetByte(zone,a,b,layer[0].sizex,layer[0].sizey),\r
4208             a,b,basex,basey);\r
4209       vfree(zone);\r
4210       zone=tb;\r
4211 \r
4212       for (i=0; i<numlayers; i++)\r
4213       {\r
4214         tbw=(word *)valloc(basex*basey*2,"tilebuf",0);\r
4215         //memset(tbw, 0, basex*basey*2);\r
4216         for (b=0; b<basey; ++b)\r
4217           for (a=0; a<basex; ++a)\r
4218             PutWord(tbw,\r
4219               GetWord(layers[i],a,b,layer[i].sizex,layer[i].sizey),\r
4220               a,b,basex,basey);\r
4221 \r
4222         vfree(layers[i]);\r
4223         layers[i]=tbw;\r
4224       }\r
4225       for (i=0; i<numlayers; ++i)\r
4226       {\r
4227         layer[i].sizex=basex;\r
4228         layer[i].sizey=basey;\r
4229       }\r
4230       xwin=0; ywin=0;\r
4231       WaitRelease(); continue;\r
4232     }\r
4233 \r
4234     if (mb==1 && mx>rsxofs+101 && mx<rsxofs+30+101 && my>rsyofs+31 && my<rsyofs+10+31 && !moving)\r
4235     {\r
4236       // insert code for button "Cancel" here\r
4237       done=1;\r
4238       ButtonPressed(rsxofs+101, rsyofs+31, "Cancel");\r
4239       DrawMouse();\r
4240       while (mb)\r
4241       {\r
4242         ReadMouse();\r
4243         ShowPage();\r
4244         ReadMouse();\r
4245       }\r
4246       WaitRelease(); continue;\r
4247     }\r
4248 \r
4249     if (mb==1 && mx>(rsxofs+rsxsize-9) && (mx<rsxofs+rsxsize-2)\r
4250     && my>(rsyofs+1) && (my<rsyofs+8) && !moving)\r
4251     {\r
4252       done=1;\r
4253       WaitRelease();\r
4254       break;\r
4255     }\r
4256 \r
4257     if (mb==1 && mx>rsxofs && mx<rsxofs+rsxsize && my>rsyofs && my<(rsyofs+9) && !moving)\r
4258     {\r
4259       moving=1;\r
4260       mxo=mx-rsxofs;\r
4261       myo=my-rsyofs;\r
4262       continue;\r
4263     }\r
4264 \r
4265     if (mb==1 && !moving)\r
4266     {\r
4267       ctf=0;\r
4268       cb=0;\r
4269       str=0;\r
4270       WaitRelease();\r
4271     }\r
4272 \r
4273     if (last_pressed)\r
4274     {\r
4275       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
4276       else c=key_ascii_tbl[last_pressed];\r
4277 \r
4278       if (last_pressed==SCAN_ESC)\r
4279       {\r
4280         key[SCAN_ESC]=0;\r
4281         done=1;\r
4282         break;\r
4283       }\r
4284 \r
4285       if (last_pressed==SCAN_ENTER)\r
4286       {\r
4287         key[SCAN_ENTER]=0;\r
4288         ctf=0;\r
4289         str=0;\r
4290         last_pressed=0;\r
4291         continue;\r
4292       }\r
4293 \r
4294       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
4295       {\r
4296         switch (ctf)\r
4297         {\r
4298           case 0: ctf=1; str=nstr1; break;\r
4299           case 1: ctf=2; str=nstr2; break;\r
4300           case 2: ctf=0; str=0; break;\r
4301         }\r
4302         key[SCAN_TAB]=0;\r
4303         last_pressed=0;\r
4304         cb=1; cursorblink=systemtime+40;\r
4305         continue;\r
4306       }\r
4307 \r
4308       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
4309       {\r
4310         switch (ctf)\r
4311         {\r
4312           case 0: ctf=2; str=nstr2; break;\r
4313           case 1: ctf=0; str=0; break;\r
4314           case 2: ctf=1; str=nstr1; break;\r
4315         }\r
4316         key[SCAN_TAB]=0;\r
4317         last_pressed=0;\r
4318         cb=1; cursorblink=systemtime+40;\r
4319         continue;\r
4320       }\r
4321 \r
4322       if (!ctf)\r
4323         continue;\r
4324 \r
4325       if (last_pressed==SCAN_BACKSP && strlen(str))\r
4326       {\r
4327         str[strlen(str)-1]=0;\r
4328         key[SCAN_BACKSP]=0;\r
4329         last_pressed=0;\r
4330         continue;\r
4331       }\r
4332       else if (last_pressed==SCAN_BACKSP)\r
4333       {\r
4334         last_pressed=0;\r
4335         continue;\r
4336       }\r
4337 \r
4338       t=strlen(str);\r
4339       str[t]=c;\r
4340       str[t+1]=0;\r
4341       last_pressed=0;\r
4342     }\r
4343   } while (!done);\r
4344   basex=atoi(nstr1);\r
4345   basey=atoi(nstr2);\r
4346 }\r
4347 \r
4348 int cdxsize=150, cdysize=45;\r
4349 int cdxofs=110, cdyofs=70;\r
4350 char curtrack=1;\r
4351 \r
4352 void CDDialog()\r
4353 { char done=0, moving=0;\r
4354   int mxo, myo, cursorblink;\r
4355   char ctf=0, cb=0, c, t, *str;\r
4356 \r
4357   last_pressed=0;\r
4358   do\r
4359   {\r
4360     RenderMap();\r
4361     RenderGUI();\r
4362 \r
4363     if (ctf && systemtime >= cursorblink)\r
4364     {\r
4365       cb ^= 1;\r
4366       cursorblink = systemtime+40;\r
4367     }\r
4368     if (moving)\r
4369     {\r
4370       cdxofs = (mx-mxo);\r
4371       cdyofs = (my-myo);\r
4372       if (!mb) moving=0;\r
4373       if (cdxofs<16) cdxofs = 16;\r
4374       if (cdyofs<16) cdyofs = 16;\r
4375       if (cdxofs+cdxsize>335) cdxofs = 336-cdxsize;\r
4376       if (cdyofs+cdysize>sy+16) cdyofs = (sy+16)-cdysize;\r
4377     }\r
4378 \r
4379     Window(cdxofs, cdyofs, cdxofs+cdxsize, cdyofs+cdysize, "CD Player");\r
4380     Button(cdxofs+53, cdyofs+10, "Play");\r
4381     Button(cdxofs+53, cdyofs+21, "Stop");\r
4382     Button(cdxofs+85, cdyofs+10, "Eject");\r
4383     Button(cdxofs+85, cdyofs+21, "Close");\r
4384     Button(cdxofs+117, cdyofs+10, "Next");\r
4385     Button(cdxofs+117, cdyofs+21, "Prev");\r
4386     Button(cdxofs+117, cdyofs+32, "OK");\r
4387     GotoXY(cdxofs+4, cdyofs+18); printstring("Track ");\r
4388     sprintf(strbuf,"%d",curtrack); printstring(strbuf);\r
4389 \r
4390     DrawMouse();\r
4391     ShowPage();\r
4392     CheckTimerStuff();\r
4393 \r
4394     // input phase\r
4395     if (mb==1 && mx>cdxofs+53 && mx<cdxofs+30+53 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
4396     {\r
4397       // insert code for button "Play" here\r
4398       ButtonPressed(cdxofs+53, cdyofs+10, "Play");\r
4399       DrawMouse();\r
4400       ShowPage();\r
4401       //CD_Play(curtrack);\r
4402       while (mb)\r
4403       {\r
4404         ReadMouse();\r
4405         ShowPage();\r
4406         ReadMouse();\r
4407       }\r
4408       WaitRelease(); continue;\r
4409     }\r
4410 \r
4411     if (mb==1 && mx>cdxofs+53 && mx<cdxofs+30+53 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
4412     {\r
4413       // insert code for button "Stop" here\r
4414       ButtonPressed(cdxofs+53, cdyofs+21, "Stop");\r
4415       DrawMouse();\r
4416       ShowPage();\r
4417       //CD_Stop();\r
4418       while (mb)\r
4419       {\r
4420         ReadMouse();\r
4421         ShowPage();\r
4422         ReadMouse();\r
4423       }\r
4424       WaitRelease(); continue;\r
4425     }\r
4426 \r
4427     if (mb==1 && mx>cdxofs+85 && mx<cdxofs+30+85 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
4428     {\r
4429       // insert code for button "Eject" here\r
4430       ButtonPressed(cdxofs+85, cdyofs+10, "Eject");\r
4431       DrawMouse();\r
4432       ShowPage();\r
4433       //CD_Open_Door();\r
4434       while (mb)\r
4435       {\r
4436         ReadMouse();\r
4437         ShowPage();\r
4438         ReadMouse();\r
4439       }\r
4440       WaitRelease(); continue;\r
4441     }\r
4442 \r
4443     if (mb==1 && mx>cdxofs+85 && mx<cdxofs+30+85 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
4444     {\r
4445       // insert code for button "Close" here\r
4446       ButtonPressed(cdxofs+85, cdyofs+21, "Close");\r
4447       DrawMouse();\r
4448       ShowPage();\r
4449       //CD_Close_Door();\r
4450       while (mb)\r
4451       {\r
4452         ReadMouse();\r
4453         ShowPage();\r
4454         ReadMouse();\r
4455       }\r
4456       WaitRelease(); continue;\r
4457     }\r
4458 \r
4459     if (mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+10 && my<cdyofs+10+10 && !moving)\r
4460     {\r
4461       // insert code for button "Next" here\r
4462       ButtonPressed(cdxofs+117, cdyofs+10, "Next");\r
4463       curtrack++;\r
4464       DrawMouse();\r
4465       while (mb)\r
4466       {\r
4467         ReadMouse();\r
4468         ShowPage();\r
4469         ReadMouse();\r
4470       }\r
4471       WaitRelease(); continue;\r
4472     }\r
4473 \r
4474     if (mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+21 && my<cdyofs+10+21 && !moving)\r
4475     {\r
4476       // insert code for button "Prev" here\r
4477       ButtonPressed(cdxofs+117, cdyofs+21, "Prev");\r
4478       DrawMouse();\r
4479       if (curtrack>1) curtrack--;\r
4480       while (mb)\r
4481       {\r
4482         ReadMouse();\r
4483         ShowPage();\r
4484         ReadMouse();\r
4485       }\r
4486       WaitRelease(); continue;\r
4487     }\r
4488 \r
4489     if ((mb==1 && mx>cdxofs+117 && mx<cdxofs+30+117 && my>cdyofs+32 && my<cdyofs+10+32 && !moving) || (key[SCAN_ENTER] && !ctf))\r
4490     {\r
4491       // insert code for button "OK" here\r
4492       ButtonPressed(cdxofs+117, cdyofs+32, "OK");\r
4493       DrawMouse();\r
4494       done=1;\r
4495       while (mb)\r
4496       {\r
4497         ReadMouse();\r
4498         ShowPage();\r
4499         ReadMouse();\r
4500       }\r
4501       WaitRelease(); continue;\r
4502     }\r
4503 \r
4504     if (mb==1 && mx>(cdxofs+cdxsize-9) && (mx<cdxofs+cdxsize-2)\r
4505     && my>(cdyofs+1) && (my<cdyofs+8) && !moving)\r
4506     {\r
4507       done=1;\r
4508       WaitRelease();\r
4509       break;\r
4510     }\r
4511 \r
4512     if (mb==1 && mx>cdxofs && mx<cdxofs+cdxsize && my>cdyofs && my<(cdyofs+9) && !moving)\r
4513     {\r
4514       moving=1;\r
4515       mxo=mx-cdxofs;\r
4516       myo=my-cdyofs;\r
4517       continue;\r
4518     }\r
4519 \r
4520     if (mb==1 && !moving)\r
4521     {\r
4522       ctf=0;\r
4523       cb=0;\r
4524       str=0;\r
4525       WaitRelease();\r
4526     }\r
4527 \r
4528     if (last_pressed)\r
4529     {\r
4530       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
4531       else c=key_ascii_tbl[last_pressed];\r
4532 \r
4533       if (last_pressed==SCAN_ESC)\r
4534       {\r
4535         key[SCAN_ESC]=0;\r
4536         done=1;\r
4537         break;\r
4538       }\r
4539 \r
4540       if (last_pressed==SCAN_ENTER)\r
4541       {\r
4542         key[SCAN_ENTER]=0;\r
4543         ctf=0;\r
4544         str=0;\r
4545         last_pressed=0;\r
4546         continue;\r
4547       }\r
4548 \r
4549       if (!ctf)\r
4550         continue;\r
4551 \r
4552       if (last_pressed==SCAN_BACKSP && strlen(str))\r
4553       {\r
4554         str[strlen(str)-1]=0;\r
4555         key[SCAN_BACKSP]=0;\r
4556         last_pressed=0;\r
4557         continue;\r
4558       }\r
4559       else if (last_pressed==SCAN_BACKSP)\r
4560       {\r
4561         last_pressed=0;\r
4562         continue;\r
4563       }\r
4564 \r
4565       t=strlen(str);\r
4566       str[t]=c;\r
4567       str[t+1]=0;\r
4568       last_pressed=0;\r
4569     }\r
4570   } while (!done);\r
4571 }\r
4572 \r
4573 int ntxsize=130, nytsize=51;\r
4574 int ntxofs=110, ntyofs=70;\r
4575 \r
4576 void NoticeDialog()\r
4577 { char done=0, moving=0;\r
4578   int mxo, myo, cursorblink;\r
4579   char ctf=0, cb=0, c, t, *str;\r
4580 \r
4581   last_pressed=0;\r
4582   do\r
4583   {\r
4584     RenderMap();\r
4585     RenderGUI();\r
4586 \r
4587     if (ctf && systemtime >= cursorblink)\r
4588     {\r
4589       cb ^= 1;\r
4590       cursorblink = systemtime+40;\r
4591     }\r
4592     if (moving)\r
4593     {\r
4594       ntxofs = (mx-mxo);\r
4595       ntyofs = (my-myo);\r
4596       if (!mb) moving=0;\r
4597       if (ntxofs<16) ntxofs = 16;\r
4598       if (ntyofs<16) ntyofs = 16;\r
4599       if (ntxofs+ntxsize>335) ntxofs = 336-ntxsize;\r
4600       if (ntyofs+nytsize>sy+16) ntyofs = (sy+16)-nytsize;\r
4601     }\r
4602 \r
4603     Window(ntxofs, ntyofs, ntxofs+ntxsize, ntyofs+nytsize, "Notice!");\r
4604     GotoXY(ntxofs+20, ntyofs+20); printstring("Don't forget to add this");\r
4605     GotoXY(ntxofs+14, ntyofs+26); printstring("layer to the Render String!");\r
4606     Button(ntxofs+50, ntyofs+36, "OK");\r
4607     GotoXY(ntxofs+25, ntyofs+14); printstring("Layer has been added.");\r
4608 \r
4609     DrawMouse();\r
4610     ShowPage();\r
4611     CheckTimerStuff();\r
4612 \r
4613     // input phase\r
4614     if ((mb==1 && mx>ntxofs+50 && mx<ntxofs+30+50 && my>ntyofs+36 && my<ntyofs+10+36 && !moving) || (key[SCAN_ENTER] && !ctf))\r
4615     {\r
4616       // insert code for button "OK" here\r
4617       ButtonPressed(ntxofs+50, ntyofs+36, "OK");\r
4618       done=1;\r
4619       DrawMouse();\r
4620       while (mb)\r
4621       {\r
4622         ReadMouse();\r
4623         ShowPage();\r
4624         ReadMouse();\r
4625       }\r
4626       WaitRelease(); continue;\r
4627     }\r
4628 \r
4629     if (mb==1 && mx>(ntxofs+ntxsize-9) && (mx<ntxofs+ntxsize-2)\r
4630     && my>(ntyofs+1) && (my<ntyofs+8) && !moving)\r
4631     {\r
4632       done=1;\r
4633       WaitRelease();\r
4634       break;\r
4635     }\r
4636 \r
4637     if (mb==1 && mx>ntxofs && mx<ntxofs+ntxsize && my>ntyofs && my<(ntyofs+9) && !moving)\r
4638     {\r
4639       moving=1;\r
4640       mxo=mx-ntxofs;\r
4641       myo=my-ntyofs;\r
4642       continue;\r
4643     }\r
4644 \r
4645     if (mb==1 && !moving)\r
4646     {\r
4647       ctf=0;\r
4648       cb=0;\r
4649       str=0;\r
4650       WaitRelease();\r
4651     }\r
4652 \r
4653     if (last_pressed)\r
4654     {\r
4655       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
4656       else c=key_ascii_tbl[last_pressed];\r
4657 \r
4658       if (last_pressed==SCAN_ESC)\r
4659       {\r
4660         key[SCAN_ESC]=0;\r
4661         done=1;\r
4662         break;\r
4663       }\r
4664 \r
4665       if (last_pressed==SCAN_ENTER)\r
4666       {\r
4667         key[SCAN_ENTER]=0;\r
4668         ctf=0;\r
4669         str=0;\r
4670         last_pressed=0;\r
4671         continue;\r
4672       }\r
4673 \r
4674       if (!ctf)\r
4675         continue;\r
4676 \r
4677       if (last_pressed==SCAN_BACKSP && strlen(str))\r
4678       {\r
4679         str[strlen(str)-1]=0;\r
4680         key[SCAN_BACKSP]=0;\r
4681         last_pressed=0;\r
4682         continue;\r
4683       }\r
4684       else if (last_pressed==SCAN_BACKSP)\r
4685       {\r
4686         last_pressed=0;\r
4687         continue;\r
4688       }\r
4689 \r
4690       t=strlen(str);\r
4691       str[t]=c;\r
4692       str[t+1]=0;\r
4693       last_pressed=0;\r
4694     }\r
4695   } while (!done);\r
4696 }\r
4697 \r
4698 int oxsize=150, oysize=98;\r
4699 int oxofs=120, oyofs=70;\r
4700 extern char vcedprog[80];\r
4701 \r
4702 void OptionsDialog()\r
4703 { char done=0, moving=0;\r
4704   int mxo, myo, cursorblink;\r
4705   char ctf=0, cb=0, c, t, *str;\r
4706   char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
4707 \r
4708   sprintf(nstr1, "%d", winbg);\r
4709   sprintf(nstr2, "%d", titlebg);\r
4710   sprintf(nstr3, "%d", brightw);\r
4711   sprintf(nstr4, "%d", darkw);\r
4712   last_pressed=0;\r
4713   do\r
4714   {\r
4715     RenderMap();\r
4716     RenderGUI();\r
4717 \r
4718     if (ctf && systemtime >= cursorblink)\r
4719     {\r
4720       cb ^= 1;\r
4721       cursorblink = systemtime+40;\r
4722     }\r
4723     if (moving)\r
4724     {\r
4725       oxofs = (mx-mxo);\r
4726       oyofs = (my-myo);\r
4727       if (!mb) moving=0;\r
4728       if (oxofs<16) oxofs = 16;\r
4729       if (oyofs<16) oyofs = 16;\r
4730       if (oxofs+oxsize>335) oxofs = 336-oxsize;\r
4731       if (oyofs+oysize>sy+16) oyofs = (sy+16)-oysize;\r
4732     }\r
4733 \r
4734     Window(oxofs, oyofs, oxofs+oxsize, oyofs+oysize, "MapEd Options");\r
4735     GotoXY(oxofs+16, oyofs+12); printstring("Smooth Scroll");\r
4736     CheckBox(oxofs+5, oyofs+11, scrollmode);\r
4737     GotoXY(oxofs+16, oyofs+20); printstring("Tile Highlight");\r
4738     CheckBox(oxofs+5, oyofs+19, mh);\r
4739     GotoXY(oxofs+38, oyofs+31); printstring("Window Background");\r
4740     TextField(oxofs+5, oyofs+29, 30, nstr1, ctf == 1 ? cb : 0);\r
4741     TextField(oxofs+5, oyofs+39, 30, nstr2, ctf == 2 ? cb : 0);\r
4742     GotoXY(oxofs+38, oyofs+41); printstring("Titlebar Background");\r
4743     CheckBox(oxofs+74, oyofs+11, vm);\r
4744     GotoXY(oxofs+84, oyofs+12); printstring("320x240 driver");\r
4745     CheckBox(oxofs+74, oyofs+19, mouse_scroll);\r
4746     GotoXY(oxofs+84, oyofs+20); printstring("Mouse Scrolling");\r
4747     TextField(oxofs+5, oyofs+49, 30, nstr3, ctf == 3 ? cb : 0);\r
4748     TextField(oxofs+5, oyofs+59, 30, nstr4, ctf == 4 ? cb : 0);\r
4749     GotoXY(oxofs+38, oyofs+51); printstring("White");\r
4750     GotoXY(oxofs+38, oyofs+61); printstring("Shadow");\r
4751     Button(oxofs+60, oyofs+85, "OK");\r
4752     HLine(oxofs+1, oyofs+71, 148, white);\r
4753     GotoXY(oxofs+3, oyofs+76); printstring("Editor:");\r
4754     TextField(oxofs+28, oyofs+74, 118, vcedprog, ctf == 5 ? cb : 0);\r
4755 \r
4756     DrawMouse();\r
4757     ShowPage();\r
4758     CheckTimerStuff();\r
4759 \r
4760     // input phase\r
4761     if (mb==1 && mx>oxofs+5 && mx<oxofs+8+5 && my>oyofs+11 && my<oyofs+7+11 && !moving)\r
4762     {\r
4763       xwin=xwin>>4; xwin=xwin<<4;\r
4764       ywin=ywin>>4; ywin=ywin<<4;\r
4765       scrollmode ^= 1; WaitRelease(); continue;\r
4766     }\r
4767 \r
4768     if (mb==1 && mx>oxofs+5 && mx<oxofs+8+5 && my>oyofs+19 && my<oyofs+7+19 && !moving)\r
4769     {\r
4770       mh ^= 1; WaitRelease(); continue;\r
4771     }\r
4772 \r
4773     if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+29 && my<oyofs+9+29 && !moving)\r
4774     {\r
4775       ctf=1; str=nstr1; cb=1;\r
4776       cursorblink=systemtime+40; continue;\r
4777     }\r
4778 \r
4779     if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+39 && my<oyofs+9+39 && !moving)\r
4780     {\r
4781       ctf=2; str=nstr2; cb=1;\r
4782       cursorblink=systemtime+40; continue;\r
4783     }\r
4784 \r
4785     if (mb==1 && mx>oxofs+74 && mx<oxofs+8+74 && my>oyofs+11 && my<oyofs+7+11 && !moving)\r
4786     {\r
4787       vm ^= 1; WaitRelease();\r
4788       ShutdownVideo();\r
4789       InitVideo(vm);\r
4790       set_intensity(63);\r
4791       InitMouse();\r
4792       continue;\r
4793     }\r
4794 \r
4795     if (mb==1 && mx>oxofs+74 && mx<oxofs+8+74 && my>oyofs+19 && my<oyofs+7+19 && !moving)\r
4796     {\r
4797       mouse_scroll ^= 1; WaitRelease(); continue;\r
4798     }\r
4799 \r
4800     if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+49 && my<oyofs+9+49 && !moving)\r
4801     {\r
4802       ctf=3; str=nstr3; cb=1;\r
4803       cursorblink=systemtime+40; continue;\r
4804     }\r
4805 \r
4806     if (mb==1 && mx>oxofs+5 && mx<oxofs+30+5 && my>oyofs+59 && my<oyofs+9+59 && !moving)\r
4807     {\r
4808       ctf=4; str=nstr4; cb=1;\r
4809       cursorblink=systemtime+40; continue;\r
4810     }\r
4811 \r
4812     if ((mb==1 && mx>oxofs+60 && mx<oxofs+30+60 && my>oyofs+85 && my<oyofs+10+85 && !moving) || (key[SCAN_ENTER] && !ctf))\r
4813     {\r
4814       // insert code for button "OK" here\r
4815       ButtonPressed(oxofs+60, oyofs+85, "OK");\r
4816       DrawMouse();\r
4817       while (mb)\r
4818       {\r
4819         ReadMouse();\r
4820         ShowPage();\r
4821         ReadMouse();\r
4822       }\r
4823       done=1;\r
4824       WaitRelease(); continue;\r
4825     }\r
4826 \r
4827     if (mb==1 && mx>oxofs+28 && mx<oxofs+118+28 && my>oyofs+74 && my<oyofs+9+74 && !moving)\r
4828     {\r
4829       ctf=5; str=vcedprog; cb=1;\r
4830       cursorblink=systemtime+40; continue;\r
4831     }\r
4832 \r
4833     if (mb==1 && mx>(oxofs+oxsize-9) && (mx<oxofs+oxsize-2)\r
4834     && my>(oyofs+1) && (my<oyofs+8) && !moving)\r
4835     {\r
4836       done=1;\r
4837       WaitRelease();\r
4838       break;\r
4839     }\r
4840 \r
4841     if (mb==1 && mx>oxofs && mx<oxofs+oxsize && my>oyofs && my<(oyofs+9) && !moving)\r
4842     {\r
4843       moving=1;\r
4844       mxo=mx-oxofs;\r
4845       myo=my-oyofs;\r
4846       continue;\r
4847     }\r
4848 \r
4849     if (mb==1 && !moving)\r
4850     {\r
4851       ctf=0;\r
4852       cb=0;\r
4853       str=0;\r
4854       WaitRelease();\r
4855     }\r
4856 \r
4857     if (last_pressed)\r
4858     {\r
4859       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
4860       else c=key_ascii_tbl[last_pressed];\r
4861 \r
4862       if (last_pressed==SCAN_ESC)\r
4863       {\r
4864         key[SCAN_ESC]=0;\r
4865         done=1;\r
4866         break;\r
4867       }\r
4868 \r
4869       if (last_pressed==SCAN_ENTER)\r
4870       {\r
4871         key[SCAN_ENTER]=0;\r
4872         ctf=0;\r
4873         str=0;\r
4874         last_pressed=0;\r
4875         continue;\r
4876       }\r
4877 \r
4878       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
4879       {\r
4880         switch (ctf)\r
4881         {\r
4882           case 0: ctf=1; str=nstr1; break;\r
4883           case 1: ctf=2; str=nstr2; break;\r
4884           case 2: ctf=3; str=nstr3; break;\r
4885           case 3: ctf=4; str=nstr4; break;\r
4886           case 4: ctf=5; str=vcedprog; break;\r
4887           case 5: ctf=0; str=0; break;\r
4888         }\r
4889         key[SCAN_TAB]=0;\r
4890         last_pressed=0;\r
4891         cb=1; cursorblink=systemtime+40;\r
4892         continue;\r
4893       }\r
4894 \r
4895       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
4896       {\r
4897         switch (ctf)\r
4898         {\r
4899           case 0: ctf=5; str=vcedprog; break;\r
4900           case 1: ctf=0; str=0; break;\r
4901           case 2: ctf=1; str=nstr1; break;\r
4902           case 3: ctf=2; str=nstr2; break;\r
4903           case 4: ctf=3; str=nstr3; break;\r
4904           case 5: ctf=4; str=nstr4; break;\r
4905         }\r
4906         key[SCAN_TAB]=0;\r
4907         last_pressed=0;\r
4908         cb=1; cursorblink=systemtime+40;\r
4909         continue;\r
4910       }\r
4911 \r
4912       if (!ctf)\r
4913         continue;\r
4914 \r
4915       if (last_pressed==SCAN_BACKSP && strlen(str))\r
4916       {\r
4917         str[strlen(str)-1]=0;\r
4918         key[SCAN_BACKSP]=0;\r
4919         last_pressed=0;\r
4920         continue;\r
4921       }\r
4922       else if (last_pressed==SCAN_BACKSP)\r
4923       {\r
4924         last_pressed=0;\r
4925         continue;\r
4926       }\r
4927 \r
4928       t=strlen(str);\r
4929       str[t]=c;\r
4930       str[t+1]=0;\r
4931       last_pressed=0;\r
4932     }\r
4933   } while (!done);\r
4934   winbg=atoi(nstr1);\r
4935   titlebg=atoi(nstr2);\r
4936   brightw=atoi(nstr3);\r
4937   darkw=atoi(nstr4);\r
4938 }\r
4939 \r
4940 int vcexsize=200, vceysize=60;\r
4941 int vcexofs=76, vceyofs=70;\r
4942 \r
4943 void VCNotify(char *msg)\r
4944 { char done=0, moving=0;\r
4945   int mxo, myo, cursorblink;\r
4946   char ctf=0, cb=0, c, t, *str;\r
4947 \r
4948   last_pressed=0;\r
4949   do\r
4950   {\r
4951     RenderMap();\r
4952     RenderGUI();\r
4953 \r
4954     if (ctf && systemtime >= cursorblink)\r
4955     {\r
4956       cb ^= 1;\r
4957       cursorblink = systemtime+40;\r
4958     }\r
4959     if (moving)\r
4960     {\r
4961       vcexofs = (mx-mxo);\r
4962       vceyofs = (my-myo);\r
4963       if (!mb) moving=0;\r
4964       if (vcexofs<16) vcexofs = 16;\r
4965       if (vceyofs<16) vceyofs = 16;\r
4966       if (vcexofs+vcexsize>335) vcexofs = 336-vcexsize;\r
4967       if (vceyofs+vceysize>sy+16) vceyofs = (sy+16)-vceysize;\r
4968     }\r
4969 \r
4970     Window(vcexofs, vceyofs, vcexofs+vcexsize, vceyofs+vceysize, "VergeC Error Report");\r
4971     Button(vcexofs+85, vceyofs+41, "OK");\r
4972     GotoXY(vcexofs+29, vceyofs+17); printstring("VCC has reported the following error:");\r
4973     GotoXY(vcexofs+100-(pixels(msg)/2), vceyofs+23); printstring(msg);\r
4974 \r
4975     DrawMouse();\r
4976     ShowPage();\r
4977     CheckTimerStuff();\r
4978 \r
4979     // input phase\r
4980     if ((mb==1 && mx>vcexofs+85 && mx<vcexofs+30+85 && my>vceyofs+41 && my<vceyofs+10+41 && !moving) || (key[SCAN_ENTER] && !ctf))\r
4981     {\r
4982       // insert code for button "OK" here\r
4983       ButtonPressed(vcexofs+85, vceyofs+41, "OK");\r
4984       DrawMouse();\r
4985       while (mb)\r
4986       {\r
4987         ReadMouse();\r
4988         ShowPage();\r
4989         ReadMouse();\r
4990       }\r
4991       done=1;\r
4992       WaitRelease(); continue;\r
4993     }\r
4994 \r
4995     if (mb==1 && mx>(vcexofs+vcexsize-9) && (mx<vcexofs+vcexsize-2)\r
4996     && my>(vceyofs+1) && (my<vceyofs+8) && !moving)\r
4997     {\r
4998       done=1;\r
4999       WaitRelease();\r
5000       break;\r
5001     }\r
5002 \r
5003     if (mb==1 && mx>vcexofs && mx<vcexofs+vcexsize && my>vceyofs && my<(vceyofs+9) && !moving)\r
5004     {\r
5005       moving=1;\r
5006       mxo=mx-vcexofs;\r
5007       myo=my-vceyofs;\r
5008       continue;\r
5009     }\r
5010 \r
5011     if (mb==1 && !moving)\r
5012     {\r
5013       ctf=0;\r
5014       cb=0;\r
5015       str=0;\r
5016       WaitRelease();\r
5017     }\r
5018 \r
5019     if (last_pressed)\r
5020     {\r
5021       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
5022       else c=key_ascii_tbl[last_pressed];\r
5023 \r
5024       if (last_pressed==SCAN_ESC)\r
5025       {\r
5026         key[SCAN_ESC]=0;\r
5027         done=1;\r
5028         break;\r
5029       }\r
5030 \r
5031       if (last_pressed==SCAN_ENTER)\r
5032       {\r
5033         key[SCAN_ENTER]=0;\r
5034         ctf=0;\r
5035         str=0;\r
5036         last_pressed=0;\r
5037         continue;\r
5038       }\r
5039 \r
5040       if (!ctf)\r
5041         continue;\r
5042 \r
5043       if (last_pressed==SCAN_BACKSP && strlen(str))\r
5044       {\r
5045         str[strlen(str)-1]=0;\r
5046         key[SCAN_BACKSP]=0;\r
5047         last_pressed=0;\r
5048         continue;\r
5049       }\r
5050       else if (last_pressed==SCAN_BACKSP)\r
5051       {\r
5052         last_pressed=0;\r
5053         continue;\r
5054       }\r
5055 \r
5056       t=strlen(str);\r
5057       str[t]=c;\r
5058       str[t+1]=0;\r
5059       last_pressed=0;\r
5060     }\r
5061   } while (!done);\r
5062 }\r