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
18 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
\r
21 // + fixed ScreenShot() to properly save screenshots with
\r
22 // the sequential filenames.
\r
23 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
\r
25 // ================================= Data ====================================
\r
27 // ================================= Code ====================================
\r
29 int CheckMouseTabs()
\r
32 for (i=0; i<10; i++)
\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
46 Message("I'm sorry dave, I can't do that...",600);
\r
48 while (systemtime<i)
\r
54 Message("Just kidding! :)",200);
\r
57 void WritePCXLine(unsigned char *p,int len,FILE *pcxf)
\r
59 unsigned char byt, samect, repcode;
\r
65 while (samect<(unsigned) 63 && i<len && byt==p[i])
\r
70 if (samect>1 || (byt & 0xC0) != 0)
\r
72 repcode=0xC0 | samect;
\r
73 fwrite(&repcode,1,1,pcxf);
\r
75 fwrite(&byt,1,1,pcxf);
\r
79 acopytile(int x, int y, char *src, char *pt)
\r
99 void WritePalette(FILE *f)
\r
103 for (i=0; i<768; i++)
\r
104 pal[i]=pal[i] << 2;
\r
106 b=12; fwrite(&b, 1, 1, f);
\r
107 fwrite(pal, 1, 768, f);
\r
109 for (i=0; i<768; i++)
\r
110 pal[i]=pal[i] >> 2;
\r
113 void OutputVSPpcx()
\r
115 unsigned char *ptr;
\r
119 // First figure out the filename
\r
123 while (*ptr != '.')
\r
135 pcxf=fopen(strbuf,"wb");
\r
137 // Write PCX header
\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
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
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
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
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
163 w1=0; fwrite(&w1, 1, 1, pcxf);
\r
164 fwrite(screen, 1, 59, pcxf); // filler
\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
169 ptr=(char *) malloc(320*w2);
\r
170 memset(ptr,255,(320*w2)); // Give the PCX a white background
\r
172 // Now we "draw" the tiles into the buffer.
\r
174 for (i=0; i<numtiles; i++)
\r
180 acopytile(_x,_y,vsp+(i*256),ptr);
\r
183 // And now we save the rest of the PCX.
\r
185 for (w1=0; w1<w2; w1++)
\r
186 WritePCXLine(ptr+(w1*320),320,pcxf);
\r
188 WritePalette(pcxf);
\r
197 unsigned short int w1;
\r
198 int i,n; //zero 5.7.99
\r
207 sprintf(fnamestr,"%d.pcx",n);
\r
208 pcxf=fopen(fnamestr,"r");
\r
210 if(pcxf) fclose(pcxf);
\r
215 // Takes a snapshot of the current screen.
\r
217 sprintf(fnamestr,"%d.pcx",n);
\r
220 pcxf=fopen(&fnamestr,"wb");
\r
223 // Write PCX header
\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
236 fwrite(screen,1,48,pcxf);
\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
242 w1=0; fwrite(&w1, 1, 1, pcxf);
\r
243 fwrite(screen, 1, 59, pcxf); // filler
\r
245 for (w1=0; w1<sy; w1++)
\r
246 WritePCXLine(screen+((w1+16)*tsx)+16, sx, pcxf);
\r
248 WritePalette(pcxf);
\r
253 // aen -- put this out here because the PollMovement() routine i added
\r
254 // needs access to them.
\r
261 void PollMovement() // aen
\r
271 xmax = (layer[0].sizex * 16) - sx;
\r
272 ymax = (layer[0].sizey * 16) - sy;
\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
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
288 if (key[SCAN_UP] || ms_up)
\r
292 ywin -= map_scroll_y;
\r
293 if (ywin < 0) ywin = 0;
\r
297 if (key[SCAN_UP] || (!(systemtime%10)))
\r
301 if (ywin < 0) ywin = 0;
\r
306 if (key[SCAN_DOWN] || ms_down)
\r
310 ywin += map_scroll_y;
\r
316 if (key[SCAN_DOWN] || (!(systemtime%10)))
\r
326 if (key[SCAN_RIGHT] || ms_right)
\r
330 xwin += map_scroll_x;
\r
336 if (key[SCAN_RIGHT] || (!(systemtime%10)))
\r
346 if (key[SCAN_LEFT] || ms_left)
\r
350 xwin -= map_scroll_x;
\r
351 if (xwin < 0) xwin=0;
\r
355 if (key[SCAN_LEFT] || (!(systemtime%10)))
\r
359 if (xwin < 0) xwin = 0;
\r
370 xmax = (layer[0].sizex * 16) - sx;
\r
371 ymax = (layer[0].sizey * 16) - sy;
\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
384 if (key[SCAN_A] && el<6)
\r
387 if (lt==numtiles) lt=0;
\r
390 if (key[SCAN_Z] && el<6)
\r
393 else lt=numtiles-1;
\r
396 if (key[SCAN_A] && el==7)
\r
401 if (key[SCAN_Z] && el==7)
\r
409 if (rt==numtiles) rt=0;
\r
415 else rt=numtiles-1;
\r
421 if (random(0,255)<15) HAL();
\r
425 Message("MAP/VSP saved.",100);
\r
431 sprintf(strbuf,"Left: %d Right: %d", lt, rt);
\r
432 Message(strbuf, 300);
\r
444 if (mh) Message("MAP Tile Highlight enabled.",100);
\r
445 else Message("MAP Tile Highlight disabled.",100);
\r
449 // movement code moved to PollMovement()
\r
452 if (key[SCAN_PGUP])
\r
459 if (key[SCAN_HOME])
\r
473 if (key[SCAN_PGDN])
\r
481 if (key[SCAN_CTRL] && el<6)
\r
486 if (key[SCAN_CTRL] && el==7)
\r
498 xwin=xwin/16; xwin=xwin*16;
\r
499 ywin=ywin/16; ywin=ywin*16;
\r
500 Message("Tile scroll.",150);
\r
505 Message("Pixel scroll.",150);
\r
511 if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])
\r
517 layertoggle[6]=0; layertoggle[7]=0;
\r
518 layertoggle[8]=0; layertoggle[9]=0;
\r
524 if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])
\r
530 layertoggle[6]=0; layertoggle[7]=0;
\r
531 layertoggle[8]=0; layertoggle[9]=0;
\r
533 { layertoggle[1]=1;
\r
538 if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])
\r
544 layertoggle[6]=0; layertoggle[7]=0;
\r
545 layertoggle[8]=0; layertoggle[9]=0;
\r
547 { layertoggle[2]=1;
\r
552 if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])
\r
558 layertoggle[6]=0; layertoggle[7]=0;
\r
559 layertoggle[8]=0; layertoggle[9]=0;
\r
561 { layertoggle[3]=1;
\r
566 if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])
\r
572 layertoggle[6]=0; layertoggle[7]=0;
\r
573 layertoggle[8]=0; layertoggle[9]=0;
\r
575 { layertoggle[4]=1;
\r
580 if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])
\r
586 layertoggle[6]=0; layertoggle[7]=0;
\r
587 layertoggle[8]=0; layertoggle[9]=0;
\r
589 { layertoggle[5]=1;
\r
595 layertoggle[6]=1; layertoggle[7]=0;
\r
596 layertoggle[8]=0; layertoggle[9]=0;
\r
602 layertoggle[6]=0; layertoggle[7]=1;
\r
603 layertoggle[8]=0; layertoggle[9]=0;
\r
609 layertoggle[6]=0; layertoggle[7]=0;
\r
610 layertoggle[8]=1; layertoggle[9]=0;
\r
616 layertoggle[6]=0; layertoggle[7]=0;
\r
617 layertoggle[8]=0; layertoggle[9]=1;
\r
624 sprintf(strbuf,"Mouse scroll %sabled.", mouse_scroll ? "en" : "dis");
\r
625 Message(strbuf, 100);
\r
631 Message("Screen capture saved.",300);
\r
637 Message("PCX file exported.",300);
\r
639 if (key[SCAN_LANGLE])
\r
641 key[SCAN_LANGLE]=0;
\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
655 if (key[SCAN_RANGLE])
\r
657 key[SCAN_RANGLE]=0;
\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
672 if (CheckMouseTabs()) return;
\r
674 if (mb>=3) MainMenu(mx-4,my-5);
\r
675 if (key[SCAN_ESC]) DoMainMenu();
\r
677 if (mb==1 && key[SCAN_SLASH] && el<6)
\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
685 if (mb==2 && key[SCAN_SLASH] && el<6)
\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
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
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
703 if (mb && el<6 && shifted)
\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
709 if (!mb && el<6 && shifted)
\r
718 if (x2<x1) x2^=x1,x1^=x2,x2^=x1;
\r
719 if (y2<y1) y2^=y1,y1^=y2,y2^=y1;
\r
721 copybuf_wide=x2-x1+1;
\r
722 copybuf_deep=y2-y1+1;
\r
728 for (j=0; j<copybuf_deep; j++)
\r
730 for (i=0; i<copybuf_wide; i++)
\r
731 layers[el][((y1+j)*layer[el].sizex)+(x1+i)]=lt;
\r
738 if (copybuf) vfree(copybuf);
\r
739 copybuf=(word *)valloc(copybuf_wide*copybuf_deep*2, "copybuf", 0);
\r
742 for (j=0; j<copybuf_deep; j++)
\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
753 if (mb==1 && el<6 && !shifted && pasting)
\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
760 for (j=0; j<copybuf_deep; j++)
\r
762 for (i=0; i<copybuf_wide; i++)
\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
770 if (mb==1 && el<6 && !shifted && !pasting)
\r
772 if (mx>335) mx=334;
\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
778 if (mb==2 && el<6 && !shifted)
\r
780 if (mx>335) mx=334;
\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
787 if (mb==1 && el==6)
\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
794 if (mb==2 && el==6)
\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
801 if (mb==1 && el==7 && (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]))
\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
810 if (mb==1 && el==7)
\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
817 if (mb==2 && el==7)
\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
824 if (mb==1 && el==8)
\r
827 ProcessEntity((xwin+(mx-16))/16,(ywin+(my-16))/16);
\r
830 if (el==8 && EntityThere((mx-16+xwin)/16,(my+ywin-16)/16) &&
\r
834 DeleteEntity((mx-16+xwin)/16,(my-16+ywin)/16);
\r