2780 lines
60 KiB
C++
2780 lines
60 KiB
C++
////////////////////////////////////////////////////
|
|
//
|
|
// 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("<filename> : set the Launch filename\n");
|
|
printf("/PARMS=<string> : 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<infoy*8 && (b0 || b1))
|
|
{
|
|
mx=xbase+(mx>>(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<SelX1 || SelY2<SelY1))
|
|
{
|
|
SelX1=mx;
|
|
SelY1=my;
|
|
}
|
|
DrawMap();
|
|
sound(2000);
|
|
}
|
|
//
|
|
// FLOOD FILL!
|
|
//
|
|
else
|
|
if (FillMode)
|
|
{
|
|
while(MouseButton());
|
|
DoFloodFill(mx,my,1);
|
|
}
|
|
//
|
|
// PICK UP TILE(S)
|
|
//
|
|
else
|
|
{
|
|
if (planeton)
|
|
whicht=*(MapBkgnd+loc);
|
|
if (planemon)
|
|
whichtm=*(MapFrgnd+loc)+tilenum;
|
|
if (planeion)
|
|
whichi=*(MapInfoPl+loc)+tilenum;
|
|
DrawInfoBar();
|
|
|
|
//
|
|
// IF WE'RE IN TILESEARCH MODE, SHOW IT!
|
|
//
|
|
if (TsearchMode)
|
|
DrawMap();
|
|
}
|
|
while(MouseButton()>>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;j<TileCopy.h;j++)
|
|
for (i=0;i<TileCopy.w;i++)
|
|
{
|
|
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i;
|
|
if (XMSlookup[val]!=-1)
|
|
MapBkgnd[(my+j)*mapwidth+mx+i]=val;
|
|
}
|
|
break;
|
|
case 2: // MASKED
|
|
for (j=0;j<TileCopy.h;j++)
|
|
for (i=0;i<TileCopy.w;i++)
|
|
{
|
|
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i+tilenum+maxiconrows*selectcols;
|
|
if (XMSlookup[val]!=-1)
|
|
MapFrgnd[(my+j)*mapwidth+mx+i]=val-tilenum;
|
|
}
|
|
}
|
|
nosound();
|
|
DrawMap();
|
|
DirtyFlag=1;
|
|
}
|
|
while(MouseButton());
|
|
nosound();
|
|
}
|
|
else
|
|
{
|
|
int i,j;
|
|
|
|
if (SnapMode)
|
|
{
|
|
mx=(mx/snapxsize)*snapxsize+snapx;
|
|
my=(my/snapysize)*snapysize+snapy;
|
|
}
|
|
|
|
if (mx+TileCopy.w-1<mapwidth && my+TileCopy.h-1<mapheight)
|
|
{
|
|
sound(500);
|
|
CopyUndoRegion();
|
|
UndoRegion.x=mx;
|
|
UndoRegion.y=my;
|
|
UndoRegion.w=TileCopy.w;
|
|
UndoRegion.h=TileCopy.h;
|
|
|
|
for (j=0;j<TileCopy.h;j++)
|
|
for (i=0;i<TileCopy.w;i++)
|
|
{
|
|
int theM,theI;
|
|
|
|
|
|
if (TileCopy.PlanesCopied&BPLANE)
|
|
MapBkgnd[(j+my)*mapwidth+mx+i]=
|
|
CutBkgnd[(j+TileCopy.y)*mapwidth+TileCopy.x+i];
|
|
if (TileCopy.PlanesCopied&FPLANE)
|
|
{
|
|
theM=CutFrgnd[(j+TileCopy.y)*mapwidth+TileCopy.x+i];
|
|
if (theM || F3_flag)
|
|
MapFrgnd[(j+my)*mapwidth+mx+i]=theM;
|
|
}
|
|
if (TileCopy.PlanesCopied&IPLANE)
|
|
{
|
|
theI=CutInfoPl[(j+TileCopy.y)*mapwidth+TileCopy.x+i];
|
|
if (theI || F3_flag)
|
|
MapInfoPl[(j+my)*mapwidth+mx+i]=theI;
|
|
}
|
|
}
|
|
nosound();
|
|
DrawMap();
|
|
DirtyFlag=1;
|
|
}
|
|
else
|
|
sound(500);
|
|
|
|
while(MouseButton());
|
|
}
|
|
}
|
|
//
|
|
// PLOT TILE(S)
|
|
//
|
|
else
|
|
{
|
|
unsigned oldt,oldm,oldi;
|
|
|
|
//
|
|
// ARE WE STARTING THE PLOTTING REGION?
|
|
//
|
|
if (!Plotting)
|
|
{
|
|
CopyUndoRegion();
|
|
UndoRegion.x=mx;
|
|
UndoRegion.y=my;
|
|
UndoRegion.w=UndoRegion.h=1;
|
|
Plotting=1;
|
|
}
|
|
|
|
//
|
|
// FLOAT THE PLOTTING REGION
|
|
//
|
|
if (mx<UndoRegion.x)
|
|
UndoRegion.x=mx;
|
|
if (my<UndoRegion.y)
|
|
UndoRegion.y=my;
|
|
if (mx+1>UndoRegion.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<<tsize)+8,tsize);
|
|
CheckInfoValues(mx-xbase,my-ybase,oldi);
|
|
MouseShow();
|
|
DirtyFlag=1;
|
|
}
|
|
}
|
|
nosound();
|
|
}
|
|
}
|
|
|
|
//
|
|
// CLICK ON TILES
|
|
//
|
|
if (b0 && pixely>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].x<size+1) || (snake[0].x>320-(size+1)))
|
|
{
|
|
xdir=-xdir;
|
|
snake[0].x+=xdir<<1;
|
|
}
|
|
else if (abs(xdir)>size-1)
|
|
xdir=-(xdir>>1);
|
|
if ((snake[0].y<size+1) || (snake[0].y>200-(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;j<snake[x].y+size;j++,cury+=320)
|
|
_fmemset((screen+cury+snake[x].x),255-x,size);
|
|
}
|
|
else
|
|
{
|
|
_fmemset((screen+(320*snake[x].y)+snake[x].x),255-x,size);
|
|
}
|
|
}
|
|
oldx=pixelx;
|
|
oldy=pixely;
|
|
MouseCoords(&pixelx,&pixely);
|
|
if ((oldx!=pixelx) || (oldy!=pixely))
|
|
done=1;
|
|
for (x=0;x<127;x++)
|
|
if (keydown[x])
|
|
done=1;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Routine called continuously by DeskEventLoop
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void Continuous(void)
|
|
{
|
|
static int oldx, oldy;
|
|
if (biostime(0,0)-tics>tictime)
|
|
{
|
|
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<SelX1)
|
|
{
|
|
temp=SelX1;
|
|
SelX1=SelX2;
|
|
SelX2=temp;
|
|
}
|
|
if (SelY2<SelY1)
|
|
{
|
|
temp=SelY1;
|
|
SelY1=SelY2;
|
|
SelY2=temp;
|
|
}
|
|
|
|
//
|
|
// BLOCK FILL?
|
|
//
|
|
if (BfillMode)
|
|
{
|
|
BfillMode=0;
|
|
DrawInfoBar();
|
|
DoBlockFill();
|
|
SelX1=SelX2=SelY1=SelY2=-1;
|
|
}
|
|
else
|
|
//
|
|
// COPY MODE?
|
|
//
|
|
if (SelectMode)
|
|
{
|
|
SelectMode=0;
|
|
|
|
TileCopy.x=SelX1;
|
|
TileCopy.y=SelY1;
|
|
TileCopy.w=SelX2-SelX1+1;
|
|
TileCopy.h=SelY2-SelY1+1;
|
|
TileCopy.MapOrTileSelect=0;
|
|
TileCopy.PlanesCopied=planeton*BPLANE | planemon*FPLANE | planeion*IPLANE;
|
|
|
|
//
|
|
// DO THE COPY!
|
|
//
|
|
sound(600);
|
|
for (j=SelY1;j<=SelY2;j++)
|
|
for (i=SelX1;i<=SelX2;i++)
|
|
{
|
|
if (planeton)
|
|
CutBkgnd[j*mapwidth+i]=MapBkgnd[j*mapwidth+i];
|
|
if (planemon)
|
|
CutFrgnd[j*mapwidth+i]=MapFrgnd[j*mapwidth+i];
|
|
if (planeion)
|
|
CutInfoPl[j*mapwidth+i]=MapInfoPl[j*mapwidth+i];
|
|
}
|
|
|
|
DrawInfoBar();
|
|
SelX1=SelX2=SelY1=SelY2=-1;
|
|
PasteOK=1;
|
|
px=py=-1;
|
|
nosound();
|
|
DrawMap();
|
|
}
|
|
clearkeys();
|
|
}
|
|
|
|
//
|
|
// See if we want to scroll the map!
|
|
//
|
|
CheckMapScroll();
|
|
CheckFloatPaste((pixelx>>(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<jmax;j++)
|
|
for(i=0;i<imax;i++)
|
|
{
|
|
unsigned tilet,tilem,tilei,loc;
|
|
|
|
loc=(ybase+j)*mapwidth+xbase+i;
|
|
|
|
tilet=*(MapBkgnd+loc);
|
|
tilem=*(MapFrgnd+loc)+tilenum;
|
|
tilei=*(MapInfoPl+loc)+tilenum;
|
|
|
|
CombineTiles(tilet*viewton-BkgndColor*(!viewton),tilem*viewmon,tilei*viewion,tsize);
|
|
if (GridMode)
|
|
Overlay(tsize);
|
|
DrawTile(i<<(tsize-1),j*(4<<tsize)+8,tsize);
|
|
CheckInfoValues(i,j,tilei);
|
|
CheckSelectEdges(i+xbase,j+ybase,i,j);
|
|
}
|
|
MouseShow();
|
|
DrawFloatPaste();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Figure out SCREENW,SCREENH from videomode & tsize
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void FigureScreenEdges(void)
|
|
{
|
|
switch(videomode)
|
|
{
|
|
case CGA:
|
|
case EGA1:
|
|
case VGA:
|
|
screenw=40>>(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;i<sizeof(MapFileHeaderStr);i++)
|
|
*((char _seg *)MapFileHeader+i)=0;
|
|
|
|
MapFileHeader->RLEWtag=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;i<mapwidth*mapheight;i++)
|
|
if (MapInfoPl[i]==TEDInfo->permicon)
|
|
{
|
|
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;i<numtplanes;i++)
|
|
{
|
|
//
|
|
// SPACE FOR OLD TILEINFO TO DECOMPRESS INTO
|
|
//
|
|
MMAllocate(&tempblock,MapFileHeader->oldtilenum);
|
|
//
|
|
// 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->oldtilenum<tilenum)
|
|
{
|
|
movedata((unsigned)tempblock,0,(unsigned)Tinfo[i],0,MapFileHeader->oldtilenum);
|
|
//
|
|
// IF NEW TILEINFO IS MORE, FILL END WITH 0s
|
|
//
|
|
for (j=MapFileHeader->oldtilenum;j<tilenum;j++)
|
|
*(Tinfo[i]+j)=0;
|
|
DirtyFlag=pflag=1;
|
|
}
|
|
else
|
|
{
|
|
movedata((unsigned)tempblock,0,(unsigned)Tinfo[i],0,tilenum);
|
|
if (MapFileHeader->oldtilenum>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;i<numtmplanes;i++)
|
|
{
|
|
MMAllocate(&tempblock,MapFileHeader->oldtilemnum);
|
|
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->oldtilemnum<tilemnum)
|
|
{
|
|
movedata((unsigned)tempblock,0,(unsigned)TMinfo[i],0,MapFileHeader->oldtilemnum);
|
|
for (j=MapFileHeader->oldtilemnum;j<tilemnum;j++)
|
|
*(TMinfo[i]+j)=0;
|
|
DirtyFlag=pflag=1;
|
|
}
|
|
else
|
|
{
|
|
movedata((unsigned)tempblock,0,(unsigned)TMinfo[i],0,tilemnum);
|
|
if (MapFileHeader->oldtilemnum>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 (size<LBCSIZE)
|
|
clen=size;
|
|
|
|
LoadFile(mapname,MK_FP(block,0),coff,clen);
|
|
XMSmove(0,(long)MK_FP(block,0),XMSmaps,coff,clen);
|
|
size-=LBCSIZE;
|
|
coff+=clen;
|
|
} while(size>0);
|
|
|
|
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;i<num;i++)
|
|
{
|
|
int j;
|
|
|
|
|
|
|
|
if (OFF3(offsets,i+index)!=0xffffff)
|
|
{
|
|
realnum++;
|
|
if (OFF3(offsets,i+index+1)!=0xffffff)
|
|
tile_len[i]=OFF3(offsets,i+index+1)-OFF3(offsets,i+index);
|
|
else
|
|
for (j=i+1;j<num+numm;j++)
|
|
if (OFF3(offsets,j+index)!=0xffffff)
|
|
{
|
|
tile_len[i]=OFF3(offsets,j+index)-OFF3(offsets,i+index);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
tile_len[i]=0;
|
|
|
|
}
|
|
MMAllocate((memptr *)&tilem_len,numm*2);
|
|
for (realnumm=i=0;i<numm;i++)
|
|
{
|
|
int j;
|
|
|
|
|
|
if (OFF3(offsets,i+indexm)!=0xffffff)
|
|
{
|
|
realnumm++;
|
|
if (OFF3(offsets,i+indexm+1)!=0xffffff)
|
|
tilem_len[i]=OFF3(offsets,i+indexm+1)-OFF3(offsets,i+indexm);
|
|
else
|
|
for (j=i+1;j<numm+1;j++)
|
|
if (OFF3(offsets,j+indexm)!=0xffffff)
|
|
{
|
|
tilem_len[i]=OFF3(offsets,j+indexm)-OFF3(offsets,i+indexm);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
tilem_len[i]=0;
|
|
}
|
|
|
|
//
|
|
// DON'T REALLOCATE THIS IF WE'RE COMING BACK FROM A LAUNCH!
|
|
//
|
|
if (!launched)
|
|
{
|
|
long size=expsize*realnum+expmsize*realnumm,savings=0;
|
|
|
|
|
|
if (1024L*XMSTotalFree()<size)
|
|
{
|
|
savings=CgaXMSsize+EgaXMSsize+VgaXMSsize;
|
|
if (1024L*XMSTotalFree()<size-savings)
|
|
{
|
|
MouseShow();
|
|
ErrDialog("Not enough memory to load\n"
|
|
"requested graphics.\n"," OK ");
|
|
|
|
MMFreePtr((memptr *)&GraphHeader);
|
|
MMFreePtr((memptr *)&packed);
|
|
MMFreePtr((memptr *)&unpack);
|
|
|
|
if (rtn)
|
|
return -1;
|
|
else
|
|
Quit("Get more Extended memory!");
|
|
}
|
|
|
|
if (CgaXMS)
|
|
{
|
|
XMSFreeMem(CgaXMS);
|
|
MMFreePtr((memptr *)&CgaXMSlookup);
|
|
}
|
|
if (EgaXMS)
|
|
{
|
|
XMSFreeMem(EgaXMS);
|
|
MMFreePtr((memptr *)&EgaXMSlookup);
|
|
}
|
|
if (VgaXMS)
|
|
{
|
|
XMSFreeMem(VgaXMS);
|
|
MMFreePtr((memptr *)&VgaXMSlookup);
|
|
}
|
|
CgaXMSsize=EgaXMSsize=VgaXMSsize=CgaXMS=EgaXMS=VgaXMS=0;
|
|
}
|
|
|
|
switch(tempvid)
|
|
{
|
|
case CGA:
|
|
xmshandle=CgaXMS=XMSAllocate(size);
|
|
CgaXMSsize=size;
|
|
break;
|
|
case EGA1:
|
|
case EGA2:
|
|
xmshandle=EgaXMS=XMSAllocate(size);
|
|
EgaXMSsize=size;
|
|
break;
|
|
case VGA:
|
|
xmshandle=VgaXMS=XMSAllocate(size);
|
|
VgaXMSsize=size;
|
|
}
|
|
|
|
ErrDialog("GRAPHICS INSTALLATION\n"
|
|
"Decompressing and\n"
|
|
"moving tiles into\n"
|
|
"Extended memory:","");
|
|
}
|
|
else
|
|
{
|
|
long size;
|
|
|
|
|
|
CgaXMS=TEDInfo->OldCgaXMS;
|
|
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;i<num;i++)
|
|
{
|
|
long size,off;
|
|
|
|
|
|
off=OFF3(offsets,index+i);
|
|
if (off==0xffffff) // SPARSE TILE?
|
|
{
|
|
*(XMSlookup+i)=-1;
|
|
continue;
|
|
}
|
|
|
|
size=tile_len[i];
|
|
|
|
//
|
|
// GET COMPRESSED TILE DATA FROM CACHE OR DISK
|
|
//
|
|
if (cacheon==1)
|
|
{
|
|
//
|
|
// HUFFMAN DECOMPRESS
|
|
//
|
|
HuffExpand((unsigned char huge *)CacheBlock+off,(unsigned char huge *)unpack+unpackoff,
|
|
expsize,(huffnode *)hufftable);
|
|
}
|
|
else
|
|
if (cacheon==2)
|
|
{
|
|
XMSmove(cacheon_h,off,0,(long)packed,size);
|
|
//
|
|
// HUFFMAN DECOMPRESS
|
|
//
|
|
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
|
|
expsize,(huffnode *)hufftable);
|
|
}
|
|
else
|
|
{
|
|
LoadFile(gname1,(char huge *)packed,off,size);
|
|
//
|
|
// HUFFMAN DECOMPRESS
|
|
//
|
|
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
|
|
expsize,(huffnode *)hufftable);
|
|
}
|
|
|
|
unpacksize+=expsize;
|
|
unpackoff+=expsize;
|
|
|
|
*(XMSlookup+i)=xmsoff;
|
|
xmsoff+=expsize;
|
|
|
|
if (unpacksize>unpackmax-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;i<numm;i++)
|
|
{
|
|
long size,off;
|
|
|
|
off=OFF3(offsets,indexm+i);
|
|
if (off==0xffffff) // SPARSE TILE?
|
|
{
|
|
*(XMSlookup+i+num)=-1;
|
|
continue;
|
|
}
|
|
|
|
size=tilem_len[i];
|
|
|
|
//
|
|
// GET COMPRESSED TILE DATA FROM CACHE OR DISK
|
|
//
|
|
if (cacheon==1)
|
|
{
|
|
//
|
|
// HUFFMAN DECOMPRESS
|
|
//
|
|
HuffExpand((unsigned char huge *)CacheBlock+off,(unsigned char huge *)unpack+unpackoff,
|
|
expmsize,(huffnode *)hufftable);
|
|
}
|
|
else
|
|
if (cacheon==2)
|
|
{
|
|
XMSmove(cacheon_h,off,0,(long)packed,size);
|
|
//
|
|
// HUFFMAN DECOMPRESS
|
|
//
|
|
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
|
|
expmsize,(huffnode *)hufftable);
|
|
}
|
|
else
|
|
{
|
|
LoadFile(gname1,(char huge *)packed,off,size);
|
|
//
|
|
// HUFFMAN DECOMPRESS
|
|
//
|
|
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
|
|
expmsize,(huffnode *)hufftable);
|
|
}
|
|
|
|
unpacksize+=expmsize;
|
|
unpackoff+=expmsize;
|
|
|
|
*(XMSlookup+i+num)=xmsoff;
|
|
xmsoff+=expmsize;
|
|
|
|
if (unpacksize>unpackmax-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,""}};
|