]> 4ch.mooo.com Git - 16.git/blob - 16/v2/source/verge/MAPED/CONTROLS.C
be58e951fd57c5fe3739c6e36f9e30cff55eeb96
[16.git] / 16 / v2 / source / verge / MAPED / CONTROLS.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 \r
18 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
19 // CHANGELOG:\r
20 // <zero 5.7.99>\r
21 // + fixed ScreenShot() to properly save screenshots with\r
22 //   the sequential filenames.\r
23 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
24 \r
25 // ================================= Data ====================================\r
26 \r
27 // ================================= Code ====================================\r
28 \r
29 int CheckMouseTabs()\r
30 { int i;\r
31 \r
32   for (i=0; i<10; i++)\r
33   {\r
34     if (i<6 && i>=numlayers) continue;\r
35     if (mb==1 && mx>17+(i*10) && mx<26+(i*10) && my>(tsy-7) && my<tsy)\r
36     {   layertoggle[i]=layertoggle[i] ^ 1; WaitRelease(); return 1; }\r
37     if (mb==2 && mx>17+(i*10) && mx<26+(i*10) && my>(tsy-7) && my<tsy)\r
38     {   el=i; WaitRelease(); return 1; }\r
39   }\r
40   return 0;\r
41 }\r
42 \r
43 HAL()\r
44 { int i;\r
45 \r
46   Message("I'm sorry dave, I can't do that...",600);\r
47   i=systemtime+400;\r
48   while (systemtime<i)\r
49   {\r
50     RenderMap();\r
51     RenderGUI();\r
52     ShowPage();\r
53   }\r
54   Message("Just kidding! :)",200);\r
55 }\r
56 \r
57 void WritePCXLine(unsigned char *p,int len,FILE *pcxf)\r
58 { int i;\r
59   unsigned char byt, samect, repcode;\r
60 \r
61   i=0;\r
62   do\r
63   {   byt=p[i++];\r
64       samect=1;\r
65       while (samect<(unsigned) 63 && i<len && byt==p[i])\r
66       {\r
67          samect++;\r
68          i++;\r
69       }\r
70       if (samect>1 || (byt & 0xC0) != 0)\r
71       {\r
72          repcode=0xC0 | samect;\r
73          fwrite(&repcode,1,1,pcxf);\r
74       }\r
75       fwrite(&byt,1,1,pcxf);\r
76   } while (i<len);\r
77 }\r
78 \r
79 acopytile(int x, int y, char *src, char *pt)\r
80 {\r
81   char *d;\r
82   int h;\r
83 \r
84   h=16;\r
85 \r
86   y<<=6;\r
87   d=pt+y+(y<<2)+x;\r
88 \r
89   for (; h; h--)\r
90   {\r
91     memcpy(d,src,16);\r
92     src+=16;\r
93     d+=320;\r
94   }\r
95 }\r
96 \r
97 extern FILE *pcxf;\r
98 \r
99 void WritePalette(FILE *f)\r
100 { char b;\r
101   int i;\r
102 \r
103   for (i=0; i<768; i++)\r
104       pal[i]=pal[i] << 2;\r
105 \r
106   b=12; fwrite(&b, 1, 1, f);\r
107   fwrite(pal, 1, 768, f);\r
108 \r
109   for (i=0; i<768; i++)\r
110       pal[i]=pal[i] >> 2;\r
111 }\r
112 \r
113 void OutputVSPpcx()\r
114 { int i,j,_x,_y;\r
115   unsigned char *ptr;\r
116   char b1;\r
117   short int w1,w2;\r
118 \r
119   // First figure out the filename\r
120 \r
121   i=0;\r
122   ptr=&vspname;\r
123   while (*ptr != '.')\r
124   {\r
125     strbuf[i]=*ptr;\r
126     ptr++;\r
127     i++;\r
128   }\r
129   strbuf[i++]='.';\r
130   strbuf[i++]='P';\r
131   strbuf[i++]='C';\r
132   strbuf[i++]='X';\r
133   strbuf[i++]=0;\r
134 \r
135   pcxf=fopen(strbuf,"wb");\r
136 \r
137 // Write PCX header\r
138 \r
139    b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
140    b1=5; fwrite(&b1, 1, 1, pcxf);  // version = 3.0, >16 colors\r
141    b1=1; fwrite(&b1, 1, 1, pcxf);  // encoding always = 1\r
142    b1=8; fwrite(&b1, 1, 1, pcxf);  // 8 bits per pixel, for 256 colors\r
143    w1=0; fwrite(&w1, 1, 2, pcxf);  // xmin = 0;\r
144    w1=0; fwrite(&w1, 1, 2, pcxf);  // ymin = 0;\r
145  w1=319; fwrite(&w1, 1, 2, pcxf);  // xmax = 319;\r
146 \r
147  // At this point we need to figure out how many vertical rows tall the\r
148  // PCX needs to be in order to accomidate the number of tiles in the VSP.\r
149 \r
150  w2=numtiles/18; w2++;\r
151  w2=(w2*17); fwrite(&w2, 1, 2, pcxf);  // ymax = ?;\r
152  w1=320; fwrite(&w1, 1, 2, pcxf);      // hres = 320;\r
153  w2++; fwrite(&w2, 1, 2, pcxf);        // vres = ?;\r
154 \r
155  fwrite(screen, 1, 48, pcxf);  // 16-color palette data. Who knows what's\r
156                                // actually in here. It doesn't matter since\r
157                                // the 256-color palette is stored elsewhere.\r
158 \r
159  b1=0; fwrite(&b1, 1, 1, pcxf);   // reserved always = 0.\r
160  b1=1; fwrite(&b1, 1, 1, pcxf);   // number of color planes. Just 1 for 8bit.\r
161  w1=320; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
162 \r
163  w1=0; fwrite(&w1, 1, 1, pcxf);\r
164  fwrite(screen, 1, 59, pcxf);          // filler\r
165 \r
166  // The header is written. Now we need to generate a large buffer where we'll\r
167  // "draw" the PCX, and then encode the data and save the PCX.\r
168 \r
169  ptr=(char *) malloc(320*w2);\r
170  memset(ptr,255,(320*w2));            // Give the PCX a white background\r
171 \r
172  // Now we "draw" the tiles into the buffer.\r
173 \r
174  for (i=0; i<numtiles; i++)\r
175  {\r
176     j=i/18;\r
177     _y=1+(j*17);\r
178     j=i-(j*18);\r
179     _x=1+(j*17);\r
180     acopytile(_x,_y,vsp+(i*256),ptr);\r
181  }\r
182 \r
183  // And now we save the rest of the PCX.\r
184 \r
185  for (w1=0; w1<w2; w1++)\r
186      WritePCXLine(ptr+(w1*320),320,pcxf);\r
187 \r
188   WritePalette(pcxf);\r
189   fclose(pcxf);\r
190 \r
191   vfree(ptr);\r
192 }\r
193 \r
194 void ScreenShot()\r
195 {\r
196   unsigned char b1;\r
197   unsigned short int w1;\r
198   int i,n; //zero 5.7.99\r
199   char fnamestr[13];\r
200   static int ss=0;\r
201   FILE *pcxf;\r
202 \r
203 //--- zero 5.7.99\r
204   n=0;\r
205   do\r
206   {\r
207     sprintf(fnamestr,"%d.pcx",n);\r
208     pcxf=fopen(fnamestr,"r");\r
209     i=(int)pcxf;\r
210     if(pcxf) fclose(pcxf);\r
211     n++;\r
212   } while(i);\r
213   n--;\r
214 \r
215   // Takes a snapshot of the current screen.\r
216 \r
217    sprintf(fnamestr,"%d.pcx",n);\r
218 //---\r
219 \r
220    pcxf=fopen(&fnamestr,"wb");\r
221    ss++;\r
222 \r
223 // Write PCX header\r
224 \r
225    b1=10; fwrite(&b1, 1, 1, pcxf); // manufacturer always = 10\r
226    b1=5; fwrite(&b1, 1, 1, pcxf);  // version = 3.0, >16 colors\r
227    b1=1; fwrite(&b1, 1, 1, pcxf);  // encoding always = 1\r
228    b1=8; fwrite(&b1, 1, 1, pcxf);  // 8 bits per pixel, for 256 colors\r
229    w1=0; fwrite(&w1, 1, 2, pcxf);  // xmin = 0;\r
230    w1=0; fwrite(&w1, 1, 2, pcxf);  // ymin = 0;\r
231  w1=sx-1; fwrite(&w1, 1, 2, pcxf);  // xmax = 319;\r
232  w1=sy-1; fwrite(&w1, 1, 2, pcxf);  // ymax = 199;\r
233  w1=sx; fwrite(&w1, 1, 2, pcxf);  // hres = 320;\r
234  w1=sy; fwrite(&w1, 1, 2, pcxf);  // vres = 200;\r
235 \r
236  fwrite(screen,1,48,pcxf);\r
237 \r
238  b1=0; fwrite(&b1, 1, 1, pcxf);   // reserved always = 0.\r
239  b1=1; fwrite(&b1, 1, 1, pcxf);   // number of color planes. Just 1 for 8bit.\r
240  w1=sx; fwrite(&w1, 1, 2, pcxf); // number of bytes per line\r
241 \r
242  w1=0; fwrite(&w1, 1, 1, pcxf);\r
243  fwrite(screen, 1, 59, pcxf);          // filler\r
244 \r
245  for (w1=0; w1<sy; w1++)\r
246      WritePCXLine(screen+((w1+16)*tsx)+16, sx, pcxf);\r
247 \r
248  WritePalette(pcxf);\r
249  fclose(pcxf);\r
250  timer_count=0;\r
251 }\r
252 \r
253 // aen -- put this out here because the PollMovement() routine i added\r
254 //        needs access to them.\r
255 \r
256 int ms_right=0;\r
257 int ms_down=0;\r
258 int ms_left=0;\r
259 int ms_up=0;\r
260 \r
261 void PollMovement() // aen\r
262 {\r
263   int xmax, ymax;\r
264 \r
265   // d'oh! :p\r
266   ms_right=0;\r
267   ms_down=0;\r
268   ms_left=0;\r
269   ms_up=0;\r
270 \r
271   xmax = (layer[0].sizex * 16) - sx;\r
272   ymax = (layer[0].sizey * 16) - sy;\r
273 \r
274   // aen: made all scroll code apply movement first, correct afterwards. if\r
275   // not done this way, bugs crop up with the movement when holding page\r
276   // down, to scroll to the bottom of the map (in tile scroll), then holding\r
277   // the up arrow key to scroll back up to the top (will scroll into the\r
278   // negatives).\r
279 \r
280   if (mouse_scroll)\r
281   {\r
282     if (my<18) ms_up=1;\r
283     if (my>(tsy-2)) ms_down=1;\r
284     if (mx>334) ms_right=1;\r
285     if (mx<18) ms_left=1;\r
286   }\r
287 \r
288   if (key[SCAN_UP] || ms_up)\r
289   {\r
290     if (scrollmode)\r
291     {\r
292        ywin -= map_scroll_y;\r
293        if (ywin < 0) ywin = 0;\r
294     }\r
295     else\r
296     {\r
297       if (key[SCAN_UP] || (!(systemtime%10)))\r
298       {\r
299         key[SCAN_UP]=0;\r
300         ywin -= 16;\r
301         if (ywin < 0) ywin = 0;\r
302         systemtime++;\r
303       }\r
304     }\r
305   }\r
306   if (key[SCAN_DOWN] || ms_down)\r
307   {\r
308     if (scrollmode)\r
309     {\r
310       ywin += map_scroll_y;\r
311       if (ywin > ymax)\r
312         ywin = ymax;\r
313     }\r
314     else\r
315     {\r
316       if (key[SCAN_DOWN] || (!(systemtime%10)))\r
317       {\r
318         key[SCAN_DOWN]=0;\r
319         ywin += 16;\r
320         if (ywin > ymax)\r
321           ywin = ymax;\r
322         systemtime++;\r
323       }\r
324     }\r
325   }\r
326   if (key[SCAN_RIGHT] || ms_right)\r
327   {\r
328     if (scrollmode)\r
329     {\r
330       xwin += map_scroll_x;\r
331       if (xwin > xmax)\r
332         xwin = xmax;\r
333     }\r
334     else\r
335     {\r
336       if (key[SCAN_RIGHT] || (!(systemtime%10)))\r
337       {\r
338          key[SCAN_RIGHT]=0;\r
339          xwin += 16;\r
340          if (xwin > xmax)\r
341            xwin = xmax;\r
342          systemtime++;\r
343       }\r
344     }\r
345   }\r
346   if (key[SCAN_LEFT] || ms_left)\r
347   {\r
348     if (scrollmode)\r
349     {\r
350       xwin -= map_scroll_x;\r
351       if (xwin < 0) xwin=0;\r
352     }\r
353     else\r
354     {\r
355        if (key[SCAN_LEFT] || (!(systemtime%10)))\r
356        {\r
357          key[SCAN_LEFT]=0;\r
358          xwin -= 16;\r
359          if (xwin < 0) xwin = 0;\r
360          systemtime++;\r
361        }\r
362     }\r
363   }\r
364 }\r
365 \r
366 ProcessControls()\r
367 {\r
368   int xmax, ymax;\r
369 \r
370   xmax = (layer[0].sizex * 16) - sx;\r
371   ymax = (layer[0].sizey * 16) - sy;\r
372 \r
373   if (key[SCAN_F5]) { key[SCAN_F5]=0; ShellMAP(); }\r
374   if (key[SCAN_F6]) { key[SCAN_F6]=0; CompileAll(); }\r
375   if (key[SCAN_F8]) { key[SCAN_F8]=0; ShellVERGE(); }\r
376   if (key[SCAN_ALT] && key[SCAN_D]) { key[SCAN_D]=0; ShellToDOS(); }\r
377   if (key[SCAN_ALT] && key[SCAN_L]) LoadMAPDialog();\r
378   if (key[SCAN_ALT] && key[SCAN_V]) ShellEditMAP();\r
379   if (key[SCAN_ALT] && key[SCAN_S]) ShellEditSystem();\r
380   if (key[SCAN_ALT] && key[SCAN_N]) NewMAP();\r
381   if (key[SCAN_ALT] && key[SCAN_P]) MPDialog();\r
382   if (!key[SCAN_ALT] && key[SCAN_P]) { pasting^=1; key[SCAN_P]=0; } // aen\r
383 \r
384   if (key[SCAN_A] && el<6)\r
385   {\r
386     lt++;\r
387     if (lt==numtiles) lt=0;\r
388     key[SCAN_A]=0;\r
389   }\r
390   if (key[SCAN_Z] && el<6)\r
391   {\r
392     if (lt) lt--;\r
393     else lt=numtiles-1;\r
394     key[SCAN_Z]=0;\r
395   }\r
396   if (key[SCAN_A] && el==7)\r
397   {\r
398     curzone++;\r
399     key[SCAN_A]=0;\r
400   }\r
401   if (key[SCAN_Z] && el==7)\r
402   {\r
403     curzone--;\r
404     key[SCAN_Z]=0;\r
405   }\r
406   if (key[SCAN_S])\r
407   {\r
408     rt++;\r
409     if (rt==numtiles) rt=0;\r
410     key[SCAN_S]=0;\r
411   }\r
412   if (key[SCAN_X])\r
413   {\r
414     if (rt) rt--;\r
415     else rt=numtiles-1;\r
416     key[SCAN_X]=0;\r
417   }\r
418   if (key[SCAN_F10])\r
419   {\r
420     key[SCAN_F10]=0;\r
421     if (random(0,255)<15) HAL();\r
422     SaveMAP(mapname);\r
423     SaveVSP(vspname);\r
424     CompileMAP();\r
425     Message("MAP/VSP saved.",100);\r
426     modified=0;\r
427   }\r
428   if (key[SCAN_C])\r
429   {\r
430     key[SCAN_C]=0;\r
431     sprintf(strbuf,"Left: %d Right: %d", lt, rt);\r
432     Message(strbuf, 300);\r
433   }\r
434   if (key[SCAN_M])\r
435   {\r
436     key[SCAN_M]=0;\r
437     GenerateMiniVSP();\r
438     MiniMAP();\r
439   }\r
440   if (key[SCAN_H])\r
441   {\r
442     key[SCAN_H]=0;\r
443     mh=mh^1;\r
444     if (mh) Message("MAP Tile Highlight enabled.",100);\r
445        else Message("MAP Tile Highlight disabled.",100);\r
446   }\r
447 \r
448   // ***\r
449   // movement code moved to PollMovement()\r
450   // ***\r
451 \r
452   if (key[SCAN_PGUP])\r
453   {\r
454     key[SCAN_PGUP]=0;\r
455     ywin -= sy;\r
456     if (ywin < 0)\r
457       ywin = 0;\r
458   }\r
459   if (key[SCAN_HOME])\r
460   {\r
461     key[SCAN_HOME]=0;\r
462     xwin -= sx;\r
463     if (xwin < 0)\r
464       xwin = 0;\r
465   }\r
466   if (key[SCAN_END])\r
467   {\r
468     key[SCAN_END]=0;\r
469     xwin += sx;\r
470     if (xwin > xmax)\r
471       xwin = xmax;\r
472   }\r
473   if (key[SCAN_PGDN])\r
474   {\r
475     key[SCAN_PGDN]=0;\r
476     ywin += sy;\r
477     if (ywin > ymax)\r
478       ywin = ymax;\r
479   }\r
480 \r
481   if (key[SCAN_CTRL] && el<6)\r
482   {\r
483     key[SCAN_CTRL]=0;\r
484     TileSelector();\r
485   }\r
486   if (key[SCAN_CTRL] && el==7)\r
487   {\r
488     key[SCAN_CTRL]=0;\r
489     ZoneEdDialog();\r
490   }\r
491 \r
492   if (key[SCAN_TAB])\r
493   {\r
494     key[SCAN_TAB]=0;\r
495     if (scrollmode)\r
496     {\r
497       scrollmode=0;\r
498       xwin=xwin/16; xwin=xwin*16;\r
499       ywin=ywin/16; ywin=ywin*16;\r
500       Message("Tile scroll.",150);\r
501     }\r
502     else\r
503     {\r
504       scrollmode=1;\r
505       Message("Pixel scroll.",150);\r
506     }\r
507   }\r
508 \r
509   if (key[SCAN_1])\r
510   {\r
511      if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
512      {\r
513        layertoggle[0]=0;\r
514        return;\r
515      }\r
516      layertoggle[0]=1;\r
517      layertoggle[6]=0; layertoggle[7]=0;\r
518      layertoggle[8]=0; layertoggle[9]=0;\r
519      el=0;\r
520      key[SCAN_1]=0;\r
521   }\r
522   if (key[SCAN_2])\r
523   {\r
524      if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
525      {\r
526        layertoggle[1]=0;\r
527        return;\r
528      }\r
529      key[SCAN_2]=0;\r
530      layertoggle[6]=0; layertoggle[7]=0;\r
531      layertoggle[8]=0; layertoggle[9]=0;\r
532      if (numlayers>1)\r
533      { layertoggle[1]=1;\r
534        el=1; }\r
535   }\r
536   if (key[SCAN_3])\r
537   {\r
538      if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
539      {\r
540        layertoggle[2]=0;\r
541        return;\r
542      }\r
543      key[SCAN_3]=0;\r
544      layertoggle[6]=0; layertoggle[7]=0;\r
545      layertoggle[8]=0; layertoggle[9]=0;\r
546      if (numlayers>2)\r
547      { layertoggle[2]=1;\r
548        el=2; }\r
549   }\r
550   if (key[SCAN_4])\r
551   {\r
552      if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
553      {\r
554        layertoggle[3]=0;\r
555        return;\r
556      }\r
557      key[SCAN_4]=0;\r
558      layertoggle[6]=0; layertoggle[7]=0;\r
559      layertoggle[8]=0; layertoggle[9]=0;\r
560      if (numlayers>3)\r
561      { layertoggle[3]=1;\r
562        el=3; }\r
563   }\r
564   if (key[SCAN_5])\r
565   {\r
566      if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
567      {\r
568        layertoggle[4]=0;\r
569        return;\r
570      }\r
571      key[SCAN_5]=0;\r
572      layertoggle[6]=0; layertoggle[7]=0;\r
573      layertoggle[8]=0; layertoggle[9]=0;\r
574      if (numlayers>4)\r
575      { layertoggle[4]=1;\r
576        el=4; }\r
577   }\r
578   if (key[SCAN_6])\r
579   {\r
580      if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
581      {\r
582        layertoggle[5]=0;\r
583        return;\r
584      }\r
585      key[SCAN_6]=0;\r
586      layertoggle[6]=0; layertoggle[7]=0;\r
587      layertoggle[8]=0; layertoggle[9]=0;\r
588      if (numlayers>5)\r
589      { layertoggle[5]=1;\r
590        el=5; }\r
591   }\r
592   if (key[SCAN_O])\r
593   {\r
594      key[SCAN_O]=0;\r
595      layertoggle[6]=1; layertoggle[7]=0;\r
596      layertoggle[8]=0; layertoggle[9]=0;\r
597      el=6;\r
598   }\r
599   if (key[SCAN_N])\r
600   {\r
601      key[SCAN_N]=0;\r
602      layertoggle[6]=0; layertoggle[7]=1;\r
603      layertoggle[8]=0; layertoggle[9]=0;\r
604      el=7;\r
605   }\r
606   if (key[SCAN_E])\r
607   {\r
608      key[SCAN_E]=0;\r
609      layertoggle[6]=0; layertoggle[7]=0;\r
610      layertoggle[8]=1; layertoggle[9]=0;\r
611      el=8;\r
612   }\r
613   if (key[SCAN_T])\r
614   {\r
615      key[SCAN_T]=0;\r
616      layertoggle[6]=0; layertoggle[7]=0;\r
617      layertoggle[8]=0; layertoggle[9]=1;\r
618      el=9;\r
619   }\r
620   if (key[SCAN_F9])\r
621   { // aen\r
622     key[SCAN_F9]=0;\r
623     mouse_scroll^=1;\r
624     sprintf(strbuf,"Mouse scroll %sabled.", mouse_scroll ? "en" : "dis");\r
625     Message(strbuf, 100);\r
626   }\r
627   if (key[SCAN_F11])\r
628   {\r
629     key[SCAN_F11]=0;\r
630     ScreenShot();\r
631     Message("Screen capture saved.",300);\r
632   }\r
633   if (key[SCAN_F12])\r
634   {\r
635     key[SCAN_F12]=0;\r
636     OutputVSPpcx();\r
637     Message("PCX file exported.",300);\r
638   }\r
639   if (key[SCAN_LANGLE])\r
640   {\r
641       key[SCAN_LANGLE]=0;\r
642       ShutdownVideo();\r
643       vm=0;\r
644       InitVideo(0);\r
645       set_intensity(63);\r
646       InitMouse();\r
647 \r
648       // aen -- gotta recalc this if you're in a lower res at the bottom of\r
649       //        the map and jump to a higher res.\r
650       xmax = (layer[0].sizex * 16) - sx;\r
651       ymax = (layer[0].sizey * 16) - sy;\r
652       if (xwin > xmax) xwin=xmax;\r
653       if (ywin > ymax) ywin=ymax;\r
654   }\r
655   if (key[SCAN_RANGLE])\r
656   {\r
657       key[SCAN_RANGLE]=0;\r
658       ShutdownVideo();\r
659       vm=1;\r
660       InitVideo(1);\r
661       set_intensity(63);\r
662       InitMouse();\r
663 \r
664       // aen -- gotta recalc this if you're in a lower res at the bottom of\r
665       //        the map and jump to a higher res.\r
666       xmax = (layer[0].sizex * 16) - sx;\r
667       ymax = (layer[0].sizey * 16) - sy;\r
668       if (xwin > xmax) xwin=xmax;\r
669       if (ywin > ymax) ywin=ymax;\r
670   }\r
671 \r
672   if (CheckMouseTabs()) return;\r
673 \r
674   if (mb>=3) MainMenu(mx-4,my-5);\r
675   if (key[SCAN_ESC]) DoMainMenu();\r
676 \r
677   if (mb==1 && key[SCAN_SLASH] && el<6)\r
678   {\r
679     lt=layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
680              layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16)];\r
681 \r
682     return;\r
683   }\r
684 \r
685   if (mb==2 && key[SCAN_SLASH] && el<6)\r
686   {\r
687     rt=layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
688              layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16)];\r
689     return;\r
690   }\r
691 \r
692   // aen; these must come before the tile plotting code just below\r
693   // to work correctly.\r
694   if (mb && el<6 && key[SCAN_LSHIFT] && !shifted)\r
695   {\r
696     selx1=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
697     sely1=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
698     selx2=selx1;\r
699     sely2=sely1;\r
700     shifted=mb;\r
701     return;\r
702   }\r
703   if (mb && el<6 && shifted)\r
704   {\r
705     selx2=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
706     sely2=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
707     return;\r
708   }\r
709   if (!mb && el<6 && shifted)\r
710   { int i,j;\r
711     int x1,y1,x2,y2;\r
712 \r
713     x1=selx1;\r
714     y1=sely1;\r
715     x2=selx2;\r
716     y2=sely2;\r
717 \r
718     if (x2<x1) x2^=x1,x1^=x2,x2^=x1;\r
719     if (y2<y1) y2^=y1,y1^=y2,y2^=y1;\r
720 \r
721     copybuf_wide=x2-x1+1;\r
722     copybuf_deep=y2-y1+1;\r
723 \r
724     if (shifted==2)\r
725     {\r
726       // block fill\r
727       modified=1;\r
728       for (j=0; j<copybuf_deep; j++)\r
729       {\r
730         for (i=0; i<copybuf_wide; i++)\r
731           layers[el][((y1+j)*layer[el].sizex)+(x1+i)]=lt;\r
732       }\r
733     }\r
734 \r
735     if (shifted==1)\r
736     {\r
737       modified=1;\r
738       if (copybuf) vfree(copybuf);\r
739       copybuf=(word *)valloc(copybuf_wide*copybuf_deep*2, "copybuf", 0);\r
740 \r
741       // copy\r
742       for (j=0; j<copybuf_deep; j++)\r
743       {\r
744         for (i=0; i<copybuf_wide; i++)\r
745           copybuf[(j*copybuf_wide)+i]=layers[el][((y1+j)*layer[el].sizex)+(x1+i)];\r
746       }\r
747       pasting=1;\r
748     }\r
749     selx1=sely1=0;\r
750     selx2=sely2=0;\r
751     shifted=0;\r
752   }\r
753   if (mb==1 && el<6 && !shifted && pasting)\r
754   { int a,b,i,j;\r
755 \r
756     a=(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)/16);\r
757     b=(((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16);\r
758 \r
759     // paste\r
760     for (j=0; j<copybuf_deep; j++)\r
761     {\r
762       for (i=0; i<copybuf_wide; i++)\r
763       {\r
764         if (b+j<layer[el].sizey && a+i<layer[el].sizex)\r
765           layers[el][((b+j)*layer[el].sizex)+(a+i)]=copybuf[(j*copybuf_wide)+i];\r
766       }\r
767     }\r
768   }\r
769 \r
770   if (mb==1 && el<6 && !shifted && !pasting)\r
771   {\r
772     if (mx>335) mx=334;\r
773     modified=1;\r
774     layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
775                layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)\r
776                /16)]=lt;\r
777   }\r
778   if (mb==2 && el<6 && !shifted)\r
779   {\r
780     if (mx>335) mx=334;\r
781     modified=1;\r
782     layers[el][((((ywin*layer[el].pmulty/layer[el].pdivy)+my-16)/16) *\r
783                layer[el].sizex)+(((xwin*layer[el].pmultx/layer[el].pdivx)+mx-16)\r
784                /16)]=rt;\r
785   }\r
786 \r
787   if (mb==1 && el==6)\r
788   {\r
789    modified=1;\r
790    obstruct[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
791                layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
792                /16)]=1;\r
793   }\r
794   if (mb==2 && el==6)\r
795   {\r
796    modified=1;\r
797    obstruct[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
798                layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
799                /16)]=0;\r
800   }\r
801   if (mb==1 && el==7 && (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]))\r
802   {\r
803    curzone=zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
804                layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
805                /16)];\r
806    WaitRelease();\r
807    ZoneEdDialog();\r
808    return;\r
809   }\r
810   if (mb==1 && el==7)\r
811   {\r
812    modified=1;\r
813    zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
814                layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
815                /16)]=curzone;\r
816   }\r
817   if (mb==2 && el==7)\r
818   {\r
819    modified=1;\r
820    zone[((((ywin*layer[0].pmulty/layer[0].pdivy)+my-16)/16) *\r
821                layer[0].sizex)+(((xwin*layer[0].pmultx/layer[0].pdivx)+mx-16)\r
822                /16)]=0;\r
823   }\r
824   if (mb==1 && el==8)\r
825   {\r
826      WaitRelease();\r
827      ProcessEntity((xwin+(mx-16))/16,(ywin+(my-16))/16);\r
828      modified=1;\r
829   }\r
830   if (el==8 && EntityThere((mx-16+xwin)/16,(my+ywin-16)/16) &&\r
831       key[SCAN_DEL])\r
832   {\r
833     WaitRelease();\r
834     DeleteEntity((mx-16+xwin)/16,(my-16+ywin)/16);\r
835     modified=1;\r
836   }\r
837 }\r