//////////////////////////////////////////////////// // // TED 5 // MultiVideo mode, MultiTile size, MultiMap editor // by John Romero (C) 1991 Id Software // // Development Log: // ------------------------------------------------- // Mar 19 91 - Starting this thing! Getting it to // compile with the JHUFF and MEM stuff. // // Mar 20 91 - Got the whole deal compiling and wrote // the EGA drawchar routine and got most of // Dialogs written! // // Mar 25 91 - Forgot some days in there! Got the XMS // stuff going and started the big initialization // part. Past init will be lots easier! // // Mar 30 91 - Got map selection and dimensioning and // allocation done. Added more MENU abilities to // allow more flexible dialogs. // // Apr 7 91 - Got project initialization done. Got // tiles into XMS. Wrote XMS routines for all // memory functions needed. // // Apr 12 91 - FINALLY got the maps loading and saving // correctly - NO THANKS TO MR.C OVER THERE! You // see, he can't remember whether his expansion // routines use the compressed or expanded length // and that was causing me quite a problem. Got // it solved and the map shuffling shit works // PERFECTLY now! Got tile select in, map stats, // and other stuff... // // Apr 19 91 - Got all 3 planes working (drawing,etc.) // TileSelect screens jam...lots of little options // thrown in... !!! I got my '75 Cougar !!! // // Apr 25 91 - Got map dimension changing done! Fixed // some small bugs...had a WHOPPER of a fucking // bug today ... I was overwriting the stack // when the first background save happened. I'm SURE // I allocated enough memory -- I don't know... // // Apr 27 91 - Map Edge Select works (for Copy) & now I // draw a frame around the entire region. // // May 01 91 - Added a nice feature - retaining the Copy // buffer wherever it may get toasted. Used XMS so // I didn't chew mainmem. Also made it so you can // turn the plane READ/WRITEs ON/OFF (obvious advantage). // Got Copy/Paste from everywhere with FloatingPaste! // // May 03 91 - Got entering values for infoplane stuff & all // that shit encompasses. Trying to get a cursor drawn // (with backgrnd save/restore) in CGA & EGA3 modes. // Wish me luck! ... FUCK IT! I removed EGA3 mode -- it // was too much shit & kludgery to get a cursor going. // // May 08 91 - Well! Let's see...I got Huffman map compression // done; wrote a MakeOBJ function that can be used within // the Memory Manager or Standard Borland C. Added .OBJ // generation to IGRAB. Started the function to generate // graphic map dumps. Modified the MapHeader stuff more // when John needed "extras". // // May 09 91 - Finished ILBM & Apple Preferred map dumps! // Fixed a couple hidden bugs, made some things nicer, // started on Flood Fill... // // May 11 91 - Got the TILEINFO/M stuff structured and loading // and saving (with compression). Putting all the "hidden" // commands in the menus... // // May 13 91 - Stuck in a PROJECT SELECT option (for the Keen2 // trilogy, it'll be nice). // // May 16 91 - Got all of TILEINFO stuff finished. Tom and // Jason's first day! Tom BETAed IGRAB & TED5 big time. // Had to basically dump the GraphHeaderStr and just // make the ?GAHEAD.ext file all dataoffsets! (The simpler, // the better!) // // May 19 91 - Almost got the Flood Fill mode working...Tom // started drawing maps a little early & now I need to add // a little kludge-fix to reformat his old maps... // // May 22 91 - Got AWESOME UNDO working ... fixed the nagging little // paste/scrolling bug fixed (separated the PasteErase // & PasteDraw routines) ... finished Block Fill ... fixed // the floating paste/tile showthru bug ... // // May 27 91 - Basically finished up. Tom is BETAing now. I need // to make SelectMap accept the arrows & make an array for // the map names instead of the sorry way I'm doing it now. // // Jun 2 91 - Got level launching working! Been working on // TED5 and IGRAB docs and MUSE most of the time. // // Jun 18 91 - v0.13 because John C.'s system didn't have // the SCmapmask set to 15 in CopyEGA! // // Jun 20 91 - v0.14: It's annoying to LAUNCH the game and come // back at the top-left corner! // // Jun 26 91 - v0.17: Made LAUNCH with ICON CHANGE ctrl-alt-L // because Tomshit was having problems...adding Unused Tile // Scan...fixing a couple minor Tom-irritants... // // Jul 12 91 - v0.23: Made VGA & CGA work! Fixed a small // bug with plane-on starting...added a GridMode for the // FloatingPaste...XMS Map-Cache...now saves the Launchname // in TEDINFO? so user program doesn't need to send anything // back but /LAUNCHED...finally fixed nagging FloatingPaste // multi-plane viewing bug... // // Jul 19 91 - v0.24: Changed TEDINFO structure and added GFXINFO // to IGRAB. Got most all bugs out...lowercase input now... // // Jul 23 91 - v0.26: Only write out .H if it needs to...got the // SnapPaste feature in that Tom wanted... // // Aug 08 91 - v0.28: I can't believe this shit! Mr. Tom decided // to enter the value "0xF00D" into the map, which was my secret // value for passing an ESC press back from "inputint". I made // it a #define now! // // Aug 09 91 - v0.29: I FUCKING FRIED THE LIB_A.ASM & LIB.C FILES! // THESE USED TO HOLD TED5'S TILE-DRAWING AND CGA/VGA ROUTINES! // AAAARRRRGGGG!!!! Trying to recontruct the program. It'll // take a bit (I was trying to fix a bug in EditMapNames). // // Aug 14 91 - v0.30: Just got finished fixing the FRIED SOURCE HELL! // // Aug 16 91 - v0.31: Heh heh, I added the ViewMap function! // // Aug 19 91 - v0.32: Added the MapImport function and it works! YES! // // Aug 22-23 - v0.35: Fixed a WHOLE BUNCH of little things and added // some cool features like easier TILEINFO entering, default // Import drive, F3 to toggle Paste Overlay, etc. Very nice now. // // Aug 24 91 - v0.38: Fixed a bug in passing multiple command-line // parameters to LAUNCHed program. Let user enter new parms and // a new launch name while in TED5. Added the CarmackCompression // and trashed the Huffman shit. // // Sep 07 91 - v0.40: Only ViewMap planes viewable instead of all; flag // currently loaded map in SelectMap dialog; check NumIconRows for // a bogus value for old TED5 compatibility; show map dimensions in // ChangeMapEdges dialog; CTRL-ALT-arrows will go to map edges. // // Sep 12 91 - v0.41: Let user PERMANENTLY change the Launch icon. Also, // the plane flags are always saved! // // Sep 27 91 - v0.43: Added REVIEW_MAP function. Fixed a hard-to-find bug // in the BlockFill-with-pattern function. // // Sep 29 91 - v0.44: Fixed small annoying bug w/Flood-fill w/pattern. // // Oct 12 91 - v0.45: Added the PrintReport feature after Carmacizing // all the maps. // // Nov 24 91 - v0.48: Saving the Import Path, added TILEINFOM copying // from one area to another, getting rid of the "turning the plane // viewing ON automatically sets it for writing." // // May 22 92 - v0.49: Added graphics-select switch to get rid of a dialog. // // Oct 20 95 - v0.50: Fixed EGA scrolling bug, added screensaver which comes // on automatically after 2 minutes. Timelimit adjustable // through TIMELIMIT command line MED // //////////////////////////////////////////////////// #include "ted5.h" #pragma hdrstop extern unsigned _stklen=0x2000; //////////////////////////////////////////////////// // // Variables // //////////////////////////////////////////////////// extern char far TEDCHAR,far VGAPAL,tdata; extern unsigned doubled[256]; UndoStr UndoRegion; CopyStr TileCopy; MapFileHeaderStr _seg *MapFileHeader; char _seg *Tinfo[10],_seg *TMinfo[10],_seg *GraphHeader; long _seg *XMSlookup,_seg *EgaXMSlookup,_seg *CgaXMSlookup,_seg *VgaXMSlookup; int _seg *MapBkgnd,_seg *MapFrgnd,_seg *MapInfoPl, _seg *CutBkgnd,_seg *CutFrgnd,_seg *CutInfoPl; MapHeaderStr MapHeader; TempStruct LaunchInfo; InfoStruct _seg *TEDInfo; GfxStruct _seg *GFXInfo; video lastvideo,videomode; screentype whichscreen=TILES; VMapStr VMapData; char launchname[64],ext[4],format[2],projname[64],mapname[64],planes, infoname[64],mapheadname[64],MapNames[100][16],parmstring[64]; char SM_name[64],SM_loadname[64],BkgndColor,GfxToUse; unsigned temp,whichmap,numtplanes,tilenum,tilemnum,numtmplanes,left, DirtyFlag,tilelen,tilemlen,whicht,whichtm,whichi, tsize,infoy,infomaxw,mapwidth,mapheight,screenw,usingbat, screenh,planeton,planemon,planeion,maxiconrows,lasticon,firsticon, viewton,viewmon,viewion,XMSundoB,XMSundoF,XMSundoI,launched, XMSmaps,EgaXMS,CgaXMS,VgaXMS,xmshandle,GridMode,SnapMode,snapx, snapy,snapxsize,snapysize,writeH,NoAbout,F3_flag; int tilebase=0,tilembase=0,infobaron=1,xbase,ybase,scrnbot,scrnrgt, FillMode=0,PasteMode=0,SelectMode=0,SelX1=-1,SelY1=-1,PasteOK=0,SelX2=-1, SelY2=-1,pixelx,pixely,selectcols,px,py,lastmap=-1,TIybase,TIymbase,TIxbase, TIxmbase,BfillMode,Plotting,TsearchMode,NoXMSFlag; long CgaXMSsize,EgaXMSsize,VgaXMSsize; long tics, tictime=1092L*2L; // // harderr-called routine // int ignore(void) { hardresume(0); return 0; } //////////////////////////////////////////////////// // // Start of The Beast From Hell // //////////////////////////////////////////////////// void main(void) { ParseCmdline(); SetupKBD(); MMStartup(); setvideo(EGA1); lastvideo=EGA1; InitTed5(); harderr(ignore); tics=biostime(0,0); DeskEventLoop(HandleEvent,Continuous); } //////////////////////////////////////////////////// // // Parse the commandline // //////////////////////////////////////////////////// void ParseCmdline(void) { int i; for (i=1;i<_argc;i++) { _argv[i]=strupr(_argv[i]); if (_argv[i][0]=='-' || _argv[i][0]=='/') _argv[i]++; if (!strcmp(_argv[i],"?")) { printf(TITLESTR" by John Romero (C) 1991 Id Software, Inc.\n\n"); printf("Command Line parameters:\n"); printf("/? : gets this stuff\n"); printf("/EXT=??? : set the project extension\n"); printf(" : set the Launch filename\n"); printf("/PARMS= : set parms to Launch with\n"); printf("/NOXMSMAPS : don't cache maps in XMS\n"); printf("/GFX=??? : set gfx to use - E,C,V\n"); printf("/TIME=??? : half-minutes until screenblanker (default 2 minutes)\n"); exit(0); } else if (!strncmp(_argv[i],"EXT=",4)) strcpy(ext,&_argv[i][4]); else if (!strncmp(_argv[i],"GFX=",4)) GfxToUse = _argv[i][4]; else if (!strcmp(_argv[i],"LAUNCH")) launched=1; else if (!strcmp(_argv[i],"BAT")) usingbat=1; else if (!strncmp(_argv[i],"PARMS=",6)) strcpy(parmstring,&_argv[i][6]); else if (!strncmp(_argv[i],"TIME=",5)) tictime=(atol(&_argv[i][5]))*546L; else if (!strcmp(_argv[i],"NOXMSMAPS")) NoXMSFlag=1; else if (!strcmp(_argv[i],"NOABOUT")) NoAbout=1; else strcpy(launchname,_argv[i]); } } //////////////////////////////////////////////////// // // Event handler - called when button is pressed // outside menu bar // //////////////////////////////////////////////////// void HandleEvent(void) { int pixelx,pixely,mx,my,b0,b1; unsigned loc; b0=MouseButton()&1; b1=(MouseButton()>>1)&1; MouseCoords(&mx,&my); pixely=my; pixelx=mx; // // PLOT OR PICK-UP TILE // if (my>=8 && my>(tsize+2)); my=ybase+((my-8)>>(tsize+2)); loc=my*mapwidth+mx; if (mx>=mapwidth || my>=mapheight) errsound(); else { if (b1) { // // SELECT BOTTOM-RIGHT EDGE // if (SelectMode || BfillMode) { SelX2=mx; SelY2=my; if ((SelX1==-1 && SelY1==-1) || (SelX2>1); nosound(); } if (b0) { // // SELECT TOP-LEFT EDGE // if (SelectMode || BfillMode) { SelX1=mx; SelY1=my; if ((SelX2==-1 && SelY2==-1) || (SelX1>SelX2 || SelY1>SelY2)) { SelX2=mx; SelY2=my; } DrawMap(); sound(2000); while(MouseButton()); } // // FLOOD FILL! // else if (FillMode) { while(MouseButton()); DoFloodFill(mx,my,0); } // // PASTE A CHUNK O' TILES/MAP // else if (PasteMode) { if (TileCopy.MapOrTileSelect) // TILE-SELECT AREA? { int i,j; if (SnapMode) { mx=(mx/snapxsize)*snapxsize+snapx; my=(my/snapysize)*snapysize+snapy; } if (mx+TileCopy.w>mapwidth || my+TileCopy.h>mapheight) sound(500); else { CopyUndoRegion(); UndoRegion.x=mx; UndoRegion.y=my; UndoRegion.w=TileCopy.w; UndoRegion.h=TileCopy.h; sound(500); switch(TileCopy.MapOrTileSelect) { case 1: // TILES for (j=0;jUndoRegion.x+UndoRegion.w) UndoRegion.w=mx-UndoRegion.x+1; if (my+1>UndoRegion.y+UndoRegion.h) UndoRegion.h=my-UndoRegion.y+1; if (planeton) *(MapBkgnd+loc)=whicht; if (planemon) *(MapFrgnd+loc)=whichtm-tilenum; if (planeion) *(MapInfoPl+loc)=whichi-tilenum; oldt=MapBkgnd[loc]; oldm=MapFrgnd[loc]+tilenum; oldi=MapInfoPl[loc]+tilenum; CombineTiles(viewton?oldt:-BkgndColor,viewmon*oldm,oldi*viewion,tsize); if (GridMode) Overlay(tsize); MouseHide(); DrawTile((mx-xbase)<<(tsize-1),(my-ybase)*(4<infoy*8) { if (pixelx<7*8) SelectTiles(1); else if (pixelx<8*14 && tilemnum) SelectTiles(2); else if (pixelx<8*20 && tilemnum) SelectTiles(3); } } #define PEL_WRITE_ADR 0x3c8 #define PEL_READ_ADR 0x3c7 #define PEL_DATA 0x3c9 #define PEL_MASK 0x3c6 void ScreenBlank ( void ) { int done; int x; int y; int r; int g; int b; int c; int oldx,oldy; int i, j; int xdir,ydir; int cury; int size; int type; struct { int x,y; } snake[256]; unsigned char far * screen=(unsigned char far *)0xa0000000l; randomize(); _AX=0x13; asm int 10h done=0; size=random(10)+2; clearkeys(); for (i=255;i>=0;i--) { snake[i].x=160; snake[i].y=100; } type=random(11); r=random(200)+56; g=random(200)+56; b=random(200)+56; outp (PEL_WRITE_ADR,0); for (i=0;i<=255;i++) { outp (PEL_DATA, (unsigned char)((i*r)>>10)); outp (PEL_DATA, (unsigned char)((i*g)>>10)); outp (PEL_DATA, (unsigned char)((i*b)>>10)); } xdir=0; while (!xdir) xdir=random(size<<1)-size; ydir=0; while (!ydir) ydir=random(size<<1)-size; while (!done) { if ((random(100)-80)>0) { xdir+=random(3)-1; ydir+=random(3)-1; } for (i=255;i>0;i--) snake[i]=snake[i-1]; snake[0].x+=xdir; snake[0].y+=ydir; if ((snake[0].x320-(size+1))) { xdir=-xdir; snake[0].x+=xdir<<1; } else if (abs(xdir)>size-1) xdir=-(xdir>>1); if ((snake[0].y200-(size+1))) { ydir=-ydir; snake[0].y+=ydir<<1; } else if (abs(ydir)>size-1) ydir=-(ydir>>1); for (x=255;x>=0;x--) { if (type<7) { for (j=snake[x].y,cury=320*snake[x].y;jtictime) { MouseHide(); ScreenBlank(); clearkeys(); videomode=lastvideo; Item_ModeSwitch(); RedrawDesktop(); DrawMap(); DrawInfoBar(); MouseShow(); tics=biostime(0,0); } oldx=pixelx; oldy=pixely; MouseCoords(&pixelx,&pixely); if ((oldx!=pixelx) || (oldy!=pixely)) { tics=biostime(0,0); PrintCoords(); } if (!MouseButton()) Plotting=0; // // PLANE "WRITE" SELECTION // if (keydown[2] && viewton) { planeton^=1; DrawInfoBar(); DrawMap(); PrintCoords(); tics=biostime(0,0); while(keydown[2]); } if (keydown[3] && tilemnum && (MapFileHeader->maptype&FPLANE) && viewmon) { planemon^=1; DrawInfoBar(); DrawMap(); PrintCoords(); tics=biostime(0,0); while(keydown[3]); } if (keydown[4] && (MapFileHeader->maptype&IPLANE) && viewion) { planeion^=1; DrawInfoBar(); DrawMap(); PrintCoords(); tics=biostime(0,0); while(keydown[4]); } // // PLANE "VIEW" SELECTION // if (keydown[5]) { viewton^=1; if (!viewton) planeton=0; DrawInfoBar(); DrawMap(); PrintCoords(); tics=biostime(0,0); while(keydown[5]); } if (keydown[6] && tilemnum && (MapFileHeader->maptype&FPLANE)) { viewmon^=1; if (!viewmon) planemon=0; DrawInfoBar(); DrawMap(); PrintCoords(); tics=biostime(0,0); while(keydown[6]); } if (keydown[7] && (MapFileHeader->maptype&IPLANE)) { viewion^=1; if (!viewion) planeion=0; DrawInfoBar(); DrawMap(); PrintCoords(); tics=biostime(0,0); while(keydown[7]); } // // Cancel COPY or PASTE or FLOOD FILL or BLOCK FILL // if (keydown[1] && (PasteMode || SelectMode || FillMode || BfillMode || TsearchMode)) { while(keydown[1]); if (PasteMode) { EraseFloatPaste(); px=py=-1; } SnapMode=TsearchMode=BfillMode=FillMode=PasteMode=SelectMode=0; SelX1=SelX2=SelY1=SelY2=-1; DrawMap(); DrawInfoBar(); tics=biostime(0,0); } // // END OF COPY || BLOCK FILL // if (keydown[0x1c] && (SelectMode || BfillMode)) { int temp,j,i; tics=biostime(0,0); while(keydown[0x1c]); if (SelX2>(tsize+2))+xbase,((pixely-8)>>(tsize+2))+ybase); } //////////////////////////////////////////////////// // // Draw the current map on the screen at xbase,ybase // //////////////////////////////////////////////////// void DrawMap(void) { int i,j,imax,jmax; EraseFloatPaste(); jmax=screenh; if (jmax>mapheight) jmax=mapheight; imax=screenw; if (imax>mapwidth) imax=mapwidth; MouseHide(); for(j=0;j>(tsize-1); screenh=22>>(tsize-1); break; case EGA2: screenw=80>>(tsize-1); screenh=57>>(tsize-1); break; } if (!infobaron) { infoy=100; // WAY OFF THE BOTTOM! screenh+=2*(tsize==1)+(tsize==2); } } //////////////////////////////////////////////////// // // Print the coords on the INFOBAR // //////////////////////////////////////////////////// void PrintCoords(void) { static zeroed=0; int mx,my; if (!infobaron) return; xormask=0; MouseCoords(&mx,&my); if (my<8 || my>=infoy*8) { if (zeroed) return; sx=infomaxw-9; sy=infoy; print("??? ?????"); sx=infomaxw-9; sy=infoy+1; print("??? ?????"); zeroed=1; return; } zeroed=0; mx=mx>>(tsize+2); sx=infomaxw-9; sy=infoy; printint(mx+xbase); print(" "); sx=infomaxw-5; printhex(mx+xbase); my=(my-8)>>(tsize+2); sx=infomaxw-9; sy=infoy+1; printint(my+ybase); print(" "); sx=infomaxw-5; printhex(my+ybase); } //////////////////////////////////////////////////// // // Draw the INFOBAR // //////////////////////////////////////////////////// void DrawInfoBar(void) { int ox,oy; if (PasteMode) { px=py=-1; CheckFloatPaste((pixelx>>(tsize+2))+xbase,((pixely-8)>>(tsize+2))+ybase); } if (!infobaron) return; EraseFloatPaste(); ox=sx=0; switch(videomode) { case CGA: case EGA1: case VGA: oy=sy=23-2*(tsize==3); infomaxw=40; break; case EGA2: oy=sy=58-2*(tsize==3)-1*(tsize==2); infomaxw=80; } MouseHide(); infoy=oy; bar(0,infoy,infomaxw-1,infoy+1,' '); if (SelectMode) { sx=leftedge=1; sy=infoy; print("Copy Mode\nESC to exit"); } else if (TsearchMode) { sx=leftedge=1; sy=infoy; print("Tile Search Mode\nESC to exit"); } else if (BfillMode) { sx=leftedge=1; sy=infoy; print("Block Fill Mode\nESC to exit"); } else if (PasteMode) { sx=leftedge=1; sy=infoy; print("Paste Mode\nESC to exit"); } else if (FillMode) { sx=leftedge=1; sy=infoy; print("Flood Fill Mode\nESC to exit"); } else { CombineTiles(whicht,0,0,tsize); DrawTile(ox,oy*8+8*(tsize==1),tsize); sx=ox+2+2*(tsize==3); sy=oy; printhex(whicht); sx-=5; sy++; printint(whicht); print(" "); if (tilemnum) { ox+=7; CombineTiles(-BkgndColor,whichtm,0,tsize); DrawTile(ox,oy*8+8*(tsize==1),tsize); sx=ox+2+2*(tsize==3); sy=oy; (whichtm==tilenum)?print(" No "):printhex(whichtm-tilenum); sx-=5; sy++; (whichtm==tilenum)?print("Tile"):printint(whichtm-tilenum); print(" "); ox+=7; CombineTiles(-ICONBACK,(whichi>lasticon)?firsticon:whichi,0,tsize); DrawTile(ox,oy*8+8*(tsize==1),tsize); sx=ox+2+2*(tsize==3); sy=oy; (whichi==tilenum)?print(" No "):printhex(whichi-tilenum); sx-=5; sy++; (whichi==tilenum)?print("Icon"):printint(whichi-tilenum); print(" "); } } sx=infomaxw-11; sy=infoy; print("X="); sy++; sx-=2; print("Y="); sx=infomaxw-((videomode==EGA2)?19:18); sy=infoy+1; print("123"); if (SnapMode) { sx=infomaxw-((videomode==EGA2)?21:20); sy=infoy+1; print("S"); } if (GridMode) { sx=infomaxw-((videomode==EGA2)?20:19); sy=infoy+1; print("G"); } sx=infomaxw-((videomode==EGA2)?19:18); sy=infoy; (planeton)?print("B"):print(" "); (planemon)?print("F"):print(" "); (planeion)?print("I"):print(" "); sx=infomaxw-15; sy=infoy+1; print("456"); sx=infomaxw-15; sy=infoy; (viewton)?print("b"):print(" "); (viewmon)?print("f"):print(" "); (viewion)?print("i"):print(" "); if (videomode==EGA2) { sx=screencenterx-strlen(MapHeader.name)/2; sy=infoy; print(MapHeader.name); } DrawFloatPaste(); MouseShow(); } //////////////////////////////////////////////////// //////////////////////////////////////////////////// //////////////////////////////////////////////////// // // Initialize TED5: // // * Project Select if multiple projects // * If Project has NO LEVELS: // * Init Level 1 // * Init TILEINFO // * Init TEDINFO file // * Load TILES into XMS // //////////////////////////////////////////////////// //////////////////////////////////////////////////// //////////////////////////////////////////////////// char bstrings[10][15]; btype ProjButns[10]; DialogDef ProjSelect={"Select the project to work on:", 30,0,0,&ProjButns[0],DrawProjBord}; void InitTed5(void) { char pname[15]; unsigned i,loop,which; MouseInit(); MouseShow(); if (!MouseStatus) { ErrDialog("Sorry, but TED5 will NOT\n" "operate without a mouse!\n"," Press ENTER "); Quit("Only REAL developers have a mouse!"); } MouseOrigin(0,0); ErrDialog("Initializing. One moment.",""); // // Create bit-doubling lookup table // for CGA font creation // for (loop=0;loop<256;loop++) { unsigned result,temp=loop; asm mov ax,temp asm mov ah,al asm mov cx,8 LOOP0: asm shl al,1 asm rcl bx,1 asm shl ah,1 asm rcl bx,1 asm loop LOOP0 asm xchg bh,bl asm mov result,bx doubled[loop]=result; } // // Init everything! // InitXMS(); FindGraphFile(); LoadInfoFile(); LoadMapHeader(); RestoreBackground(); LoadGraphStuff(0,TEDInfo->lastvid); DrawInfoBar(); DrawMap(); if (!launched && !NoAbout) Item_About(); launched=0; } //////////////////////////////////////////////////// //////////////////////////////////////////////////// // // Load the MAPTEMP.ext header in... // //////////////////////////////////////////////////// //////////////////////////////////////////////////// btype SelectTsizeb[]={{" 8x8 ",1,2,1}, {" 16x16 ",1,5,1}, {" 32x32 ",1,8,1}}; DialogDef SelectTsize={" Which tile size to use?" ,26,10,3,&SelectTsizeb[0],STnot}; void LoadMapHeader(void) { unsigned size,i,j,pflag; char types=0; strcpy(mapheadname,"MAPTHEAD."); strcat(mapheadname,ext); strcpy(mapname,"MAPTEMP."); strcat(mapname,ext); strcpy(SM_name,"MAPTEMP1."); strcat(SM_name,ext); strcpy(SM_loadname,"MAPTEMP."); strcat(SM_loadname,ext); if (access(mapheadname,0)) { int i; // // Gotta create a new map file! // MMAllocate((memptr *)&MapFileHeader,sizeof(MapFileHeaderStr)); for (i=0;iRLEWtag=0xabcd; for (i=0;i<100;i++) { MapFileHeader->dataoffsets[i]=-1; MapFileHeader->datalengths[i]=0; memset(MapNames[i],0,16); } if (!GFXInfo->num8 && !GFXInfo->num8m && !GFXInfo->num16 && !GFXInfo->num16m && !GFXInfo->num32 && !GFXInfo->num32m) { ErrDialog("Uhh...you 'neglected' to\n" "grab tiles to use. Running\n" "TED5 is quite useless at\n" "this point, I'm afraid.","Duh!"); Quit("Get some tiles ... quick! Me hungry!"); } if (!GFXInfo->num8 && !GFXInfo->num16 && !GFXInfo->num32) { ErrDialog("You may have grabbed some\n" "MASKED tiles, but I require\n" "NON-MASKED tiles as a\n" "minimum requirement!","Geez..."); Quit("Please grab some normal tiles!"); } types+=(GFXInfo->num8>0)+(GFXInfo->num16>0)+(GFXInfo->num32>0); redo: if (types>1) { int which; which=DoDialog(&SelectTsize); switch(which) { case 0: Quit(""); case 1: if (!GFXInfo->num8) which=0; break; case 2: if (!GFXInfo->num16) which=0; break; case 3: if (!GFXInfo->num32) which=0; break; } MapFileHeader->tsize=TEDInfo->tsize=tsize=which; } else { if (GFXInfo->num8) TEDInfo->tsize=1; else if (GFXInfo->num16) TEDInfo->tsize=2; else if (GFXInfo->num32) TEDInfo->tsize=3; MapFileHeader->tsize=tsize=TEDInfo->tsize; } // // pick the planes that all maps will use // if (PickMorePlanes()) goto redo; // // initialize TILEINFO/TILEINFOM // switch(tsize) { case 1: tilenum=GFXInfo->num8; tilemnum=GFXInfo->num8m; break; case 2: tilenum=GFXInfo->num16; tilemnum=GFXInfo->num16m; break; case 3: tilenum=GFXInfo->num32; tilemnum=GFXInfo->num32m; } InitTileinfo(); if (numtplanes || numtmplanes) // only input if applicable Item_EditTinfoNames(); // void where prohibited // // now create a map! // CreateMap(0); FigureScreenEdges(); MapFileHeader->NumIconRows=maxiconrows=InputIconAmount(); } // // MAP FILE ALREADY IN PLACE. LOAD STUFF IN... // else { memptr block,tempblock; LoadIn(mapheadname,(memptr *)&MapFileHeader); // // See if the NumIconRows is toasty (old TED5 compatibility) // if (MapFileHeader->NumIconRows>50) MapFileHeader->NumIconRows=4; // // has the TEDINFO?.ext file been changed? // if so, reconstruct pertinent data... // if (!TEDInfo->tsize) { tsize=TEDInfo->tsize=MapFileHeader->tsize; switch(tsize) { case 1: tilenum=GFXInfo->num8; tilemnum=GFXInfo->num8m; break; case 2: tilenum=GFXInfo->num16; tilemnum=GFXInfo->num16m; break; case 3: tilenum=GFXInfo->num32; tilemnum=GFXInfo->num32m; } } maxiconrows=MapFileHeader->NumIconRows; // // Read-in all the Map Names // for (i=0;i<100;i++) if (MapFileHeader->dataoffsets[i]!=-1) { MapHeaderStr TempHead; LoadFile(mapname,(char huge *)&TempHead, MapFileHeader->dataoffsets[i],sizeof(MapHeaderStr)); strcpy(MapNames[i],TempHead.name); } FigureScreenEdges(); if (!TEDInfo->level) { for(i=0;i<100;i++) if (MapFileHeader->dataoffsets[i]!=-1) { whichmap=TEDInfo->level=i; break; } } else whichmap=TEDInfo->level; LoadMap(TEDInfo->level); // // IF WE WERE LAUNCHED AND CHARACTER POSITION WAS CHANGED, // PUT IT BACK! // if (launched && (TEDInfo->lastx || TEDInfo->lasty)) { int i; for (i=0;ipermicon) { MapInfoPl[i]=0; MapInfoPl[TEDInfo->lasty*mapwidth+TEDInfo->lastx]=TEDInfo->permicon; TEDInfo->lastx=TEDInfo->lasty=0; DirtyFlag=1; break; } } // // POSITION SCREEN // xbase=TEDInfo->oscrx; ybase=TEDInfo->oscry; if (xbase+screenw>mapwidth) xbase=mapwidth-screenw; if (ybase+screenh>mapheight) ybase=mapheight-screenh; if (launched) _fmemcpy((void far *)parmstring,(void far *)TEDInfo->parmstring,64); // // LOAD TILEINFO/M AND ADJUST IF IT CHANGED // numtplanes=MapFileHeader->numtplanes; numtmplanes=MapFileHeader->numtmplanes; pflag=0; for (i=0;ioldtilenum); // // SPACE FOR OLD TILEINFO TO LOAD INTO // MMAllocate(&block,MapFileHeader->tileinfolen[i]); LoadFile(mapheadname,MK_FP(block,0),MapFileHeader->tileinfooff[i],MapFileHeader->tileinfolen[i]); // // DECOMPRESS FROM "BLOCK" TO "TEMPBLOCK" // RLEBExpand(MK_FP(block,0),MK_FP(tempblock,0), MapFileHeader->oldtilenum,MapFileHeader->RLEWtag); MMFreePtr(&block); // // ALLOCATE TINFO ARRAY // MMAllocate((memptr *)&Tinfo[i],tilenum); // // MOVE FROM "TEMPBLOCK" TO "TINFO[I]" ARRAY // if (MapFileHeader->oldtilenumoldtilenum); // // IF NEW TILEINFO IS MORE, FILL END WITH 0s // for (j=MapFileHeader->oldtilenum;joldtilenum>tilenum) DirtyFlag=pflag=2; } MMFreePtr(&tempblock); } switch(pflag) { case 1: ErrDialog("The new TILEINFO data has\n" "been expanded to accomodate\n" "the newly grabbed tiles."," OK "); break; case 2: ErrDialog("The new TILEINFO data has\n" "been shrunk due to a reduced\n" "amount of tiles."," OK "); } pflag=0; if (tilemnum && (MapFileHeader->maptype&FPLANE)) for (i=0;ioldtilemnum); MMAllocate(&block,MapFileHeader->tileinfomlen[i]); LoadFile(mapheadname,MK_FP(block,0),MapFileHeader->tileinfomoff[i],MapFileHeader->tileinfomlen[i]); RLEBExpand(MK_FP(block,0),MK_FP(tempblock,0), MapFileHeader->oldtilemnum,MapFileHeader->RLEWtag); MMFreePtr(&block); MMAllocate((memptr *)&TMinfo[i],tilemnum); if (MapFileHeader->oldtilemnumoldtilemnum); for (j=MapFileHeader->oldtilemnum;joldtilemnum>tilemnum) DirtyFlag=pflag=2; } MMFreePtr(&tempblock); } switch(pflag) { case 1: ErrDialog("The new TILEINFOM data has\n" "been expanded to accomodate\n" "the newly grabbed masked tiles."," OK "); break; case 2: ErrDialog("The new TILEINFOM data has\n" "been shrunk due to a reduced\n" "amount of tiles."," OK "); } #if 0 // // TURN ON PLANES // viewton=planeton=1; if (MapFileHeader->maptype&FPLANE) viewmon=1; if (MapFileHeader->maptype&IPLANE) viewion=1; planemon=planeion=0; #endif } // // LOAD THE MAPFILE INTO XMS IF ENOUGH ROOM // if (1024L*XMSTotalFree()>2L*filelen(mapname) && !NoXMSFlag) { #define LBCSIZE 0x4000 memptr block; long size,clen,coff; size=filelen(mapname); MMAllocate(&block,LBCSIZE); XMSmaps=XMSAllocate(size); // // LOAD ENTIRE MAPFILE FROM DISK TO XMS! // coff=0; do { clen=LBCSIZE; if (size0); MMFreePtr(&block); } } void STnot(int x,int y) { sx=x+10; sy=y+2; if (!GFXInfo->num8) print("<-Not available"); else { printint(GFXInfo->num8); print(" total tiles"); } sx=x+10; sy=y+5; if (!GFXInfo->num16) print("<-Not available"); else { printint(GFXInfo->num16); print(" total tiles"); } sx=x+10; sy=y+8; if (!GFXInfo->num32) print("<-Not available"); else { printint(GFXInfo->num32); print(" total tiles"); } } //////////////////////////////////////////////////// //////////////////////////////////////////////////// // // Load the graphheader file & ?GAGRAPH.ext file and stick it in XMS! // //////////////////////////////////////////////////// //////////////////////////////////////////////////// int LoadGraphStuff(int rtn,video newvid) { #define NUMFASTDECOMP 100 // # of tiles in fast decompress buffer char gname[14]="?GAHEAD.",gname1[14]="?GAGRAPH.",_seg *packed,_seg *unpack, dictname[14]="?GADICT.",hufftable[1020],_seg *CacheBlock; unsigned index,indexm,num,numm,i,realnum,realnumm,ox,oy,cacheon=0,_seg *tile_len, _seg *tilem_len,cacheon_h; long expsize,expmsize,xmsoff=0,unpackoff,unpackmax,unpacksize, unpackxms; video tempvid,pickedvid; char huge *offsets; strcat(gname,ext); strcat(gname1,ext); strcat(dictname,ext); gname[0]=format[0]; gname1[0]=format[0]; dictname[0]=format[0]; if (!launched) switch(format[0]) { case 'C': pickedvid=CGA; break; case 'E': pickedvid=EGA1; break; case 'V': pickedvid=VGA; } else pickedvid=TEDInfo->lastvid; // // VALIDATE GRAPHICS MODE // tempvid=rtn?newvid:pickedvid; switch(tempvid) { case CGA: gname[0]='C'; if (access(gname,0)) { if (rtn) return 0; } else { TEDInfo->lastvid=CGA; dictname[0]=format[0]=gname1[0]='C'; setvideo(CGA); InitDesktop(TED5MenuBar,1); MouseShow(); break; } case EGA1: case EGA2: gname[0]='E'; if (access(gname,0)) { if (rtn) return 0; } else { TEDInfo->lastvid=tempvid; dictname[0]=format[0]=gname1[0]='E'; setvideo(tempvid); InitDesktop(TED5MenuBar,1); MouseShow(); break; } case VGA: gname[0]='V'; if (access(gname,0)) { if (rtn) return 0; gname[0]=format[0]; } else { TEDInfo->lastvid=VGA; dictname[0]=format[0]=gname1[0]='V'; setvideo(VGA); InitDesktop(TED5MenuBar,1); MouseShow(); break; } } // // FIND HEADER & LOAD IT // if (access(gname,0)) { char errstr[100]="Can't find the "; strcat(errstr,format); strcat(errstr,"GAHEAD."); strcat(errstr,ext); strcat(errstr,"\nfile! Maybe you didn't\n" "copy it from the graphics\n" "subdirectory?"); ErrDialog(errstr," OK "); if (rtn) return 0; Quit("You're stupid! Copy the damn file!"); } LoadIn(gname,(memptr *)&GraphHeader); switch(MapFileHeader->tsize) { case 1: index=GFXInfo->off8; indexm=GFXInfo->off8m; num=GFXInfo->num8; numm=GFXInfo->num8m; if (indexm==index+1) { ErrDialog("I'm sorry, but you need to\n" "capture your 8x8 tiles\n" "individually, and not in a\n" "big chunk."," Alright "); if (rtn) return 0; Quit("Regrab-time, bag o' shit!"); } switch(tempvid) { case CGA: expsize=16; expmsize=32; break; case EGA1: case EGA2: expsize=32; expmsize=40; break; case VGA: expsize=64; expmsize=128; } break; case 2: index=GFXInfo->off16; indexm=GFXInfo->off16m; num=GFXInfo->num16; numm=GFXInfo->num16m; switch(tempvid) { case CGA: expsize=64; expmsize=128; break; case EGA1: case EGA2: expsize=128; expmsize=128+32; break; case VGA: expsize=256; expmsize=512; } break; case 3: index=GFXInfo->off32; indexm=GFXInfo->off32m; num=GFXInfo->num32; numm=GFXInfo->num32m; switch(tempvid) { case CGA: expsize=256; expmsize=512; break; case EGA1: case EGA2: expsize=512; expsize=512+4*32; break; case VGA: expsize=1024; expmsize=2048; } } // // MOVE TILES INTO XMS MEMORY! // MMAllocate((memptr *)&packed,expmsize); unpackmax=expmsize*NUMFASTDECOMP; MMAllocate((memptr *)&unpack,unpackmax); tilelen=expsize; tilemlen=expmsize; offsets=MK_FP(GraphHeader,0); // // LOAD DICTIONARY IN & INITIALIZE IT // if (!launched) { char _seg *block; if (access(dictname,0)) { char errst[200]="I can't find the \n"; strcat(errst,dictname); strcat(errst," file!"); ErrDialog(errst," OK "); if (rtn) return 0; Quit("Look in the graphics grab directory!"); } LoadIn(dictname,(memptr *)&block); movedata((unsigned)block,0,FP_SEG(hufftable),FP_OFF(hufftable),1020); MMFreePtr((memptr *)&block); OptimizeNodes((huffnode *)hufftable); } // // Count up the REAL number of tiles there are! // Build tables for tile lengths // MMAllocate((memptr *)&tile_len,num*2); for (realnum=i=0;iOldCgaXMS; EgaXMS=TEDInfo->OldEgaXMS; VgaXMS=TEDInfo->OldVgaXMS; CgaXMSsize=TEDInfo->OldCgaXMSsize; EgaXMSsize=TEDInfo->OldEgaXMSsize; VgaXMSsize=TEDInfo->OldVgaXMSsize; size=(num+numm)*4; if (CgaXMS) { MMAllocate((memptr *)&CgaXMSlookup,size); XMSmove(TEDInfo->CgaXMSlook,0,0,(long)MK_FP(CgaXMSlookup,0),size); XMSFreeMem(TEDInfo->CgaXMSlook); TEDInfo->CgaXMSlook=0; } if (EgaXMS) { MMAllocate((memptr *)&EgaXMSlookup,size); XMSmove(TEDInfo->EgaXMSlook,0,0,(long)MK_FP(EgaXMSlookup,0),size); XMSFreeMem(TEDInfo->EgaXMSlook); TEDInfo->EgaXMSlook=0; } if (VgaXMS) { MMAllocate((memptr *)&VgaXMSlookup,size); XMSmove(TEDInfo->VgaXMSlook,0,0,(long)MK_FP(VgaXMSlookup,0),size); XMSFreeMem(TEDInfo->VgaXMSlook); TEDInfo->VgaXMSlook=0; } switch(tempvid) { case CGA: xmshandle=CgaXMS; XMSlookup=CgaXMSlookup; break; case EGA1: case EGA2: xmshandle=EgaXMS; XMSlookup=EgaXMSlookup; break; case VGA: xmshandle=VgaXMS; XMSlookup=VgaXMSlookup; } ErrDialog("RE-INITIALIZING...",""); } ox=sx; oy=sy; // // INSTALL GRAPHICS IF NOT A LAUNCH... // if (!launched) { switch(tempvid) { case CGA: MMAllocate((memptr *)&CgaXMSlookup,(num+numm)*4); XMSlookup=CgaXMSlookup; break; case EGA1: case EGA2: MMAllocate((memptr *)&EgaXMSlookup,(num+numm)*4); XMSlookup=EgaXMSlookup; break; case VGA: MMAllocate((memptr *)&VgaXMSlookup,(num+numm)*4); XMSlookup=VgaXMSlookup; } // // SET UP MEMORY CACHE IF ENOUGH IS AVAILABLE... // cacheon_h=0; if (filelen(gname1)<16L*MMTotalFree()) { LoadIn(gname1,(memptr *)&CacheBlock); cacheon=1; } else // // DAMN! TRY XMS AS A LAST RESORT... // if (filelen(gname1)<1024l*XMSTotalFree()) { #define TMPBUFSIZE 32000l long amtleft,tmpoff=0,tmpsize; memptr tblock; amtleft=filelen(gname1); MMAllocate(&tblock,TMPBUFSIZE); cacheon_h=XMSAllocate(amtleft); tmpsize=TMPBUFSIZE; while(amtleft>0) { LoadFile(gname1,MK_FP(tblock,0),tmpoff,tmpsize); XMSmove(0,(long)MK_FP(tblock,0),cacheon_h,tmpoff,tmpsize); amtleft-=TMPBUFSIZE; tmpoff+=TMPBUFSIZE; tmpsize=(amtleft>TMPBUFSIZE)?TMPBUFSIZE:amtleft; } MMFreePtr(&tblock); cacheon=2; } clearkeys(); // // MOVE NONMASKED TILES INTO XMS MEMORY! // --------- unpacksize=unpackoff=0; unpackxms=xmsoff; for (i=0;iunpackmax-expsize) { XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize); unpacksize=unpackoff=0; unpackxms=xmsoff; sx=ox; sy=oy; printint(num+numm-i); print(" "); } // // ESC will exit! // if (keydown[1]) if (rtn) { switch(tempvid) { case CGA: XMSFreeMem(CgaXMS); MMFreePtr((memptr *)&CgaXMSlookup); CgaXMS=0; break; case EGA1: case EGA2: XMSFreeMem(EgaXMS); MMFreePtr((memptr *)&EgaXMSlookup); EgaXMS=0; break; case VGA: XMSFreeMem(VgaXMS); MMFreePtr((memptr *)&VgaXMSlookup); VgaXMS=0; } switch(videomode) { case CGA: xmshandle=CgaXMS; XMSlookup=CgaXMSlookup; break; case EGA1: case EGA2: xmshandle=EgaXMS; XMSlookup=EgaXMSlookup; break; case VGA: xmshandle=VgaXMS; XMSlookup=VgaXMSlookup; } MMFreePtr((memptr *)&GraphHeader); MMFreePtr((memptr *)&packed); MMFreePtr((memptr *)&unpack); if (cacheon) MMFreePtr((memptr *)&CacheBlock); return 0; } else Quit("XMS LOADING ABORTED!"); } // // FLUSH THE FAST(?)-CACHE // if (unpacksize) { XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize); unpacksize=unpackoff=0; unpackxms=xmsoff; } // // MOVE MASKED TILES INTO XMS MEMORY! // ------ for (i=0;iunpackmax-expmsize) { XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize); unpacksize=unpackoff=0; unpackxms=xmsoff; sx=ox; sy=oy; printint(numm-i); print(" "); } // // ESC will exit! // if (keydown[1]) if (rtn) { switch(tempvid) { case CGA: XMSFreeMem(CgaXMS); MMFreePtr((memptr *)&CgaXMSlookup); CgaXMS=0; break; case EGA1: case EGA2: XMSFreeMem(EgaXMS); MMFreePtr((memptr *)&EgaXMSlookup); EgaXMS=0; break; case VGA: XMSFreeMem(VgaXMS); MMFreePtr((memptr *)&VgaXMSlookup); VgaXMS=0; } switch(videomode) { case CGA: xmshandle=CgaXMS; XMSlookup=CgaXMSlookup; break; case EGA1: case EGA2: xmshandle=EgaXMS; XMSlookup=EgaXMSlookup; break; case VGA: xmshandle=VgaXMS; XMSlookup=VgaXMSlookup; } MMFreePtr((memptr *)&GraphHeader); MMFreePtr((memptr *)&packed); MMFreePtr((memptr *)&unpack); if (cacheon) MMFreePtr((memptr *)&CacheBlock); return 0; } else Quit("XMS LOADING ABORTED!"); } // // FLUSH THE FAST-CACHE // if (unpacksize) { XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize); unpacksize=unpackoff=0; unpackxms=xmsoff; } if (cacheon==1) MMFreePtr((memptr *)&CacheBlock); else if (cacheon==2) XMSFreeMem(cacheon_h); } // // GET RID OF TILE-FILE CACHE MEMORY (OR WE'RE TOASTY) // MMFreePtr((memptr *)&GraphHeader); MMFreePtr((memptr *)&packed); MMFreePtr((memptr *)&unpack); MMFreePtr((memptr *)&tile_len); MMFreePtr((memptr *)&tilem_len); whicht=0; whichi=tilenum; whichtm=tilenum; switch(tsize) { case 1: lasticon=tilenum+36*maxiconrows; break; case 2: lasticon=tilenum+18*maxiconrows; break; case 3: lasticon=tilenum+7*maxiconrows; } firsticon=tilenum; RestoreBackground(); return 1; } //////////////////////////////////////////////////// //////////////////////////////////////////////////// // // Load TEDINFO.ext file // //////////////////////////////////////////////////// //////////////////////////////////////////////////// void LoadInfoFile(void) { char pname[14]="TEDINFO.",gfxname[14]="GFXINFO"; // // Load the TEDINFO.ext file! // strcat(pname,ext); strcpy(infoname,pname); if (access(pname,0)) { MMAllocate((memptr *)&TEDInfo,sizeof(InfoStruct)); _fmemset(TEDInfo,0,sizeof(InfoStruct)); // BFI BFI TEDInfo->pflags=0x27; // 0010 0111 } else LoadIn(pname,(memptr *)&TEDInfo); tsize=TEDInfo->tsize; if (launchname[0]) _fmemcpy((char far *)TEDInfo->launchname,(char far *)launchname,14); // // LOAD THE "GFXINFO?.EXT" FILE // strcat(gfxname,format); strcat(gfxname,"."); strcat(gfxname,ext); LoadIn(gfxname,(memptr *)&GFXInfo); switch(tsize) { case 1: tilenum=GFXInfo->num8; tilemnum=GFXInfo->num8m; break; case 2: tilenum=GFXInfo->num16; tilemnum=GFXInfo->num16m; break; case 3: tilenum=GFXInfo->num32; tilemnum=GFXInfo->num32m; } _fstrcpy((char far *)launchname,(char far *)TEDInfo->launchname); if (launched) TEDInfo->lastvid=LaunchInfo.lastmode; // // SET PLANE FLAGS BACK TO NORMAL // planeton=(TEDInfo->pflags>>6)&1; planemon=(TEDInfo->pflags>>5)&1; planeion=(TEDInfo->pflags>>4)&1; viewton=(TEDInfo->pflags>>2)&1; viewmon=(TEDInfo->pflags>>1)&1; viewion=(TEDInfo->pflags)&1; // // SET BACKGROUND COLOR // BkgndColor=TEDInfo->BackgndColor; if (BkgndColor>16) TEDInfo->BackgndColor=BkgndColor=O_FGNDBACK; } //////////////////////////////////////////////////// //////////////////////////////////////////////////// // // Find ?GAGRAPH.ext file // //////////////////////////////////////////////////// //////////////////////////////////////////////////// void FindGraphFile(void) { struct ffblk ffblk; char pname[15]="?GAGRAPH.*",*tempstr,tiname[13]="TEDINFO.TMP"; int i,which; // // RETURNING FROM LAUNCH...GET INFO BACK // if (launched) { LoadFile(tiname,(char huge *)&LaunchInfo,0,0); unlink(tiname); videomode=LaunchInfo.lastmode; switch(videomode) { case CGA: format[0]='C'; break; case EGA1: case EGA2: format[0]='E'; break; case VGA: format[0]='V'; } strcpy(ext,LaunchInfo.ext); projname[0]=format[0]; strcat(projname,"GAGRAPH."); strcat(projname,ext); return; } // // Find ?GAGRAPH.ext // if (ext[0]) { strcpy(pname,"?GAGRAPH."); strcat(pname,ext); } if (findfirst(pname,&ffblk,FA_ARCH)) { ErrDialog("I can't find a graphics\nfile! (ex:?GAGRAPH.ext)"," Alright "); Quit("Can't work without graphics ya know!"); } if (GfxToUse) format[0] = GfxToUse; else { // setup the dialog strcpy(bstrings[0],ffblk.ff_name); ProjButns[0].xoff=9; ProjButns[0].yoff=2; ProjButns[0].border=0; ProjButns[0].text=bstrings[0]; for (i=1;i<10;i++) { if (findnext(&ffblk)) break; strcpy(bstrings[i],ffblk.ff_name); ProjButns[i].xoff=9; ProjButns[i].yoff=2+i; ProjButns[i].border=0; ProjButns[i].text=bstrings[i]; } ProjSelect.numbuttons=i; ProjSelect.height=i+3; which=1; if (i>1) do { which=DoDialog(&ProjSelect); } while(!which); which--; tempstr=strpbrk(bstrings[which],".")+1; strcpy(ext,tempstr); format[0]=bstrings[which][0]; } strcpy(projname,bstrings[which]); } // // draw border for project window // void DrawProjBord(int x,int y) { DrawBorder(x+8,y+1,13,ProjSelect.height-2,1); } //////////////////////////////////////////////////// // // Input amount of icons to reserve // Returns maximum # of icon rows to reserve // //////////////////////////////////////////////////// btype ICb={" ",8,3,1}; DialogDef ICd={"Enter maximum amount\nof icons to reserve:",20,5,1,&ICb,NULL}; int InputIconAmount(void) { char tempstr[4]; int value; if (!(MapFileHeader->maptype&IPLANE)) return 4; MouseHide(); DrawDialog(&ICd,1); while(1) { GetDialogXY(&ICd,&sx,&sy); GetButtonXY(&ICd,0,&sx,&sy); if (input(tempstr,3)) { value=atoi(tempstr); if (value>0) { MouseShow(); RestoreBackground(); return (value+17)/18; } } } } //////////////////////////////////////////////////// //////////////////////////////////////////////////// // // Unhook everything // //////////////////////////////////////////////////// //////////////////////////////////////////////////// void Unhook(void) { ShutdownKBD(); if (CgaXMS) XMSFreeMem(CgaXMS); if (EgaXMS) XMSFreeMem(EgaXMS); if (VgaXMS) XMSFreeMem(VgaXMS); if (XMSundoB) XMSFreeMem(XMSundoB); if (XMSundoF) XMSFreeMem(XMSundoF); if (XMSundoI) XMSFreeMem(XMSundoI); if (XMSmaps) XMSFreeMem(XMSmaps); } void PatchPointers(void) { } //////////////////////////////////////////////////// //////////////////////////////////////////////////// // // Menu Definitions // //////////////////////////////////////////////////// //////////////////////////////////////////////////// MenuDef AboutMenu[]= {{"About...",Item_About,0,0}, {"Video Mode Switch",Item_ModeSwitch,0,0x43}, {"Last Video Mode",Item_LastVideo,ALT,0x2c}, {"Memory Available",Item_PrintMem,0,0x44}, {"Launch Project",Item_Launch,ALT,0x26}, {"--------------------",NULL,0,0}, // {"Display Unused Tiles",Item_CountTiles,0,0}, {"Project Re-Select",Item_ProjectReSelect,0,0}, {"Visit DOS",Item_VisitDOS,0,0} }; MenuDef FileMenu[]= {{"Edit New Map",Item_EditMap,ALT,0x18}, {"Save Map",Item_SaveMap,ALT,0x1f}, {"Create Map",Item_CreateMap,ALT,0x2e}, {"Delete Map",Item_DeleteMap,ALT,0x20}, {"Switch Map",Item_SwitchMap,ALT,0x11}, {"Amputate Maps",Item_Amputate}, {"---------------",NULL,0,0}, {"Import Maps",Item_ImportMaps,0,0}, {"Change ICON Rows",Item_ChangeIconRows,0,0}, {"Carmacize Maps",Item_Huffman,0,0}, {"Quit TED5",Item_Quit,ALT,0x2d}}; MenuDef EditMenu[]= {{"Switch to Last Map",Item_LastMap,ALT,0x32}, {"Edit TILEINFO/M Values",Item_EditTinfoValues,ALT,0x14}, {"Change LAUNCH name",Item_LAUNCHname,0,0}, {"Change PARM string",Item_PARMstring,0,0}, {"Edit TILEINFO/M Names",Item_EditTinfoNames,0,0}, {"Add/Del TILEINFO/M Planes",Item_AddDelTinfo,0,0}, {"Edit MAP Names",Item_EditMapNames,0,0}, {"Change MAP Edges",Item_EditMapEdges,0,0}}; MenuDef ModeMenu[]= { {"Copy Mode",Item_Copy,0,0x2e}, {"Paste Mode",Item_Paste,0,0x19}, {"Block Fill",Item_BlockFill,0,0x30}, {"Flood Fill",Item_FloodFill,0,0x21}, {"Undo last action",Item_Undo,0,0x16}, {"Tile Search",Item_TileSearch,0,0x14}, {"GridMode toggle",Item_GridMode,0,0x22}, {"Snap-Paste toggle",Item_SnapTog,0,0x1f}, {"Paste Overlay toggle",Item_POtog,0,0x3d} }; MenuDef MiscMenu[]= { {"Select Tile",Item_SelectTile,0,0x39}, {"Map Stats",Item_MapStats,0,0x17}, {"Toggle INFOBAR",Item_ToggleInfo,0,0x42}, {"New INFOPLANE value",Item_InputInfoplane,0,0x1c}, {"View Map & Goto",Item_ViewMap,ALT,0x2f}, {"ReView Map & Goto",Item_ReviewMap,0,0xe}, {"Change LAUNCH icon",Item_ChangeLaunchIcon,0,0}, {"Change bkgnd color",Item_ChangeBkgndColor,0,0}, {"TILEINFOM Copy",Item_TINFOCopy,0,0}, {"Graphic Map Dump",Item_GraphicDump,0,0} }; MBarDef TED5MenuBar[]= {{9,AboutMenu," ? "}, {11,FileMenu,"File"}, {8,EditMenu,"Edit"}, {9,ModeMenu,"Modes"}, {10,MiscMenu,"Misc"}, {0,0,""}};