1 ////////////////////////////////////////////////////
2 ////////////////////////////////////////////////////
6 ////////////////////////////////////////////////////
7 ////////////////////////////////////////////////////
12 void SignalSound(void)
25 ////////////////////////////////////////////////////
27 // Create an OBJ linkable file from any type of datafile
30 // 0 = everything's a-ok!
31 // -1 = file not found
34 ////////////////////////////////////////////////////
35 int MakeOBJ(char *filename,char *destfilename,char *public,segtype whichseg,char *farname)
37 char THEADR[17]={0x80,14,0,12,32,32,32,32,32,32,32,32,32,32,32,32,0},
38 COMENT[18]={0x88,0,0,0,0,'M','a','k','e','O','B','J',' ','v','1','.','1',0},
40 6,'D','G','R','O','U','P',
41 5,'_','D','A','T','A',
44 5,'_','T','E','X','T',
46 8,'F','A','R','_','D','A','T','A'},
47 SEGDEF[9]={0x98,7,0,0x48,0,0,2,3,4}, // for .DATA
48 SEGDEF1[9]={0x98,7,0,0x48,0,0,5,6,4}, // for .CODE
49 SEGDEF2[9]={0x98,7,0,0x60,0,0,8,7,4}, // for .FARDATA
50 GRPDEF[7]={0x9a,4,0,1,0xff,1,0x61},
51 MODEND[5]={0x8a,2,0,0,0x74};
53 unsigned i,j,flag,handle;
54 long fsize,offset,loffset,temp,amtleft,amount,offset1;
55 char _seg *dblock,*block;
59 // Need to compute the CHECKSUM in the COMENT field
60 // (so if the "MakeOBJ..." string is modified, the CHECKSUM
63 COMENT[1]=sizeof(COMENT)-3;
64 for (flag=i=0;i<sizeof(COMENT);i++)
66 COMENT[sizeof(COMENT)-1]=(flag^0xff)+1;
68 if ((handle=open(filename,O_BINARY))==NULL)
71 fsize=filelength(handle);
73 if (fsize>0x10000L) // BIGGER THAN 1 SEG = ERROR!
76 LoadIn(filename,(memptr *)&block); // LOAD FILE IN
79 MMAllocate((memptr *)&dblock,0x10000L);
81 ////////////////////////////////////////////////////
83 // INSERT HEADER RECORD
85 movedata(_DS,FP_OFF(&THEADR),(unsigned)dblock,offset,sizeof(THEADR));
86 movedata(FP_SEG(filename),FP_OFF(filename),
87 (unsigned)dblock,offset+4,strlen(filename));
88 offset+=sizeof(THEADR);
91 ////////////////////////////////////////////////////
93 // INSERT COMMENT RECORD
95 movedata(_DS,FP_OFF(COMENT),(unsigned)dblock,offset,sizeof(COMENT));
96 offset+=sizeof(COMENT);
99 ////////////////////////////////////////////////////
101 // INSERT START OF LIST-OF-NAMES RECORD
104 movedata(_DS,FP_OFF(LNAMES),(unsigned)dblock,offset,sizeof(LNAMES));
105 offset+=sizeof(LNAMES);
107 // If it's a .FARDATA segment, we need to insert the segment name!
108 if (whichseg==FARDATA)
110 *(dblock+offset)=strlen(farname);
111 movedata(FP_SEG(farname),FP_OFF(farname),
112 (unsigned)dblock,offset+1,strlen(farname));
113 offset+=strlen(farname)+1;
116 // Now, finish the List-Of-Names record by creating
117 // the CHECKSUM and LENGTH
119 offset=offset-loffset-2;
120 *(int huge *)(dblock+loffset+1)=offset;
123 // Now, figure out the CHECKSUM of the record
124 for (flag=i=0;i<(offset-loffset);i++)
125 flag+=*(dblock+i+loffset);
126 *(dblock+offset)=(flag^0xff)+1;
130 ////////////////////////////////////////////////////
132 // CREATE SEGMENT DEFINITION RECORD
139 movedata(FP_SEG(&SEGDEF),FP_OFF(&SEGDEF),
140 (unsigned)dblock,offset,sizeof(SEGDEF));
141 *(int huge *)(dblock+offset+4)=temp;
142 offset+=sizeof(SEGDEF);
145 movedata(FP_SEG(&SEGDEF1),FP_OFF(&SEGDEF1),
146 (unsigned)dblock,offset,sizeof(SEGDEF1));
147 *(int huge *)(dblock+offset+4)=temp;
148 offset+=sizeof(SEGDEF1);
151 movedata(FP_SEG(&SEGDEF2),FP_OFF(&SEGDEF2),
152 (unsigned)dblock,offset,sizeof(SEGDEF2));
153 *(int huge *)(dblock+offset+4)=temp;
154 offset+=sizeof(SEGDEF2);
159 for (flag=0,i=loffset;i<offset;i++)
161 *(dblock+offset)=(flag^0xff)+1;
165 ////////////////////////////////////////////////////
167 // CREATE GROUP DEFINITION RECORD
173 movedata(FP_SEG(&GRPDEF),FP_OFF(&GRPDEF),
174 (unsigned)dblock,offset,sizeof(GRPDEF));
175 offset+=sizeof(GRPDEF);
179 ////////////////////////////////////////////////////
181 // CREATE PUBLIC DEFINITION RECORD
184 *(dblock+offset)=0x90; // PUBDEF ID
185 offset+=3; // point to public base, skip length
186 *(dblock+offset)=1; // group index=1
187 *(dblock+offset+1)=1; // segment index=1
188 offset+=2; // point to public name
191 movedata(FP_SEG(public),FP_OFF(public),
192 (unsigned)dblock,offset+1,strlen(public));
193 *(dblock+offset)=strlen(public);
194 offset+=strlen(public)+1;
195 *(int huge *)(dblock+offset)=0; // public offset within segment
197 *(dblock+offset)=0; // type index
201 temp=offset-loffset-2;
202 *(int huge *)(dblock+loffset+1)=temp;
206 for (flag=0,i=loffset;i<offset;i++)
208 *(dblock+offset)=(flag^0xff)+1;
211 ////////////////////////////////////////////////////
213 // DATA RECORD(S). YUCK.
218 for (i=0;i<(fsize+1023)/1024;i++)
226 *(dblock+offset)=0xa0; // LEDATA ID
227 *(int huge *)(dblock+offset+1)=amount+4; // length of record
229 *(dblock+offset)=1; // segment index
230 *(int huge *)(dblock+offset+1)=i*1024; // index into segment
235 LoadFile(filename,(char huge *)dblock+offset,i*1024,amount);
240 for (flag=0,j=offset1;j<offset;j++)
242 *(dblock+offset)=(flag^0xff)+1;
248 ////////////////////////////////////////////////////
252 movedata(FP_SEG(&MODEND),FP_OFF(&MODEND),(unsigned)dblock,offset,sizeof(MODEND));
253 offset+=sizeof(MODEND);
256 // Save the little puppy out!
258 SaveFile(destfilename,(char huge *)dblock,0,offset);
259 MMFreePtr((memptr *)&dblock);
260 MMFreePtr((memptr *)&block);
265 ////////////////////////////////////////////////////
267 // DUMP THE PASTE BUFFER OUT TO EITHER AN
268 // "APPLE PREFERRED" OR "ILBM" GRAPHICS FORMAT FILE
270 // NOTE: THIS IS ONLY AVAILABLE IN EGA, BECAUSE I
271 // DON'T FEEL LIKE WRITING A CGA ILBM PIXEL-SPLICER --
272 // AND APPLE PREFERRED ONLY HANDLES 4-BIT COLOR ANYWAY!
273 // (YES, I KNOW, I COULD ONLY USE 4 OUT OF 16 COLORS...SHUT UP!)
275 ////////////////////////////////////////////////////
276 btype dumpB[]={{" DeluxePaint II ILBM ",4,2,2},
277 {" Apple Preferred ",4,5,1}},
279 DialogDef dumpD={" Which format do you require?",30,7,2,&dumpB[0],NULL},
280 fnameD={"Enter filename to\nsave (no suffix)",17,5,1,&fnameB,NULL};
282 void Item_GraphicDump(void)
284 char filename[14],ext[5],_seg *block,_seg *block1;
285 ApPrefStr PrefHeader;
286 int which,i,j,k,m,n,pwidth,lwidth,dx,dy;
287 long tilelen,fsize=0,bufsize;
291 ErrDialog("You need to use the Copy command\n"
292 "to copy part of the map or tiles\n"
293 "so I know what I need to dump!"," OK ");
301 ErrDialog("Sorry, but this function is only\n"
302 "available for EGA mode. If you\n"
303 "have a REAL NEED for this to work\n"
304 "in CGA or VGA, talk to Id Software!"," OK ");
308 if (!(which=DoDialog(&dumpD)))
316 case 1: tilelen=32L; break;
317 case 2: tilelen=128L; break;
318 case 3: tilelen=512L;
322 // GET FILENAME TO SAVE UNDER
324 DrawDialog(&fnameD,1);
326 GetButtonXY(&fnameD,0,&sx,&sy);
327 if (!input(filename,8))
333 for (i=0;i<strlen(filename);i++)
334 if (filename[i]=='.')
343 // SETUP FOR EACH TYPE
350 char form[5]="FORM",ilbm[9]="ILBMBMHD",body[5]="BODY";
354 MMAllocate((memptr *)&block,size);
356 movedata(FP_SEG(form),FP_OFF(form),(unsigned)block,fsize,4);
358 size=40L+tilelen*TileCopy.w*TileCopy.h;
359 *(block+fsize)=(size>>24)&0xff;
360 *(block+fsize+1)=(size>>16)&0xff;
361 *(block+fsize+2)=(size>>8)&0xff;
362 *(block+fsize+3)=size&0xff;
364 movedata(FP_SEG(ilbm),FP_OFF(ilbm),(unsigned)block,fsize,8);
371 *(block+fsize)=(TileCopy.w<<(tsize+2))/256; // pixel width
372 *(block+fsize+1)=(TileCopy.w<<(tsize+2))&0xff;
373 *(block+fsize+2)=(TileCopy.h<<(tsize+2))/256; // pixel height
374 *(block+fsize+3)=(TileCopy.h<<(tsize+2))&0xff;
375 *(int huge *)(block+fsize+4)=0; // Xorg
376 *(int huge *)(block+fsize+6)=0; // Yorg
377 *(block+fsize+8)=4; // planes
378 *(block+fsize+9)=0; // mask (stencil!)
379 *(block+fsize+10)=0; // compression (none)
380 *(block+fsize+11)=0; // pad (?)
381 *(int huge *)(block+fsize+12)=0; // trans (?)
382 *(int huge *)(block+fsize+14)=0x101; // aspt (aspect?)
383 *(int huge *)(block+fsize+16)=0x4001; // page width
384 *(int huge *)(block+fsize+18)=0xc800; // page height
386 movedata(FP_SEG(body),FP_OFF(body),(unsigned)block,fsize,4);
388 size=tilelen*TileCopy.w*TileCopy.h;
389 *(block+fsize)=(size>>24)&0xff;
390 *(block+fsize+1)=(size>>16)&0xff;
391 *(block+fsize+2)=(size>>8)&0xff;
392 *(block+fsize+3)=size&0xff;
399 case 2: // APPLE PREFERRED
401 int Ctable[16]={0x0000,0x000a,0x00a0,0x00aa,0x0a00,0x0a0a,0x0a50,0x0aaa,
402 0x0555,0x055f,0x05f5,0x05ff,0x0f55,0x0f5f,0x0ff5,0x0fff};
406 PrefHeader.length=sizeof(ApPrefStr)+4L*(TileCopy.h<<(tsize+2))+
407 TileCopy.w*TileCopy.h*tilelen+(((TileCopy.w*TileCopy.h*tilelen)+63)/64);
408 strncpy(PrefHeader.Kind,"\x4MAIN",5);
409 PrefHeader.MasterMode=0;
410 PrefHeader.PixelsPerLine=TileCopy.w<<(tsize+2);
411 PrefHeader.NumColorTables=1;
413 PrefHeader.ColorTable[i]=Ctable[i];
414 PrefHeader.NumScanLines=TileCopy.h<<(tsize+2);
416 size=sizeof(ApPrefStr)+4L*(TileCopy.h<<(tsize+2));
417 MMAllocate((memptr *)&block,size);
418 movedata(FP_SEG(&PrefHeader),FP_OFF(&PrefHeader),(unsigned)block,fsize,sizeof(ApPrefStr));
419 fsize+=sizeof(ApPrefStr);
421 pixwid=TileCopy.w*(2<<tsize);
422 for (i=0;i<(TileCopy.h<<(tsize+2));i++)
424 *(int huge *)(block+fsize)=pixwid+(pixwid+63)/64;
425 *(int huge *)(block+fsize+2)=0;
430 MMAllocate((memptr *)&block1,tilelen*TileCopy.w);
437 strcat(filename,ext);
438 SaveFile(filename,(char huge *)block,0,fsize);
439 MMFreePtr((memptr *)&block);
442 // NOW, WRITE THE DATA OUT! EEEE!
444 bufsize=tilelen*TileCopy.w;
445 MMAllocate((memptr *)&block,bufsize);
447 pwidth=(1<<(tsize-1))*TileCopy.w;
450 ErrDialog("One moment. I am busy.\n Countdown:","");
454 for (j=0;j<TileCopy.h;j++)
458 printint(TileCopy.h-j);
461 for (i=0;i<TileCopy.w;i++)
463 unsigned tilet,tilem,tilei,loc;
472 ErrDialog("You aborted out of the\n"
473 "graphic dump conversion!"," Yes, I know ");
476 MMFreePtr((memptr *)&block1);
480 // GET THE CORRECT TILE MOVED INTO "TDATA"
482 switch(TileCopy.MapOrTileSelect)
485 loc=(j+TileCopy.y)*mapwidth+TileCopy.x+i;
486 tilet=(TileCopy.PlanesCopied&BPLANE)?CutBkgnd[loc]:-BkgndColor;
487 tilem=(TileCopy.PlanesCopied&FPLANE)?CutFrgnd[loc]+tilenum:0;
488 tilei=(TileCopy.PlanesCopied&IPLANE)?CutInfoPl[loc]+tilenum:0;
489 CombineTiles(tilet,tilem,tilei,tsize);
491 case 1: // BKGND TILE COPY
492 loc=(TileCopy.y+j)*selectcols+TileCopy.x+i;
493 CombineTiles(loc,0,0,tsize);
495 case 2: // FRGND TILE COPY
496 loc=(TileCopy.y+j)*selectcols+TileCopy.x+i+tilenum;
497 CombineTiles(-BkgndColor,loc,0,tsize);
501 // NOW, MUNGE "TDATA" INTO BIT-PLANES!
503 // INTERNAL: P0 P1 P2 P3
504 // SCANLINE x ...... ...... ...... ......
506 for (k=0;k<8<<(tsize-1);k++)
508 movedata(FP_SEG(&tdata),FP_OFF(&tdata)+(m*tsize*(8<<(tsize-1)))+k*(1<<(tsize-1)),
509 (unsigned)block,k*lwidth+m*pwidth+i*(1<<(tsize-1)),1<<(tsize-1));
512 // ALRIGHT. NOW SAVE THIS CHUNK OUT IN THE CORRECT FORMAT
517 SaveFile(filename,MK_FP(block,0),fsize,bufsize);
520 case 2: // APPLE PREFERRED
525 // FIRST, I NEED TO CONVERT THE ILBM PLANAR FORMAT
526 // TO SUPER-RES NIBBLES
528 for (k=0;k<8<<(tsize-1);k++)
529 for (m=0;m<(1<<(tsize-1))*TileCopy.w;m++)
531 unsigned char src[4],dest[4]={0,0,0,0};
534 src[n]=block[k*lwidth+pwidth*n+m];
536 asm mov al,[BYTE PTR src+0]
537 asm mov ah,[BYTE PTR src+1]
538 asm mov bl,[BYTE PTR src+2]
539 asm mov bh,[BYTE PTR src+3]
617 asm mov [BYTE PTR dest+0],cl
618 asm mov [BYTE PTR dest+1],ch
619 asm mov [BYTE PTR dest+2],dl
620 asm mov [BYTE PTR dest+3],dh
622 movedata(FP_SEG(&dest),FP_OFF(&dest),
623 (unsigned)block1,k*lwidth+m*4,4);
627 // NOW, TIME TO WRITE THE DATA OUT IN 64-BYTE CHUNKS! YUCK!
629 for (k=0;k<8<<(tsize-1);k++)
643 SaveFile(filename,(char huge *)&clen,fsize++,1);
646 SaveFile(filename,MK_FP(block1,off),fsize,clen);
657 MMFreePtr((memptr *)&block1);
659 MMFreePtr((memptr *)&block);
662 ErrDialog("Graphic successfully dumped!"," Yeah! ");
666 ////////////////////////////////////////////////////
668 // Item - Edit TILEINFO/M values
670 ////////////////////////////////////////////////////
671 btype ETVb[]={{" Tileinfo ",2,21,1},
672 {" TileinfoM ",16,21,1},
674 DialogDef ETVd={" Edit TILEINFO/M values",38,23,3,&ETVb[0],NULL};
677 void Item_EditTinfoValues(void)
679 int max,i,which,exitok=0,mx,my,b0,b1,CTRLdown;
680 static int whichtinfo=0;
683 // IS THE "CTRL" KEY DOWN?
685 CTRLdown=keydown[0x1d];
696 case 0: max=tilenum; break;
697 case 1: max=tilemnum;
721 DrawTinfoScreen(whichtinfo,0,-max); // ALIGN TO TOP
724 case 0: DrawTinfoScreen(whichtinfo,0,whicht); break;
725 case 1: DrawTinfoScreen(whichtinfo,0,whichtm-tilenum);
729 DrawTinfoScreen(whichtinfo,0,0);
734 which=CheckButtonsRet(&ETVd);
747 DrawTinfoScreen(whichtinfo,0,0);
751 GetButtonXY(&ETVd,0,&sx,&sy);
761 GetButtonXY(&ETVd,1,&sx,&sy);
774 DrawTinfoScreen(whichtinfo,0,0);
778 GetButtonXY(&ETVd,1,&sx,&sy);
791 MouseCoords(&mx,&my);
798 // CHECK FOR BUTTON PRESSES
801 UseTinfoValue(whichtinfo,mx,my,1);
804 UseTinfoValue(whichtinfo,mx,my,0);
807 // SPACE = ENTER VALUES HORIZONTALLY
811 while(keydown[0x39]);
813 EnterTinfoValue(whichtinfo,mx,my,0);
817 // CHECK FOR SCROLLING
819 if (keydown[0x48]) // UP
821 DrawTinfoScreen(whichtinfo,0,-1);
823 while(keydown[0x48]);
826 if (keydown[0x50]) // DOWN
828 DrawTinfoScreen(whichtinfo,0,1);
830 while(keydown[0x50]);
833 if (keydown[0x49]) // PGUP
835 DrawTinfoScreen(whichtinfo,0,-8);
837 while(keydown[0x49]);
840 if (keydown[0x51]) // PGDN
842 DrawTinfoScreen(whichtinfo,0,8);
844 while(keydown[0x51]);
847 if (keydown[0x47]) // HOME
849 DrawTinfoScreen(whichtinfo,0,-max);
850 while(keydown[0x47]);
853 if (keydown[0x4f]) // END
855 DrawTinfoScreen(whichtinfo,0,max);
856 while(keydown[0x4f]);
859 if (keydown[0x4d]) // RIGHT
861 DrawTinfoScreen(whichtinfo,1,0);
863 while(keydown[0x4d]);
866 if (keydown[0x4b]) // LEFT
868 DrawTinfoScreen(whichtinfo,-1,0);
870 while(keydown[0x4b]);
882 // PICKUP/DROP TILEINFO VALUE AT CURSOR
884 void UseTinfoValue(int whichtinfo,int mx,int my,int PickupOrDrop)
886 int whichx=-1,whichy=-1;
887 unsigned dialogx,dialogy;
890 GetDialogXY(&ETVd,&dialogx,&dialogy);
892 if (mx>=dialogx+10 && mx<=dialogx+45)
893 whichx=(mx-(dialogx+10))/7;
895 if (my>=4 && my<=((videomode==EGA2)?55:19))
896 whichy=(my-4)>>(tsize-1);
901 if (whichx>=numtplanes)
908 if (whichx>=numtmplanes)
910 if (whichy>=tilemnum)
914 if (whichx>=0 && whichy>=0)
920 CurTIvalue=*(Tinfo[whichx+TIxbase]+whichy+TIybase);
923 CurTIvalue=*(TMinfo[whichx+TIxmbase]+whichy+TIymbase);
929 *(Tinfo[whichx+TIxbase]+whichy+TIybase)=CurTIvalue;
933 *(TMinfo[whichx+TIxmbase]+whichy+TIymbase)=CurTIvalue;
937 DrawTinfoScreen(whichtinfo,0,0);
939 while(MouseButton());
944 // ENTER TILEINFO/M CELL VALUES
946 void EnterTinfoValue(int whichtinfo,int mx,int my,int H_or_V)
948 int whichx=-1,whichy=-1,val,outok=0,tempx,tempy,maxx,maxy;
949 unsigned dialogx,dialogy;
952 GetDialogXY(&ETVd,&dialogx,&dialogy);
954 if (mx>=dialogx+10 && mx<=dialogx+45)
955 whichx=(mx-(dialogx+10))/7;
957 if (my>=4 && my<=((videomode==EGA2)?55:19))
958 whichy=(my-4)>>(tsize-1);
963 if (whichx>=numtplanes)
970 if (whichx>=numtmplanes)
972 if (whichy>=tilemnum)
978 if (whichx>=0 && whichy>=0)
984 sx=whichx*7+dialogx+10;
985 sy=(whichy<<(tsize-1))+4;
988 if ((val=inputint(3))!=(int)ESCOUT)
992 *(Tinfo[whichx+TIxbase]+whichy+TIybase)=val&0xff;
996 *(TMinfo[whichx+TIxmbase]+whichy+TIymbase)=val&0xff;
1003 // INPUT INTO THE NEXT FIELD!
1007 tempx=(whichtinfo?TIxmbase:TIxbase);
1008 tempy=(whichtinfo?TIymbase:TIybase);
1009 maxx=(whichtinfo?numtmplanes:numtplanes);
1010 maxy=(whichtinfo?tilemnum:tilenum);
1014 case 0: // HORIZONTAL
1016 if (tempx+whichx>=maxx)
1019 if (whichx>TINFOWIDTH)
1029 case 0: TIxbase=tempx; break;
1030 case 1: TIxmbase=tempx;
1036 if (tempy+whichy>=maxy)
1039 if (whichy>(videomode==EGA2?TINFOHEIGHTEGA2:TINFOHEIGHT))
1041 whichy=(videomode==EGA2?TINFOHEIGHTEGA2:TINFOHEIGHT);
1049 case 0: TIybase=tempy; break;
1050 case 1: TIymbase=tempy;
1055 DrawTinfoScreen(whichtinfo,0,0);
1065 // Draw the Tileinfo screen
1067 void DrawTinfoScreen(int thescreen,int deltax,int deltay)
1069 int temp,temp1,i,j,width,height,dialogx;
1070 char _seg *Values[10];
1080 height=16>>(tsize-1); break;
1083 height=52>>(tsize-1);
1097 if (TIybase+height>tilenum)
1098 TIybase=tilenum-height;
1103 case 1: // TILEINFOM
1104 if (height>tilemnum)
1112 if (TIymbase+height>tilemnum)
1113 TIymbase=tilemnum-height;
1119 // DRAW TILES AND THEIR VALUES
1121 for (i=0;i<height;i++)
1124 sy=(i<<(tsize-1))+4;
1135 CombineTiles(temp+i,0,0,tsize);
1138 CombineTiles(-BkgndColor,temp+i+tilenum,0,tsize);
1141 DrawTile(dialogx+5,(i+2)<<(3+(tsize-1)),tsize);
1145 // DRAW TILEINFO ARRAYS
1152 if (width>numtplanes)
1160 if (TIxbase+width>numtplanes)
1161 TIxbase=numtplanes-width;
1170 if (width>numtmplanes)
1178 if (TIxmbase+width>numtmplanes)
1179 TIxmbase=numtmplanes-width;
1183 Values[i]=TMinfo[i];
1186 for (j=0;j<width;j++)
1188 sx=(dialogx+10)+j*7;
1195 fprint(MapFileHeader->tnames[j+TIxbase]);
1200 fprint(MapFileHeader->tmnames[j+TIxmbase]);
1202 for (i=0;i<height;i++)
1204 sx=(dialogx+10)+j*7;
1205 sy=(i<<(tsize-1))+4;
1207 printhexb(Values[j+temp1][i+temp]);
1208 sx=(dialogx+10)+j*7;
1212 printint(Values[j+temp1][i+temp]&0xff);
1220 ////////////////////////////////////////////////////
1222 // Item - Add or Delete TILEINFO/M planes
1224 ////////////////////////////////////////////////////
1225 btype AODb[]={{" Add ",1,3,1},
1228 TOMb[]={{" Tileinfo ",1,2,1},
1229 {" TileinfoM ",1,5,1}},
1230 AreSureB2[]={{" Yes ",1,2,1},
1232 TINb2={" Done ",8,15,1};;
1233 DialogDef AODd={" TILEINFO/M\n Pick a function",25,5,3,&AODb[0],NULL},
1234 TOMd={"Add to what?",13,7,2,&TOMb[0],NULL},
1235 NId={"Gimme a name!",13,4,0,NULL,NULL},
1236 AreSureD2={"Are you sure?",13,4,2,&AreSureB2[0],NULL},
1237 TINd2={" Which to delete?\n"
1238 " TILEINFO TILEINFOM",
1239 22,17,1,&TINb2,NULL};
1241 void Item_AddDelTinfo(void)
1249 which=DoDialog(&AODd);
1252 case 0: // ESC or EXIT
1259 which=DoDialog(&TOMd);
1268 ErrDialog("You already have 10 TILEINFO\n"
1269 "planes defined!"," OK ");
1277 ErrDialog("You crazy shit! You don't\n"
1278 "have any masked tiles!"," Duh! ");
1282 if (numtmplanes==10)
1284 ErrDialog("You already have 10 TILEINFOM\n"
1285 "planes defined!"," OK ");
1293 GetDialogXY(&NId,&dx,&dy);
1296 DrawBorder(sx,sy,9,2,1);
1301 RestoreBackground();
1307 // MOVE THE NAME AND ALLOCATE THE MEMORY!
1312 movedata(FP_SEG(temp),FP_OFF(temp),
1313 (unsigned)MapFileHeader,FP_OFF(MapFileHeader->tnames[numtplanes]),8);
1314 MMAllocate((memptr *)&Tinfo[numtplanes],tilenum);
1315 for (i=0;i<tilenum;i++)
1316 *(Tinfo[numtplanes]+i)=0;
1317 MapFileHeader->numtplanes=++numtplanes;
1322 movedata(FP_SEG(temp),FP_OFF(temp),
1323 (unsigned)MapFileHeader,FP_OFF(MapFileHeader->tmnames[numtmplanes]),8);
1324 MMAllocate((memptr *)&TMinfo[numtmplanes],tilemnum);
1325 for (i=0;i<tilemnum;i++)
1326 *(TMinfo[numtmplanes]+i)=0;
1327 MapFileHeader->numtmplanes=++numtmplanes;
1331 RestoreBackground();
1340 unsigned ox,oy,i,oktoexit=0;
1346 DrawDialog(&TINd2,1);
1347 GetDialogXY(&TINd2,&sx,&sy);
1350 DrawBorder(sx,sy+2,10,11,1);
1353 DrawBorder(sx+11,sy+2,10,11,1);
1359 fprint(MapFileHeader->tnames[i]);
1362 fprint(MapFileHeader->tmnames[i]);
1368 if ((which=CheckList(ox+1,oy+3,8,numtplanes,TInfoNon,TInfoNoff,0))>=0)
1372 RestoreBackground();
1373 reply=DoDialog(&AreSureD2);
1381 if (which!=numtplanes-1)
1385 MapFileHeader->tnames[which][i]=MapFileHeader->tnames[numtplanes-1][i];
1386 MapFileHeader->tnames[numtplanes-1][i]=0;
1388 for (i=0;i<tilenum;i++)
1389 *(Tinfo[which]+i)=*(Tinfo[numtplanes-1]+i);
1390 MMFreePtr((memptr *)&Tinfo[numtplanes-1]);
1394 MMFreePtr((memptr *)&Tinfo[which]);
1396 MapFileHeader->tnames[which][i]=0;
1399 MapFileHeader->numtplanes=--numtplanes;
1403 if ((which=CheckList(ox+12,oy+3,8,numtmplanes,TInfoMNon,TInfoMNoff,0))>=0)
1407 RestoreBackground();
1408 reply=DoDialog(&AreSureD2);
1416 if (which!=numtmplanes-1)
1420 MapFileHeader->tmnames[which][i]=MapFileHeader->tmnames[numtplanes-1][i];
1421 MapFileHeader->tmnames[numtmplanes-1][i]=0;
1423 for (i=0;i<tilemnum;i++)
1424 *(TMinfo[which]+i)=*(TMinfo[numtmplanes-1]+i);
1425 MMFreePtr((memptr *)&TMinfo[numtmplanes-1]);
1429 MMFreePtr((memptr *)&TMinfo[which]);
1431 MapFileHeader->tmnames[which][i]=0;
1434 MapFileHeader->numtmplanes=--numtmplanes;
1438 GetButtonXY(&TINd2,0,&sx,&sy);
1439 if (!CheckList(sx,sy,6,1,TIDoneOn,TIDoneOff,1))
1449 RestoreBackground();
1457 ////////////////////////////////////////////////////
1459 // Item - Project Re-Select
1461 ////////////////////////////////////////////////////
1462 btype NGBb[]={{" Do It! ",1,4,2},
1463 {" No! Help! ",16,4,1}};
1464 DialogDef NGBd={"Are you sure you want to\n"
1465 "switch projects? Abort now\n"
1466 "or forever hold your peace!",
1467 28,6,2,&NGBb[0],NULL};
1469 void Item_ProjectReSelect(void)
1476 which=DoDialog(&NGBd);
1477 if (!which || which==2)
1481 TEDInfo->lastvid=videomode;
1482 TEDInfo->level=whichmap;
1486 if (!CheckForMapSave())
1490 // RELEASE ALL MEMORY
1494 MMFreePtr((memptr *)&MapBkgnd);
1495 MMFreePtr((memptr *)&CutBkgnd);
1499 MMFreePtr((memptr *)&MapFrgnd);
1500 MMFreePtr((memptr *)&CutFrgnd);
1504 MMFreePtr((memptr *)&MapInfoPl);
1505 MMFreePtr((memptr *)&CutInfoPl);
1508 MMFreePtr((memptr *)&TEDInfo);
1509 MMFreePtr((memptr *)&MapFileHeader);
1513 MMFreePtr((memptr *)&CgaXMSlookup);
1518 MMFreePtr((memptr *)&EgaXMSlookup);
1523 MMFreePtr((memptr *)&VgaXMSlookup);
1527 XMSFreeMem(XMSmaps);
1529 XMSmaps=CgaXMS=EgaXMS=VgaXMS=xmshandle=0;
1532 for (i=0;i<numtplanes;i++)
1534 MMFreePtr((memptr *)&Tinfo[i]);
1535 for (i=0;i<numtmplanes;i++)
1537 MMFreePtr((memptr *)&TMinfo[i]);
1542 writeH=TIxbase=TIxmbase=TIybase=TIymbase=PasteOK=DirtyFlag=ext[0]=0;
1548 LoadGraphStuff(0,videomode);
1557 ////////////////////////////////////////////////////
1559 // Item - Toggle GRIDMODE on/off
1561 ////////////////////////////////////////////////////
1562 void Item_GridMode(void)
1574 ////////////////////////////////////////////////////
1576 // Item - Toggle SNAP-PASTE on/off
1578 ////////////////////////////////////////////////////
1579 void Item_SnapTog(void)
1587 snapx=(pixelx>>(tsize+2))+xbase;
1588 snapy=((pixely-8)>>(tsize+2))+ybase;
1589 snapxsize=TileCopy.w;
1590 snapysize=TileCopy.h;
1592 snapx=snapx-(snapx/snapxsize)*snapxsize;
1593 snapy=snapy-(snapy/snapysize)*snapysize;
1600 ////////////////////////////////////////////////////
1602 // Item - View Map & Goto
1604 ////////////////////////////////////////////////////
1605 void Item_ViewMap(void)
1611 ////////////////////////////////////////////////////
1613 // Item - Review Map & Goto
1615 ////////////////////////////////////////////////////
1616 void Item_ReviewMap(void)
1622 ////////////////////////////////////////////////////
1624 // Code to actually do the ViewMap (and save it in
1625 // EGA memory when finished).
1627 // 0 = ViewMap, as normal & save when done (but only
1628 // if a full map was viewed)
1629 // 1 = RestoreMap for GOTO
1631 ////////////////////////////////////////////////////
1632 void Do_ViewMap(int how)
1634 int _seg *a_bg,_seg *a_fg,_seg *a_in,CopyArea,bl_width,bl_height,bl_x,bl_y,p_info;
1636 char huge *EGA=MK_FP(0xa000,0);
1637 char _seg *block,_seg *gblock[4];
1638 int i,j,k,m,n,pwidth,lwidth,maptype,step,pixnum[4]={0,8,16,32},curpix,
1639 maxpack,curline,lybase,t8=8<<(tsize-1),t1=1<<(tsize-1),scrn_h,scrn_w;
1640 long tilelen,bufsize;
1645 savevideo=videomode;
1649 if (videomode!=EGA1 && videomode!=EGA2)
1651 ErrDialog("This function is currently\n"
1652 "only usable in EGA mode!"," OK ");
1657 // SCREEN DIMENSIONS
1665 bl_height=mapheight;
1669 p_info=MapFileHeader->maptype;
1672 if ((TileCopy.w>screenw || TileCopy.h>screenh) && !how)
1673 if (Message("\"Yes\" to display full map,\n"
1674 "\"No\" to display COPY buffer.")==1)
1678 bl_width=TileCopy.w;
1679 bl_height=TileCopy.h;
1683 p_info=TileCopy.PlanesCopied;
1688 // VALIDATE WIDTH & HEIGHT
1690 if (bl_height<screenh && bl_width<screenw)
1692 ErrDialog("The area fits within the\n"
1693 "screen! Forget it!"," Wah! ");
1699 // FIGURE OUT THE BEST RATIO FOR CONVERSION
1702 switch(bl_width>=bl_height)
1704 case 1: // WIDTH > HEIGHT
1705 step=(float)(pixnum[tsize]*bl_width)/scrn_w+.5;
1706 if (pixnum[tsize]*bl_width/step>scrn_w)
1708 if ((float)(pixnum[tsize]*bl_height)/step+.5<scrn_h)
1711 case 0: // HEIGHT > WIDTH
1712 step=(float)(pixnum[tsize]*bl_height)/scrn_h+.5;
1713 if (pixnum[tsize]*bl_height/step>scrn_h)
1721 // POP LAST MAP ON SCREEN
1725 unsigned EGAseg=VMapData.EGAseg;
1727 if (!VMapData.built_flag)
1729 ErrDialog("You haven't previously\n"
1730 "VIEWed a map!"," OK ");
1735 // RESTORE MAP IN MEMORY!
1738 outport(GCindex,GCmode | 0x100);
1739 outport(SCindex,SCmapmask | 0xf00);
1751 maxpack=VMapData.maxpack;
1762 outport(GCindex,GCmode);
1763 outport(SCindex,SCmapmask | 0xf00);
1764 _fmemset(MK_FP(0xa000,0),0,0x2000);
1771 case 1: tilelen=32L; break;
1772 case 2: tilelen=128L; break;
1773 case 3: tilelen=512L;
1777 // ALLOCATE TEMP BUFFERS & BEGIN!
1779 bufsize=tilelen*bl_width;
1782 MMAllocate((memptr *)&block,bufsize);
1783 maxpack=pwidth/step+1;
1785 MMAllocate((memptr *)&gblock[i],maxpack);
1787 outport(GCindex,GCmode);
1789 for (j=bl_y;j<bl_y+bl_height;j++)
1792 for (i=bl_x;i<bl_x+bl_width;i++)
1794 unsigned tilet,tilem,tilei,loc;
1802 setvideo(savevideo);
1809 // GET THE CORRECT TILE MOVED INTO "TDATA"
1812 tilet=viewton?((p_info&BPLANE)?a_bg[loc]:-BkgndColor):-BkgndColor;
1813 tilem=viewmon?((p_info&FPLANE)?a_fg[loc]+tilenum:0):0;
1814 tilei=viewion?((p_info&IPLANE)?a_in[loc]+tilenum:0):0;
1815 CombineTiles(tilet,tilem,tilei,tsize);
1818 // NOW, MUNGE "TDATA" INTO BIT-PLANES!
1820 // INTERNAL: P0 P1 P2 P3
1821 // SCANLINE x ...... ...... ...... ......
1824 if (!((lybase+k)%step))
1826 movedata(FP_SEG(&tdata),FP_OFF(&tdata)+(m*tsize*t8)+k*t1,
1827 (unsigned)block,k*lwidth+m*pwidth+(i-bl_x)*t1,t1);
1831 // CONVERT BIT-PLANE LINES TO COMPRESSED FORM...
1833 for (k=0;k<8<<(tsize-1);k++)
1835 if (!((lybase+k)%step))
1841 _fmemset(gblock[0],0,maxpack);
1842 _fmemset(gblock[1],0,maxpack);
1843 _fmemset(gblock[2],0,maxpack);
1844 _fmemset(gblock[3],0,maxpack);
1845 for (m=0;m<pwidth*8;m++)
1862 asm mov cl,[BYTE PTR temp2]
1863 asm mov ch,[BYTE PTR temp1]
1868 asm mov es,[WORD PTR gblock]
1880 asm mov es,[WORD PTR gblock+2]
1892 asm mov es,[WORD PTR gblock+4]
1904 asm mov es,[WORD PTR gblock+6]
1919 *(gblock[0]+temp)|=((block[idx]>>temp2)&1)<<temp1;
1920 *(gblock[1]+temp)|=((block[idx+pwidth]>>temp2)&1)<<temp1;
1921 *(gblock[2]+temp)|=((block[idx+pwidth*2]>>temp2)&1)<<temp1;
1922 *(gblock[3]+temp)|=((block[idx+pwidth*3]>>temp2)&1)<<temp1;
1930 // BLAST ONTO THE SCREEN
1936 outport(SCindex,SCmapmask | (0x100<<n));
1937 for (m=0;m<maxpack;m++)
1938 *(EGA+EGA1lookup[curline]+m)=*(gblock[n]+m);
1947 MMFreePtr((memptr *)&block);
1949 MMFreePtr((memptr *)&gblock[m]);
1953 // SAVE MAP IN MEMORY!
1957 unsigned EGAseg=0xa800;
1961 outport(GCindex,GCmode | 0x100);
1962 outport(SCindex,SCmapmask | 0xf00);
1974 VMapData.built_flag=1;
1975 VMapData.EGAseg=EGAseg;
1976 VMapData.maxpack=maxpack;
1983 // DONE WITH MAP BUILD-N-DISPLAY
1989 // IF MOUSE BUTTON PRESSED WITHIN REGION, GO THERE!
1997 if (x<maxpack*8 && y<(mapheight*t8/step) && !CopyArea)
1999 xbase=(x*step)/t8-screenw/2;
2000 ybase=(y*step)/t8-screenh/2;
2001 if (xbase+screenw>mapwidth)
2002 xbase=mapwidth-screenw;
2003 if (ybase+screenh>mapheight)
2004 ybase=mapheight-screenh;
2010 while(MouseButton());
2016 setvideo(savevideo);
2024 ////////////////////////////////////////////////////
2026 // MAP IMPORTING FUNCTIONS FOLLOW:
2028 ////////////////////////////////////////////////////
2029 char _seg *oldnames,oldmapname[64],oldmapheadname[64],
2030 oldSM_name[64],oldSM_loadname[64];
2037 _fstrcpy(mapheadname,TEDInfo->ImportPath);
2038 strcat(mapheadname,oldmapheadname);
2039 if (access(mapheadname,0))
2041 strcpy(mapheadname,oldmapheadname);
2045 _fstrcpy(mapname,TEDInfo->ImportPath);
2046 strcat(mapname,oldmapname);
2049 _fstrcpy(SM_name,TEDInfo->ImportPath);
2050 strcat(SM_name,oldSM_name);
2052 _fstrcpy(SM_loadname,TEDInfo->ImportPath);
2053 strcat(SM_loadname,oldSM_loadname);
2055 MMAllocate((memptr *)&oldnames,100*16);
2056 movedata(FP_SEG(MapNames),FP_OFF(MapNames),(unsigned)oldnames,0,100*16);
2058 MMFreePtr((memptr *)&MapFileHeader);
2060 LoadIn(mapheadname,(memptr *)&MapFileHeader);
2063 if (MapFileHeader->dataoffsets[i]>=0)
2065 MapHeaderStr TempHead;
2067 LoadFile(mapname,(char huge *)&TempHead,MapFileHeader->dataoffsets[i],sizeof(MapHeaderStr));
2068 strcpy(MapNames[i],TempHead.name);
2074 void IM_swapout(void)
2076 if (oldnames) // GET RID OF MAPNAMES
2078 strcpy(mapname,oldmapname);
2079 strcpy(mapheadname,oldmapheadname);
2080 strcpy(SM_name,oldSM_name);
2081 strcpy(SM_loadname,oldSM_loadname);
2083 movedata((unsigned)oldnames,0,FP_SEG(MapNames),FP_OFF(MapNames),100*16);
2084 MMFreePtr((memptr *)&oldnames);
2085 MMFreePtr((memptr *)&MapFileHeader);
2086 LoadIn(mapheadname,(memptr *)&MapFileHeader);
2091 void IM_LoadMap(void)
2093 unsigned long csize,size=0;
2097 // DEALLOCATE ALL CURRENT MAP MEMORY
2101 MMFreePtr((memptr *)&MapBkgnd);
2102 MMFreePtr((memptr *)&CutBkgnd);
2106 MMFreePtr((memptr *)&MapFrgnd);
2107 MMFreePtr((memptr *)&CutFrgnd);
2111 MMFreePtr((memptr *)&MapInfoPl);
2112 MMFreePtr((memptr *)&CutInfoPl);
2118 LoadFile(mapname,(char huge *)&MapHeader,MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
2121 // LOAD & DECOMPRESS MAP PLANES
2123 if (MapFileHeader->maptype & BPLANE)
2125 LoadFile(mapname,(char huge *)&size,MapHeader.mapbkgndpl,2);
2127 MMAllocate((memptr *)&MapBkgnd,size);
2128 MMAllocate((memptr *)&CutBkgnd,size);
2129 csize=MapHeader.mapbkgndlen-2;
2130 MMAllocate(&block,csize);
2132 LoadFile(mapname,MK_FP(block,0),MapHeader.mapbkgndpl+2,csize);
2134 RLEWExpand(MK_FP(block,0),MK_FP(MapBkgnd,0),size,MapFileHeader->RLEWtag);
2137 if (MapFileHeader->maptype & FPLANE)
2139 LoadFile(mapname,(char huge *)&size,MapHeader.mapfrgndpl,2);
2141 MMAllocate((memptr *)&MapFrgnd,size);
2142 MMAllocate((memptr *)&CutFrgnd,size);
2143 csize=MapHeader.mapfrgndlen-2;
2144 MMAllocate(&block,csize);
2146 LoadFile(mapname,MK_FP(block,0),MapHeader.mapfrgndpl+2,csize);
2148 RLEWExpand(MK_FP(block,0),MK_FP(MapFrgnd,0),size,MapFileHeader->RLEWtag);
2151 if (MapFileHeader->maptype & IPLANE)
2153 LoadFile(mapname,(char huge *)&size,MapHeader.mapinfopl,2);
2155 MMAllocate((memptr *)&MapInfoPl,size);
2156 MMAllocate((memptr *)&CutInfoPl,size);
2157 csize=MapHeader.mapinfolen-2;
2158 MMAllocate(&block,csize);
2160 LoadFile(mapname,MK_FP(block,0),MapHeader.mapinfopl+2,csize);
2162 RLEWExpand(MK_FP(block,0),MK_FP(MapInfoPl,0),size,MapFileHeader->RLEWtag);
2168 void IM_SaveMap(void)
2171 long fsize,size,nsize,change;
2172 MapHeaderStr TempHeader;
2174 char string[100],TEDid[]=IDSTRING;
2178 strcpy(string,"Saving Map, '");
2179 strcat(string,MapHeader.name);
2181 strcat(string,"'.");
2182 ErrDialog(string,"");
2185 // SAVE MAP FILE HEADER
2187 SaveFile(mapheadname,MK_FP(MapFileHeader,0),0,sizeof(MapFileHeaderStr));
2188 fsize=sizeof(MapFileHeaderStr);
2191 // COMPRESS & SAVE TILEINFOS
2193 for (i=0;i<numtplanes;i++)
2195 MMAllocate(&block,tilenum);
2196 MapFileHeader->tileinfooff[i]=fsize;
2197 nsize=RLEBCompress(MK_FP(Tinfo[i],0),tilenum,MK_FP(block,0),MapFileHeader->RLEWtag);
2198 MapFileHeader->tileinfolen[i]=nsize;
2199 SaveFile(mapheadname,MK_FP(block,0),fsize,nsize);
2204 for (i=0;i<numtmplanes;i++)
2206 MMAllocate(&block,tilemnum);
2207 MapFileHeader->tileinfomoff[i]=fsize;
2208 nsize=RLEBCompress(MK_FP(TMinfo[i],0),tilemnum,MK_FP(block,0),MapFileHeader->RLEWtag);
2209 MapFileHeader->tileinfomlen[i]=nsize;
2210 SaveFile(mapheadname,MK_FP(block,0),fsize,nsize);
2215 MapFileHeader->oldtilenum=tilenum;
2216 MapFileHeader->oldtilemnum=tilemnum;
2218 SaveFile(mapheadname,MK_FP(MapFileHeader,2),2,sizeof(MapFileHeaderStr)-2);
2220 // SAVE ALREADY COMPRESSED MAPS
2224 // NOTE: I AM STORING "TED5" AT THE START OF THE FILE BECAUSE
2225 // SAVING THE FILE AT OFFSET 0 WILL TRASH IT (I HAVE TO RE-SAVE THE HEADER!)
2227 SaveFile(SM_name,(char huge *)TEDid,0,strlen(TEDid));
2228 fsize=strlen(TEDid);
2234 if (MapFileHeader->dataoffsets[i]==-1 || i==whichmap)
2237 oldoff=MapFileHeader->dataoffsets[i];
2239 LoadFile(SM_loadname,(char huge *)&TempHeader,oldoff,sizeof(MapHeaderStr));
2241 strcpy(TempHeader.name,MapNames[i]);
2242 MapFileHeader->dataoffsets[i]=fsize;
2243 size=TempHeader.mapbkgndlen+TempHeader.mapfrgndlen+TempHeader.mapinfolen;
2244 change=TempHeader.mapbkgndpl-fsize-sizeof(MapHeaderStr);
2245 TempHeader.mapbkgndpl-=change;
2246 TempHeader.mapfrgndpl-=change;
2247 TempHeader.mapinfopl-=change;
2249 SaveFile(SM_name,(char huge *)&TempHeader,fsize,sizeof(MapHeaderStr));
2250 fsize+=sizeof(MapHeaderStr);
2252 MMAllocate(&block,size);
2253 LoadFile(SM_loadname,MK_FP(block,0),oldoff+sizeof(MapHeaderStr),size);
2254 SaveFile(SM_name,MK_FP(block,0),fsize,size);
2256 SaveFile(SM_name,"!ID!",fsize,4);
2262 // SAVE CURRENT MAP AT END OF FILE
2264 MapFileHeader->dataoffsets[whichmap]=fsize;
2265 MapFileHeader->datalengths[whichmap]=sizeof(MapHeaderStr);
2266 SaveFile(SM_name,(char huge *)&MapHeader,fsize,sizeof(MapHeaderStr));
2267 fsize+=sizeof(MapHeaderStr);
2269 size=MapHeader.width*MapHeader.height*sizeof(int);
2270 MMAllocate(&block,size);
2271 if (MapFileHeader->maptype & BPLANE)
2273 MapHeader.mapbkgndpl=fsize;
2274 nsize=RLEWCompress(MK_FP(MapBkgnd,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
2275 MapHeader.mapbkgndlen=nsize+2;
2277 SaveFile(SM_name,(char huge *)&size,fsize,2);
2279 SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
2283 MapHeader.mapbkgndlen=0;
2285 if (MapFileHeader->maptype & FPLANE)
2287 MapHeader.mapfrgndpl=fsize;
2288 nsize=RLEWCompress(MK_FP(MapFrgnd,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
2289 MapHeader.mapfrgndlen=nsize+2;
2291 SaveFile(SM_name,(char huge *)&size,fsize,2);
2293 SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
2297 MapHeader.mapfrgndlen=0;
2299 if (MapFileHeader->maptype & IPLANE)
2301 MapHeader.mapinfopl=fsize;
2302 nsize=RLEWCompress(MK_FP(MapInfoPl,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
2303 MapHeader.mapinfolen=nsize+2;
2305 SaveFile(SM_name,(char huge *)&size,fsize,2);
2307 SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
2311 MapHeader.mapinfolen=0;
2313 SaveFile(SM_name,"!ID!",fsize,4);
2320 SaveFile(SM_name,(char huge *)&MapHeader,
2321 MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
2324 // RE-SAVE FILE HEADER
2325 // NOTE: The "2" is so MSDOS doesn't truncate the fucking file!
2327 SaveFile(mapheadname,MK_FP(MapFileHeader,2),2,sizeof(MapFileHeaderStr)-2);
2329 unlink(SM_loadname);
2330 rename(SM_name,SM_loadname);
2332 RestoreBackground();
2336 ////////////////////////////////////////////////////
2338 // Item - Import Maps
2340 ////////////////////////////////////////////////////
2341 btype IMPMb[]={{"New Path",3,2,1},
2344 DialogDef IMPMd={"Map Importing",13,11,3,&IMPMb[0],NULL};
2345 btype NPb={" ",1,3,1};
2346 DialogDef NPd={"Current Path:",38,5,1,&NPb,NULL};
2349 void Item_ImportMaps(void)
2351 char imfile[64],tempstr[40],impath[64];
2352 int oldwhichmap,which,mapnum,i;
2359 // THE IMPORT FUNCTION WILL RID THE SYSTEM OF XMSMAPS
2363 XMSFreeMem(XMSmaps);
2370 _fstrcpy(impath,TEDInfo->ImportPath);
2372 strcpy(oldmapname,mapname);
2373 strcpy(oldmapheadname,mapheadname);
2374 strcpy(oldSM_name,SM_name);
2375 strcpy(oldSM_loadname,SM_loadname);
2382 oldwhichmap=whichmap;
2384 DrawDialog(&IMPMd,1);
2387 which=CheckButtons(&IMPMd);
2396 GetDialogXY(&NPd,&sx,&sy);
2400 print("- current dir -");
2403 GetButtonXY(&NPd,0,&sx,&sy);
2404 if (input(tempstr,36))
2406 strcpy(impath,tempstr);
2407 if (impath[strlen(impath)-1]!='\\')
2408 strcat(impath,"\\");
2411 if (access(mapheadname,0))
2413 ErrDialog("Can't find any TED5\n"
2414 "map files at that path."," OK ");
2418 RestoreBackground();
2419 ErrDialog("Verifying path...","");
2420 _fstrcpy(TEDInfo->ImportPath,impath);
2427 RestoreBackground();
2436 ErrDialog("Loading File Info...","");
2439 RestoreBackground();
2440 ErrDialog("Having problems with your path!"," OK ");
2443 RestoreBackground();
2446 mapnum=SelectMap(1,CREATED,"TO IMPORT");
2449 char check[100]="Are you SURE you want to\n"
2452 strcat(check,MapNames[mapnum]);
2454 if (Message(check)<2)
2458 ErrDialog("Importing. One moment.","");
2463 RestoreBackground();
2472 RestoreBackground();
2473 whichmap=oldwhichmap;
2487 ////////////////////////////////////////////////////
2491 ////////////////////////////////////////////////////
2493 char oldpath[64]="\\";
2495 void Item_VisitDOS(void)
2497 TempStruct LaunchInfo;
2498 char ename[64],temp[40],tiname[14]="TEDINFO.TMP";
2504 // Save the handles for all XMS memory so we don't
2505 // have to re-install this shit!
2507 TEDInfo->OldCgaXMS=CgaXMS;
2508 TEDInfo->OldEgaXMS=EgaXMS;
2509 TEDInfo->OldVgaXMS=VgaXMS;
2511 TEDInfo->OldCgaXMSsize=CgaXMSsize;
2512 TEDInfo->OldEgaXMSsize=EgaXMSsize;
2513 TEDInfo->OldVgaXMSsize=VgaXMSsize;
2515 size=4L*(tilenum+tilemnum);
2518 if (1024L*XMSTotalFree()<size)
2521 TEDInfo->OldCgaXMS=TEDInfo->OldCgaXMSsize=0;
2525 TEDInfo->CgaXMSlook=XMSAllocate(size);
2526 XMSmove(0,(long)MK_FP(CgaXMSlookup,0),TEDInfo->CgaXMSlook,0,size);
2532 if (1024L*XMSTotalFree()<size)
2535 TEDInfo->OldEgaXMS=TEDInfo->OldEgaXMSsize=0;
2539 TEDInfo->EgaXMSlook=XMSAllocate(size);
2540 XMSmove(0,(long)MK_FP(EgaXMSlookup,0),TEDInfo->EgaXMSlook,0,size);
2546 if (1024L*XMSTotalFree()<size)
2549 TEDInfo->OldVgaXMS=TEDInfo->OldVgaXMSsize=0;
2553 TEDInfo->VgaXMSlook=XMSAllocate(size);
2554 XMSmove(0,(long)MK_FP(VgaXMSlookup,0),TEDInfo->VgaXMSlook,0,size);
2559 // SAVE CURRENT VIDEOMODE FOR LAUNCH RETURN
2561 LaunchInfo.lastmode=videomode;
2562 strcpy(LaunchInfo.ext,ext);
2563 SaveFile(tiname,(char huge *)&LaunchInfo,0,sizeof(TempStruct));
2565 TEDInfo->oscrx=xbase;
2566 TEDInfo->oscry=ybase;
2567 _fmemcpy((void far *)TEDInfo->parmstring,(void far *)parmstring,64);
2574 XMSFreeMem(XMSmaps);
2576 strcpy(temp,"Launching ");
2577 _fstrcat((char far *)temp,(char far *)TEDInfo->launchname);
2584 _fmemcpy((char far *)ename,(char far *)TEDInfo->launchname,14);
2586 RemoveUndoBuffers();
2590 // ARE WE EXITING WITH A BATCH FILE?
2594 printf("The TED5 DOS shell. Type 'EXIT' to return to TED5.");
2597 // SAVE CURRENT DRIVE & PATH
2600 getcurdir(0,oldpath+1);
2604 spawnlp(P_WAIT,"COMMAND",NULL);
2612 execlp("TED5.EXE","TED5.EXE","/LAUNCH",NULL);
2614 printf("Can't find TED5 for some reason!");
2619 ////////////////////////////////////////////////////
2621 // Item - Paste Overlay toggle
2623 ////////////////////////////////////////////////////
2624 void Item_POtog(void)