X-Git-Url: http://4ch.mooo.com/gitweb/?p=16.git;a=blobdiff_plain;f=16%2Fted5%2FTED5.C;fp=16%2Fted5%2FTED5.C;h=8614ef9dfe45c03db281b3d4a4c796a6a2540925;hp=0000000000000000000000000000000000000000;hb=4c15d088479b9b6c4a8b298a9db585bc11582321;hpb=21ff8e5607ba86e91ed0d71f6261fd0fcc676e16 diff --git a/16/ted5/TED5.C b/16/ted5/TED5.C new file mode 100755 index 00000000..8614ef9d --- /dev/null +++ b/16/ted5/TED5.C @@ -0,0 +1,2779 @@ +//////////////////////////////////////////////////// +// +// 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,""}};