//////////////////////////////////////////////////// //////////////////////////////////////////////////// // // 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;itileinfooff[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;itileinfomoff[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()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 (size0); 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 (size0); 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=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;jtnames[0])), sizeof(OutputHeadStr)); for (i=1;itnames[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;itmnames[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;itileinfooff[i]=fsize; // THIS DOESN'T REALLY MATTER fsize+=tilenum; // ....YET! for(j=0;jtileinfomoff[i]=fsize; fsize+=tilemnum; for(j=0;jnumtplanes=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=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 (whichtnames[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;imaptype&FPLANE) { MMAllocate((memptr *)&MapFrgnd,size); MMAllocate((memptr *)&CutFrgnd,size); for(i=0;imaptype&IPLANE) { MMAllocate((memptr *)&MapInfoPl,size); MMAllocate((memptr *)&CutInfoPl,size); for(i=0;idataoffsets[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=xbase && i=ybase && j=xbase && imaptype&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;jmaptype&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;jmaptype&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()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()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()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 && pixelypermicon && MapFileHeader->maptype&IPLANE && !usingbat && keydown[0x1d]) { unsigned i,j; mx=xbase+(pixelx>>(tsize+2)); my=ybase+((pixely-8)>>(tsize+2)); for (j=0;jpermicon) { 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