2034 lines
41 KiB
C++
2034 lines
41 KiB
C++
////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// TED5-3
|
|
//
|
|
////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////
|
|
#include "ted5.h"
|
|
#pragma hdrstop
|
|
|
|
int xms1;
|
|
extern int tics;
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// MAP SCROLLING
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void CheckMapScroll(void)
|
|
{
|
|
//
|
|
// LEFT
|
|
//
|
|
if (keydown[0x4b]) // left arrow
|
|
{
|
|
int i,j,imax,jmax,tilesmoved;
|
|
|
|
tics=biostime(0,0);
|
|
|
|
if (xbase)
|
|
{
|
|
EraseFloatPaste();
|
|
|
|
if (keydown[0x1d]) // CTRL-KEY
|
|
{
|
|
tilesmoved=screenw;
|
|
if (keydown[0x38]) // ALT-KEY
|
|
{
|
|
xbase=0;
|
|
DrawMap();
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
switch(videomode)
|
|
{
|
|
case CGA:
|
|
case EGA1:
|
|
case VGA:
|
|
tilesmoved=1;
|
|
break;
|
|
case EGA2:
|
|
tilesmoved=2;
|
|
}
|
|
|
|
if (xbase<tilesmoved)
|
|
tilesmoved=xbase;
|
|
xbase-=tilesmoved;
|
|
|
|
MouseHide();
|
|
if (tilesmoved<screenw)
|
|
CopyScreen(0,8,infomaxw-(tilesmoved<<(tsize-1)),screenh<<(tsize+2),tilesmoved<<(tsize-1),8);
|
|
|
|
jmax=screenh;
|
|
if (jmax>mapheight)
|
|
jmax=mapheight;
|
|
|
|
for (i=0;i<tilesmoved;i++)
|
|
for (j=0;j<jmax;j++)
|
|
{
|
|
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);
|
|
}
|
|
|
|
px+=tilesmoved;
|
|
DrawFloatPaste();
|
|
MouseShow();
|
|
if (keydown[0x36] || keydown[0x1d])
|
|
while(keydown[0x4b]);
|
|
}
|
|
}
|
|
else
|
|
//
|
|
// RIGHT
|
|
//
|
|
if (keydown[0x4d]) // right arrow
|
|
{
|
|
int i,j,imax,jmax,tilesmoved;
|
|
|
|
tics=biostime(0,0);
|
|
|
|
if (xbase+screenw<mapwidth)
|
|
{
|
|
EraseFloatPaste();
|
|
|
|
if (keydown[0x1d]) // CTRL-KEY
|
|
{
|
|
tilesmoved=screenw;
|
|
if (keydown[0x38]) // ALT-KEY
|
|
{
|
|
xbase=mapwidth-screenw;
|
|
DrawMap();
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
switch(videomode)
|
|
{
|
|
case CGA:
|
|
case EGA1:
|
|
case VGA:
|
|
tilesmoved=1;
|
|
break;
|
|
case EGA2:
|
|
tilesmoved=2;
|
|
}
|
|
|
|
|
|
if (xbase+screenw+tilesmoved>=mapwidth)
|
|
tilesmoved=mapwidth-screenw-xbase;
|
|
xbase+=tilesmoved;
|
|
|
|
MouseHide();
|
|
if (tilesmoved<screenw)
|
|
CopyScreen(tilesmoved<<(tsize-1),8,infomaxw-(tilesmoved<<(tsize-1)),screenh<<(tsize+2),0,8);
|
|
|
|
jmax=screenh;
|
|
if (jmax>mapheight)
|
|
jmax=mapheight;
|
|
|
|
for (i=0;i<tilesmoved;i++)
|
|
for (j=0;j<jmax;j++)
|
|
{
|
|
unsigned tilet,tilem,tilei,loc;
|
|
|
|
loc=(ybase+j)*mapwidth+xbase+screenw-tilesmoved+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(infomaxw-((tilesmoved-i)<<(tsize-1)),j*(4<<tsize)+8,tsize);
|
|
CheckInfoValues(screenw-tilesmoved+i,j,tilei);
|
|
CheckSelectEdges(screenw-tilesmoved+i+xbase,j+ybase,i+screenw-tilesmoved,j);
|
|
}
|
|
|
|
px+=tilesmoved;
|
|
DrawFloatPaste();
|
|
MouseShow();
|
|
if (keydown[0x36] || keydown[0x1d])
|
|
while(keydown[0x4d]);
|
|
}
|
|
}
|
|
|
|
//
|
|
// UP
|
|
//
|
|
if (keydown[0x48]) // up arrow
|
|
{
|
|
int i,j,imax,jmax,tilesmoved;
|
|
|
|
tics=biostime(0,0);
|
|
|
|
if (ybase)
|
|
{
|
|
EraseFloatPaste();
|
|
|
|
if (keydown[0x1d]) // CTRL-KEY
|
|
{
|
|
tilesmoved=screenh;
|
|
if (keydown[0x38]) // ALT-KEY
|
|
{
|
|
ybase=0;
|
|
DrawMap();
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
switch(videomode)
|
|
{
|
|
case CGA:
|
|
case EGA1:
|
|
case VGA:
|
|
tilesmoved=1;
|
|
break;
|
|
case EGA2:
|
|
tilesmoved=2;
|
|
}
|
|
|
|
if (ybase<tilesmoved)
|
|
tilesmoved=ybase;
|
|
ybase-=tilesmoved;
|
|
|
|
MouseHide();
|
|
if (tilesmoved<screenh)
|
|
CopyScreen(0,8,infomaxw,(screenh-tilesmoved)<<(tsize+2),0,8+(tilesmoved<<(tsize+2)));
|
|
|
|
imax=screenw;
|
|
if (imax>mapwidth)
|
|
imax=mapwidth;
|
|
|
|
for (j=0;j<tilesmoved;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),8+(j<<(tsize+2)),tsize);
|
|
CheckInfoValues(i,j,tilei);
|
|
CheckSelectEdges(i+xbase,j+ybase,i,j);
|
|
}
|
|
|
|
py+=tilesmoved;
|
|
DrawFloatPaste();
|
|
MouseShow();
|
|
if (keydown[0x36] || keydown[0x1d])
|
|
while(keydown[0x48]);
|
|
}
|
|
}
|
|
else
|
|
//
|
|
// DOWN
|
|
//
|
|
if (keydown[0x50]) // down arrow
|
|
{
|
|
int i,j,imax,jmax,tilesmoved;
|
|
|
|
tics=biostime(0,0);
|
|
|
|
if (ybase+screenh<mapheight)
|
|
{
|
|
EraseFloatPaste();
|
|
|
|
if (keydown[0x1d]) // CTRL-KEY
|
|
{
|
|
tilesmoved=screenh;
|
|
if (keydown[0x38]) // ALT-KEY
|
|
{
|
|
ybase=mapheight-screenh;
|
|
DrawMap();
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
switch(videomode)
|
|
{
|
|
case CGA:
|
|
case EGA1:
|
|
case VGA:
|
|
tilesmoved=1;
|
|
break;
|
|
case EGA2:
|
|
tilesmoved=2;
|
|
}
|
|
|
|
if (ybase+screenh+tilesmoved>=mapheight)
|
|
tilesmoved=mapheight-screenh-ybase;
|
|
ybase+=tilesmoved;
|
|
|
|
MouseHide();
|
|
if (tilesmoved<screenh)
|
|
CopyScreen(0,8+(tilesmoved<<(tsize+2)),infomaxw,(screenh-tilesmoved)<<(tsize+2),0,8);
|
|
|
|
imax=screenw;
|
|
if (imax>mapwidth)
|
|
imax=mapwidth;
|
|
|
|
for (j=0;j<tilesmoved;j++)
|
|
for (i=0;i<imax;i++)
|
|
{
|
|
unsigned tilet,tilem,tilei,loc;
|
|
|
|
loc=(ybase+j+screenh-tilesmoved)*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),8+((screenh-tilesmoved+j)<<(tsize+2)),tsize);
|
|
CheckInfoValues(i,screenh-tilesmoved+j,tilei);
|
|
CheckSelectEdges(i+xbase,screenh-tilesmoved+j+ybase,i,j+screenh-tilesmoved);
|
|
}
|
|
|
|
|
|
py+=tilesmoved;
|
|
DrawFloatPaste();
|
|
MouseShow();
|
|
if (keydown[0x36] || keydown[0x1d])
|
|
while(keydown[0x50]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Copy a screen section to another, mode independent
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void CopyScreen(int srcx,int srcy,int width,int height,int destx,int desty)
|
|
{
|
|
switch(videomode)
|
|
{
|
|
case CGA: CopyCGA(srcx,srcy,width,height,destx,desty); break;
|
|
case EGA1:
|
|
case EGA2:outport(SCindex,0x0f00 | SCmapmask);CopyEGA(srcx,srcy,width,height,destx,desty); break;
|
|
case VGA: CopyVGA(srcx,srcy,width,height,destx,desty);
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// See if either of the Select edges are visible on the map
|
|
// Draw them if so
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void CheckSelectEdges(int x,int y,int i,int j)
|
|
{
|
|
int temp;
|
|
|
|
if (SelX2<SelX1)
|
|
{
|
|
temp=SelX1;
|
|
SelX1=SelX2;
|
|
SelX2=temp;
|
|
}
|
|
if (SelY2<SelY1)
|
|
{
|
|
temp=SelY1;
|
|
SelY1=SelY2;
|
|
SelY2=temp;
|
|
}
|
|
|
|
if (y==SelY2 && x==SelX2)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 1: drawchar(i,j+1,8);
|
|
break;
|
|
case 2: drawchar(i*2+1,j*2+2,8);
|
|
drawchar(i*2+1,j*2+1,5);
|
|
drawchar(i*2,j*2+2,7);
|
|
break;
|
|
case 3: drawchar(i*4+3,j*4+4,8);
|
|
|
|
drawchar(i*4+3,j*4+3,5);
|
|
drawchar(i*4+3,j*4+2,5);
|
|
drawchar(i*4+3,j*4+1,5);
|
|
|
|
drawchar(i*4+2,j*4+4,7);
|
|
drawchar(i*4+1,j*4+4,7);
|
|
drawchar(i*4,j*4+4,7);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (y==SelY1 && x==SelX1)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 1: drawchar(i,j+1,1);
|
|
break;
|
|
case 2: drawchar(i*2,j*2+1,1);
|
|
drawchar(i*2+1,j*2+1,2);
|
|
drawchar(i*2,j*2+2,4);
|
|
break;
|
|
case 3: drawchar(i*4,j*4+1,1);
|
|
|
|
drawchar(i*4+1,j*4+1,2);
|
|
drawchar(i*4+2,j*4+1,2);
|
|
drawchar(i*4+3,j*4+1,2);
|
|
|
|
drawchar(i*4,j*4+2,4);
|
|
drawchar(i*4,j*4+3,4);
|
|
drawchar(i*4,j*4+4,4);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (y==SelY2 && x==SelX1)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 1: drawchar(i,j+1,6);
|
|
break;
|
|
case 2: drawchar(i*2 ,j*2+2,6);
|
|
drawchar(i*2+1,j*2+2,7);
|
|
drawchar(i*2 ,j*2+1,4);
|
|
break;
|
|
case 3: drawchar(i*4,j*4+4,6);
|
|
|
|
drawchar(i*4+1,j*4+4,7);
|
|
drawchar(i*4+2,j*4+4,7);
|
|
drawchar(i*4+3,j*4+4,7);
|
|
|
|
drawchar(i*4,j*4+1,4);
|
|
drawchar(i*4,j*4+2,4);
|
|
drawchar(i*4,j*4+3,4);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (y==SelY1 && x==SelX2)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 1: drawchar(i,j+1,3);
|
|
break;
|
|
case 2: drawchar(i*2+1,j*2+1,3);
|
|
drawchar(i*2+1,j*2+2,5);
|
|
drawchar(i*2 ,j*2+1,2);
|
|
break;
|
|
case 3: drawchar(i*4+3,j*4+1,3);
|
|
|
|
drawchar(i*4+3,j*4+4,5);
|
|
drawchar(i*4+3,j*4+3,5);
|
|
drawchar(i*4+3,j*4+2,5);
|
|
|
|
drawchar(i*4+2,j*4+4,7);
|
|
drawchar(i*4+1,j*4+4,7);
|
|
drawchar(i*4,j*4+4,7);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (y==SelY1 && x>SelX1 && x<SelX2)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 3: drawchar(i*4+2,j*4+1,2);
|
|
drawchar(i*4+3,j*4+1,2);
|
|
drawchar(i*4+1,j*4+1,2);
|
|
drawchar(i*4 ,j*4+1,2);
|
|
break;
|
|
case 2: drawchar(i*2+1,j*2+1,2);
|
|
drawchar(i*2 ,j*2+1,2);
|
|
break;
|
|
case 1: drawchar(i,j+1,2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (y==SelY2 && x>SelX1 && x<SelX2)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 1: drawchar(i,j+1,7);
|
|
break;
|
|
case 2: drawchar(i*2,j*2+2,7);
|
|
drawchar(i*2+1,j*2+2,7);
|
|
break;
|
|
case 3: drawchar(i*4 ,j*4+4,7);
|
|
drawchar(i*4+1,j*4+4,7);
|
|
drawchar(i*4+2,j*4+4,7);
|
|
drawchar(i*4+3,j*4+4,7);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (x==SelX1 && y>SelY1 && y<SelY2)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 3: drawchar(i*4,j*4+3,4);
|
|
drawchar(i*4,j*4+4,4);
|
|
drawchar(i*4,j*4+2,4);
|
|
drawchar(i*4,j*4+1,4);
|
|
break;
|
|
case 2: drawchar(i*2,j*2+2,4);
|
|
drawchar(i*2,j*2+1,4);
|
|
break;
|
|
case 1: drawchar(i,j+1,4);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (x==SelX2 && y>SelY1 && y<SelY2)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 1: drawchar(i,j+1,5);
|
|
break;
|
|
case 2: drawchar(i*2+1,j*2+1,5);
|
|
drawchar(i*2+1,j*2+2,5);
|
|
break;
|
|
case 3: drawchar(i*4+3,j*4+1,5);
|
|
drawchar(i*4+2,j*4+1,5);
|
|
drawchar(i*4+1,j*4+1,5);
|
|
drawchar(i*4 ,j*4+1,5);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// FLOATING PASTE REGION!
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void CheckFloatPaste(int mx,int my)
|
|
{
|
|
int i,j,maxh,maxw;
|
|
|
|
|
|
if (SnapMode && PasteMode && (pixely>=8 || pixely<infoy*8))
|
|
{
|
|
mx=(mx/snapxsize)*snapxsize+snapx;
|
|
my=(my/snapysize)*snapysize+snapy;
|
|
|
|
if (mx<xbase)
|
|
mx+=snapxsize;
|
|
if (my<ybase)
|
|
my+=snapysize;
|
|
if (mx>=xbase+screenw)
|
|
mx-=snapxsize;
|
|
if (my>=ybase+screenh)
|
|
my-=snapysize;
|
|
}
|
|
|
|
if (!PasteMode || (px==mx && py==my) || (pixely<8 || pixely>infoy*8))
|
|
return;
|
|
|
|
if (mx>mapwidth || my>mapheight)
|
|
return;
|
|
|
|
MouseHide();
|
|
EraseFloatPaste();
|
|
|
|
//
|
|
// FLOAT IT...
|
|
//
|
|
px=mx;
|
|
py=my;
|
|
|
|
DrawFloatPaste();
|
|
MouseShow();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// DRAW FLOATING PASTE REGION
|
|
//
|
|
void DrawFloatPaste(void)
|
|
{
|
|
int i,j,maxw,maxh;
|
|
|
|
|
|
if (px==-1 || py==-1 || !PasteMode)
|
|
return;
|
|
//
|
|
// NOW, DRAW IT IN A NEW LOCATION!
|
|
//
|
|
MouseHide();
|
|
|
|
|
|
maxh=TileCopy.h;
|
|
if (py+maxh>mapheight)
|
|
maxh=mapheight-py;
|
|
if (py+maxh-ybase>screenh)
|
|
maxh=screenh-(py-ybase);
|
|
|
|
maxw=TileCopy.w;
|
|
if (px+maxw>mapwidth)
|
|
maxw=mapwidth-px;
|
|
if (px+maxw-xbase>screenw)
|
|
maxw=screenw-(px-xbase);
|
|
|
|
switch(TileCopy.MapOrTileSelect)
|
|
{
|
|
case 0: // MAP PASTE DRAW
|
|
for (j=0;j<maxh;j++)
|
|
for (i=0;i<maxw;i++)
|
|
{
|
|
unsigned tilet,tilem,tilei,loc,loc1,oldt,oldm,oldi;
|
|
int theT,theM,theI;
|
|
|
|
loc=(TileCopy.y+j)*mapwidth+TileCopy.x+i;
|
|
loc1=(py+j)*mapwidth+px+i;
|
|
|
|
tilet=*(CutBkgnd+loc);
|
|
oldt=MapBkgnd[loc1];
|
|
tilem=*(CutFrgnd+loc)+tilenum;
|
|
if (tilem==tilenum)
|
|
tilem=0;
|
|
oldm=MapFrgnd[loc1]+tilenum;
|
|
tilei=*(CutInfoPl+loc)+tilenum;
|
|
if (tilei==tilenum)
|
|
tilei=0;
|
|
oldi=MapInfoPl[loc1]+tilenum;
|
|
|
|
theT=(TileCopy.PlanesCopied&BPLANE)?tilet:-BkgndColor;
|
|
if (theT==-BkgndColor && viewton)
|
|
theT=oldt;
|
|
theM=(TileCopy.PlanesCopied&FPLANE)?tilem:0;
|
|
if (!theM && viewmon && !(TileCopy.PlanesCopied&FPLANE && F3_flag))
|
|
theM=oldm;
|
|
theI=(TileCopy.PlanesCopied&IPLANE)?tilei:0;
|
|
if (!theI && viewion && !(TileCopy.PlanesCopied&IPLANE && F3_flag))
|
|
theI=oldi;
|
|
|
|
CombineTiles(theT,theM,theI,tsize);
|
|
if (GridMode)
|
|
Overlay(tsize);
|
|
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
|
|
}
|
|
break;
|
|
|
|
case 1: // TILE PASTE DRAW
|
|
for (j=0;j<maxh;j++)
|
|
for (i=0;i<maxw;i++)
|
|
{
|
|
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i;
|
|
unsigned tilem,tilei,loc;
|
|
|
|
loc=(py+j)*mapwidth+px+i;
|
|
|
|
tilem=MapFrgnd[loc]+tilenum;
|
|
tilei=MapInfoPl[loc]+tilenum;
|
|
|
|
if (XMSlookup[val]!=-1)
|
|
{
|
|
CombineTiles(viewton?val:-BkgndColor,
|
|
viewmon?tilem:0,
|
|
viewion?tilei:0,
|
|
tsize);
|
|
if (GridMode)
|
|
Overlay(tsize);
|
|
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 2: // MASKED PASTE DRAW
|
|
for (j=0;j<maxh;j++)
|
|
for (i=0;i<maxw;i++)
|
|
{
|
|
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i+tilenum+maxiconrows*selectcols;
|
|
unsigned tilet,tilei,loc;
|
|
|
|
loc=(py+j)*mapwidth+px+i;
|
|
|
|
tilet=MapBkgnd[loc];
|
|
tilei=MapInfoPl[loc]+tilenum;
|
|
|
|
if (XMSlookup[val]!=-1)
|
|
{
|
|
CombineTiles(viewton?tilet:-BkgndColor,
|
|
viewmon?val:0,
|
|
viewion?tilei:0,
|
|
tsize);
|
|
if (GridMode)
|
|
Overlay(tsize);
|
|
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
|
|
}
|
|
}
|
|
}
|
|
|
|
MouseShow();
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// ERASE FLOATING PASTE REGION
|
|
//
|
|
void EraseFloatPaste(void)
|
|
{
|
|
int maxh,maxw,i,j;
|
|
|
|
|
|
if (px==-1 || py==-1 || !PasteMode)
|
|
return;
|
|
|
|
//
|
|
// ERASE THE FLOATING REGION
|
|
// (PRECLIPPING REGION)
|
|
//
|
|
MouseHide();
|
|
|
|
maxh=TileCopy.h;
|
|
if (py+maxh>mapheight)
|
|
maxh=mapheight-py;
|
|
if (py+maxh-ybase>screenh)
|
|
maxh=screenh-(py-ybase);
|
|
|
|
maxw=TileCopy.w;
|
|
if (px+maxw>mapwidth)
|
|
maxw=mapwidth-px;
|
|
if (px+maxw-xbase>screenw)
|
|
maxw=screenw-(px-xbase);
|
|
|
|
for (j=0;j<maxh;j++)
|
|
for (i=0;i<maxw;i++)
|
|
{
|
|
unsigned tile_t,tile_m,tile_i,loc;
|
|
|
|
loc=(py+j)*mapwidth+px+i;
|
|
|
|
tile_t=*(MapBkgnd+loc);
|
|
tile_m=*(MapFrgnd+loc)+tilenum;
|
|
tile_i=*(MapInfoPl+loc)+tilenum;
|
|
|
|
CombineTiles(viewton?tile_t:-BkgndColor,viewmon?tile_m:0,viewion?tile_i:0,tsize);
|
|
if (GridMode)
|
|
Overlay(tsize);
|
|
DrawTile((px+i-xbase)<<(tsize-1),(py+j-ybase)*(4<<tsize)+8,tsize);
|
|
}
|
|
|
|
MouseShow();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// SAVE CUT BUFFERS TO XMS BEFORE MAP LOAD/CREATE
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void SaveCutBuffers(void)
|
|
{
|
|
long size,off;
|
|
int j;
|
|
|
|
//
|
|
// IS SOMETHING IN THE COPY BUFFER?
|
|
// IF SO, PRESERVE AS MUCH AS POSSIBLE
|
|
//
|
|
if (!TileCopy.MapOrTileSelect)
|
|
{
|
|
size=(2L*TileCopy.w*TileCopy.h)*(((TileCopy.PlanesCopied&BPLANE)>0)+
|
|
((TileCopy.PlanesCopied&FPLANE)>0)+((TileCopy.PlanesCopied&IPLANE)>0));
|
|
|
|
xms1=XMSAllocate(size);
|
|
|
|
off=0;
|
|
if (TileCopy.PlanesCopied&BPLANE)
|
|
for (j=0;j<TileCopy.h;j++)
|
|
{
|
|
XMSmove(0,(long)MK_FP(CutBkgnd,2L*((TileCopy.y+j)*mapwidth)+2L*TileCopy.x),
|
|
xms1,off,2L*TileCopy.w);
|
|
off+=2L*TileCopy.w;
|
|
}
|
|
|
|
if (TileCopy.PlanesCopied&FPLANE)
|
|
for (j=0;j<TileCopy.h;j++)
|
|
{
|
|
XMSmove(0,(long)MK_FP(CutFrgnd,2L*((TileCopy.y+j)*mapwidth)+2L*TileCopy.x),
|
|
xms1,off,2L*TileCopy.w);
|
|
off+=2L*TileCopy.w;
|
|
}
|
|
|
|
if (TileCopy.PlanesCopied&IPLANE)
|
|
for (j=0;j<TileCopy.h;j++)
|
|
{
|
|
XMSmove(0,(long)MK_FP(CutInfoPl,2L*((TileCopy.y+j)*mapwidth)+2L*TileCopy.x),
|
|
xms1,off,2L*TileCopy.w);
|
|
off+=2L*TileCopy.w;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// RESTORE CUT BUFFERS FROM XMS AFTER MAP LOAD/CREATE
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void RestoreCutBuffers(void)
|
|
{
|
|
//
|
|
// COPY BACK STUFF IN XMS
|
|
//
|
|
if (!TileCopy.MapOrTileSelect)
|
|
{
|
|
long ToOff,off;
|
|
int newwidth,newheight,j;
|
|
|
|
newwidth=(TileCopy.w>mapwidth)?mapwidth:TileCopy.w;
|
|
newheight=(TileCopy.h>mapheight)?mapheight:TileCopy.h;
|
|
|
|
ToOff=off=0;
|
|
|
|
if (TileCopy.PlanesCopied&BPLANE)
|
|
for (j=0;j<newheight;j++)
|
|
{
|
|
XMSmove(xms1,off,0,(long)MK_FP(CutBkgnd,2L*(j*mapwidth)),2L*newwidth);
|
|
ToOff+=2L*newwidth;
|
|
off+=2L*TileCopy.w;
|
|
}
|
|
|
|
if (TileCopy.PlanesCopied&FPLANE)
|
|
for (j=0;j<newheight;j++)
|
|
{
|
|
XMSmove(xms1,off,0,(long)MK_FP(CutFrgnd,2L*(j*mapwidth)),2L*newwidth);
|
|
ToOff+=2L*newwidth;
|
|
off+=2L*TileCopy.w;
|
|
}
|
|
|
|
if (TileCopy.PlanesCopied&IPLANE)
|
|
for (j=0;j<newheight;j++)
|
|
{
|
|
XMSmove(xms1,off,0,(long)MK_FP(CutInfoPl,2L*(j*mapwidth)),2L*newwidth);
|
|
ToOff+=2L*newwidth;
|
|
off+=2L*TileCopy.w;
|
|
}
|
|
|
|
TileCopy.x=TileCopy.y=0;
|
|
TileCopy.w=newwidth;
|
|
TileCopy.h=newheight;
|
|
|
|
XMSFreeMem(xms1); // RELEASE THE MEMORY
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// SEE IF THERE'S AN INFO VALUES AT THE CURRENT POSITION
|
|
// THAT NEEDS TO BE PRINTED
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void CheckInfoValues(int i,int j,int tilei)
|
|
{
|
|
sx=i<<(tsize-1);
|
|
sy=(j<<(tsize-1))+1;
|
|
|
|
if (TsearchMode)
|
|
{
|
|
unsigned loc,temp,p=0;
|
|
|
|
loc=(j+ybase)*mapwidth+i+xbase;
|
|
|
|
if (planeton)
|
|
{
|
|
if (MapBkgnd[loc]==whicht)
|
|
{
|
|
temp=whicht;
|
|
p=1;
|
|
}
|
|
}
|
|
else
|
|
if (planemon)
|
|
{
|
|
if (MapFrgnd[loc]==whichtm-tilenum)
|
|
{
|
|
temp=whichtm-tilenum;
|
|
p=1;
|
|
}
|
|
}
|
|
else
|
|
if (planeion)
|
|
if ((unsigned)MapInfoPl[loc]==whichi-tilenum)
|
|
{
|
|
temp=whichi-tilenum;
|
|
p=1;
|
|
}
|
|
|
|
if (p)
|
|
switch(tsize)
|
|
{
|
|
case 1:
|
|
print("#");
|
|
break;
|
|
case 2:
|
|
printhexb(temp>>8);
|
|
sx-=2;
|
|
sy++;
|
|
printhexb(temp&0xff);
|
|
break;
|
|
case 3: printhex(temp);
|
|
}
|
|
}
|
|
else
|
|
if (viewion && tilei>lasticon)
|
|
{
|
|
switch(tsize)
|
|
{
|
|
case 1:
|
|
print("#");
|
|
break;
|
|
case 2:
|
|
printhexb(tilei-tilenum>>8);
|
|
sx-=2;
|
|
sy++;
|
|
printhexb(tilei-tilenum&0xff);
|
|
break;
|
|
case 3: printhex(tilei-tilenum);
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Item - Edit Map Edges
|
|
//
|
|
////////////////////////////////////////////////////
|
|
btype MapEdgeB[]={{"\xb",7,3,1},
|
|
{"\xc",7,7,1},
|
|
{"\xe",4,5,1},
|
|
{"\x1f",10,5,1},
|
|
{" Exit ",5,16,2}};
|
|
DialogDef MapEdgeD={" PICK MAP EDGE\n"
|
|
" TO CHANGE",
|
|
16,18,5,&MapEdgeB[0],NULL};
|
|
|
|
void Item_EditMapEdges(void)
|
|
{
|
|
int which,val,newwidth,newheight,b,f,i,
|
|
_seg *tempB,_seg *tempF,_seg *tempI;
|
|
unsigned dx,dy,obx,oby,k,j,modified=0;
|
|
long size;
|
|
|
|
b=MapFileHeader->maptype&BPLANE;
|
|
f=MapFileHeader->maptype&FPLANE;
|
|
i=MapFileHeader->maptype&IPLANE;
|
|
|
|
DrawDialog(&MapEdgeD,1);
|
|
GetDialogXY(&MapEdgeD,&dx,&dy);
|
|
do
|
|
{
|
|
MouseHide();
|
|
sx=dx+2;
|
|
sy=dy+14;
|
|
print("W:");
|
|
printint(MapHeader.width);
|
|
print(", H:");
|
|
printint(MapHeader.height);
|
|
print(" ");
|
|
MouseShow();
|
|
|
|
|
|
which=CheckButtons(&MapEdgeD);
|
|
GetButtonXY(&MapEdgeD,which-1,&obx,&oby);
|
|
MouseHide();
|
|
if (which>=1 && which<=4)
|
|
{
|
|
// DRAW INPUT BAR
|
|
sx=dx;
|
|
sy=dy+9;
|
|
print("+ or - value");
|
|
DrawBorder(dx,dy+10,15,2,1);
|
|
|
|
// INPUT VALUE
|
|
sx=dx+1;
|
|
sy=dy+11;
|
|
val=inputint(9);
|
|
|
|
// ERASE THE ARROW AND INPUT BAR
|
|
sx=obx;
|
|
sy=oby;
|
|
print(MapEdgeB[which-1].text);
|
|
bar(dx,dy+9,dx+15,dy+12,' ');
|
|
|
|
// CHECK FOR ESC
|
|
if (val==(int)ESCOUT)
|
|
which=6;
|
|
}
|
|
|
|
MouseShow();
|
|
switch(which)
|
|
{
|
|
//
|
|
// ADD OR DELETE FROM TOP
|
|
//
|
|
case 1:
|
|
newheight=mapheight+val;
|
|
size=2L*newheight*mapwidth;
|
|
if (size<=0 || size>0x10000L)
|
|
{
|
|
RestoreBackground();
|
|
ErrDialog("Invalid Map height!"," OK ");
|
|
return;
|
|
}
|
|
|
|
// FREE UP SOME MEMORY!
|
|
SaveCutBuffers();
|
|
RemoveUndoBuffers();
|
|
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&CutBkgnd);
|
|
MMAllocate((memptr *)&tempB,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&CutFrgnd);
|
|
MMAllocate((memptr *)&tempF,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&CutInfoPl);
|
|
MMAllocate((memptr *)&tempI,size);
|
|
}
|
|
|
|
if (val<0)
|
|
{
|
|
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
|
|
for (j=abs(val);j<mapheight;j++)
|
|
for (k=0;k<mapwidth;k++)
|
|
{
|
|
if (b)
|
|
tempB[(j+val)*mapwidth+k]=MapBkgnd[j*mapwidth+k];
|
|
if (f)
|
|
tempF[(j+val)*mapwidth+k]=MapFrgnd[j*mapwidth+k];
|
|
if (i)
|
|
tempI[(j+val)*mapwidth+k]=MapInfoPl[j*mapwidth+k];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (j=0;j<mapheight+val;j++)
|
|
for (k=0;k<mapwidth;k++)
|
|
{
|
|
if (j<abs(val))
|
|
{
|
|
if (b)
|
|
tempB[j*mapwidth+k]=whicht;
|
|
if (f)
|
|
tempF[j*mapwidth+k]=whichtm-tilenum;
|
|
if (i)
|
|
tempI[j*mapwidth+k]=whichi-tilenum;
|
|
}
|
|
else
|
|
{
|
|
if (b)
|
|
tempB[j*mapwidth+k]=MapBkgnd[(j-val)*mapwidth+k];
|
|
if (f)
|
|
tempF[j*mapwidth+k]=MapFrgnd[(j-val)*mapwidth+k];
|
|
if (i)
|
|
tempI[j*mapwidth+k]=MapInfoPl[(j-val)*mapwidth+k];
|
|
}
|
|
}
|
|
}
|
|
|
|
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&MapBkgnd);
|
|
MMAllocate((memptr *)&MapBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&MapFrgnd);
|
|
MMAllocate((memptr *)&MapFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&MapInfoPl);
|
|
MMAllocate((memptr *)&MapInfoPl,size);
|
|
}
|
|
|
|
// COPY THE REGION BACK IN...
|
|
for (j=0;j<newheight;j++)
|
|
for (k=0;k<mapwidth;k++)
|
|
{
|
|
if (b)
|
|
MapBkgnd[j*mapwidth+k]=tempB[j*mapwidth+k];
|
|
if (f)
|
|
MapFrgnd[j*mapwidth+k]=tempF[j*mapwidth+k];
|
|
if (i)
|
|
MapInfoPl[j*mapwidth+k]=tempI[j*mapwidth+k];
|
|
}
|
|
|
|
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&tempB);
|
|
MMAllocate((memptr *)&CutBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&tempF);
|
|
MMAllocate((memptr *)&CutFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&tempI);
|
|
MMAllocate((memptr *)&CutInfoPl,size);
|
|
}
|
|
|
|
mapheight=newheight;
|
|
MapHeader.height=newheight;
|
|
modified=DirtyFlag=1;
|
|
AllocateUndoBuffers();
|
|
UndoRegion.x=-1;
|
|
SaveUndo(0,0,mapwidth,mapheight);
|
|
RestoreCutBuffers();
|
|
|
|
break;
|
|
|
|
//
|
|
// ADD OR DELETE FROM BOTTOM
|
|
//
|
|
case 2:
|
|
newheight=mapheight+val;
|
|
size=2L*newheight*mapwidth;
|
|
if (size<=0 || size>0x10000L)
|
|
{
|
|
RestoreBackground();
|
|
ErrDialog("Invalid Map height!"," OK ");
|
|
return;
|
|
}
|
|
|
|
// FREE UP SOME MEMORY!
|
|
SaveCutBuffers();
|
|
RemoveUndoBuffers();
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&CutBkgnd);
|
|
MMAllocate((memptr *)&tempB,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&CutFrgnd);
|
|
MMAllocate((memptr *)&tempF,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&CutInfoPl);
|
|
MMAllocate((memptr *)&tempI,size);
|
|
}
|
|
|
|
if (val<0)
|
|
{
|
|
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
|
|
for (j=0;j<mapheight+val;j++)
|
|
for (k=0;k<mapwidth;k++)
|
|
{
|
|
if (b)
|
|
tempB[j*mapwidth+k]=MapBkgnd[j*mapwidth+k];
|
|
if (f)
|
|
tempF[j*mapwidth+k]=MapFrgnd[j*mapwidth+k];
|
|
if (i)
|
|
tempI[j*mapwidth+k]=MapInfoPl[j*mapwidth+k];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (j=0;j<mapheight+val;j++)
|
|
for (k=0;k<mapwidth;k++)
|
|
{
|
|
if (j>=mapheight)
|
|
{
|
|
if (b)
|
|
tempB[j*mapwidth+k]=whicht;
|
|
if (f)
|
|
tempF[j*mapwidth+k]=whichtm-tilenum;
|
|
if (i)
|
|
tempI[j*mapwidth+k]=whichi-tilenum;
|
|
}
|
|
else
|
|
{
|
|
if (b)
|
|
tempB[j*mapwidth+k]=MapBkgnd[j*mapwidth+k];
|
|
if (f)
|
|
tempF[j*mapwidth+k]=MapFrgnd[j*mapwidth+k];
|
|
if (i)
|
|
tempI[j*mapwidth+k]=MapInfoPl[j*mapwidth+k];
|
|
}
|
|
}
|
|
}
|
|
|
|
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&MapBkgnd);
|
|
MMAllocate((memptr *)&MapBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&MapFrgnd);
|
|
MMAllocate((memptr *)&MapFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&MapInfoPl);
|
|
MMAllocate((memptr *)&MapInfoPl,size);
|
|
}
|
|
|
|
// COPY THE REGION BACK IN...
|
|
for (j=0;j<newheight;j++)
|
|
for (k=0;k<mapwidth;k++)
|
|
{
|
|
if (b)
|
|
MapBkgnd[j*mapwidth+k]=tempB[j*mapwidth+k];
|
|
if (f)
|
|
MapFrgnd[j*mapwidth+k]=tempF[j*mapwidth+k];
|
|
if (i)
|
|
MapInfoPl[j*mapwidth+k]=tempI[j*mapwidth+k];
|
|
}
|
|
|
|
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&tempB);
|
|
MMAllocate((memptr *)&CutBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&tempF);
|
|
MMAllocate((memptr *)&CutFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&tempI);
|
|
MMAllocate((memptr *)&CutInfoPl,size);
|
|
}
|
|
|
|
mapheight=newheight;
|
|
MapHeader.height=newheight;
|
|
modified=DirtyFlag=1;
|
|
AllocateUndoBuffers();
|
|
UndoRegion.x=-1;
|
|
SaveUndo(0,0,mapwidth,mapheight);
|
|
RestoreCutBuffers();
|
|
|
|
break;
|
|
|
|
//
|
|
// ADD OR DELETE FROM LEFTEDGE
|
|
//
|
|
case 3:
|
|
newwidth=mapwidth+val;
|
|
size=2L*newwidth*mapheight;
|
|
if (size<=0 || size>0x10000L)
|
|
{
|
|
RestoreBackground();
|
|
ErrDialog("Invalid Map width!"," OK ");
|
|
return;
|
|
}
|
|
|
|
// FREE UP SOME MEMORY!
|
|
SaveCutBuffers();
|
|
RemoveUndoBuffers();
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&CutBkgnd);
|
|
MMAllocate((memptr *)&tempB,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&CutFrgnd);
|
|
MMAllocate((memptr *)&tempF,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&CutInfoPl);
|
|
MMAllocate((memptr *)&tempI,size);
|
|
}
|
|
|
|
if (val<0)
|
|
{
|
|
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
|
|
for (j=0;j<mapheight;j++)
|
|
for (k=abs(val);k<mapwidth;k++)
|
|
{
|
|
if (b)
|
|
tempB[j*newwidth+k+val]=MapBkgnd[j*mapwidth+k];
|
|
if (f)
|
|
tempF[j*newwidth+k+val]=MapFrgnd[j*mapwidth+k];
|
|
if (i)
|
|
tempI[j*newwidth+k+val]=MapInfoPl[j*mapwidth+k];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (j=0;j<mapheight;j++)
|
|
for (k=0;k<mapwidth+val;k++)
|
|
{
|
|
if (k<abs(val))
|
|
{
|
|
if (b)
|
|
tempB[j*newwidth+k]=whicht;
|
|
if (f)
|
|
tempF[j*newwidth+k]=whichtm-tilenum;
|
|
if (i)
|
|
tempI[j*newwidth+k]=whichi-tilenum;
|
|
}
|
|
else
|
|
{
|
|
if (b)
|
|
tempB[j*newwidth+k]=MapBkgnd[j*mapwidth+k-val];
|
|
if (f)
|
|
tempF[j*newwidth+k]=MapFrgnd[j*mapwidth+k-val];
|
|
if (i)
|
|
tempI[j*newwidth+k]=MapInfoPl[j*mapwidth+k-val];
|
|
}
|
|
}
|
|
}
|
|
|
|
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&MapBkgnd);
|
|
MMAllocate((memptr *)&MapBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&MapFrgnd);
|
|
MMAllocate((memptr *)&MapFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&MapInfoPl);
|
|
MMAllocate((memptr *)&MapInfoPl,size);
|
|
}
|
|
|
|
// COPY THE REGION BACK IN...
|
|
for (j=0;j<mapheight;j++)
|
|
for (k=0;k<newwidth;k++)
|
|
{
|
|
if (b)
|
|
MapBkgnd[j*newwidth+k]=tempB[j*newwidth+k];
|
|
if (f)
|
|
MapFrgnd[j*newwidth+k]=tempF[j*newwidth+k];
|
|
if (i)
|
|
MapInfoPl[j*newwidth+k]=tempI[j*newwidth+k];
|
|
}
|
|
|
|
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&tempB);
|
|
MMAllocate((memptr *)&CutBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&tempF);
|
|
MMAllocate((memptr *)&CutFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&tempI);
|
|
MMAllocate((memptr *)&CutInfoPl,size);
|
|
}
|
|
|
|
mapwidth=newwidth;
|
|
MapHeader.width=newwidth;
|
|
modified=DirtyFlag=1;
|
|
AllocateUndoBuffers();
|
|
UndoRegion.x=-1;
|
|
SaveUndo(0,0,mapwidth,mapheight);
|
|
RestoreCutBuffers();
|
|
|
|
break;
|
|
|
|
//
|
|
// ADD OR DELETE FROM RIGHTEDGE
|
|
//
|
|
case 4:
|
|
newwidth=mapwidth+val;
|
|
size=2L*newwidth*mapheight;
|
|
if (size<=0 || size>0x10000L)
|
|
{
|
|
RestoreBackground();
|
|
ErrDialog("Invalid Map width!"," OK ");
|
|
return;
|
|
}
|
|
|
|
// FREE UP SOME MEMORY!
|
|
SaveCutBuffers();
|
|
RemoveUndoBuffers();
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&CutBkgnd);
|
|
MMAllocate((memptr *)&tempB,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&CutFrgnd);
|
|
MMAllocate((memptr *)&tempF,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&CutInfoPl);
|
|
MMAllocate((memptr *)&tempI,size);
|
|
}
|
|
|
|
if (val<0)
|
|
{
|
|
// COPY MAP PLANES INTO TEMP MEMORY (CLIPPED, HERE)
|
|
for (j=0;j<mapheight;j++)
|
|
for (k=0;k<mapwidth+val;k++)
|
|
{
|
|
if (b)
|
|
tempB[j*newwidth+k]=MapBkgnd[j*mapwidth+k];
|
|
if (f)
|
|
tempF[j*newwidth+k]=MapFrgnd[j*mapwidth+k];
|
|
if (i)
|
|
tempI[j*newwidth+k]=MapInfoPl[j*mapwidth+k];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (j=0;j<mapheight;j++)
|
|
for (k=0;k<mapwidth+val;k++)
|
|
{
|
|
if (k>=mapwidth)
|
|
{
|
|
if (b)
|
|
tempB[j*newwidth+k]=whicht;
|
|
if (f)
|
|
tempF[j*newwidth+k]=whichtm-tilenum;
|
|
if (i)
|
|
tempI[j*newwidth+k]=whichi-tilenum;
|
|
}
|
|
else
|
|
{
|
|
if (b)
|
|
tempB[j*newwidth+k]=MapBkgnd[j*mapwidth+k];
|
|
if (f)
|
|
tempF[j*newwidth+k]=MapFrgnd[j*mapwidth+k];
|
|
if (i)
|
|
tempI[j*newwidth+k]=MapInfoPl[j*mapwidth+k];
|
|
}
|
|
}
|
|
}
|
|
|
|
// DEALLOCATE & REALLOCATE THE MAP BUFFERS, RESIZED
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&MapBkgnd);
|
|
MMAllocate((memptr *)&MapBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&MapFrgnd);
|
|
MMAllocate((memptr *)&MapFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&MapInfoPl);
|
|
MMAllocate((memptr *)&MapInfoPl,size);
|
|
}
|
|
|
|
// COPY THE REGION BACK IN...
|
|
for (j=0;j<mapheight;j++)
|
|
for (k=0;k<newwidth;k++)
|
|
{
|
|
if (b)
|
|
MapBkgnd[j*newwidth+k]=tempB[j*newwidth+k];
|
|
if (f)
|
|
MapFrgnd[j*newwidth+k]=tempF[j*newwidth+k];
|
|
if (i)
|
|
MapInfoPl[j*newwidth+k]=tempI[j*newwidth+k];
|
|
}
|
|
|
|
// TOAST THE 'TEMP' BUFFERS & REALLOCATE THE 'CUT' BUFFERS
|
|
if (b)
|
|
{
|
|
MMFreePtr((memptr *)&tempB);
|
|
MMAllocate((memptr *)&CutBkgnd,size);
|
|
}
|
|
if (f)
|
|
{
|
|
MMFreePtr((memptr *)&tempF);
|
|
MMAllocate((memptr *)&CutFrgnd,size);
|
|
}
|
|
if (i)
|
|
{
|
|
MMFreePtr((memptr *)&tempI);
|
|
MMAllocate((memptr *)&CutInfoPl,size);
|
|
}
|
|
|
|
mapwidth=newwidth;
|
|
MapHeader.width=newwidth;
|
|
modified=DirtyFlag=1;
|
|
AllocateUndoBuffers();
|
|
UndoRegion.x=-1;
|
|
SaveUndo(0,0,mapwidth,mapheight);
|
|
RestoreCutBuffers();
|
|
break;
|
|
}
|
|
} while(which && which!=5);
|
|
RestoreBackground();
|
|
if (modified)
|
|
{
|
|
xbase=ybase=0;
|
|
MouseHide();
|
|
InitDesktop(TED5MenuBar,0);
|
|
DrawInfoBar();
|
|
DrawMap();
|
|
MouseShow();
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Display amount of memory available
|
|
//
|
|
////////////////////////////////////////////////////
|
|
btype ShowMemb={" OK ",6,11,2};
|
|
DialogDef ShowMemd={"Extended Memory \n"
|
|
"Available:\n\n"
|
|
"Main Memory\n"
|
|
"Available:\n\n"
|
|
"In Extended Mem\n"
|
|
"----------------\n"
|
|
"CGA: EGA:\n"
|
|
"VGA: Maps:"
|
|
,16,13,1,&ShowMemb,PrintMem};
|
|
|
|
void Item_PrintMem(void)
|
|
{
|
|
DoDialog(&ShowMemd);
|
|
}
|
|
|
|
void PrintMem(int x,int y)
|
|
{
|
|
long total;
|
|
char memstring[10];
|
|
|
|
sx=x+10;
|
|
sy=y+1;
|
|
itoa(XMSTotalFree(),memstring,10);
|
|
strcat(memstring,"K");
|
|
print(memstring);
|
|
|
|
sx=x+10;
|
|
sy=y+4;
|
|
total=(MMTotalFree()*16L)/1024;
|
|
ltoa(total,memstring,10);
|
|
strcat(memstring,"K");
|
|
print(memstring);
|
|
|
|
sx=x+4;
|
|
sy=y+8;
|
|
if (!CgaXMS)
|
|
print("No");
|
|
else
|
|
print("Yes");
|
|
|
|
sx=x+13;
|
|
sy=y+8;
|
|
if (!EgaXMS)
|
|
print("No");
|
|
else
|
|
print("Yes");
|
|
|
|
sx=x+4;
|
|
sy=y+9;
|
|
if (!VgaXMS)
|
|
print("No");
|
|
else
|
|
print("Yes");
|
|
|
|
|
|
sx=x+13;
|
|
sy=y+9;
|
|
if (!XMSmaps)
|
|
print("No");
|
|
else
|
|
print("Yes");
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// CARMACIZE THE MAP FILE!
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void Item_Huffman(void)
|
|
{
|
|
OutputHeadStr NewFileHeader;
|
|
char huffname[14]="GAMEMAPS.",huffheadname[14]="MAPSHEAD.",tempstr[200],
|
|
mapidstr[8]=IDSTRING,objname[14],dictname[14],tempname[14];
|
|
int dx,dy,i,oxb,oyb,maplengths[100];
|
|
MapHeaderStr TempHeader;
|
|
memptr block,block1,block2;
|
|
long size,fsize,nsize;
|
|
|
|
|
|
Item_SaveMap();
|
|
|
|
strcat(huffname,ext);
|
|
strcat(huffheadname,ext);
|
|
strcpy(tempstr,"This will take a while.\n");
|
|
strcat(tempstr,huffname);
|
|
strcat(tempstr,". [ ]");
|
|
ErrDialog(tempstr,"");
|
|
dy=sy;
|
|
dx=sx-16;
|
|
|
|
oxb=xbase;
|
|
oyb=ybase;
|
|
//
|
|
// Free up memory
|
|
//
|
|
if (MapBkgnd)
|
|
{
|
|
MMFreePtr((memptr *)&MapBkgnd);
|
|
MMFreePtr((memptr *)&CutBkgnd);
|
|
}
|
|
if (MapFrgnd)
|
|
{
|
|
MMFreePtr((memptr *)&MapFrgnd);
|
|
MMFreePtr((memptr *)&CutFrgnd);
|
|
}
|
|
if (MapInfoPl)
|
|
{
|
|
MMFreePtr((memptr *)&MapInfoPl);
|
|
MMFreePtr((memptr *)&CutInfoPl);
|
|
}
|
|
|
|
//
|
|
// Now, time to Carmacize all the maps
|
|
//
|
|
sx=dx;
|
|
sy=dy;
|
|
print("Carmacizing");
|
|
dx=sx+1;
|
|
|
|
fsize=0;
|
|
SaveFile(huffname,(char huge *)&mapidstr,fsize,strlen(mapidstr));
|
|
fsize+=strlen(mapidstr);
|
|
|
|
memset(&maplengths,0,sizeof(long)*100);
|
|
memset(&NewFileHeader,0,sizeof(OutputHeadStr));
|
|
MMAllocate(&block1,sizeof(MapHeaderStr));
|
|
for (i=0;i<100;i++)
|
|
if (MapFileHeader->dataoffsets[i]!=-1)
|
|
{
|
|
//
|
|
// LOAD MAP HEADER
|
|
//
|
|
sx=dx;
|
|
printint(i);
|
|
LoadFile(mapname,(char huge *)&TempHeader,MapFileHeader->dataoffsets[i],sizeof(MapHeaderStr));
|
|
|
|
//
|
|
// COMPRESS EACH MAP PLANE
|
|
//
|
|
#pragma warn -sus
|
|
if (MapFileHeader->maptype&BPLANE)
|
|
{
|
|
size=TempHeader.mapbkgndlen;
|
|
MMAllocate(&block,size);
|
|
MMAllocate(&block2,size);
|
|
LoadFile(mapname,block,TempHeader.mapbkgndpl,size);
|
|
*(int _seg *)block2=TempHeader.mapbkgndlen;
|
|
nsize=CarmackCompress((unsigned char huge *)block,size,(unsigned char huge *)block2+2)+2;
|
|
maplengths[i]+=nsize;
|
|
if (nsize==2)
|
|
{
|
|
RestoreBackground();
|
|
MMFreePtr(&block2);
|
|
MMFreePtr(&block);
|
|
MMFreePtr(&block1);
|
|
LoadMap(whichmap);
|
|
xbase=oxb;
|
|
ybase=oyb;
|
|
ErrDialog("ESC out of this infernal thing!"," YES! ");
|
|
return;
|
|
}
|
|
|
|
SaveFile(huffname,block2,fsize,nsize);
|
|
TempHeader.mapbkgndpl=fsize;
|
|
TempHeader.mapbkgndlen=nsize;
|
|
MMFreePtr(&block2);
|
|
MMFreePtr(&block);
|
|
fsize+=nsize;
|
|
}
|
|
if (MapFileHeader->maptype&FPLANE)
|
|
{
|
|
size=TempHeader.mapfrgndlen;
|
|
MMAllocate(&block,size);
|
|
MMAllocate(&block2,size);
|
|
LoadFile(mapname,block,TempHeader.mapfrgndpl,size);
|
|
*(int _seg *)block2=TempHeader.mapfrgndlen;
|
|
nsize=CarmackCompress((unsigned char huge *)block,size,(unsigned char huge *)block2+2)+2;
|
|
maplengths[i]+=nsize;
|
|
if (nsize==2)
|
|
{
|
|
RestoreBackground();
|
|
MMFreePtr(&block2);
|
|
MMFreePtr(&block);
|
|
MMFreePtr(&block1);
|
|
LoadMap(whichmap);
|
|
xbase=oxb;
|
|
ybase=oyb;
|
|
ErrDialog("ESC out of this infernal thing!"," YES! ");
|
|
return;
|
|
}
|
|
|
|
SaveFile(huffname,block2,fsize,nsize);
|
|
TempHeader.mapfrgndpl=fsize;
|
|
TempHeader.mapfrgndlen=nsize;
|
|
MMFreePtr(&block2);
|
|
MMFreePtr(&block);
|
|
fsize+=nsize;
|
|
}
|
|
if (MapFileHeader->maptype&IPLANE)
|
|
{
|
|
size=TempHeader.mapinfolen;
|
|
MMAllocate(&block,size);
|
|
MMAllocate(&block2,size);
|
|
LoadFile(mapname,block,TempHeader.mapinfopl,size);
|
|
*(int _seg *)block2=TempHeader.mapinfolen;
|
|
nsize=CarmackCompress((unsigned char huge *)block,size,(unsigned char huge *)block2+2)+2;
|
|
maplengths[i]+=nsize;
|
|
if (nsize==2)
|
|
{
|
|
RestoreBackground();
|
|
MMFreePtr(&block2);
|
|
MMFreePtr(&block);
|
|
MMFreePtr(&block1);
|
|
LoadMap(whichmap);
|
|
xbase=oxb;
|
|
ybase=oyb;
|
|
ErrDialog("ESC out of this infernal thing!"," YES! ");
|
|
return;
|
|
}
|
|
|
|
SaveFile(huffname,block2,fsize,nsize);
|
|
TempHeader.mapinfopl=fsize;
|
|
TempHeader.mapinfolen=nsize;
|
|
MMFreePtr(&block2);
|
|
MMFreePtr(&block);
|
|
fsize+=nsize;
|
|
}
|
|
#pragma warn +sus
|
|
|
|
//
|
|
// SAVE MAP HEADER
|
|
//
|
|
nsize=sizeof(TempHeader);
|
|
maplengths[i]+=nsize;
|
|
SaveFile(huffname,(char huge *)&TempHeader,fsize,nsize);
|
|
NewFileHeader.dataoffsets[i]=fsize;
|
|
fsize+=nsize;
|
|
|
|
SaveFile(huffname,"!ID!",fsize,4);
|
|
fsize+=4;
|
|
}
|
|
MMFreePtr(&block1);
|
|
|
|
|
|
//
|
|
// COPY PERTINENT MAPFILEHEADER DATA TO NEWFILEHEADER
|
|
//
|
|
{
|
|
char outname[14],tempname[14]="MTEMP.TMP",doutname[14];
|
|
|
|
|
|
strcpy(outname,ext);
|
|
strcat(outname,"MHEAD.OBJ");
|
|
|
|
NewFileHeader.RLEWtag=MapFileHeader->RLEWtag;
|
|
fsize=sizeof(OutputHeadStr);
|
|
SaveFile(tempname,(char huge *)&NewFileHeader,0,fsize);
|
|
|
|
for (i=0;i<numtplanes;i++)
|
|
{
|
|
SaveFile(tempname,MK_FP(Tinfo[i],0),fsize,tilenum);
|
|
fsize+=tilenum;
|
|
}
|
|
for (i=0;i<numtmplanes;i++)
|
|
{
|
|
SaveFile(tempname,MK_FP(TMinfo[i],0),fsize,tilemnum);
|
|
fsize+=tilemnum;
|
|
}
|
|
|
|
MakeOBJ(tempname,outname,"_maphead",FARDATA,"MapHeader");
|
|
// unlink(tempname);
|
|
}
|
|
|
|
RestoreBackground();
|
|
SignalSound();
|
|
|
|
//
|
|
// FINSIHED. PRINT REPORT?
|
|
//
|
|
if (Message("Finished with compression.\n"
|
|
"Print report on lengths?")==2)
|
|
{
|
|
fprintf(stdprn,"TED5 Carmacized Map Lengths for .%s\n\n",ext);
|
|
fprintf(stdprn,"#\tMap Name\t\tLength\n");
|
|
fprintf(stdprn,"_\t--------\t\t------\n");
|
|
for (i=0;i<100;i++)
|
|
if (MapFileHeader->dataoffsets[i]!=-1)
|
|
{
|
|
char tstr[16];
|
|
strcpy(tstr,MapNames[i]);
|
|
while(strlen(tstr)<16)
|
|
strcat(tstr," ");
|
|
fprintf(stdprn,"%d\t%s\t%d\n",i,tstr,maplengths[i]);
|
|
}
|
|
fprintf(stdprn,"%c",12);
|
|
}
|
|
|
|
LoadMap(whichmap);
|
|
xbase=oxb;
|
|
ybase=oyb;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Item - Change the LAUNCH name
|
|
//
|
|
////////////////////////////////////////////////////
|
|
btype CLNb={" ",1,5,1};
|
|
DialogDef CLNd={"Current LAUNCH name:\n\n\nNew LAUNCH name:",38,7,1,&CLNb,NULL};
|
|
|
|
void Item_LAUNCHname(void)
|
|
{
|
|
char tempstr[40];
|
|
|
|
|
|
MouseHide();
|
|
DrawDialog(&CLNd,1);
|
|
GetDialogXY(&CLNd,&sx,&sy);
|
|
sy++;
|
|
sx++;
|
|
print(launchname);
|
|
GetButtonXY(&CLNd,0,&sx,&sy);
|
|
if (input(tempstr,36))
|
|
{
|
|
strcpy(launchname,tempstr);
|
|
SaveTEDInfo();
|
|
}
|
|
MouseShow();
|
|
RestoreBackground();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Item - Change the PARM string
|
|
//
|
|
////////////////////////////////////////////////////
|
|
btype CPSb={" ",1,5,1};
|
|
DialogDef CPSd={"Current PARM string:\n\n\nNew PARM string:",38,7,1,&CPSb,NULL};
|
|
|
|
void Item_PARMstring(void)
|
|
{
|
|
char tempstr[40];
|
|
|
|
|
|
MouseHide();
|
|
DrawDialog(&CPSd,1);
|
|
GetDialogXY(&CPSd,&sx,&sy);
|
|
sy++;
|
|
sx++;
|
|
print(parmstring);
|
|
GetButtonXY(&CPSd,0,&sx,&sy);
|
|
if (input(tempstr,36))
|
|
{
|
|
strcpy(parmstring,tempstr);
|
|
_fstrcpy(TEDInfo->parmstring,(char far *)parmstring);
|
|
SaveTEDInfo();
|
|
}
|
|
MouseShow();
|
|
RestoreBackground();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Item - Change Icon Rows
|
|
//
|
|
////////////////////////////////////////////////////
|
|
btype CIRb={" ",8,4,1};
|
|
DialogDef CIRd={"Enter amount of icons\n"
|
|
"to add/delete.\n"
|
|
"Use + or -.",22,6,1,&CIRb,NULL};
|
|
|
|
void Item_ChangeIconRows(void)
|
|
{
|
|
unsigned i,j,dx,dy,max,oxbase,oybase,base;
|
|
int value,owm;
|
|
memptr block;
|
|
|
|
|
|
if (!(MapFileHeader->maptype&IPLANE))
|
|
{
|
|
ErrDialog("You don't have an icon plane!"," OK ");
|
|
return;
|
|
}
|
|
|
|
CheckForMapSave();
|
|
|
|
oxbase=xbase;
|
|
oybase=ybase;
|
|
|
|
DrawDialog(&CIRd,1);
|
|
GetButtonXY(&CIRd,0,&dx,&dy);
|
|
sx=dx;
|
|
sy=dy;
|
|
MouseHide();
|
|
value=inputint(3);
|
|
MouseShow();
|
|
if (!value || value==(int)ESCOUT)
|
|
{
|
|
RestoreBackground();
|
|
return;
|
|
}
|
|
|
|
value=SGN(value)*(18*((abs(value)+17)/18));
|
|
|
|
base=18*maxiconrows;
|
|
maxiconrows+=value/18;
|
|
MapFileHeader->NumIconRows+=value/18;
|
|
|
|
owm=whichmap;
|
|
RestoreBackground();
|
|
|
|
|
|
//
|
|
// MAKE SURE WE ADJUST TILEINFOM!
|
|
//
|
|
MMAllocate(&block,tilemnum+value);
|
|
for (i=0;i<numtmplanes;i++)
|
|
{
|
|
_fmemset(block,0,tilemnum+value);
|
|
movedata((unsigned)TMinfo[i],0,(unsigned)block,0,base);
|
|
movedata((unsigned)TMinfo[i],base,
|
|
(unsigned)block,base+value,tilemnum-base);
|
|
MMFreePtr((memptr *)&TMinfo[i]);
|
|
MMAllocate((memptr *)&TMinfo[i],tilemnum+value);
|
|
movedata((unsigned)block,0,(unsigned)TMinfo[i],0,tilemnum+value);
|
|
}
|
|
MMFreePtr(&block);
|
|
MapFileHeader->oldtilemnum=tilemnum+value;
|
|
|
|
|
|
//
|
|
// RUN THROUGH EACH MAP AND ADJUST TILEM VALUES
|
|
//
|
|
for (i=0;i<100;i++)
|
|
if (MapFileHeader->dataoffsets[i]>=0)
|
|
{
|
|
whichmap=i;
|
|
LoadMap(i);
|
|
max=mapwidth*mapheight;
|
|
for (j=0;j<max;j++)
|
|
if (MapFrgnd[j]>0)
|
|
MapFrgnd[j]+=value;
|
|
DirtyFlag=1;
|
|
SaveMap(0);
|
|
}
|
|
|
|
DirtyFlag=0;
|
|
whichmap=owm;
|
|
LoadMap(whichmap);
|
|
xbase=oxbase;
|
|
ybase=oybase;
|
|
DrawMap();
|
|
ErrDialog("If your map looks messed up,\n"
|
|
"you need to change the amount\n"
|
|
"of icons in your IGRAB script\n"
|
|
"and re-grab your tiles!"," OK ");
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Item - Change LAUNCH Icon
|
|
//
|
|
////////////////////////////////////////////////////
|
|
void Item_ChangeLaunchIcon(void)
|
|
{
|
|
sound(1700);
|
|
TEDInfo->permicon=whichi-tilenum;
|
|
delay(30);
|
|
nosound();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//
|
|
// Item - Change Background color
|
|
//
|
|
////////////////////////////////////////////////////
|
|
btype CBCb[]={{"\xb",5,2,1},
|
|
{"\xc",16,2,1},
|
|
{"Exit",9,2,2}};
|
|
DialogDef CBCd={"Change Backgrnd Color!",22,4,3,&CBCb[0],0};
|
|
void Item_ChangeBkgndColor(void)
|
|
{
|
|
int which;
|
|
|
|
do
|
|
{
|
|
which=DoDialog(&CBCd);
|
|
switch(which)
|
|
{
|
|
case 1:
|
|
sound(1700);
|
|
if (--BkgndColor<0)
|
|
BkgndColor=15;
|
|
TEDInfo->BackgndColor=BkgndColor;
|
|
DrawMap();
|
|
DrawInfoBar();
|
|
break;
|
|
case 2:
|
|
sound(1700);
|
|
if (++BkgndColor>15)
|
|
BkgndColor=0;
|
|
TEDInfo->BackgndColor=BkgndColor;
|
|
DrawMap();
|
|
DrawInfoBar();
|
|
}
|
|
nosound();
|
|
} while(which>0 && which<3);
|
|
}
|