+////////////////////////////////////////////////////
+////////////////////////////////////////////////////
+//
+// TED5-1
+//
+////////////////////////////////////////////////////
+////////////////////////////////////////////////////
+#include "ted5.h"
+#pragma hdrstop
+
+void InputMap(char *lvlname,unsigned *levelw,unsigned *levelh,int exitok);
+void MNameOn(int x,int y,int i);
+void MNameOff(int x,int y,int i);
+void DnarOn(int x,int y);
+void DnarOff(int x,int y);
+void UparOn(int x,int y);
+void UparOff(int x,int y);
+void ExitOn(int x,int y);
+void ExitOff(int x,int y);
+void TInfoNon(int x,int y,int b);
+void TInfoNoff(int x,int y,int b);
+void TInfoMNon(int x,int y,int b);
+void TInfoMNoff(int x,int y,int b);
+void TIDoneOn(int x,int y);
+void TIDoneOff(int x,int y);
+
+
+////////////////////////////////////////////////////
+//
+// SAVE the current map
+//
+////////////////////////////////////////////////////
+void SaveMap(int delmap)
+{
+ memptr block;
+ long fsize,size,nsize,change;
+ MapHeaderStr TempHeader;
+ int i,XMStemp;
+ char string[100],TEDid[]=IDSTRING;
+
+
+
+ RemoveUndoBuffers();
+ if (delmap)
+ {
+ LoadFile(mapname,(char huge *)&TempHeader,
+ MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
+ strcpy(string,"Deleting Map, '");
+ strcat(string,TempHeader.name);
+ }
+ else
+ {
+ strcpy(string,"Saving Map, '");
+ strcat(string,MapHeader.name);
+ }
+
+ strcat(string,"'.");
+ ErrDialog(string,"");
+
+
+ BackupFile(mapheadname);
+ BackupFile(SM_loadname);
+
+
+ if (delmap || DirtyFlag)
+ {
+ //
+ // SAVE MAP FILE HEADER
+ //
+ if (delmap)
+ MapFileHeader->dataoffsets[whichmap]=-1;
+
+ SaveFile(mapheadname,MK_FP(MapFileHeader,0),0,sizeof(MapFileHeaderStr));
+ fsize=sizeof(MapFileHeaderStr);
+
+ //
+ // COMPRESS & SAVE TILEINFOS
+ //
+ MMAllocate(&block,tilenum);
+ for (i=0;i<numtplanes;i++)
+ {
+ MapFileHeader->tileinfooff[i]=fsize;
+ nsize=RLEBCompress(MK_FP(Tinfo[i],0),tilenum,MK_FP(block,0),MapFileHeader->RLEWtag);
+ MapFileHeader->tileinfolen[i]=nsize;
+ SaveFile(mapheadname,MK_FP(block,0),fsize,nsize);
+ fsize+=nsize;
+ }
+ MMFreePtr(&block);
+
+ MMAllocate(&block,tilemnum);
+ for (i=0;i<numtmplanes;i++)
+ {
+ MapFileHeader->tileinfomoff[i]=fsize;
+ nsize=RLEBCompress(MK_FP(TMinfo[i],0),tilemnum,MK_FP(block,0),MapFileHeader->RLEWtag);
+ MapFileHeader->tileinfomlen[i]=nsize;
+ SaveFile(mapheadname,MK_FP(block,0),fsize,nsize);
+ fsize+=nsize;
+ }
+ MMFreePtr(&block);
+
+ MapFileHeader->oldtilenum=tilenum;
+ MapFileHeader->oldtilemnum=tilemnum;
+
+ SaveFile(mapheadname,MK_FP(MapFileHeader,2),2,sizeof(MapFileHeaderStr)-2);
+ //
+ // SAVE ALREADY COMPRESSED MAPS
+ //
+
+ //
+ // IF MAPS ARE IN XMS ALREADY, ALLOCATE A NEW BUFFER
+ // TO SHUFFLE ALREADY-COMPRESSED MAPS INTO
+ //
+ if (XMSmaps)
+ {
+ int planes;
+ long len=filelen(SM_loadname);
+
+
+ planes=(MapFileHeader->maptype&BPLANE>0)+
+ (MapFileHeader->maptype&FPLANE>0)+
+ (MapFileHeader->maptype&IPLANE>0);
+ len+=2L*mapwidth*mapheight*planes;
+
+ if (1024L*XMSTotalFree()<len)
+ {
+ XMSFreeMem(XMSmaps);
+ XMSmaps=0;
+ }
+ else
+ XMStemp=XMSAllocate(len);
+ }
+
+ //
+ // NOTE: I AM STORING "TED5" AT THE START OF THE FILE BECAUSE
+ // SAVING THE FILE AT OFFSET 0 WILL TRASH IT (I HAVE TO RE-SAVE THE HEADER!)
+ //
+ if (XMSmaps)
+ XMSmove(0,(long)&TEDid,XMStemp,0,strlen(TEDid));
+ else
+ SaveFile(SM_name,(char huge *)TEDid,0,strlen(TEDid));
+ fsize=strlen(TEDid);
+
+ for (i=0;i<100;i++)
+ {
+ long oldoff;
+
+ if (MapFileHeader->dataoffsets[i]==-1 || i==whichmap)
+ continue;
+
+ oldoff=MapFileHeader->dataoffsets[i];
+
+ if (XMSmaps)
+ XMSmove(XMSmaps,oldoff,0,(long)&TempHeader,sizeof(MapHeaderStr));
+ else
+ LoadFile(SM_loadname,(char huge *)&TempHeader,oldoff,sizeof(MapHeaderStr));
+
+ strcpy(TempHeader.name,MapNames[i]);
+ MapFileHeader->dataoffsets[i]=fsize;
+ size=TempHeader.mapbkgndlen+TempHeader.mapfrgndlen+TempHeader.mapinfolen;
+ change=TempHeader.mapbkgndpl-fsize-sizeof(MapHeaderStr);
+ TempHeader.mapbkgndpl-=change;
+ TempHeader.mapfrgndpl-=change;
+ TempHeader.mapinfopl-=change;
+
+ if (XMSmaps)
+ XMSmove(0,(long)&TempHeader,XMStemp,fsize,sizeof(MapHeaderStr));
+ else
+ SaveFile(SM_name,(char huge *)&TempHeader,fsize,sizeof(MapHeaderStr));
+ fsize+=sizeof(MapHeaderStr);
+
+ if (XMSmaps)
+ {
+ XMSmove(XMSmaps,oldoff+sizeof(MapHeaderStr),XMStemp,fsize,size);
+ fsize+=size;
+ XMSmove(0,(long)"!ID!",XMStemp,fsize,4);
+ fsize+=4;
+ }
+ else
+ {
+ MMAllocate(&block,size);
+ LoadFile(SM_loadname,MK_FP(block,0),oldoff+sizeof(MapHeaderStr),size);
+ SaveFile(SM_name,MK_FP(block,0),fsize,size);
+ fsize+=size;
+ SaveFile(SM_name,"!ID!",fsize,4);
+ fsize+=4;
+ MMFreePtr(&block);
+ }
+ }
+
+ //
+ // SAVE CURRENT MAP AT END OF FILE
+ //
+ if (!delmap)
+ {
+ MapFileHeader->dataoffsets[whichmap]=fsize;
+ MapFileHeader->datalengths[whichmap]=sizeof(MapHeaderStr);
+ if (XMSmaps)
+ XMSmove(0,(long)&MapHeader,XMStemp,fsize,sizeof(MapHeaderStr));
+ else
+ SaveFile(SM_name,(char huge *)&MapHeader,fsize,sizeof(MapHeaderStr));
+ fsize+=sizeof(MapHeaderStr);
+
+ size=MapHeader.width*MapHeader.height*sizeof(int);
+ MMAllocate(&block,size);
+ if (MapFileHeader->maptype & BPLANE)
+ {
+ MapHeader.mapbkgndpl=fsize;
+ nsize=RLEWCompress(MK_FP(MapBkgnd,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
+
+ MapHeader.mapbkgndlen=nsize+2;
+
+ if (XMSmaps)
+ XMSmove(0,(long)&size,XMStemp,fsize,2);
+ else
+ SaveFile(SM_name,(char huge *)&size,fsize,2);
+
+ fsize+=2;
+
+ if (XMSmaps)
+ XMSmove(0,(long)MK_FP(block,0),XMStemp,fsize,nsize);
+ else
+ SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
+
+ fsize+=nsize;
+ }
+ else
+ MapHeader.mapbkgndlen=0;
+
+ if (MapFileHeader->maptype & FPLANE)
+ {
+ MapHeader.mapfrgndpl=fsize;
+ nsize=RLEWCompress(MK_FP(MapFrgnd,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
+
+ MapHeader.mapfrgndlen=nsize+2;
+
+ if (XMSmaps)
+ XMSmove(0,(long)&size,XMStemp,fsize,2);
+ else
+ SaveFile(SM_name,(char huge *)&size,fsize,2);
+
+ fsize+=2;
+
+ if (XMSmaps)
+ XMSmove(0,(long)MK_FP(block,0),XMStemp,fsize,nsize);
+ else
+ SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
+
+ fsize+=nsize;
+ }
+ else
+ MapHeader.mapfrgndlen=0;
+
+ if (MapFileHeader->maptype & IPLANE)
+ {
+ MapHeader.mapinfopl=fsize;
+ nsize=RLEWCompress(MK_FP(MapInfoPl,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
+
+ MapHeader.mapinfolen=nsize+2;
+
+ if (XMSmaps)
+ XMSmove(0,(long)&size,XMStemp,fsize,2);
+ else
+ SaveFile(SM_name,(char huge *)&size,fsize,2);
+
+ fsize+=2;
+
+ if (XMSmaps)
+ XMSmove(0,(long)MK_FP(block,0),XMStemp,fsize,nsize);
+ else
+ SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
+
+ fsize+=nsize;
+ }
+ else
+ MapHeader.mapinfolen=0;
+
+ if (XMSmaps)
+ XMSmove(0,(long)"!ID!",XMStemp,fsize,4);
+ else
+ SaveFile(SM_name,"!ID!",fsize,4);
+
+ fsize+=4;
+
+ MMFreePtr(&block);
+
+ // RE-SAVE HEADER
+ if (XMSmaps)
+ XMSmove(0,(long)&MapHeader,XMStemp,
+ MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
+ else
+ SaveFile(SM_name,(char huge *)&MapHeader,
+ MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
+
+ //
+ // RE-SAVE FILE HEADER
+ // NOTE: The "2" is so SaveFile doesn't truncate the fucking file!
+ //
+ SaveFile(mapheadname,MK_FP(MapFileHeader,2),2,sizeof(MapFileHeaderStr)-2);
+ }
+
+ if (XMSmaps)
+ {
+ #define BCSIZE 0x4000
+ long size=fsize,clen,coff;
+
+ //
+ // SAVE ENTIRE MAPFILE IN XMS TO DISK!
+ //
+ XMSFreeMem(XMSmaps);
+ XMSmaps=XMStemp;
+
+ MMAllocate(&block,BCSIZE);
+ coff=0;
+ do
+ {
+ clen=BCSIZE;
+ if (size<BCSIZE)
+ clen=size;
+
+ XMSmove(XMSmaps,coff,0,(long)MK_FP(block,0),clen);
+ SaveFile(SM_loadname,MK_FP(block,0),coff,clen);
+ size-=BCSIZE;
+ coff+=clen;
+
+ } while(size>0);
+
+ MMFreePtr(&block);
+ }
+ else
+ {
+ unlink(SM_loadname);
+ rename(SM_name,SM_loadname);
+ }
+ }
+
+ AllocateUndoBuffers();
+ UndoRegion.x=-1;
+ SaveUndo(0,0,mapwidth,mapheight);
+ RestoreBackground();
+}
+
+
+
+
+
+
+////////////////////////////////////////////////////
+//
+// BACKUP FILES!
+//
+////////////////////////////////////////////////////
+void BackupFile(char *filename)
+{
+ #define BUFSIZE 0x8000
+ memptr block;
+ long size,clen,coff;
+ int i;
+ char backupname[14];
+
+
+ size = filelen(filename);
+ if (!size)
+ return;
+
+ strcpy(backupname,filename);
+ for (i=strlen(backupname);i;i--)
+ if (backupname[i] == '.')
+ backupname[i+1] = 0;
+ strcat(backupname,"BAK");
+
+ MMAllocate(&block,BUFSIZE);
+ coff=0;
+ do
+ {
+ clen=BUFSIZE;
+ if (size<BUFSIZE)
+ clen=size;
+
+ LoadFile(filename,(char far *)block,coff,clen);
+ SaveFile(backupname,MK_FP(block,0),coff,clen);
+ size-=BUFSIZE;
+ coff+=clen;
+
+ } while(size>0);
+
+ MMFreePtr(&block);
+}
+
+
+////////////////////////////////////////////////////
+//
+// SAVE OUT TEDINFO FILE
+//
+////////////////////////////////////////////////////
+void SaveTEDInfo(void)
+{
+ BackupFile(infoname);
+
+ TEDInfo->oscrx=xbase;
+ TEDInfo->oscry=ybase;
+ _fstrcpy(TEDInfo->launchname,(char far *)launchname);
+ SaveFile(infoname,MK_FP(TEDInfo,0),0,sizeof(InfoStruct));
+}
+
+
+////////////////////////////////////////////////////
+//
+// WRITE OUT THE OUTPUT HEADER FILE
+//
+////////////////////////////////////////////////////
+char * _nfstrcpy(char *dest,char far *source)
+{
+ int i;
+
+ for (i=0;i<_fstrlen(source);i++)
+ *(dest+i)=*(source+i);
+
+ return dest;
+}
+
+
+void SaveOutputHeader(void)
+{
+ char outhead[14]="MAPHEAD.",dot_h[14]="MAPS",t[15],tm[15],temp[40],temp1[40];
+ FILE *fp;
+ OutputHeadStr OutHead;
+ int i,Thelast;
+ long fsize;
+
+
+ ErrDialog("Saving header...","");
+
+ strcat(outhead,ext);
+
+ BackupFile(outhead);
+
+ memset(&OutHead,0,sizeof(OutputHeadStr));
+
+ OutHead.RLEWtag=MapFileHeader->RLEWtag;
+
+ for (i=0;i<100;i++)
+ OutHead.dataoffsets[i]=MapFileHeader->dataoffsets[i];
+
+ fsize=sizeof(OutputHeadStr);
+ SaveFile(outhead,(char huge *)&OutHead,0,fsize);
+ for (i=0;i<numtplanes;i++)
+ {
+ SaveFile(outhead,MK_FP(Tinfo[i],0),fsize,tilenum);
+ fsize+=tilenum;
+ }
+ for (i=0;i<numtmplanes;i++)
+ {
+ SaveFile(outhead,MK_FP(TMinfo[i],0),fsize,tilemnum);
+ fsize+=tilemnum;
+ }
+
+ RestoreBackground();
+
+ //
+ // DUMP OUT A MAPSext.H HEADER FILE
+ //
+ if (writeH)
+ {
+ ErrDialog("Saving .h file...","");
+
+ strcat(dot_h,ext);
+ strcat(dot_h,".H");
+ unlink(dot_h);
+
+ if ((fp=fopen(dot_h,"wt"))==NULL)
+ return;
+
+ fprintf(fp,"///////////////////////////////////////\n");
+ fprintf(fp,"//\n");
+ fprintf(fp,"// TED5 Map Header for %s\n",ext);
+ fprintf(fp,"//\n");
+ fprintf(fp,"///////////////////////////////////////\n");
+
+ Thelast=99;
+ for (i=99;i>=0;i--)
+ if (MapFileHeader->dataoffsets[i]>=0)
+ {
+ Thelast=i;
+ break;
+ }
+
+
+ fprintf(fp,"\n");
+ fprintf(fp,"//\n");
+ fprintf(fp,"// Map Names\n");
+ fprintf(fp,"//\n");
+
+ fprintf(fp,"typedef enum {\n");
+ for (i=0;i<100;i++)
+ if (MapFileHeader->dataoffsets[i]>=0)
+ {
+ char temp[28];
+ int j;
+
+
+ strcpy(temp,&MapNames[i][0]);
+ strcat(temp,"_MAP");
+
+ for (j=0;j<strlen(temp);j++)
+ if (temp[j]==' ')
+ temp[j]='_';
+
+ strcat(temp,",");
+ while(strlen(temp)<25)
+ strcat(temp," ");
+
+ fprintf(fp,"\t\t%s// %d\n",strupr(temp),i);
+ }
+ else
+ if (i<Thelast)
+ fprintf(fp,"\t\tEMPTYMAP%d,\n",i);
+
+ fprintf(fp,"\t\tLASTMAP\n\t } mapnames;\n");
+
+ switch(tsize)
+ {
+ case 1:
+ strcpy(t,"NUMTILE8");
+ strcpy(tm,"NUMTILE8M");
+ break;
+ case 2:
+ strcpy(t,"NUMTILE16");
+ strcpy(tm,"NUMTILE16M");
+ break;
+ case 3:
+ strcpy(t,"NUMTILE32");
+ strcpy(tm,"NUMTILE32M");
+ }
+
+
+ if (numtplanes)
+ {
+ fprintf(fp,"\n");
+ fprintf(fp,"//\n");
+ fprintf(fp,"// TILEINFO offsets\n");
+ fprintf(fp,"//\n");
+
+ memset(temp,0,sizeof(temp));
+ memset(temp1,0,sizeof(temp1));
+ fprintf(fp,"#define %s\x9\x9%d\n",
+ strupr(_nfstrcpy(temp,MapFileHeader->tnames[0])),
+ sizeof(OutputHeadStr));
+ for (i=1;i<numtplanes;i++)
+ {
+ memset(temp,0,sizeof(temp));
+ memset(temp1,0,sizeof(temp1));
+
+ fprintf(fp,"#define %s\x9\x9(%s+%s)\n",
+ strupr(_nfstrcpy(temp,MapFileHeader->tnames[i])),
+ strupr(_nfstrcpy(temp1,MapFileHeader->tnames[i-1])),
+ t);
+ }
+ }
+
+ if (numtmplanes)
+ {
+ fprintf(fp,"\n");
+ fprintf(fp,"//\n");
+ fprintf(fp,"// TILEINFOM offsets\n");
+ fprintf(fp,"//\n");
+
+ memset(temp,0,sizeof(temp));
+ memset(temp1,0,sizeof(temp1));
+ fprintf(fp,"#define %s\x9\x9(%s+%s)\n",
+ strupr(_nfstrcpy(temp,MapFileHeader->tmnames[0])),
+ strupr(_nfstrcpy(temp1,MapFileHeader->tnames[numtplanes-1])),
+ t);
+ for (i=1;i<numtmplanes;i++)
+ {
+ memset(temp,0,sizeof(temp));
+ memset(temp1,0,sizeof(temp1));
+
+ fprintf(fp,"#define %s\x9\x9(%s+%s)\n",
+ strupr(_nfstrcpy(temp,MapFileHeader->tmnames[i])),
+ strupr(_nfstrcpy(temp1,MapFileHeader->tmnames[i-1])),
+ tm);
+ }
+ }
+
+ fclose(fp);
+ writeH=0;
+ RestoreBackground();
+ }
+
+}
+
+
+////////////////////////////////////////////////////
+//
+// Initialize the TILEINFO/M arrays
+//
+////////////////////////////////////////////////////
+btype TIb[]={{" ",1,2,1},
+ {" ",1,6,1},
+ {" Done ",12,9,2}};
+DialogDef TId={" How many TILEINFO planes?\n\n\n\n"
+ " How many TILEINFOM planes?",
+ 27,11,3,&TIb[0],NULL};
+
+void InitTileinfo(void)
+{
+ unsigned temp,which,oktoexit=0,ox,oy,i,j;
+ long fsize;
+
+ numtplanes=numtmplanes=0;
+ DrawDialog(&TId,1);
+ GetButtonXY(&TId,0,&sx,&sy);
+ printint(numtplanes);
+ if (MapFileHeader->maptype&FPLANE)
+ {
+ GetButtonXY(&TId,1,&sx,&sy);
+ printint(numtmplanes);
+ }
+ do
+ {
+ which=CheckButtons(&TId);
+ switch(which)
+ {
+ case 1:
+ MouseHide();
+ GetButtonXY(&TId,0,&sx,&sy);
+ ox=sx;
+ oy=sy;
+ print(TIb[0].text);
+ sx=ox;
+ sy=oy;
+ if ((temp=inputint(9))!=ESCOUT && temp<11 && temp)
+ numtplanes=temp;
+ sx=ox;
+ sy=oy;
+ print(TIb[0].text);
+ sx=ox;
+ sy=oy;
+ printint(numtplanes);
+ MouseShow();
+
+ case 2:
+ MouseHide();
+ GetButtonXY(&TId,1,&sx,&sy);
+ ox=sx;
+ oy=sy;
+ print(TIb[1].text);
+ sx=ox;
+ sy=oy;
+ if (MapFileHeader->maptype&FPLANE)
+ {
+ if ((temp=inputint(9))!=ESCOUT && temp<11 && temp)
+ numtmplanes=temp;
+ sx=ox;
+ sy=oy;
+ print(TIb[1].text);
+ sx=ox;
+ sy=oy;
+ printint(numtmplanes);
+ }
+ MouseShow();
+ break;
+
+ case 3:
+ MouseHide();
+ oktoexit=1;
+ GetButtonXY(&TId,2,&sx,&sy);
+ print(TIb[2].text);
+ MouseShow();
+ }
+
+ } while(!oktoexit);
+
+ RestoreBackground();
+
+ //
+ // allocate arrays
+ //
+ fsize=sizeof(MapFileHeaderStr);
+
+ for (i=0;i<numtplanes;i++)
+ {
+ MMAllocate((memptr *)&Tinfo[i],tilenum);
+ MapFileHeader->tileinfooff[i]=fsize; // THIS DOESN'T REALLY MATTER
+ fsize+=tilenum; // ....YET!
+ for(j=0;j<tilenum;j++)
+ *(Tinfo[i]+j)=0;
+ }
+
+ for (i=0;i<numtmplanes;i++)
+ {
+ MMAllocate((memptr *)&TMinfo[i],tilemnum);
+ MapFileHeader->tileinfomoff[i]=fsize;
+ fsize+=tilemnum;
+ for(j=0;j<tilemnum;j++)
+ *(TMinfo[i]+j)=0;
+ }
+
+ MapFileHeader->numtplanes=numtplanes;
+ MapFileHeader->numtmplanes=numtmplanes;
+
+ MapFileHeader->oldtilenum=tilenum;
+ MapFileHeader->oldtilemnum=tilemnum;
+ writeH=1;
+}
+
+
+////////////////////////////////////////////////////
+//
+// Item - Edit the TILEINFO names
+//
+////////////////////////////////////////////////////
+btype TINb={" Done ",8,15,1};
+DialogDef TINd={" Enter plane names:\n"
+ " TILEINFO TILEINFOM",
+ 22,17,1,&TINb,NULL};
+
+void Item_EditTinfoNames(void)
+{
+ unsigned ox,oy,i,oktoexit=0;
+ int which;
+
+ MouseHide();
+ DrawDialog(&TINd,1);
+ GetDialogXY(&TINd,&sx,&sy);
+ ox=sx;
+ oy=sy;
+ DrawBorder(sx,sy+2,10,11,1);
+ sx=ox;
+ sy=oy;
+ DrawBorder(sx+11,sy+2,10,11,1);
+
+ for (i=0;i<10;i++)
+ {
+ sx=ox+1;
+ sy=oy+i+3;
+ fprint(MapFileHeader->tnames[i]);
+ sx=ox+12;
+ sy=oy+i+3;
+ fprint(MapFileHeader->tmnames[i]);
+ }
+ MouseShow();
+
+ do
+ {
+ if ((which=CheckList(ox+1,oy+3,8,numtplanes,TInfoNon,TInfoNoff,0))>=0)
+ {
+ char temp[8];
+
+ MouseHide();
+redo:
+ sx=ox+1;
+ sy=oy+which+3;
+ print(" ");
+ sx=ox+1;
+ sy=oy+which+3;
+ if (input(temp,7))
+ {
+ for(i=0;i<8;i++)
+ MapFileHeader->tnames[which][i]=temp[i];
+ which++;
+ writeH=DirtyFlag=1;
+ if (which<numtplanes)
+ goto redo;
+ }
+ else
+ TInfoNoff(ox+1,oy+3+which,which);
+ MouseShow();
+ }
+
+ if ((which=CheckList(ox+12,oy+3,8,numtmplanes,TInfoMNon,TInfoMNoff,0))>=0)
+ {
+ char temp[8];
+
+ MouseHide();
+redo1:
+ sx=ox+12;
+ sy=oy+which+3;
+ print(" ");
+ sx=ox+12;
+ sy=oy+which+3;
+ if (input(temp,7))
+ {
+ for(i=0;i<8;i++)
+ MapFileHeader->tmnames[which][i]=temp[i];
+ which++;
+ writeH=DirtyFlag=1;
+ if (which<numtmplanes)
+ goto redo1;
+ }
+ else
+ TInfoMNoff(ox+12,oy+3+which,which);
+ MouseShow();
+ }
+
+ GetButtonXY(&TINd,0,&sx,&sy);
+ if (!CheckList(sx,sy,6,1,TIDoneOn,TIDoneOff,1))
+ oktoexit++;
+
+ if (keydown[1])
+ {
+ while(keydown[1]);
+ oktoexit++;
+ }
+ }while(!oktoexit);
+
+ RestoreBackground();
+}
+
+void TInfoNon(int x,int y,int b)
+{
+ xormask=1;
+ sx=x;
+ sy=y;
+ if (!MapFileHeader->tnames[b][0])
+ print(" ");
+ else
+ fprint(MapFileHeader->tnames[b]);
+ xormask=0;
+}
+void TInfoNoff(int x,int y,int b)
+{
+ sx=x;
+ sy=y;
+ if (!MapFileHeader->tnames[b][0])
+ print(" ");
+ else
+ fprint(MapFileHeader->tnames[b]);
+}
+void TInfoMNon(int x,int y,int b)
+{
+ xormask=1;
+ sx=x;
+ sy=y;
+ if (!MapFileHeader->tmnames[b][0])
+ print(" ");
+ else
+ fprint(MapFileHeader->tmnames[b]);
+ xormask=0;
+}
+void TInfoMNoff(int x,int y,int b)
+{
+ sx=x;
+ sy=y;
+ if (!MapFileHeader->tmnames[b][0])
+ print(" ");
+ else
+ fprint(MapFileHeader->tmnames[b]);
+}
+void TIDoneOn(int x,int y)
+{
+ xormask=1;
+ sx=x;
+ sy=y;
+ print(" Done ");
+ xormask=0;
+}
+void TIDoneOff(int x,int y)
+{
+ sx=x;
+ sy=y;
+ print(" Done ");
+}
+
+////////////////////////////////////////////////////
+//
+// Create a new map!
+//
+////////////////////////////////////////////////////
+void CreateMap(int exitok)
+{
+ unsigned lwidth,lheight,i;
+ int mapnum;
+ long size;
+ char lname[16];
+
+ if ((mapnum=SelectMap(exitok,NOTCREATED,"TO CREATE"))==-1)
+ return;
+
+ InputMap(lname,&lwidth,&lheight,exitok);
+ if (!lname[0])
+ return;
+
+ RemoveUndoBuffers();
+ SaveCutBuffers();
+
+ if (MapBkgnd)
+ {
+ MMFreePtr((memptr *)&MapBkgnd);
+ MMFreePtr((memptr *)&CutBkgnd);
+ }
+ if (MapFrgnd)
+ {
+ MMFreePtr((memptr *)&MapFrgnd);
+ MMFreePtr((memptr *)&CutFrgnd);
+ }
+ if (MapInfoPl)
+ {
+ MMFreePtr((memptr *)&MapInfoPl);
+ MMFreePtr((memptr *)&CutInfoPl);
+ }
+
+ size=2L*(lwidth*lheight);
+
+ if (MapFileHeader->maptype&BPLANE)
+ {
+ MMAllocate((memptr *)&MapBkgnd,size);
+ MMAllocate((memptr *)&CutBkgnd,size);
+ for(i=0;i<lwidth*lheight;i++)
+ *(MapBkgnd+i)=*(CutBkgnd+i)=0;
+ }
+ if (MapFileHeader->maptype&FPLANE)
+ {
+ MMAllocate((memptr *)&MapFrgnd,size);
+ MMAllocate((memptr *)&CutFrgnd,size);
+ for(i=0;i<lwidth*lheight;i++)
+ *(MapFrgnd+i)=*(CutFrgnd+i)=0;
+ }
+ if (MapFileHeader->maptype&IPLANE)
+ {
+ MMAllocate((memptr *)&MapInfoPl,size);
+ MMAllocate((memptr *)&CutInfoPl,size);
+ for(i=0;i<lwidth*lheight;i++)
+ *(MapInfoPl+i)=*(CutInfoPl+i)=0;
+ }
+
+ whichmap=mapnum;
+ strcpy(MapHeader.name,lname);
+ MapHeader.width=mapwidth=lwidth;
+ MapHeader.height=mapheight=lheight;
+ strcpy(MapNames[mapnum],MapHeader.name);
+ AllocateUndoBuffers();
+ DirtyFlag=1;
+ SaveMap(0);
+ DirtyFlag=0;
+ RestoreCutBuffers();
+ SelectMode=PasteMode=xbase=ybase=0;
+ SelX1=SelX2=SelY1=SelY2=-1;
+ writeH=1;
+}
+
+
+////////////////////////////////////////////////////
+//
+// Load a map
+//
+////////////////////////////////////////////////////
+void LoadMap(int mapnum)
+{
+ unsigned long csize,size=0;
+ memptr block;
+
+ SaveCutBuffers();
+ //
+ // DEALLOCATE ALL CURRENT MAP MEMORY
+ //
+ RemoveUndoBuffers();
+
+ if (MapBkgnd)
+ {
+ MMFreePtr((memptr *)&MapBkgnd);
+ MMFreePtr((memptr *)&CutBkgnd);
+ }
+ if (MapFrgnd)
+ {
+ MMFreePtr((memptr *)&MapFrgnd);
+ MMFreePtr((memptr *)&CutFrgnd);
+ }
+ if (MapInfoPl)
+ {
+ MMFreePtr((memptr *)&MapInfoPl);
+ MMFreePtr((memptr *)&CutInfoPl);
+ }
+
+ //
+ // LOAD MAP HEADER
+ //
+ if (XMSmaps)
+ XMSmove(XMSmaps,MapFileHeader->dataoffsets[mapnum],0,(long)&MapHeader,sizeof(MapHeaderStr));
+ else
+ LoadFile(mapname,(char huge *)&MapHeader,MapFileHeader->dataoffsets[mapnum],sizeof(MapHeaderStr));
+
+ //
+ // LOAD & DECOMPRESS MAP PLANES
+ //
+ if (MapFileHeader->maptype & BPLANE)
+ {
+ if (XMSmaps)
+ XMSmove(XMSmaps,MapHeader.mapbkgndpl,0,(long)&size,2);
+ else
+ LoadFile(mapname,(char huge *)&size,MapHeader.mapbkgndpl,2);
+
+ MMAllocate((memptr *)&MapBkgnd,size);
+ MMAllocate((memptr *)&CutBkgnd,size);
+ csize=MapHeader.mapbkgndlen-2;
+ MMAllocate(&block,csize);
+
+ if (XMSmaps)
+ XMSmove(XMSmaps,MapHeader.mapbkgndpl+2,0,(long)MK_FP(block,0),csize);
+ else
+ LoadFile(mapname,MK_FP(block,0),MapHeader.mapbkgndpl+2,csize);
+
+ RLEWExpand(MK_FP(block,0),MK_FP(MapBkgnd,0),size,MapFileHeader->RLEWtag);
+ MMFreePtr(&block);
+ }
+ if (MapFileHeader->maptype & FPLANE)
+ {
+ if (XMSmaps)
+ XMSmove(XMSmaps,MapHeader.mapfrgndpl,0,(long)&size,2);
+ else
+ LoadFile(mapname,(char huge *)&size,MapHeader.mapfrgndpl,2);
+
+ MMAllocate((memptr *)&MapFrgnd,size);
+ MMAllocate((memptr *)&CutFrgnd,size);
+ csize=MapHeader.mapfrgndlen-2;
+ MMAllocate(&block,csize);
+
+ if (XMSmaps)
+ XMSmove(XMSmaps,MapHeader.mapfrgndpl+2,0,(long)MK_FP(block,0),csize);
+ else
+ LoadFile(mapname,MK_FP(block,0),MapHeader.mapfrgndpl+2,csize);
+
+ RLEWExpand(MK_FP(block,0),MK_FP(MapFrgnd,0),size,MapFileHeader->RLEWtag);
+ MMFreePtr(&block);
+ }
+ if (MapFileHeader->maptype & IPLANE)
+ {
+ if (XMSmaps)
+ XMSmove(XMSmaps,MapHeader.mapinfopl,0,(long)&size,2);
+ else
+ LoadFile(mapname,(char huge *)&size,MapHeader.mapinfopl,2);
+
+ MMAllocate((memptr *)&MapInfoPl,size);
+ MMAllocate((memptr *)&CutInfoPl,size);
+ csize=MapHeader.mapinfolen-2;
+ MMAllocate(&block,csize);
+
+ if (XMSmaps)
+ XMSmove(XMSmaps,MapHeader.mapinfopl+2,0,(long)MK_FP(block,0),csize);
+ else
+ LoadFile(mapname,MK_FP(block,0),MapHeader.mapinfopl+2,csize);
+
+ RLEWExpand(MK_FP(block,0),MK_FP(MapInfoPl,0),size,MapFileHeader->RLEWtag);
+ MMFreePtr(&block);
+ }
+
+ mapwidth=MapHeader.width;
+ mapheight=MapHeader.height;
+ strcpy(MapNames[mapnum],MapHeader.name);
+
+ AllocateUndoBuffers();
+ UndoRegion.x=-1;
+ SaveUndo(0,0,mapwidth,mapheight);
+ RestoreCutBuffers();
+
+ SelectMode=PasteMode=xbase=ybase=0;
+ SelX1=SelX2=SelY1=SelY2=-1;
+}
+
+
+////////////////////////////////////////////////////
+//
+// Select a new map!
+//
+////////////////////////////////////////////////////
+btype ClvlB[]={{"\xb",28,5,1},
+ {"\xc",28,14,1},
+ {" Exit ",12,17,1}};
+DialogDef ClvlD={" SELECT MAP",
+ 30,19,2,&ClvlB[0],NULL};
+int smbase=0;
+
+int SelectMap(int exitok,int createflg,char *title)
+{
+ MapHeaderStr TempMapHeader;
+ unsigned ox,oy,i,dx,dy;
+ int select=-1,redraw;
+
+ if (exitok)
+ {
+ ClvlD.numbuttons=3;
+ ClvlD.height=19;
+ }
+ else
+ {
+ ClvlD.numbuttons=2;
+ ClvlD.height=16;
+ }
+
+ DrawDialog(&ClvlD,1);
+ GetDialogXY(&ClvlD,&dx,&dy);
+ sy=dy+1;
+ sx=screencenterx-strlen(title)/2;
+ print(title);
+
+ dx+=3;
+ dy+=5;
+
+ MouseHide();
+ GetButtonXY(&ClvlD,0,&sx,&sy);
+ sx-=27;
+ sy-=2;
+ print("Map Name\n");
+ ox=sx+1;
+ oy=sy+1;
+ DrawBorder(sx,sy,26,11,2);
+ MouseShow();
+
+
+ do
+ {
+ int mx,my;
+
+ //
+ // DRAW MAP NAMES
+ //
+ MouseHide();
+ for (i=0;i<10;i++)
+ {
+ sy=oy+i;
+ sx=ox;
+ if (i+smbase==whichmap)
+ print("*");
+ else
+ print(" ");
+
+ printint(i+smbase);
+ print(" ");
+ sx=ox+5;
+ MNameOff(sx,sy,i);
+ }
+ MouseShow();
+ redraw=0;
+
+ do
+ {
+ GetButtonXY(&ClvlD,0,&(unsigned)mx,&(unsigned)my);
+ if (!CheckList(mx,my,1,1,UparOn,UparOff,0) || keydown[0x48])
+ {
+ MouseHide();
+ GetButtonXY(&ClvlD,0,&sx,&sy);
+ print(ClvlB[0].text);
+
+ smbase-=10;
+ if (smbase<0)
+ smbase=0;
+ redraw=1;
+ MouseShow();
+ while(keydown[0x48]);
+ continue;
+ }
+
+ GetButtonXY(&ClvlD,1,&(unsigned)mx,&(unsigned)my);
+ if (!CheckList(mx,my,1,1,DnarOn,DnarOff,0) || keydown[0x50])
+ {
+ MouseHide();
+ GetButtonXY(&ClvlD,1,&sx,&sy);
+ print(ClvlB[1].text);
+
+ smbase+=10;
+ if (smbase>90)
+ smbase=90;
+ redraw=1;
+ MouseShow();
+ while(keydown[0x50]);
+ continue;
+ }
+
+ if (exitok)
+ {
+ GetButtonXY(&ClvlD,2,&(unsigned)mx,&(unsigned)my);
+ if (!CheckList(mx,my,6,1,ExitOn,ExitOff,0))
+ {
+ RestoreBackground();
+ return -1;
+ }
+ }
+
+ if (exitok && keydown[1])
+ {
+ RestoreBackground();
+ return -1;
+ }
+
+ select=CheckList(ox+5,oy,20,10,MNameOn,MNameOff,0);
+ if (select>=0)
+ {
+ MouseHide();
+ sy=select+oy;
+ sx=ox+5;
+ MNameOff(sx,sy,select);
+ MouseShow();
+ if ((MapFileHeader->dataoffsets[select+smbase]!=-1 && createflg==NOTCREATED)||
+ (MapFileHeader->dataoffsets[select+smbase]==-1 && createflg==CREATED))
+ select=-1;
+ }
+
+ } while(!redraw && select<0);
+ } while(select<0);
+
+ RestoreBackground();
+ return select+smbase;
+}
+
+//
+// Print arrows
+//
+void DnarOn(int x,int y)
+{
+ sx=x;
+ sy=y;
+ xormask=1;
+ drawchar(sx,sy,0xc);
+ xormask=0;
+}
+void DnarOff(int x,int y)
+{
+ sx=x;
+ sy=y;
+ drawchar(sx,sy,0xc);
+}
+void UparOn(int x,int y)
+{
+ sx=x;
+ sy=y;
+ xormask=1;
+ drawchar(sx,sy,0xb);
+ xormask=0;
+}
+void UparOff(int x,int y)
+{
+ sx=x;
+ sy=y;
+ drawchar(sx,sy,0xb);
+}
+void ExitOn(int x,int y)
+{
+ sx=x;
+ sy=y;
+ xormask=1;
+ print(" Exit ");
+ xormask=0;
+}
+void ExitOff(int x,int y)
+{
+ sx=x;
+ sy=y;
+ print(" Exit ");
+}
+
+//
+// Highlight Map Name
+//
+void MNameOn(int x,int y,int i)
+{
+ xormask=1;
+ MNameOff(x,y,i);
+ xormask=0;
+}
+
+//
+// De-Highlight Map Name
+//
+void MNameOff(int x,int y,int i)
+{
+ MapHeaderStr TempMapHeader;
+
+ sx=x;
+ sy=y;
+ if (MapFileHeader->dataoffsets[i+smbase]!=-1)
+ {
+ print(" ");
+ sx=x;
+ print(MapNames[i+smbase]);
+ }
+ else
+ print("--not created yet--");
+}
+
+
+
+////////////////////////////////////////////////////
+//
+// Pick more planes for the map set
+//
+////////////////////////////////////////////////////
+btype PickPlaneb[]={{"X",1,3,1},
+ {"X",1,6,1},
+ {" Done ",1,9,2}};
+DialogDef PickPlaneD={"Which other planes\n"
+ "to enable?\n\n"
+ " Foreground\n\n\n"
+ " Information"
+ ,18,11,3,&PickPlaneb[0],NULL};
+
+int PickMorePlanes(void)
+{
+ int which;
+ char planes=7; // 1=bkgnd/2=frgnd/4=info
+
+ DrawDialog(&PickPlaneD,1);
+ do
+ {
+ which=CheckButtons(&PickPlaneD);
+ switch(which)
+ {
+ case 0:
+ RestoreBackground();
+ return 1;
+ case 1:
+ GetButtonXY(&PickPlaneD,0,&sx,&sy);
+ planes^=2;
+ MouseHide();
+ if (planes&2)
+ print("X");
+ else
+ print(" ");
+ MouseShow();
+ break;
+ case 2:
+ GetButtonXY(&PickPlaneD,1,&sx,&sy);
+ planes^=4;
+ MouseHide();
+ if (planes&4)
+ print("X");
+ else
+ print(" ");
+ MouseShow();
+ }
+ } while(which!=3);
+
+ RestoreBackground();
+ MapFileHeader->maptype=planes;
+ return 0;
+}
+
+////////////////////////////////////////////////////
+//
+// Get map dimensions
+//
+////////////////////////////////////////////////////
+btype LvlSpecb[]={{" ",1,3,1},
+ {" ",1,7,1},
+ {" ",1,11,1},
+ {" Done ",7,14,2}};
+DialogDef LvlSpec={" MAP DIMENSIONS\n"
+ " Map Name:\n\n\n\n"
+ " Map Width:\n\n\n\n"
+ " Map Height:\n",
+ 20,16,4,&LvlSpecb[0],NULL};
+
+void InputMap(char *lvlname,unsigned *levelw,unsigned *levelh,int exitok)
+{
+ unsigned butn,ok=0,nameok=0,widok=0,heightok=0,
+ ox,oy,width=0,height=0,oldwidth=0,oldheight=0;
+ char oldname[16]="",name[16]="";
+
+ MouseHide();
+ DrawDialog(&LvlSpec,1);
+ GetButtonXY(&LvlSpec,1,&sx,&sy);
+ printint(width);
+ GetButtonXY(&LvlSpec,2,&sx,&sy);
+ printint(height);
+ MouseShow();
+
+ //
+ // START INPUT IMMEDIATELY
+ //
+ butn=1;
+ goto firsttime;
+
+#pragma warn -rch
+ while (!ok)
+#pragma warn +rch
+ {
+ butn=CheckButtons(&LvlSpec);
+ if (!butn)
+ if (exitok)
+ {
+ RestoreBackground();
+ lvlname[0]=0;
+ return;
+ }
+ else
+ continue;
+
+firsttime:
+
+ xormask=0;
+ GetButtonXY(&LvlSpec,butn-1,&sx,&sy);
+ MouseHide();
+ ox=sx;
+ oy=sy;
+ print(LvlSpecb[butn-1].text);
+ sx=ox;
+ sy=oy;
+ switch(butn)
+ {
+ case 1:
+ name[0]=0;
+ if (!input(name,15))
+ {
+ strcpy(name,oldname);
+ sx=ox;
+ sy=oy;
+ print(LvlSpecb[butn-1].text);
+ }
+ strcpy(oldname,name);
+ sx=ox;
+ sy=oy;
+ if (name[0])
+ {
+ print(name);
+ nameok=1;
+ }
+ else
+ nameok=0;
+
+ if (nameok)
+ {
+ butn=2;
+ GetButtonXY(&LvlSpec,butn-1,&sx,&sy);
+ ox=sx;
+ oy=sy;
+ print(LvlSpecb[butn-1].text);
+ sx=ox;
+ sy=oy;
+ }
+ else
+ break;
+
+ case 2:
+ width=0;
+ if ((width=inputint(9))==ESCOUT)
+ {
+ widok=0;
+ width=oldwidth;
+ }
+ if (width)
+ widok=1;
+
+ oldwidth=width;
+ sx=ox;
+ sy=oy;
+ print(LvlSpecb[butn-1].text);
+ sx=ox;
+ sy=oy;
+ printint(width);
+ if (widok)
+ {
+ butn=3;
+ GetButtonXY(&LvlSpec,butn-1,&sx,&sy);
+ ox=sx;
+ oy=sy;
+ print(LvlSpecb[butn-1].text);
+ sx=ox;
+ sy=oy;
+ }
+ else
+ break;
+
+ case 3:
+ height=0;
+ if ((height=inputint(9))==ESCOUT)
+ {
+ heightok=0;
+ height=oldheight;
+ }
+ if (height)
+ heightok=1;
+
+ oldheight=height;
+ sx=ox;
+ sy=oy;
+ print(LvlSpecb[butn-1].text);
+ sx=ox;
+ sy=oy;
+ printint(height);
+ break;
+
+ case 4:
+ if (2L*height*width>0x10000) // TOO BIG! TRIM IT!
+ {
+ errsound();
+ errsound();
+ widok=heightok=0;
+ break;
+ }
+ if (nameok && widok && heightok)
+ ok=1;
+ }
+
+ MouseShow();
+ }
+
+ RestoreBackground();
+
+ *levelw=width;
+ *levelh=height;
+ strcpy(lvlname,name);
+}
+
+////////////////////////////////////////////////////
+//
+// Item - Input INFOPLANE value
+//
+////////////////////////////////////////////////////
+btype EnterIVb={" ",1,3,1};
+DialogDef EnterIV={"Enter a value for\nthe INFO plane:\n\n\n",18,5,1,&EnterIVb,NULL};
+
+void Item_InputInfoplane(void)
+{
+ unsigned val;
+
+
+ if (TsearchMode || BfillMode || FillMode || PasteMode || SelectMode)
+ return;
+
+ clearkeys();
+ DrawDialog(&EnterIV,1);
+ MouseHide();
+ GetButtonXY(&EnterIV,0,&sx,&sy);
+ if ((val=inputint(9))!=ESCOUT)
+ whichi=val+tilenum;
+ RestoreBackground();
+ DrawInfoBar();
+ MouseShow();
+}
+
+////////////////////////////////////////////////////
+//
+// Item - Select Tile
+//
+////////////////////////////////////////////////////
+void Item_SelectTile(void)
+{
+ SelectTiles(0);
+}
+
+////////////////////////////////////////////////////
+//
+// Item - Block Fill
+//
+////////////////////////////////////////////////////
+void Item_BlockFill(void)
+{
+ ZeroModes();
+ BfillMode=1;
+ DrawInfoBar();
+}
+
+//
+// DO THE ACTUAL BLOCK FILL
+//
+void DoBlockFill(void)
+{
+ unsigned loc,i,j,ctrl=0,newt,newm,newi,tton,tmon,tion,from;
+
+ if (keydown[0x1d])
+ ctrl++;
+
+ MouseHide();
+
+ CopyUndoRegion();
+ UndoRegion.x=SelX1;
+ UndoRegion.y=SelY1;
+ UndoRegion.w=SelX2-SelX1+1;
+ UndoRegion.h=SelY2-SelY1+1;
+
+ if (ctrl)
+ {
+ for (j=SelY1;j<=SelY2;j++)
+ for (i=SelX1;i<=SelX2;i++)
+ {
+ loc=j*mapwidth+i;
+ from=(TileCopy.y+((j-SelY1)%TileCopy.h))*mapwidth+
+ TileCopy.x+((i-SelX1)%TileCopy.w);
+
+ switch(TileCopy.MapOrTileSelect)
+ {
+ case 0: // COPY BUFFER
+ tton=TileCopy.PlanesCopied&BPLANE;
+ tmon=TileCopy.PlanesCopied&FPLANE;
+ tion=TileCopy.PlanesCopied&IPLANE;
+
+ newt=CutBkgnd[from];
+ newm=CutFrgnd[from];
+ newi=CutInfoPl[from];
+
+ break;
+ case 1: // TILES
+ tton=1;
+ tmon=tion=0;
+
+ newt=((j%TileCopy.h)+TileCopy.y)*selectcols+
+ TileCopy.x+(i%TileCopy.w);
+ if (XMSlookup[newt]<0)
+ tton=0;
+ break;
+ case 2: // MASKED
+ tton=tion=0;
+ tmon=1;
+
+ newm=((j%TileCopy.h)+TileCopy.y)*selectcols+
+ TileCopy.x+(i%TileCopy.w)+tilenum+maxiconrows*selectcols;
+ if (XMSlookup[newm]<0)
+ tmon=0;
+ else
+ newm-=tilenum;
+ }
+
+ if (tton)
+ *(MapBkgnd+loc)=newt;
+ if (tmon)
+ *(MapFrgnd+loc)=newm;
+ if (tion)
+ *(MapInfoPl+loc)=newi;
+
+ if (j>=ybase && j<ybase+screenh &&
+ i>=xbase && i<xbase+screenw)
+ {
+ int tempt,tempm,tempi;
+
+ tempt=*(MapBkgnd+loc);
+ tempm=*(MapFrgnd+loc)+tilenum;
+ tempi=*(MapInfoPl+loc)+tilenum;
+
+ CombineTiles(viewton?tempt:-BkgndColor,viewmon*tempm,viewion*tempi,tsize);
+ if (GridMode)
+ Overlay(tsize);
+ DrawTile((i-xbase)<<(tsize-1),((j-ybase)<<(tsize+2))+8,tsize);
+ }
+ }
+ }
+ else
+ for (j=SelY1;j<=SelY2;j++)
+ for (i=SelX1;i<=SelX2;i++)
+ {
+ loc=j*mapwidth+i;
+
+ if (planeton)
+ *(MapBkgnd+loc)=whicht;
+ if (planemon)
+ *(MapFrgnd+loc)=whichtm-tilenum;
+ if (planeion)
+ *(MapInfoPl+loc)=whichi-tilenum;
+
+ if (j>=ybase && j<ybase+screenh &&
+ i>=xbase && i<xbase+screenw)
+ {
+ int tempt,tempm,tempi;
+
+ tempt=*(MapBkgnd+loc);
+ tempm=*(MapFrgnd+loc)+tilenum;
+ tempi=*(MapInfoPl+loc)+tilenum;
+
+ CombineTiles(viewton?tempt:-BkgndColor,viewmon*tempm,viewion*tempi,tsize);
+ if (GridMode)
+ Overlay(tsize);
+ DrawTile((i-xbase)<<(tsize-1),((j-ybase)<<(tsize+2))+8,tsize);
+ }
+ }
+
+ DirtyFlag=1;
+ MouseShow();
+}
+
+
+////////////////////////////////////////////////////
+//
+// Remove the XMS undo buffers
+//
+////////////////////////////////////////////////////
+void RemoveUndoBuffers(void)
+{
+ if (XMSundoB)
+ XMSFreeMem(XMSundoB);
+ if (XMSundoF)
+ XMSFreeMem(XMSundoF);
+ if (XMSundoI)
+ XMSFreeMem(XMSundoI);
+
+ XMSundoB=XMSundoF=XMSundoI=0;
+}
+
+
+////////////////////////////////////////////////////
+//
+// Allocate XMS undo buffers
+// NOTE: uses "mapwidth" & "mapheight"
+//
+////////////////////////////////////////////////////
+void AllocateUndoBuffers(void)
+{
+ long size=2L*mapwidth*mapheight;
+
+ if (MapFileHeader->maptype&BPLANE)
+ XMSundoB=XMSAllocate(size);
+ if (MapFileHeader->maptype&FPLANE)
+ XMSundoF=XMSAllocate(size);
+ if (MapFileHeader->maptype&IPLANE)
+ XMSundoI=XMSAllocate(size);
+}
+
+
+////////////////////////////////////////////////////
+//
+// Save Undo buffers
+//
+////////////////////////////////////////////////////
+void SaveUndo(int x,int y,int w,int h)
+{
+ unsigned hsize=w*2,j;
+
+ for (j=y;j<y+h;j++)
+ {
+ unsigned off=2*(j*mapwidth+x);
+
+ if (MapFileHeader->maptype&BPLANE)
+ XMSmove(0,(long)MK_FP(MapBkgnd,off),XMSundoB,off,hsize);
+ if (MapFileHeader->maptype&FPLANE)
+ XMSmove(0,(long)MK_FP(MapFrgnd,off),XMSundoF,off,hsize);
+ if (MapFileHeader->maptype&IPLANE)
+ XMSmove(0,(long)MK_FP(MapInfoPl,off),XMSundoI,off,hsize);
+ }
+}
+
+
+////////////////////////////////////////////////////
+//
+// Restore Undo buffers
+//
+////////////////////////////////////////////////////
+void RestoreUndo(void)
+{
+ long size=2L*UndoRegion.w;
+ unsigned j;
+
+ sound(2000);
+ for (j=UndoRegion.y;j<UndoRegion.y+UndoRegion.h;j++)
+ {
+ unsigned loc=2*(j*mapwidth+UndoRegion.x);
+
+ if (MapFileHeader->maptype&BPLANE)
+ XMSmove(XMSundoB,loc,0,(long)MK_FP(MapBkgnd,loc),size);
+ if (MapFileHeader->maptype&FPLANE)
+ XMSmove(XMSundoF,loc,0,(long)MK_FP(MapFrgnd,loc),size);
+ if (MapFileHeader->maptype&IPLANE)
+ XMSmove(XMSundoI,loc,0,(long)MK_FP(MapInfoPl,loc),size);
+ }
+
+ nosound();
+}
+
+
+////////////////////////////////////////////////////
+//
+// Copy the current UNDO region to the undo buffers
+//
+////////////////////////////////////////////////////
+void CopyUndoRegion(void)
+{
+ if (UndoRegion.x==-1)
+ return;
+
+ SaveUndo(UndoRegion.x,UndoRegion.y,UndoRegion.w,UndoRegion.h);
+}
+
+
+////////////////////////////////////////////////////
+//
+// Item - Undo
+//
+////////////////////////////////////////////////////
+void Item_Undo(void)
+{
+ if (UndoRegion.x==-1)
+ {
+ ErrDialog("You don't have anything to UNDO!"," Oh, yeah. ");
+ return;
+ }
+
+ RestoreUndo();
+ DrawMap();
+}
+
+
+////////////////////////////////////////////////////
+//
+// Item - Tile Search!
+//
+////////////////////////////////////////////////////
+void Item_TileSearch(void)
+{
+ int num=planeton+planemon+planeion;
+
+ ZeroModes();
+ if (num>1)
+ {
+ ErrDialog("TILE SEARCH will only work\n"
+ "with ONE active plane! Make\n"
+ "sure that the tile you're\n"
+ "searching for is selected!"," OK ");
+ return;
+ }
+
+ TsearchMode=1;
+ DrawInfoBar();
+ DrawMap();
+}
+
+////////////////////////////////////////////////////
+//
+// Item - Launch
+//
+////////////////////////////////////////////////////
+char tempparm[40];
+
+void Item_Launch(void)
+{
+ TempStruct LaunchInfo;
+ char ename[64],*envstr[15],temp[40],temp1[40],temp2[40],tiname[14]="TEDINFO.TMP",i,j;
+ long size;
+ int rottlaunch;
+ int startp;
+ unsigned mx,my;
+
+
+ rottlaunch=0;
+ if (!TEDInfo->launchname[0])
+ {
+ ErrDialog("You didn't specify a launching\n"
+ "name on the command line? What\n"
+ "do I launch, Einstein? Geez!"," What a goober. ");
+ return;
+ }
+
+ //
+ // Save the handles for all XMS memory so we don't
+ // have to re-install this shit!
+ //
+ TEDInfo->OldCgaXMS=CgaXMS;
+ TEDInfo->OldEgaXMS=EgaXMS;
+ TEDInfo->OldVgaXMS=VgaXMS;
+
+ TEDInfo->OldCgaXMSsize=CgaXMSsize;
+ TEDInfo->OldEgaXMSsize=EgaXMSsize;
+ TEDInfo->OldVgaXMSsize=VgaXMSsize;
+
+ size=4L*(tilenum+tilemnum);
+ if (CgaXMS)
+ {
+ if (1024L*XMSTotalFree()<size)
+ {
+ XMSFreeMem(CgaXMS);
+ TEDInfo->OldCgaXMS=TEDInfo->OldCgaXMSsize=0;
+ }
+ else
+ {
+ TEDInfo->CgaXMSlook=XMSAllocate(size);
+ XMSmove(0,(long)MK_FP(CgaXMSlookup,0),TEDInfo->CgaXMSlook,0,size);
+ }
+ }
+
+ if (EgaXMS)
+ {
+ if (1024L*XMSTotalFree()<size)
+ {
+ XMSFreeMem(EgaXMS);
+ TEDInfo->OldEgaXMS=TEDInfo->OldEgaXMSsize=0;
+ }
+ else
+ {
+ TEDInfo->EgaXMSlook=XMSAllocate(size);
+ XMSmove(0,(long)MK_FP(EgaXMSlookup,0),TEDInfo->EgaXMSlook,0,size);
+ }
+ }
+
+ if (VgaXMS)
+ {
+ if (1024L*XMSTotalFree()<size)
+ {
+ XMSFreeMem(VgaXMS);
+ TEDInfo->OldVgaXMS=TEDInfo->OldVgaXMSsize=0;
+ }
+ else
+ {
+ TEDInfo->VgaXMSlook=XMSAllocate(size);
+ XMSmove(0,(long)MK_FP(VgaXMSlookup,0),TEDInfo->VgaXMSlook,0,size);
+ }
+ }
+
+ //
+ // SAVE CURRENT VIDEOMODE FOR LAUNCH RETURN
+ //
+ LaunchInfo.lastmode=videomode;
+ strcpy(LaunchInfo.ext,ext);
+ SaveFile(tiname,(char huge *)&LaunchInfo,0,sizeof(TempStruct));
+
+ //
+ // ICON CHANGE ON LAUNCH?
+ //
+ if (keydown[0x2A])
+ {
+ rottlaunch=1;
+ startp=5;
+ mx=xbase+(pixelx>>(tsize+2));
+ my=ybase+((pixely-8)>>(tsize+2));
+ }
+ else
+ startp=3;
+ if (pixely>=8 && pixely<infoy*8 && TEDInfo->permicon
+ && MapFileHeader->maptype&IPLANE && !usingbat && keydown[0x1d])
+ {
+ unsigned i,j;
+
+ mx=xbase+(pixelx>>(tsize+2));
+ my=ybase+((pixely-8)>>(tsize+2));
+
+ for (j=0;j<mapheight;j++)
+ for (i=0;i<mapwidth;i++)
+ if (MapInfoPl[j*mapwidth+i]==TEDInfo->permicon)
+ {
+ MapInfoPl[j*mapwidth+i]=0;
+ TEDInfo->lastx=i;
+ TEDInfo->lasty=j;
+ break;
+ }
+
+ MapInfoPl[my*mapwidth+mx]=TEDInfo->permicon;
+ DrawMap();
+ DirtyFlag=1;
+ }
+
+ TEDInfo->oscrx=xbase;
+ TEDInfo->oscry=ybase;
+ TEDInfo->pflags=((planeton&1)<<6)|
+ ((planemon&1)<<5)|
+ ((planeion&1)<<4)|
+ ((viewton&1)<<2)|
+ ((viewmon&1)<<1)|
+ (viewion&1);
+
+ _fmemcpy((void far *)TEDInfo->parmstring,(void far *)parmstring,64);
+
+ Item_SaveMap();
+ SaveTEDInfo();
+ SaveOutputHeader();
+
+ if (XMSmaps)
+ XMSFreeMem(XMSmaps);
+
+ strcpy(temp,"Launching ");
+ _fstrcat((char far *)temp,(char far *)TEDInfo->launchname);
+ strcat(temp,"...");
+ ErrDialog(temp,"");
+ clearkeys();
+ nosound();
+ MouseHide();
+
+ _fmemcpy((char far *)ename,(char far *)TEDInfo->launchname,14);
+
+ envstr[0] = ename;
+ envstr[1] = "/TEDLEVEL";
+ itoa(whichmap,temp,10);
+ envstr[2] = temp;
+ if (rottlaunch)
+ {
+ itoa(mx,temp1,10);
+ envstr[3] = temp1;
+ itoa(my,temp2,10);
+ envstr[4] = temp2;
+ }
+ //
+ // CHOP UP THE PARMSTRING FOR 'EXECV'
+ //
+ strcpy(tempparm,parmstring);
+ envstr[startp]=&tempparm[0];
+ for(j=startp+1,i=0;i<strlen(tempparm);i++)
+ if (tempparm[i]==' ')
+ {
+ envstr[j]=&tempparm[i+1];
+ tempparm[i]=0;
+ j++;
+ }
+ envstr[j]=0;
+
+ RemoveUndoBuffers();
+ ShutdownKBD();
+
+ //
+ // ARE WE EXITING WITH A BATCH FILE?
+ //
+
+ if (usingbat)
+ {
+ setvideo(TEXT);
+ exit(whichmap+2);
+ }
+
+ fcloseall();
+ MMShutdown();
+ execv(ename,envstr);
+
+ SetupKBD();
+ RestoreBackground();
+ MouseShow();
+ ErrDialog("LAUNCHing failed. TED5 will\n"
+ "now restart."," I have gubs ");
+ ShutdownKBD();
+ execlp("TED5.EXE","TED5.EXE","/LAUNCH",NULL);
+
+ printf("Couldn't find TED5 for some reason!");
+ exit(1);
+}
+
+
+////////////////////////////////////////////////////
+//
+// Item - TILEINFO Copy
+//
+////////////////////////////////////////////////////
+DialogDef TICd=
+{"TILEINFOM Copy Kludge\n\n"
+ "From:\n"
+ " To:\n"
+ "Rows:",22,6};
+
+
+void Item_TINFOCopy(void)
+{
+ unsigned dx,dy,i,from,to,amt;
+ memptr block;
+
+
+ MouseHide();
+ DrawDialog(&TICd,1);
+ GetDialogXY(&TICd,&dx,&dy);
+
+
+ sx=dx+5;
+ sy=dy+2;
+ from=inputint(9);
+ if (from==ESCOUT)
+ {
+ RestoreBackground();
+ MouseShow();
+ return;
+ }
+
+
+ sx=dx+5;
+ sy=dy+3;
+ to=inputint(9);
+ if (to==ESCOUT)
+ {
+ RestoreBackground();
+ MouseShow();
+ return;
+ }
+
+
+ sx=dx+5;
+ sy=dy+4;
+ amt=inputint(9);
+ if (amt==ESCOUT)
+ {
+ RestoreBackground();
+ MouseShow();
+ return;
+ }
+ amt*=18;
+
+
+ MMAllocate(&block,amt);
+
+ for (i=0;i<numtmplanes;i++)
+ {
+ movedata((unsigned)TMinfo[i],from,(unsigned)block,0,amt);
+ movedata((unsigned)block,0,(unsigned)TMinfo[i],to,amt);
+ }
+
+ MMFreePtr(&block);
+ RestoreBackground();
+ DirtyFlag=writeH=1;
+
+
+ MouseShow();
+}