4787 lines
108 KiB
C
Executable File
4787 lines
108 KiB
C
Executable File
// "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
|
||
// Ken Silverman's official web site: "http://www.advsys.net/ken"
|
||
// See the included license file "BUILDLIC.TXT" for license info.
|
||
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <fcntl.h>
|
||
#ifdef PLATFORM_DOS
|
||
#include <direct.h>
|
||
#include <dos.h>
|
||
#include <io.h>
|
||
#include <sys\types.h>
|
||
#include <sys\stat.h>
|
||
#include <conio.h>
|
||
#include "dos_compat.h"
|
||
#else
|
||
#include <dirent.h>
|
||
#include <sys/types.h>
|
||
#include <sys/stat.h>
|
||
#include <unistd.h>
|
||
#include "pragmas.h"
|
||
#include "sdl_driver.h"
|
||
#include "unix_compat.h"
|
||
#include <fnmatch.h> // This needs to be last - DDOI
|
||
#endif
|
||
|
||
#define MAXTILES 9216
|
||
#define MAXMENUFILES 256
|
||
#define MAXTILEFILES 256
|
||
#define NUMPALOOKUPS 32
|
||
#define GIFBUFLEN 4096
|
||
#define MAXMAPS 64
|
||
|
||
// Function Declarations
|
||
void reportmaps(void);
|
||
void captureit(long x1, long y1, long x2, long y2, long datilenum, char *dafilename, char capfilmode);
|
||
void updatescript(long picnumrangestart, long picnumrangeend);
|
||
int loadtileofscript(long tilenume, char *filespec, long *x1, long *y1, long *x2 , long *y2);
|
||
int selectbox(long *dax1, long *day1, long *dax2, long *day2);
|
||
void updatepalette(void);
|
||
void updatemaps(void);
|
||
int swapwalls(long swapwall1, long swapwall2);
|
||
long convalloc32(long size);
|
||
char gettrans(char dat1, char dat2);
|
||
void gettextcolors(void);
|
||
int resizetile(long picnume, long oldx, long oldy, long newx, long newy);
|
||
int screencapture(void);
|
||
void printmessage(char name[82]);
|
||
int printext256(long xpos, long ypos, short col, short backcol, char *name);
|
||
int menuselect(void);
|
||
void sortfilenames(void);
|
||
int getfilenames(char *kind);
|
||
void initmenupaths(char *filename);
|
||
void savenames(void);
|
||
int loadnames(void);
|
||
int drawtilescreen(long pictopleft);
|
||
long gettile(long tilenum);
|
||
void getpalookup(void);
|
||
int fillregion(long x, long y, char col, char bound);
|
||
void getpaletteconversion(void);
|
||
int drawmaskedbox(long x1, long y1, long x2, long y2, char col, char mask1, char mask2);
|
||
int drawxorbox(long x1, long y1, long x2, long y2, char col);
|
||
void drawmainscreen(void);
|
||
int loadgif(char *filename);
|
||
int loadpcx(char *filename);
|
||
int loadbmp(char *filename);
|
||
void loadpicture(char *filename);
|
||
void drawcolordot(char thecol);
|
||
void updatepanningforumode(long dax, long day);
|
||
void updatepanning(void);
|
||
int drawdot(char col);
|
||
void copywalltoscreen(char *bufptr, long dapicnum, char maskmode);
|
||
int showall(char *bufptr);
|
||
int savewall(char *bufptr, long wallnum);
|
||
int loadwall(char *bufptr, long wallnum);
|
||
int savepics(void);
|
||
int loadpics(long dapicnum);
|
||
int loadtables(void);
|
||
|
||
|
||
static struct sectortype
|
||
{
|
||
short wallptr, wallnum;
|
||
long ceilingz, floorz;
|
||
short ceilingstat, floorstat;
|
||
short ceilingpicnum, ceilingheinum;
|
||
signed char ceilingshade;
|
||
char ceilingpal, ceilingxpanning, ceilingypanning;
|
||
short floorpicnum, floorheinum;
|
||
signed char floorshade;
|
||
char floorpal, floorxpanning, floorypanning;
|
||
char visibility, filler;
|
||
short lotag, hitag, extra;
|
||
} mapsector;
|
||
|
||
static struct walltype
|
||
{
|
||
long x, y;
|
||
short point2, nextwall, nextsector, cstat;
|
||
short picnum, overpicnum;
|
||
signed char shade;
|
||
char pal, xrepeat, yrepeat, xpanning, ypanning;
|
||
short lotag, hitag, extra;
|
||
} mapwall;
|
||
|
||
static struct spritetype
|
||
{
|
||
long x, y, z;
|
||
short cstat, picnum;
|
||
signed char shade;
|
||
char pal, clipdist, filler;
|
||
unsigned char xrepeat, yrepeat;
|
||
signed char xoffset, yoffset;
|
||
short sectnum, statnum;
|
||
short ang, owner, xvel, yvel, zvel;
|
||
short lotag, hitag, extra;
|
||
} mapsprite;
|
||
|
||
short nummaps, numsprites[MAXMAPS];
|
||
|
||
static char *pic;
|
||
static short int mousx, mousy, bstatus, moustat;
|
||
static unsigned char col, trailstatus, tempbuf[4096];
|
||
static short xfillbuf[4096], yfillbuf[4096];
|
||
static unsigned char printbuf[128];
|
||
static short tilesizx[MAXTILES], tilesizy[MAXTILES];
|
||
static long picanm[MAXTILES], artversion, numtiles;
|
||
static long panx, pany, panxforu, panyforu, panyoff = 0, panxdim;
|
||
static long lastshowallxdim = 0x7fffffff, lastshowallydim = 0x7fffffff;
|
||
static unsigned char buf[1024*512], *buf2;
|
||
static long waloff[MAXTILES], totpicmem, xdim, ydim, asksave, c, d, picnum;
|
||
static long totpicsiz, animspeed, allasksave, mustsavelocals = 0;
|
||
static long needtosavenames = 0, gettilezoom = 1;
|
||
static short sintable[2048];
|
||
static char blackmasklookup[256];
|
||
|
||
static short tilookup[MAXTILES], tilookup2[MAXTILES], tilesreported = 0;
|
||
|
||
static char artfilename[20];
|
||
static long localtilestart[MAXTILEFILES], localtileend[MAXTILEFILES];
|
||
static long curtilefile, numtilefiles;
|
||
|
||
static long xres, yres;
|
||
static char pcxheader[128] =
|
||
{
|
||
0xa,0x5,0x1,0x8,0x0,0x0,0x0,0x0,0x3f,0x1,0xc7,0x0,
|
||
0x40,0x1,0xc8,0x0,0x0,0x0,0x0,0x8,0x8,0x8,0x10,0x10,
|
||
0x10,0x18,0x18,0x18,0x20,0x20,0x20,0x28,0x28,0x28,0x30,0x30,
|
||
0x30,0x38,0x38,0x38,0x40,0x40,0x40,0x48,0x48,0x48,0x50,0x50,
|
||
0x50,0x58,0x58,0x58,0x60,0x60,0x60,0x68,0x68,0x68,0x70,0x70,
|
||
0x70,0x78,0x78,0x78,0x0,0x1,0x40,0x1,0x0,0x0,0x0,0x0,
|
||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||
};
|
||
|
||
static long capfil = -1L;
|
||
|
||
static char names[MAXTILES][17];
|
||
static char menuname[MAXMENUFILES][17], curpath[160], menupath[160];
|
||
static long menunamecnt, menuhighlight;
|
||
|
||
static char textfont[128][8];
|
||
static char reversemask[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
|
||
|
||
static char whitecol, browncol, yellowcol, greencol, blackcol;
|
||
|
||
static char palookup[NUMPALOOKUPS][256], palette[768];
|
||
static char palette2[768], palookupe[256], *transluc, translucloaded = 0;
|
||
|
||
static unsigned char gifdata[GIFBUFLEN];
|
||
static unsigned char gifsuffix[4100], giffilbuffer[768], giftempstack[4096];
|
||
static short int gifprefix[4100];
|
||
|
||
static long totalclock;
|
||
static void (__interrupt __far *oldtimerhandler)();
|
||
static void __interrupt __far timerhandler(void);
|
||
|
||
#ifdef PLATFORM_DOS
|
||
/* Most of these will be caught in pragmas.c - DDOI */
|
||
#pragma aux scale =\
|
||
"imul ebx",\
|
||
"idiv ecx",\
|
||
parm [eax][ebx][ecx]\
|
||
modify [eax edx]\
|
||
|
||
#pragma aux mulscale =\
|
||
"imul ebx",\
|
||
"shrd eax, edx, cl",\
|
||
parm [eax][ebx][ecx]\
|
||
modify [edx]\
|
||
|
||
#pragma aux boundmulscale =\
|
||
"imul ebx",\
|
||
"mov ebx, edx",\
|
||
"shrd eax, edx, cl",\
|
||
"sar edx, cl",\
|
||
"xor edx, eax",\
|
||
"js checkit",\
|
||
"xor edx, eax",\
|
||
"jz skipboundit",\
|
||
"cmp edx, 0xffffffff",\
|
||
"je skipboundit",\
|
||
"checkit:",\
|
||
"mov eax, ebx",\
|
||
"sar eax, 31",\
|
||
"add eax, 0x80000000",\
|
||
"not eax",\
|
||
"skipboundit:",\
|
||
parm [eax][ebx][ecx]\
|
||
modify [edx]\
|
||
|
||
#pragma aux divscale =\
|
||
"cdq",\
|
||
"shld edx, eax, cl",\
|
||
"sal eax, cl",\
|
||
"idiv ebx",\
|
||
parm [eax][ebx][ecx]\
|
||
modify [edx]\
|
||
|
||
#pragma aux setvmode =\
|
||
"int 0x10",\
|
||
parm [eax]\
|
||
|
||
#pragma aux clearbuf =\
|
||
"rep stosd",\
|
||
parm [edi][ecx][eax]\
|
||
|
||
#pragma aux cleartopbox =\
|
||
"mov dx, 0x3c4",\
|
||
"mov ax, 0x0f02",\
|
||
"out dx, ax",\
|
||
"mov edi, 0xa1000",\
|
||
"mov ecx, 15360",\
|
||
"mov dl, blackcol",\
|
||
"mov dh, dl",\
|
||
"mov eax, edx",\
|
||
"shl eax, 16",\
|
||
"mov ax, dx",\
|
||
"rep stosd",\
|
||
modify [eax ecx edx edi]\
|
||
|
||
#pragma aux getpixel =\
|
||
"xor eax, eax",\
|
||
"mov al, [edi]",\
|
||
parm [edi]\
|
||
|
||
#pragma aux drawchainpixel =\
|
||
"mov dx, 0x3c4",\
|
||
"mov ax, 0x0102",\
|
||
"mov cx, di",\
|
||
"and cl, 3",\
|
||
"shl ah, cl",\
|
||
"out dx, ax",\
|
||
"shr edi, 2",\
|
||
"mov byte ptr [edi+0xa0000], bl",\
|
||
parm [edi][ebx]\
|
||
modify [eax ecx edx]\
|
||
|
||
#pragma aux drawpixel =\
|
||
"mov [edi], al",\
|
||
parm [edi][eax]\
|
||
|
||
#pragma aux drawpixels =\
|
||
"mov [edi], ax",\
|
||
parm [edi][eax]\
|
||
|
||
#pragma aux drawpixelses =\
|
||
"mov [edi], eax",\
|
||
parm [edi][eax]\
|
||
|
||
#pragma aux setupmouse =\
|
||
"mov ax, 0",\
|
||
"int 33h",\
|
||
"mov moustat,1",\
|
||
|
||
#pragma aux readmouse =\
|
||
"mov ax, 11d",\
|
||
"int 33h",\
|
||
"sar cx, 1",\
|
||
"sar dx, 1",\
|
||
"mov mousx, cx",\
|
||
"mov mousy, dx",\
|
||
"mov ax, 5d",\
|
||
"int 33h",\
|
||
"mov bstatus, ax",\
|
||
modify [eax ebx ecx edx]\
|
||
|
||
#pragma aux limitrate =\
|
||
"mov dx, 0x3da",\
|
||
"wait1: in al, dx",\
|
||
"test al, 8",\
|
||
"jnz wait1",\
|
||
"wait2: in al, dx",\
|
||
"test al, 8",\
|
||
"jz wait2",\
|
||
modify [edx]\
|
||
|
||
#pragma aux cleartext =\
|
||
"mov dx, 0x3c4",\
|
||
"mov ax, 0x0f02",\
|
||
"out dx, ax",\
|
||
"mov edi, 0xa0800",\
|
||
"mov ebx, 8",\
|
||
"mov ah, browncol",\
|
||
"mov al, ah",\
|
||
"shl eax, 8",\
|
||
"mov al, ah",\
|
||
"shl eax, 8",\
|
||
"mov al, ah",\
|
||
"begclearit: mov ecx, 14",\
|
||
"rep stosd",\
|
||
"add edi, 200",\
|
||
"sub ebx, 1",\
|
||
"jnz begclearit",\
|
||
modify [eax ebx ecx edx edi]\
|
||
|
||
//the 200 above = 256-28chars*2
|
||
|
||
//eax = (eax>>bitcnt)&((1<<numbits)-1);
|
||
#pragma aux gifgetdat =\
|
||
"mov eax, dword ptr giffilbuffer[eax]",\
|
||
"shr eax, cl",\
|
||
"xchg ebx, ecx",\
|
||
"mov ebx, 1",\
|
||
"shl ebx, cl",\
|
||
"dec ebx",\
|
||
"and eax, ebx",\
|
||
parm [eax][ebx][ecx]\
|
||
modify [eax ebx ecx]\
|
||
|
||
#endif // PLATFORM_DOS
|
||
|
||
void __interrupt __far timerhandler()
|
||
{
|
||
totalclock++;
|
||
#ifdef PLATFORM_DOS
|
||
_chain_intr(oldtimerhandler);
|
||
#endif
|
||
}
|
||
|
||
int main(int argc, char **argv)
|
||
{
|
||
unsigned char ch, *keystateptr, keystate, tempchar, filename[160];
|
||
unsigned char buffer[160], buffer2[160], dacol, col1, col2;
|
||
long i, j, k, l, m, n, x, y, x1, y1, x2, y2, xoff, yoff;
|
||
long fil, templong, dat, good, vidpos;
|
||
long markx, marky, markxlen, markylen;
|
||
long xstep, ystep, lin, num, oxdim, oydim;
|
||
|
||
//printf("------------------------------------------------------------------------------\n");
|
||
//printf("EDITART.EXE Copyright (c) 1993 - 1996 Ken Silverman, 3D Realms Entertainment.\n");
|
||
//printf("This version of EDITART was created for Duke Nukem 3D.\n");
|
||
//printf("\n");
|
||
//printf("IMPORTANT: EDITART.EXE and associated tools and utilities are NOT\n");
|
||
//printf("shareware and may NOT be freely distributed to any BBS, CD, floppy, or\n");
|
||
//printf("any other media. These tools may NOT be sold or repackaged for sale in\n");
|
||
//printf("a commercial product.\n");
|
||
//printf("\n");
|
||
//printf("Please help us protect against software piracy (which drives up software\n");
|
||
//printf("prices) by following these simple rules.\n");
|
||
//printf("\n");
|
||
//printf("Thank You!\n");
|
||
//printf("------------------------------------------------------------------------------\n");
|
||
//getch();
|
||
|
||
_platform_init(argc, argv);
|
||
if (argc >= 2)
|
||
{
|
||
// Weird... GCC wants me to add these casts - DDOI
|
||
strcpy((char *)&artfilename,argv[1]);
|
||
i = 0;
|
||
while ((artfilename[i] != 0) && (i < 5))
|
||
i++;
|
||
while (i < 5)
|
||
{
|
||
artfilename[i] = '_';
|
||
i++;
|
||
}
|
||
artfilename[5] = '0';
|
||
artfilename[6] = '0';
|
||
artfilename[7] = '0';
|
||
artfilename[8] = '.';
|
||
artfilename[9] = 'a';
|
||
artfilename[10] = 'r';
|
||
artfilename[11] = 't';
|
||
artfilename[12] = 0;
|
||
}
|
||
else
|
||
strcpy((char *)&artfilename,"tiles000.art");
|
||
|
||
panxdim = 1024L;
|
||
|
||
setvmode(0x13);
|
||
outp(0x3c4,0x4); outp(0x3c5,0x6);
|
||
outp(0x3d4,0x14); outp(0x3d5,0x0);
|
||
outp(0x3d4,0x17); outp(0x3d5,0xe3);
|
||
outp(0x3d4,0x13); outp(0x3d5,panxdim>>3);
|
||
|
||
outp(0x3c4,2); outp(0x3c5,15);
|
||
clearbuf(VIDEOBASE,16384,0L);
|
||
|
||
loadtables();
|
||
|
||
printext256(80L,84L,4,0,"Editart 7/24/96");
|
||
printext256(80L,92L,4,0,"by Kenneth Silverman");
|
||
sprintf(buffer,"Loading %s...",artfilename);
|
||
printext256(80L,108L,4,0,buffer);
|
||
|
||
initmenupaths(argv[0]);
|
||
setupmouse();
|
||
|
||
for(i=0;i<MAXTILES;i++)
|
||
tilookup[i] = i;
|
||
|
||
mousx = 0;
|
||
mousy = 0;
|
||
bstatus = 0;
|
||
if ((fil = open("palette.dat",O_BINARY|O_RDWR,S_IREAD)) != -1)
|
||
{
|
||
read(fil,&palette[0],768);
|
||
read(fil,&palookup[0][0],NUMPALOOKUPS*256);
|
||
gettextcolors();
|
||
|
||
for(i=0;i<255;i++) blackmasklookup[i] = i;
|
||
blackmasklookup[255] = blackcol;
|
||
|
||
close(fil);
|
||
}
|
||
|
||
totpicmem = 16777216L; //allocate pic = rest of memory
|
||
while ((pic = (char *)malloc(totpicmem)) == 0)
|
||
totpicmem -= 4096L;
|
||
|
||
buf2 = NULL;
|
||
if (totpicmem > 1048576)
|
||
{
|
||
buf2 = (char *)(FP_OFF(pic)+totpicmem-(1024*512));
|
||
totpicmem -= (1024*512);
|
||
}
|
||
|
||
for(i=0;i<MAXTILES;i++)
|
||
{
|
||
tilesizx[i] = 0;
|
||
tilesizy[i] = 0;
|
||
picanm[i] = 0L;
|
||
}
|
||
loadnames();
|
||
|
||
for(i=0;i<MAXTILEFILES;i++)
|
||
{
|
||
localtilestart[i] = -1;
|
||
localtileend[i] = -1;
|
||
}
|
||
numtilefiles = 0;
|
||
do
|
||
{
|
||
i = numtilefiles;
|
||
strcpy(filename,artfilename);
|
||
filename[7] = (numtilefiles%10)+48;
|
||
filename[6] = ((numtilefiles/10)%10)+48;
|
||
filename[5] = ((numtilefiles/100)%10)+48;
|
||
if ((fil = open(filename,O_BINARY|O_RDONLY,S_IREAD)) != -1)
|
||
{
|
||
read(fil,&artversion,4);
|
||
if (artversion != 1)
|
||
{
|
||
printf("Wrong art version");
|
||
exit(0);
|
||
}
|
||
read(fil,&numtiles,4);
|
||
read(fil,&localtilestart[numtilefiles],4);
|
||
read(fil,&localtileend[numtilefiles],4);
|
||
close(fil);
|
||
numtilefiles++;
|
||
}
|
||
}
|
||
while (numtilefiles != i);
|
||
|
||
picnum = 0;
|
||
curtilefile = -1;
|
||
loadpics(picnum);
|
||
menunamecnt = 0;
|
||
menuhighlight = 0;
|
||
keystateptr = (char *)0x417;
|
||
col = 0;
|
||
trailstatus = 0;
|
||
ch = 0;
|
||
loadwall(buf,picnum);
|
||
c = (xdim>>1);
|
||
d = (ydim>>1);
|
||
markx = 0;
|
||
marky = 0;
|
||
markxlen = 0;
|
||
markylen = 0;
|
||
drawmainscreen();
|
||
while (ch != 27)
|
||
{
|
||
if (kbhit() != 0)
|
||
{
|
||
ch = getch();
|
||
|
||
if (ch == 0)
|
||
{
|
||
ch = getch();
|
||
keystate = *keystateptr;
|
||
if ((keystate&3) == 0)
|
||
{
|
||
drawdot(buf[(d<<10)+c]);
|
||
if ((ch == 75) && (c > 0)) c--;
|
||
if ((ch == 77) && (c < xdim-1)) c++;
|
||
if ((ch == 72) && (d > 0)) d--;
|
||
if ((ch == 80) && (d < ydim-1)) d++;
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
else
|
||
{
|
||
drawcolordot(col);
|
||
if ((ch == 75) && (col > 0)) col--;
|
||
if ((ch == 77) && (col < 255)) col++;
|
||
if ((ch == 72) && (col > 31)) col -= 32;
|
||
if ((ch == 80) && (col < 224)) col += 32;
|
||
drawcolordot((col+16)&255);
|
||
}
|
||
if ((ch == 73) && (picnum > 0))
|
||
{
|
||
if (savewall(buf,picnum) == 0)
|
||
{
|
||
picnum--;
|
||
loadpics(picnum);
|
||
loadwall(buf,picnum);
|
||
showall(buf);
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
}
|
||
if ((ch == 81) && (picnum < MAXTILES-1))
|
||
{
|
||
if (savewall(buf,picnum) == 0)
|
||
{
|
||
picnum++;
|
||
loadpics(picnum);
|
||
loadwall(buf,picnum);
|
||
showall(buf);
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
}
|
||
if (ch == 83)
|
||
{
|
||
xdim = 0;
|
||
ydim = 0;
|
||
c = (xdim>>1);
|
||
d = (ydim>>1);
|
||
asksave = 1;
|
||
drawmainscreen();
|
||
}
|
||
if (ch == 121) //ALT+2
|
||
{
|
||
xdim = 32;
|
||
ydim = 32;
|
||
c = (xdim>>1);
|
||
d = (ydim>>1);
|
||
asksave = 1;
|
||
drawmainscreen();
|
||
}
|
||
if (ch == 22) //Alt-U (update script!)
|
||
{
|
||
savewall(buf,picnum);
|
||
savepics();
|
||
|
||
updatescript(0L,MAXTILES-1L);
|
||
|
||
loadpics(picnum);
|
||
loadwall(buf,picnum);
|
||
drawmainscreen();
|
||
ch = 255;
|
||
}
|
||
if (ch == 134) //F12
|
||
{
|
||
drawdot(buf[(d<<10)+c]);
|
||
screencapture();
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
ch = 0;
|
||
}
|
||
if ((ch == 'b') || (ch == 'B'))
|
||
{
|
||
drawdot(buf[(d<<10)+c]);
|
||
screencapture();
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
|
||
if ((ch == 't') || (ch == 'T'))
|
||
{
|
||
buf[(d<<10)+c] = col, asksave = 1;
|
||
trailstatus = 1-trailstatus;
|
||
if (trailstatus == 0)
|
||
printmessage("Trail OFF");
|
||
else
|
||
printmessage("Trail ON");
|
||
}
|
||
if ((ch == 32) || (trailstatus == 1))
|
||
buf[(d<<10)+c] = col, asksave = 1;
|
||
if (ch == 92) // It'a a \!
|
||
{
|
||
drawdot(buf[(d<<10)+c]);
|
||
c = (xdim>>1);
|
||
d = (ydim>>1);
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
if (ch == '|')
|
||
{
|
||
sprintf((char *)&printbuf,"Coordinates: (%d,%d)",c,d);
|
||
printmessage(&printbuf);
|
||
}
|
||
if (ch == 8)
|
||
{
|
||
drawcolordot(col);
|
||
col = 255;
|
||
drawcolordot((col+16)&255);
|
||
}
|
||
if ((ch == ',') || (ch == '.') || (ch == '<') || (ch == '>'))
|
||
{
|
||
xstep = 0;
|
||
ystep = 0;
|
||
if (markx > c) xstep = 1;
|
||
if (markx < c) xstep = -1;
|
||
if (marky > d) ystep = 1;
|
||
if (marky < d) ystep = -1;
|
||
i = c-xstep;
|
||
do
|
||
{
|
||
i += xstep;
|
||
j = d-ystep;
|
||
do
|
||
{
|
||
j += ystep;
|
||
if ((buf[(j<<10)+i]&31) > 0)
|
||
if (ch == ',') buf[(j<<10)+i]--;
|
||
if ((buf[(j<<10)+i]&31) < 31)
|
||
if (ch == '.') buf[(j<<10)+i]++;
|
||
if (ch == '<')
|
||
{
|
||
buf[(j<<10)+i] += 224;
|
||
buf[(j<<10)+i] &= 255;
|
||
}
|
||
if (ch == '>')
|
||
{
|
||
buf[(j<<10)+i] += 32;
|
||
buf[(j<<10)+i] &= 255;
|
||
}
|
||
}
|
||
while (j != marky);
|
||
}
|
||
while (i != markx);
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
if ((ch == 'M') || (ch == 'm'))
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
buf2[(j<<10)+i] = buf[(j<<10)+i];
|
||
printmessage("Tile in memory (P - restore)");
|
||
}
|
||
}
|
||
if ((ch == 'P') || (ch == 'p'))
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
buf[(j<<10)+i] = buf2[(j<<10)+i];
|
||
showall(buf);
|
||
asksave = 1;
|
||
printmessage("Tile restored from memory");
|
||
}
|
||
}
|
||
if ((ch == 'J') || (ch == 'j'))
|
||
{
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
if (buf[(j<<10)+i] == buf[(d<<10)+c])
|
||
if ((rand()&15) == 0)
|
||
buf[(j<<10)+i] = col;
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
if ((ch == ']') && (xdim > 0) && (ydim > 0))
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
k = (buf[(d<<10)+c]>>5);
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
buf2[(j<<10)+i] = buf[(j<<10)+i];
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
if ((buf[(j<<10)+i]>>5) == k)
|
||
{
|
||
m = buf2[(((j+0)%ydim)<<10)+((i+0)%xdim)]*2, n = 2;
|
||
tempchar = buf2[(((j+0)%ydim)<<10)+((i+1)%xdim)];
|
||
if ((tempchar>>5) == k)
|
||
m += tempchar, n += 1;
|
||
tempchar = buf2[(((j+0)%ydim)<<10)+((i-1)%xdim)];
|
||
if ((tempchar>>5) == k)
|
||
m += tempchar, n += 1;
|
||
tempchar = buf2[(((j+1)%ydim)<<10)+((i+0)%xdim)];
|
||
if ((tempchar>>5) == k)
|
||
m += tempchar, n += 1;
|
||
tempchar = buf2[(((j-1)%ydim)<<10)+((i+0)%xdim)];
|
||
if ((tempchar>>5) == k)
|
||
m += tempchar, n += 1;
|
||
|
||
buf[(j<<10)+i] = (buf[(j<<10)+i]&0xe0)+(((m+(n>>1))/n)&31);
|
||
}
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
}
|
||
if ((ch == '[') && (xdim > 0) && (ydim > 0))
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
k = (buf[(d<<10)+c]>>5);
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
buf2[(j<<10)+i] = buf[(j<<10)+i];
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
if ((buf[(j<<10)+i]>>5) == k)
|
||
{
|
||
m = buf2[(((j+0)%ydim)<<10)+((i+0)%xdim)]*2, n = 2;
|
||
|
||
l = rand();
|
||
tempchar = buf2[(((j+0)%ydim)<<10)+((i+1)%xdim)];
|
||
if (((tempchar>>5) == k) && ((l&0x03) == 0))
|
||
m += tempchar, n++;
|
||
tempchar = buf2[(((j+0)%ydim)<<10)+((i-1)%xdim)];
|
||
if (((tempchar>>5) == k) && ((l&0x0c) == 0))
|
||
m += tempchar, n++;
|
||
tempchar = buf2[(((j+1)%ydim)<<10)+((i+0)%xdim)];
|
||
if (((tempchar>>5) == k) && ((l&0x30) == 0))
|
||
m += tempchar, n++;
|
||
tempchar = buf2[(((j-1)%ydim)<<10)+((i+0)%xdim)];
|
||
if (((tempchar>>5) == k) && ((l&0xc0) == 0))
|
||
m += tempchar, n++;
|
||
|
||
buf[(j<<10)+i] = (buf[(j<<10)+i]&0xe0)+(((m+(n>>1))/n)&31);
|
||
}
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
}
|
||
if ((ch == 39) && (xdim > 0) && (ydim > 0)) // It's a '
|
||
{
|
||
k = (buf[(d<<10)+c]>>5);
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
if ((buf[(j<<10)+i]>>5) == k)
|
||
{
|
||
m = (buf[(j<<10)+i]&31);
|
||
tempchar = buf[(((j+0)%ydim)<<10)+((i+1)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m--;
|
||
tempchar = buf[(((j+0)%ydim)<<10)+((i-1)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m++;
|
||
tempchar = buf[(((j+1)%ydim)<<10)+((i+0)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m--;
|
||
tempchar = buf[(((j-1)%ydim)<<10)+((i+0)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m++;
|
||
|
||
if (m < 0) m = 0;
|
||
if (m > 31) m = 31;
|
||
buf[(j<<10)+i] = (buf[(j<<10)+i]&0xe0)+m;
|
||
}
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
if ((ch == ';') && (xdim > 0) && (ydim > 0))
|
||
{
|
||
k = (buf[(d<<10)+c]>>5);
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
if ((buf[(j<<10)+i]>>5) == k)
|
||
{
|
||
m = (buf[(j<<10)+i]&31);
|
||
tempchar = buf[(((j+0)%ydim)<<10)+((i+1)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m++;
|
||
tempchar = buf[(((j+0)%ydim)<<10)+((i-1)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m--;
|
||
tempchar = buf[(((j+1)%ydim)<<10)+((i+0)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m++;
|
||
tempchar = buf[(((j-1)%ydim)<<10)+((i+0)%xdim)];
|
||
if ((tempchar>>5) != k)
|
||
m--;
|
||
|
||
if (m < 0) m = 0;
|
||
if (m > 31) m = 31;
|
||
buf[(j<<10)+i] = (buf[(j<<10)+i]&0xe0)+m;
|
||
}
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
if (((ch == 'R') || (ch == 'r')) && (xdim > 0) && (ydim > 0))
|
||
{
|
||
printmessage("Rotate tile (Use arrows)");
|
||
ch = getch();
|
||
if (ch == 0)
|
||
{
|
||
ch = getch();
|
||
if (ch == 75)
|
||
for(i=xdim-1;i>=1;i--)
|
||
for(j=0;j<ydim;j++)
|
||
{
|
||
tempchar = buf[(j<<10)+i];
|
||
buf[(j<<10)+i] = buf[(j<<10)+((i+1)%xdim)];
|
||
buf[(j<<10)+((i+1)%xdim)] = tempchar;
|
||
}
|
||
if (ch == 77)
|
||
for(i=1;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
{
|
||
tempchar = buf[(j<<10)+i];
|
||
buf[(j<<10)+i] = buf[(j<<10)+((i+1)%xdim)];
|
||
buf[(j<<10)+((i+1)%xdim)] = tempchar;
|
||
}
|
||
if (ch == 72)
|
||
for(i=0;i<xdim;i++)
|
||
for(j=ydim-1;j>=1;j--)
|
||
{
|
||
tempchar = buf[(j<<10)+i];
|
||
buf[(j<<10)+i] = buf[(((j+1)%ydim)<<10)+i];
|
||
buf[(((j+1)%ydim)<<10)+i] = tempchar;
|
||
}
|
||
if (ch == 80)
|
||
for(i=0;i<xdim;i++)
|
||
for(j=1;j<ydim;j++)
|
||
{
|
||
tempchar = buf[(j<<10)+i];
|
||
buf[(j<<10)+i] = buf[(((j+1)%ydim)<<10)+i];
|
||
buf[(((j+1)%ydim)<<10)+i] = tempchar;
|
||
}
|
||
showall(buf);
|
||
}
|
||
asksave = 1;
|
||
cleartext();
|
||
}
|
||
if ((ch == 'C') || (ch == 'c'))
|
||
{
|
||
tempchar = buf[(d<<10)+c];
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
if (buf[(j<<10)+i] == tempchar)
|
||
buf[(j<<10)+i] = col;
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
if (ch == '1')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
markx = c;
|
||
marky = d;
|
||
printmessage("1st point set (2 - copy)");
|
||
}
|
||
}
|
||
if (ch == '2')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
x = markx, y = marky, x2 = c, y2 = d;
|
||
if (x > x2)
|
||
templong = x, x = x2, x2 = templong;
|
||
if (y > y2)
|
||
templong = y, y = y2, y2 = templong;
|
||
markxlen = x2-x+1;
|
||
markylen = y2-y+1;
|
||
for(i=0;i<markxlen;i++)
|
||
for(j=0;j<markylen;j++)
|
||
buf2[(j<<10)+i] = buf[((j+y)<<10)+(i+x)];
|
||
printmessage("Region copied (3 - paste)");
|
||
}
|
||
}
|
||
if (ch == '3')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
for(i=0;i<markxlen;i++)
|
||
for(j=0;j<markylen;j++)
|
||
if ((i+c < xdim) && (j+d < ydim) && (buf2[(j<<10)+i] != 255))
|
||
buf[((j+d)<<10)+(i+c)] = buf2[(j<<10)+i];
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
}
|
||
if (ch == '4')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
for(i=0;i<(markxlen>>1);i++)
|
||
for(j=0;j<markylen;j++)
|
||
{
|
||
templong = buf2[(j<<10)+i];
|
||
buf2[(j<<10)+i] = buf2[(j<<10)+(markxlen-1-i)];
|
||
buf2[(j<<10)+(markxlen-1-i)] = templong;
|
||
}
|
||
printmessage("Region flipped x-wise");
|
||
}
|
||
}
|
||
if (ch == '5')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
for(i=0;i<markxlen;i++)
|
||
for(j=0;j<(markylen>>1);j++)
|
||
{
|
||
templong = buf2[(j<<10)+i];
|
||
buf2[(j<<10)+i] = buf2[((markylen-1-j)<<10)+i];
|
||
buf2[((markylen-1-j)<<10)+i] = templong;
|
||
}
|
||
printmessage("Region flipped y-wise");
|
||
}
|
||
}
|
||
if (ch == '6')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
x2 = xdim;
|
||
y2 = ydim;
|
||
if (x2 > 480) x2 = 480;
|
||
if (y2 > 480) y2 = 480;
|
||
for(i=0;i<x2;i++)
|
||
for(j=0;j<y2;j++)
|
||
if (i > j)
|
||
{
|
||
templong = buf2[(i<<10)+j];
|
||
buf2[(i<<10)+j] = buf2[(j<<10)+i];
|
||
buf2[(j<<10)+i] = templong;
|
||
}
|
||
templong = markxlen;
|
||
markxlen = markylen;
|
||
markylen = templong;
|
||
printmessage("X and Y swapped");
|
||
}
|
||
}
|
||
if (ch == '8')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
if (translucloaded == 0)
|
||
{
|
||
if ((transluc = (char *)convalloc32(65536L)) != 0)
|
||
{
|
||
for(i=0;i<65536;i++)
|
||
transluc[i] = 255;
|
||
translucloaded = 1;
|
||
printmessage("Transparent table allocated");
|
||
}
|
||
else
|
||
printmessage("Not enough memory for table");
|
||
}
|
||
for(i=0;i<markxlen;i++)
|
||
for(j=0;j<markylen;j++)
|
||
if ((i+c < xdim) && (j+d < ydim) && (buf2[(j<<10)+i] != 255))
|
||
{
|
||
col1 = buf[((j+d)<<10)+(i+c)];
|
||
col2 = buf2[(j<<10)+i];
|
||
if (translucloaded == 1)
|
||
{
|
||
dacol = transluc[(col1<<8)+col2];
|
||
if (dacol == 255)
|
||
{
|
||
dacol = gettrans(buf[((j+d)<<10)+(i+c)],buf2[(j<<10)+i]);
|
||
transluc[(col1<<8)+col2] = dacol;
|
||
transluc[(col2<<8)+col1] = dacol;
|
||
}
|
||
}
|
||
else
|
||
dacol = gettrans(buf[((j+d)<<10)+(i+c)],buf2[(j<<10)+i]);
|
||
buf[((j+d)<<10)+(i+c)] = dacol;
|
||
}
|
||
showall(buf);
|
||
asksave = 1;
|
||
}
|
||
}
|
||
if (ch == '/')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
markxlen = (markxlen>>1)+1, markylen = (markylen>>1)+1;
|
||
for(i=0;i<markxlen;i++)
|
||
for(j=0;j<markylen;j++)
|
||
buf2[(j<<10)+i] = buf2[((j<<1)<<10)+(i<<1)];
|
||
printmessage("Region now half-size");
|
||
}
|
||
}
|
||
if (ch == '*')
|
||
{
|
||
if (buf2 == NULL)
|
||
{
|
||
printmessage("Not enough memory for that!");
|
||
}
|
||
else
|
||
{
|
||
markxlen <<= 1, markylen <<= 1;
|
||
if (markxlen > 1024) markxlen = 1024;
|
||
if (markylen > 512) markylen = 512;
|
||
for(i=markxlen;i>=0;i--)
|
||
for(j=markylen;j>=0;j--)
|
||
if ((i < xdim) && (j < ydim))
|
||
buf2[(j<<10)+i] = buf2[((j>>1)<<10)+(i>>1)];
|
||
printmessage("Region now double-size");
|
||
}
|
||
}
|
||
if ((ch == 'F') || (ch == 'f'))
|
||
{
|
||
fillregion(c,d,col,col);
|
||
showall(buf);
|
||
printmessage("Flood Fill");
|
||
asksave = 1;
|
||
}
|
||
if (ch == 9)
|
||
{
|
||
drawcolordot(col);
|
||
col = buf[(d<<10)+c];
|
||
drawcolordot((col+16)&255);
|
||
printmessage("Current color updated");
|
||
}
|
||
if ((ch == '+') || (ch == '-'))
|
||
{
|
||
if ((ch == '+') && ((picanm[picnum]&63) < 63))
|
||
picanm[picnum]++;
|
||
if (ch == '-')
|
||
{
|
||
if ((picanm[picnum]&63) > 0)
|
||
picanm[picnum]--;
|
||
else
|
||
picanm[picnum] = ((picanm[picnum]+64)&0x000000c0)+(picanm[picnum]&0xffffff3f);
|
||
}
|
||
asksave = 1;
|
||
showall(buf);
|
||
}
|
||
if ((ch == 's') || (ch == 'S'))
|
||
{
|
||
x = xdim;
|
||
y = ydim;
|
||
|
||
ch = 0;
|
||
while ((ch != 13) && (ch != 27))
|
||
{
|
||
sprintf((char *)&buffer,"Xdim: %d_ ",xdim);
|
||
printmessage(buffer);
|
||
|
||
ch = getch();
|
||
if ((ch >= 48) && (ch <= 57))
|
||
{
|
||
i = (xdim*10)+(ch-48);
|
||
if (i <= 1024)
|
||
xdim = i;
|
||
}
|
||
if (ch == 8)
|
||
{
|
||
xdim /= 10;
|
||
}
|
||
}
|
||
if (ch == 13)
|
||
{
|
||
ch = 0;
|
||
while ((ch != 13) && (ch != 27))
|
||
{
|
||
sprintf((char *)&buffer,"Ydim: %d_ ",ydim);
|
||
printmessage(buffer);
|
||
|
||
ch = getch();
|
||
if ((ch >= 48) && (ch <= 57))
|
||
{
|
||
i = (ydim*10)+(ch-48);
|
||
if (i <= 512)
|
||
ydim = i;
|
||
}
|
||
if (ch == 8)
|
||
{
|
||
ydim /= 10;
|
||
}
|
||
}
|
||
}
|
||
if (ch == 13)
|
||
{
|
||
c = (xdim>>1);
|
||
d = (ydim>>1);
|
||
asksave = 1;
|
||
drawmainscreen();
|
||
}
|
||
else
|
||
{
|
||
xdim = x;
|
||
ydim = y;
|
||
showall(buf);
|
||
cleartext();
|
||
}
|
||
ch = 255;
|
||
}
|
||
if ((ch == 'g') || (ch == 'G'))
|
||
{
|
||
ch = 0;
|
||
j = picnum;
|
||
while ((ch != 13) && (ch != 27))
|
||
{
|
||
sprintf((char *)&buffer,"Goto tile: %d_ ",j);
|
||
printmessage(buffer);
|
||
|
||
ch = getch();
|
||
if ((ch >= 48) && (ch <= 57))
|
||
{
|
||
i = (j*10)+(ch-48);
|
||
if (i < MAXTILES)
|
||
j = i;
|
||
}
|
||
if (ch == 8)
|
||
{
|
||
j /= 10;
|
||
}
|
||
}
|
||
if (ch == 13)
|
||
{
|
||
savewall(buf,picnum);
|
||
picnum = j;
|
||
loadpics(picnum);
|
||
loadwall(buf,picnum);
|
||
showall(buf);
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
else
|
||
{
|
||
cleartext();
|
||
}
|
||
ch = 255;
|
||
}
|
||
if (((ch == 'o') || (ch == 'O')) && (xdim > 0) && (ydim > 0))
|
||
{
|
||
x = 0;
|
||
y = 0;
|
||
|
||
l = 0;
|
||
m = xdim;
|
||
while ((m > 0) && (l == 0))
|
||
{
|
||
l = 0;
|
||
for(k=0;k<ydim;k++)
|
||
if (buf[(k<<10)+0] != 255) { l = 1; break; }
|
||
if (l == 0)
|
||
{
|
||
x++;
|
||
for(i=1;i<xdim;i++)
|
||
{
|
||
k = ((i+1)%xdim);
|
||
for(j=0;j<ydim;j++)
|
||
{
|
||
tempchar = buf[(j<<10)+i];
|
||
buf[(j<<10)+i] = buf[(j<<10)+k];
|
||
buf[(j<<10)+k] = tempchar;
|
||
}
|
||
}
|
||
xdim--;
|
||
}
|
||
m--;
|
||
}
|
||
|
||
l = 0;
|
||
m = ydim;
|
||
while ((m > 0) && (l == 0))
|
||
{
|
||
l = 0;
|
||
for(k=0;k<xdim;k++)
|
||
if (buf[(0<<10)+k] != 255) { l = 1; break; }
|
||
if (l == 0)
|
||
{
|
||
y++;
|
||
for(j=1;j<ydim;j++)
|
||
{
|
||
k = ((j+1)%ydim);
|
||
for(i=0;i<xdim;i++)
|
||
{
|
||
tempchar = buf[(j<<10)+i];
|
||
buf[(j<<10)+i] = buf[(k<<10)+i];
|
||
buf[(k<<10)+i] = tempchar;
|
||
}
|
||
}
|
||
ydim--;
|
||
}
|
||
m--;
|
||
}
|
||
|
||
l = 0;
|
||
while ((xdim > 0) && (l == 0))
|
||
{
|
||
l = 0;
|
||
for(k=0;k<ydim;k++)
|
||
if (buf[(k<<10)+(xdim-1)] != 255) { l = 1; break; }
|
||
if (l == 0) { x--; xdim--; }
|
||
}
|
||
|
||
l = 0;
|
||
while ((ydim > 0) && (l == 0))
|
||
{
|
||
l = 0;
|
||
for(k=0;k<xdim;k++)
|
||
if (buf[((ydim-1)<<10)+k] != 255) { l = 1; break; }
|
||
if (l == 0) { y--; ydim--; }
|
||
}
|
||
|
||
i = (long)((signed char)((picanm[picnum]>>8)&255));
|
||
i -= (x>>1);
|
||
if (i < -128) i = -128;
|
||
if (i > 127) i = 127;
|
||
picanm[picnum] = (picanm[picnum]&0xffff00ff)+((i&255)<<8);
|
||
|
||
i = (long)((signed char)((picanm[picnum]>>16)&255));
|
||
i -= (y>>1);
|
||
if (i < -128) i = -128;
|
||
if (i > 127) i = 127;
|
||
picanm[picnum] = (picanm[picnum]&0xff00ffff)+((i&255)<<16);
|
||
|
||
c = (xdim>>1);
|
||
d = (ydim>>1);
|
||
asksave = 1;
|
||
drawmainscreen();
|
||
ch = 255;
|
||
}
|
||
|
||
if ((ch == 'u') || (ch == 'U'))
|
||
{
|
||
k = 0;
|
||
|
||
if (loadtileofscript(picnum,filename,&x1,&y1,&x2,&y2) == 1)
|
||
{
|
||
strcpy(menupath,filename);
|
||
i = strlen(filename)-1;
|
||
while ((menupath[i] != '\\') && (i > 0)) i--;
|
||
menupath[i] = 0;
|
||
|
||
j = 0; i++;
|
||
while (filename[i] != 0) buffer[j++] = filename[i++];
|
||
buffer[j] = 0;
|
||
loadpicture(buffer);
|
||
|
||
if ((k=selectbox(&x1,&y1,&x2,&y2)) == 1)
|
||
captureit(x1,y1,x2,y2,picnum,filename,1);
|
||
drawmainscreen();
|
||
chdir(curpath);
|
||
|
||
menuhighlight = 0;
|
||
}
|
||
|
||
while (k == 0)
|
||
{
|
||
i = menuselect();
|
||
if (i < 0)
|
||
{
|
||
chdir(curpath); //Error or Escape (cancel)
|
||
showall(buf);
|
||
if (i == -2)
|
||
printmessage("No files found.");
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
menuhighlight = i;
|
||
|
||
loadpicture(menuname[menuhighlight]);
|
||
|
||
strcpy(filename,menupath);
|
||
strcat(filename,"\\");
|
||
strcat(filename,menuname[menuhighlight]);
|
||
x1 = 0x80000000;
|
||
if ((k=selectbox(&x1,&y1,&x2,&y2)) == 1)
|
||
captureit(x1,y1,x2,y2,picnum,filename,1);
|
||
drawmainscreen();
|
||
chdir(curpath);
|
||
}
|
||
}
|
||
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
ch = 255;
|
||
}
|
||
if ((ch == 'v') || (ch == 'V'))
|
||
{
|
||
savewall(buf,picnum);
|
||
savepics();
|
||
picnum = gettile(picnum);
|
||
loadpics(picnum);
|
||
loadwall(buf,picnum);
|
||
drawmainscreen();
|
||
ch = 255;
|
||
}
|
||
if (((ch == 'a') || (ch == 'A')) && ((picanm[picnum]&192) > 0) && ((picanm[picnum]&63) > 0))
|
||
{
|
||
savewall(buf,picnum);
|
||
sprintf((char *)&printbuf,"Use +/- to change speed");
|
||
printmessage(&printbuf);
|
||
i = 1;
|
||
ch = 0;
|
||
|
||
#ifdef PLATFORM_DOS
|
||
// These should be NOPs for Unix - DDOI
|
||
oldtimerhandler = _dos_getvect(0x8);
|
||
_dos_setvect(0x8, timerhandler);
|
||
outp(0x43,54); outp(0x40,9942&255); outp(0x40,9942>>8);
|
||
#endif
|
||
totalclock = 0L;
|
||
|
||
animspeed = ((((unsigned long)picanm[picnum])>>24)&15);
|
||
|
||
j = picnum;
|
||
|
||
while ((ch != 13) && (ch != 27))
|
||
{
|
||
templong = picnum;
|
||
|
||
i = (totalclock>>animspeed);
|
||
switch(picanm[templong]&192)
|
||
{
|
||
case 64:
|
||
k = (i%((picanm[templong]&63)<<1));
|
||
if (k < (picanm[templong]&63))
|
||
templong += k;
|
||
else
|
||
templong += (((picanm[templong]&63)<<1)-k);
|
||
break;
|
||
case 128:
|
||
templong += (i%((picanm[templong]&63)+1));
|
||
break;
|
||
case 192:
|
||
templong -= (i%((picanm[templong]&63)+1));
|
||
}
|
||
|
||
if ((templong >= 0) && (templong < MAXTILES))
|
||
loadwall(buf,templong);
|
||
|
||
if (templong != j)
|
||
{
|
||
j = templong;
|
||
//if ((xdim < lastshowallxdim) || (ydim < lastshowallydim))
|
||
cleartopbox();
|
||
}
|
||
lastshowallxdim = xdim;
|
||
lastshowallydim = ydim;
|
||
|
||
copywalltoscreen(buf,templong,1);
|
||
|
||
if (kbhit() != 0)
|
||
{
|
||
ch = getch();
|
||
if ((ch == '+') && (animspeed > 0)) animspeed--;
|
||
if ((ch == '-') && (animspeed < 15)) animspeed++;
|
||
}
|
||
}
|
||
|
||
#ifdef PLATFORM_DOS
|
||
// NOPs for Unix - DDOI
|
||
_dos_setvect(0x8, oldtimerhandler);
|
||
outp(0x43,54); outp(0x40,255); outp(0x40,255);
|
||
#endif
|
||
|
||
cleartopbox();
|
||
|
||
cleartext();
|
||
loadwall(buf,picnum);
|
||
showall(buf);
|
||
|
||
if (ch == 13)
|
||
{
|
||
picanm[picnum] = (picanm[picnum]&0xf0ffffff) + (((unsigned long)(animspeed&15))<<24);
|
||
asksave = 1;
|
||
}
|
||
|
||
ch = 255;
|
||
}
|
||
if ((ch == '`') || (ch == '~'))
|
||
{
|
||
if ((xdim <= 320) && (ydim <= 200))
|
||
{
|
||
sprintf((char *)&printbuf,"Use arrows to change center",animspeed);
|
||
printmessage(&printbuf);
|
||
templong = picanm[picnum];
|
||
ch = 0;
|
||
|
||
copywalltoscreen(buf,picnum,1);
|
||
|
||
k = whitecol;
|
||
while ((ch != 13) && (ch != 27) && (ch != '`') && (ch != '~'))
|
||
{
|
||
if (kbhit() != 0)
|
||
{
|
||
ch = getch();
|
||
if ((ch == '/') || (ch == '?'))
|
||
{
|
||
picanm[picnum] &= 0xff0000ff;
|
||
cleartopbox();
|
||
copywalltoscreen(buf,picnum,1);
|
||
}
|
||
if (ch == 0)
|
||
{
|
||
ch = getch();
|
||
if (ch == 75) picanm[picnum] = (((picanm[picnum]+(1<<8))&0x0000ff00)+(picanm[picnum]&0xffff00ff));
|
||
if (ch == 77) picanm[picnum] = (((picanm[picnum]+(255<<8))&0x0000ff00)+(picanm[picnum]&0xffff00ff));
|
||
if (ch == 72) picanm[picnum] = (((picanm[picnum]+(1<<16))&0x00ff0000)+(picanm[picnum]&0xff00ffff));
|
||
if (ch == 80) picanm[picnum] = (((picanm[picnum]+(255<<16))&0x00ff0000)+(picanm[picnum]&0xff00ffff));
|
||
cleartopbox();
|
||
copywalltoscreen(buf,picnum,1);
|
||
}
|
||
}
|
||
readmouse();
|
||
if ((mousx != 0) || (mousy != 0))
|
||
{
|
||
i = (long)((signed char)((picanm[picnum]>>8)&255));
|
||
i -= mousx;
|
||
if (i < -128) i = -128;
|
||
if (i > 127) i = 127;
|
||
picanm[picnum] = (picanm[picnum]&0xffff00ff)+((i&255)<<8);
|
||
|
||
i = (long)((signed char)((picanm[picnum]>>16)&255));
|
||
i -= mousy;
|
||
if (i < -128) i = -128;
|
||
if (i > 127) i = 127;
|
||
picanm[picnum] = (picanm[picnum]&0xff00ffff)+((i&255)<<16);
|
||
|
||
cleartopbox();
|
||
copywalltoscreen(buf,picnum,1);
|
||
}
|
||
|
||
outp(0x3c4,2); outp(0x3c5,15);
|
||
for(i=0;i<320;i+=4)
|
||
drawpixel(((((100+16-panyoff)*panxdim)+i)>>2)+(long)VIDEOBASE,k);
|
||
outp(0x3c4,2); outp(0x3c5,1);
|
||
for(j=0;j<200;j++)
|
||
drawpixel(((((j+16-panyoff)*panxdim)+160)>>2)+(long)VIDEOBASE,k);
|
||
|
||
k ^= whitecol^blackcol;
|
||
}
|
||
cleartopbox();
|
||
cleartext();
|
||
if (ch == 27)
|
||
picanm[picnum] = templong;
|
||
else
|
||
asksave = 1;
|
||
copywalltoscreen(buf,picnum,0);
|
||
ch = 255;
|
||
}
|
||
}
|
||
if ((ch == 'n') || (ch == 'N'))
|
||
{
|
||
strcpy((char *)&buffer,&names[picnum][0]);
|
||
i = 0;
|
||
while (buffer[i] != 0)
|
||
i++;
|
||
buffer[i] = '_';
|
||
buffer[i+1] = 0;
|
||
strcpy((char *)&buffer2,"Name: ");
|
||
strcat((char *)&buffer2,buffer);
|
||
printmessage(&buffer2[0]);
|
||
ch = 0;
|
||
while ((ch != 13) && (ch != 27))
|
||
{
|
||
ch = getch();
|
||
if ((ch > 32) && (i < 16))
|
||
{
|
||
buffer[i] = ch;
|
||
buffer[i+1] = '_';
|
||
buffer[i+2] = 32;
|
||
buffer[i+3] = 0;
|
||
i++;
|
||
strcpy((char *)&buffer2,"Name: ");
|
||
strcat((char *)&buffer2,buffer);
|
||
printmessage(&buffer2[0]);
|
||
}
|
||
if ((ch == 8) && (i > 0))
|
||
{
|
||
i--;
|
||
buffer[i] = '_';
|
||
buffer[i+1] = 32;
|
||
buffer[i+2] = 0;
|
||
strcpy((char *)&buffer2,"Name: ");
|
||
strcat((char *)&buffer2,buffer);
|
||
printmessage(&buffer2[0]);
|
||
}
|
||
}
|
||
if (ch == 13)
|
||
{
|
||
buffer[i] = 0;
|
||
strcpy(&names[picnum][0],&buffer[0]);
|
||
needtosavenames = 1;
|
||
}
|
||
cleartext();
|
||
if (names[picnum][0] != 0)
|
||
{
|
||
strcpy((char *)&buffer2,"Name: ");
|
||
strcat((char *)&buffer2,&names[picnum][0]);
|
||
printmessage(&buffer2[0]);
|
||
}
|
||
}
|
||
}
|
||
if (moustat == 1)
|
||
{
|
||
readmouse();
|
||
if ((mousx != 0) || (mousy != 0))
|
||
{
|
||
drawdot(buf[(d<<10)+c]);
|
||
|
||
xstep = c;
|
||
ystep = d;
|
||
c += mousx;
|
||
d += mousy;
|
||
if (c < 0) c = 0;
|
||
if (c >= xdim) c = xdim-1;
|
||
if (d < 0) d = 0;
|
||
if (d >= ydim) d = ydim-1;
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
}
|
||
if (bstatus > 0)
|
||
{
|
||
x = c;
|
||
y = d;
|
||
j = labs(xstep-x)+labs(ystep-y);
|
||
for(i=0;i<j;i++)
|
||
{
|
||
c = xstep + ((x-xstep)*i)/j;
|
||
d = ystep + ((y-ystep)*i)/j;
|
||
buf[(d<<10)+c] = col;
|
||
drawdot(col);
|
||
}
|
||
asksave = 1;
|
||
c = x;
|
||
d = y;
|
||
}
|
||
}
|
||
if (ch == 27)
|
||
{
|
||
printmessage("Quit? (Y/N)");
|
||
do
|
||
{
|
||
ch = getch();
|
||
}
|
||
while ((ch != 'y') && (ch != 'Y') && (ch != 'n') && (ch != 'N') && (ch != 27));
|
||
if ((ch == 'y') || (ch == 'Y'))
|
||
ch = 27;
|
||
else
|
||
{
|
||
cleartext();
|
||
ch = 0;
|
||
}
|
||
}
|
||
}
|
||
savewall(buf,picnum);
|
||
savepics();
|
||
savenames();
|
||
setvmode(0x3);
|
||
updatemaps();
|
||
if (capfil != -1) close(capfil);
|
||
return(0);
|
||
}
|
||
|
||
int loadtables(void)
|
||
{
|
||
short int fil;
|
||
|
||
if ((fil = open("tables.dat",O_BINARY|O_RDWR,S_IREAD)) != -1)
|
||
{
|
||
read(fil,&sintable[0],4096);
|
||
lseek(fil,4096L+1280L,SEEK_SET);
|
||
read(fil,&textfont[0],1024);
|
||
close(fil);
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
int loadpics(long dapicnum)
|
||
{
|
||
long i, offscount, siz, danum;
|
||
short int fil;
|
||
|
||
i = curtilefile;
|
||
if (i < 0) i = 0;
|
||
while ((dapicnum < localtilestart[i]) && (i > 0)) i--;
|
||
while ((dapicnum > localtileend[i]) && (i < numtilefiles-1)) i++;
|
||
|
||
if ((i == curtilefile) && (dapicnum <= localtileend[i]))
|
||
return(-1);
|
||
|
||
if (curtilefile == -1)
|
||
allasksave = 0;
|
||
else
|
||
savepics();
|
||
|
||
curtilefile = i;
|
||
|
||
if (dapicnum > localtileend[i])
|
||
{
|
||
localtilestart[numtilefiles] = localtileend[numtilefiles-1]+1;
|
||
localtileend[numtilefiles] = localtilestart[numtilefiles];
|
||
localtileend[numtilefiles] += (localtileend[0]-localtilestart[0]);
|
||
for(i=localtilestart[numtilefiles];i<=localtileend[numtilefiles];i++)
|
||
{
|
||
tilesizx[i] = 0;
|
||
tilesizy[i] = 0;
|
||
picanm[i] = 0L;
|
||
waloff[i] = FP_OFF(pic);
|
||
}
|
||
numtilefiles++;
|
||
curtilefile = numtilefiles-1;
|
||
totpicsiz = 0L;
|
||
return(0);
|
||
}
|
||
|
||
danum = curtilefile;
|
||
|
||
artfilename[7] = (danum%10)+48;
|
||
artfilename[6] = ((danum/10)%10)+48;
|
||
artfilename[5] = ((danum/100)%10)+48;
|
||
if ((fil = open(artfilename,O_BINARY|O_RDONLY,S_IREAD)) == -1)
|
||
{
|
||
if (danum == 0)
|
||
{
|
||
artversion = 1;
|
||
numtilefiles = 0;
|
||
numtiles = 0;
|
||
|
||
localtilestart[numtilefiles] = 0;
|
||
localtileend[numtilefiles] = 255;
|
||
for(i=localtilestart[0];i<=localtileend[0];i++)
|
||
{
|
||
tilesizx[i] = 0;
|
||
tilesizy[i] = 0;
|
||
picanm[i] = 0L;
|
||
waloff[i] = FP_OFF(pic);
|
||
}
|
||
numtilefiles++;
|
||
curtilefile = numtilefiles-1;
|
||
totpicsiz = 0L;
|
||
}
|
||
return(0);
|
||
}
|
||
read(fil,&artversion,4);
|
||
if (artversion != 1) return(-1);
|
||
read(fil,&numtiles,4);
|
||
read(fil,&localtilestart[danum],4);
|
||
read(fil,&localtileend[danum],4);
|
||
read(fil,&tilesizx[localtilestart[danum]],(localtileend[danum]-localtilestart[danum]+1)<<1);
|
||
read(fil,&tilesizy[localtilestart[danum]],(localtileend[danum]-localtilestart[danum]+1)<<1);
|
||
read(fil,&picanm[localtilestart[danum]],(localtileend[danum]-localtilestart[danum]+1)<<2);
|
||
|
||
totpicsiz = 0L;
|
||
offscount = 0L;
|
||
for(i=localtilestart[danum];i<=localtileend[danum];i++)
|
||
{
|
||
waloff[i] = offscount+FP_OFF(pic);
|
||
siz = tilesizx[i]*tilesizy[i];
|
||
if (siz > 0)
|
||
{
|
||
offscount += siz;
|
||
totpicsiz += siz;
|
||
}
|
||
}
|
||
|
||
if (totpicsiz >= totpicmem)
|
||
{
|
||
if (buf2 != NULL)
|
||
{
|
||
buf2 = NULL;
|
||
totpicmem += (1024*512);
|
||
}
|
||
|
||
if (totpicsiz >= totpicmem)
|
||
{
|
||
printf("Not enough memory to fit artwork data.\n");
|
||
exit(0);
|
||
}
|
||
}
|
||
|
||
read(fil,&pic[0],totpicsiz);
|
||
|
||
close(fil);
|
||
return(0);
|
||
}
|
||
|
||
int savepics(void)
|
||
{
|
||
char ch, dabuffer[160];
|
||
long i, templong, offscount, siz, danum;
|
||
short int fil;
|
||
|
||
if (allasksave == 0)
|
||
return(0);
|
||
allasksave = 0;
|
||
|
||
i = 0;
|
||
while (curpath[i] != 0) i++;
|
||
curpath[i] = 92;
|
||
curpath[i+1] = 0;
|
||
chdir(curpath);
|
||
curpath[i] = 0;
|
||
|
||
numtiles = MAXTILES-1;
|
||
while ((tilesizx[numtiles] < 2) && (tilesizy[numtiles] < 2) && (numtiles > 0))
|
||
numtiles--;
|
||
numtiles++;
|
||
|
||
if (mustsavelocals != 0)
|
||
{
|
||
mustsavelocals = 0;
|
||
|
||
for(danum=0;danum<numtilefiles;danum++)
|
||
if (danum != curtilefile)
|
||
{
|
||
artfilename[7] = (danum%10)+48;
|
||
artfilename[6] = ((danum/10)%10)+48;
|
||
artfilename[5] = ((danum/100)%10)+48;
|
||
|
||
if ((fil = open(artfilename,O_BINARY|O_WRONLY,UC_PERMS))!=-1)
|
||
{
|
||
write(fil,&artversion,4);
|
||
write(fil,&numtiles,4);
|
||
write(fil,&localtilestart[danum],4);
|
||
write(fil,&localtileend[danum],4);
|
||
close(fil);
|
||
}
|
||
}
|
||
}
|
||
|
||
danum = curtilefile;
|
||
|
||
artfilename[7] = (danum%10)+48;
|
||
artfilename[6] = ((danum/10)%10)+48;
|
||
artfilename[5] = ((danum/100)%10)+48;
|
||
|
||
sprintf(dabuffer,"Updating %s...",artfilename);
|
||
printmessage(dabuffer);
|
||
|
||
if (localtilestart[danum] > localtileend[danum])
|
||
return(0);
|
||
|
||
if (localtilestart[danum] >= MAXTILES)
|
||
return(0);
|
||
if (localtileend[danum] >= MAXTILES)
|
||
localtileend[danum] = MAXTILES-1;
|
||
|
||
if ((fil = open(artfilename,O_BINARY|O_CREAT|O_TRUNC|O_WRONLY,UC_PERMS))==-1)
|
||
return(-1);
|
||
write(fil,&artversion,4);
|
||
write(fil,&numtiles,4);
|
||
write(fil,&localtilestart[danum],4);
|
||
write(fil,&localtileend[danum],4);
|
||
write(fil,&tilesizx[localtilestart[danum]],(localtileend[danum]-localtilestart[danum]+1)<<1);
|
||
write(fil,&tilesizy[localtilestart[danum]],(localtileend[danum]-localtilestart[danum]+1)<<1);
|
||
write(fil,&picanm[localtilestart[danum]],(localtileend[danum]-localtilestart[danum]+1)<<2);
|
||
|
||
if (write(fil,&pic[0],totpicsiz) < totpicsiz)
|
||
{
|
||
printf("SAVE UNSUCCESSFUL!\n");
|
||
return(0);
|
||
}
|
||
|
||
close(fil);
|
||
|
||
sprintf(dabuffer,"%s updated.",artfilename);
|
||
printmessage(dabuffer);
|
||
|
||
return(0);
|
||
}
|
||
|
||
int loadwall(char *bufptr, long wallnum)
|
||
{
|
||
long i, j, vidpos, dat;
|
||
char *picptr;
|
||
|
||
picptr = (char *)(waloff[wallnum]);
|
||
xdim = tilesizx[wallnum];
|
||
ydim = tilesizy[wallnum];
|
||
|
||
clearbuf(buf,(1024*512)>>2,0xffffffff);
|
||
|
||
vidpos = 0;
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
{
|
||
dat = *picptr++;
|
||
*(bufptr+(j<<10)+i) = dat;
|
||
}
|
||
asksave = 0;
|
||
|
||
if (c < 0) c = 0;
|
||
if (d < 0) d = 0;
|
||
if (c >= xdim) c = xdim-1;
|
||
if (d >= ydim) d = ydim-1;
|
||
updatepanning();
|
||
|
||
return(0);
|
||
}
|
||
|
||
int savewall(char *bufptr, long wallnum)
|
||
{
|
||
long i, j, vidpos, dat;
|
||
char *picptr, ch;
|
||
|
||
if (asksave != 0)
|
||
{
|
||
if (asksave == 1)
|
||
{
|
||
asksave = 0;
|
||
printmessage("Save current tile?");
|
||
do
|
||
{
|
||
ch = getch();
|
||
}
|
||
while ((ch != 'y') && (ch != 'Y') && (ch != 'n') && (ch != 'N'));
|
||
if ((ch == 'n') || (ch == 'N'))
|
||
return(0);
|
||
}
|
||
|
||
allasksave = 1;
|
||
|
||
if ((xdim != tilesizx[wallnum]) || (ydim != tilesizy[wallnum]))
|
||
{
|
||
if (resizetile(wallnum,(long)tilesizx[wallnum],(long)tilesizy[wallnum],xdim,ydim) == -1)
|
||
{
|
||
printmessage("OUT OF MEMORY! (cancelled)");
|
||
return(-1);
|
||
}
|
||
else
|
||
{
|
||
tilesizx[wallnum] = xdim;
|
||
tilesizy[wallnum] = ydim;
|
||
}
|
||
}
|
||
|
||
picptr = (char *)(waloff[wallnum]);
|
||
xdim = tilesizx[wallnum];
|
||
ydim = tilesizy[wallnum];
|
||
|
||
vidpos = 0;
|
||
for(i=0;i<xdim;i++)
|
||
for(j=0;j<ydim;j++)
|
||
{
|
||
dat = *(bufptr+(j<<10)+i);
|
||
*picptr++ = dat;
|
||
}
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
int showall(char *bufptr)
|
||
{
|
||
//if ((xdim < lastshowallxdim) || (ydim < lastshowallydim))
|
||
cleartopbox();
|
||
lastshowallxdim = xdim;
|
||
lastshowallydim = ydim;
|
||
|
||
cleartext();
|
||
switch(picanm[picnum]&192)
|
||
{
|
||
case 0: printext256(152L,0L,whitecol,blackcol,"NoAnm:"); break;
|
||
case 64: printext256(152L,0L,whitecol,blackcol,"Oscil:"); break;
|
||
case 128: printext256(152L,0L,whitecol,blackcol,"AnmFD:"); break;
|
||
case 192: printext256(152L,0L,whitecol,blackcol,"AnmBK:"); break;
|
||
}
|
||
printbuf[0] = ((picanm[picnum]&63)/10)+48;
|
||
printbuf[1] = ((picanm[picnum]&63)%10)+48;
|
||
if ((picanm[picnum]&63) < 10)
|
||
{
|
||
printbuf[0] = ((picanm[picnum]&63)%10)+48;
|
||
printbuf[1] = 32;
|
||
}
|
||
printbuf[2] = 0;
|
||
printext256(200L,0L,whitecol,blackcol,&printbuf);
|
||
|
||
if ((xdim == 0) && (ydim == 0))
|
||
{
|
||
printext256(80L,0L,whitecol,blackcol," -blank-");
|
||
}
|
||
else
|
||
{
|
||
if (xdim >= 1000)
|
||
printbuf[0] = ((xdim/1000)%10)+48;
|
||
else
|
||
printbuf[0] = 32;
|
||
if (xdim >= 100)
|
||
printbuf[1] = ((xdim/100)%10)+48;
|
||
else
|
||
printbuf[1] = 32;
|
||
if (xdim >= 10)
|
||
printbuf[2] = ((xdim/10)%10)+48;
|
||
else
|
||
printbuf[2] = 32;
|
||
printbuf[3] = (xdim%10)+48;
|
||
printbuf[4] = '*';
|
||
printbuf[5] = 32;
|
||
printbuf[6] = 32;
|
||
printbuf[7] = 32;
|
||
printbuf[8] = 0;
|
||
if (ydim >= 100)
|
||
{
|
||
printbuf[5] = ((ydim/100)%10)+48;
|
||
printbuf[6] = ((ydim/10)%10)+48;
|
||
printbuf[7] = (ydim%10)+48;
|
||
}
|
||
else if (ydim >= 10)
|
||
{
|
||
printbuf[5] = ((ydim/10)%10)+48;
|
||
printbuf[6] = (ydim%10)+48;
|
||
}
|
||
else if (ydim >= 1)
|
||
{
|
||
printbuf[5] = (ydim%10)+48;
|
||
}
|
||
else
|
||
{
|
||
printbuf[5] = '0';
|
||
}
|
||
printext256(80L,0L,whitecol,blackcol,&printbuf);
|
||
}
|
||
|
||
sprintf(&printbuf,"Tile:");
|
||
printbuf[5] = 32;
|
||
printbuf[6] = 32;
|
||
printbuf[7] = 32;
|
||
printbuf[8] = 32;
|
||
printbuf[9] = 0;
|
||
if (picnum >= 1000)
|
||
{
|
||
printbuf[5] = ((picnum/1000)%10)+48;
|
||
printbuf[6] = ((picnum/100)%10)+48;
|
||
printbuf[7] = ((picnum/10)%10)+48;
|
||
printbuf[8] = (picnum%10)+48;
|
||
}
|
||
else if (picnum >= 100)
|
||
{
|
||
printbuf[5] = ((picnum/100)%10)+48;
|
||
printbuf[6] = ((picnum/10)%10)+48;
|
||
printbuf[7] = (picnum%10)+48;
|
||
}
|
||
else if (picnum >= 10)
|
||
{
|
||
printbuf[5] = ((picnum/10)%10)+48;
|
||
printbuf[6] = (picnum%10)+48;
|
||
}
|
||
else if (picnum >= 1)
|
||
{
|
||
printbuf[5] = (picnum%10)+48;
|
||
}
|
||
else
|
||
{
|
||
printbuf[5] = '0';
|
||
}
|
||
printext256(0L,0L,whitecol,blackcol,&printbuf);
|
||
|
||
if (names[picnum][0] != 0)
|
||
printmessage(&names[picnum][0]);
|
||
|
||
copywalltoscreen(bufptr,picnum,0);
|
||
|
||
return(0);
|
||
}
|
||
|
||
void copywalltoscreen(char *bufptr, long dapicnum, char maskmode)
|
||
{
|
||
char *ptr;
|
||
long plane, i, j, jstart, jend, vidpos, dat, daydim, cnt, xoff, yoff;
|
||
|
||
xoff = 0; yoff = 0;
|
||
if ((xdim <= 320) && (ydim <= 200))
|
||
{
|
||
xoff = 160L-(xdim>>1)-(long)((signed char)((picanm[dapicnum]>>8)&255));
|
||
yoff = 100L-(ydim>>1)-(long)((signed char)((picanm[dapicnum]>>16)&255));
|
||
}
|
||
|
||
daydim = ydim;
|
||
if (daydim > 240) daydim = 240;
|
||
|
||
if (maskmode == 1)
|
||
blackmasklookup[255] = blackcol;
|
||
else
|
||
blackmasklookup[255] = 255;
|
||
|
||
for(plane=0;plane<4;plane++)
|
||
{
|
||
outp(0x3c4,2); outp(0x3c5,1<<((plane+xoff)&3));
|
||
|
||
jstart = panyoff;
|
||
jend = daydim+panyoff;
|
||
if (jstart-panyoff+yoff < 0) jstart = 0+panyoff-yoff;
|
||
if (jend-panyoff+yoff > 240) jend = 240+panyoff-yoff;
|
||
for(j=jstart;j<jend;j++)
|
||
{
|
||
vidpos = (((16+j-panyoff+yoff)*panxdim+plane+xoff)>>2)+VIDEOBASE;
|
||
|
||
cnt = xdim-plane;
|
||
ptr = (char *)(bufptr+plane+(j<<10));
|
||
|
||
while (cnt > 12)
|
||
{
|
||
dat = blackmasklookup[*ptr];
|
||
dat += (blackmasklookup[*(ptr+4)]<<8);
|
||
dat += (blackmasklookup[*(ptr+8)]<<16);
|
||
dat += (blackmasklookup[*(ptr+12)]<<24);
|
||
drawpixelses(vidpos,dat);
|
||
vidpos += 4;
|
||
ptr += 16;
|
||
cnt -= 16;
|
||
}
|
||
while (cnt > 0)
|
||
{
|
||
drawpixel(vidpos,blackmasklookup[*ptr]);
|
||
vidpos++;
|
||
ptr += 4;
|
||
cnt -= 4;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int drawdot(char col)
|
||
{
|
||
long vidpos, dat, xoff, yoff;
|
||
|
||
updatepanning();
|
||
|
||
xoff = 0; yoff = 0;
|
||
if ((xdim <= 320) && (ydim <= 200))
|
||
{
|
||
xoff = 160L-(xdim>>1)-(long)((signed char)((picanm[picnum]>>8)&255));
|
||
yoff = 100L-(ydim>>1)-(long)((signed char)((picanm[picnum]>>16)&255));
|
||
}
|
||
|
||
dat = col;
|
||
if ((xdim|ydim) == 0) return(-1);
|
||
outp(0x3c4,2); outp(0x3c5,1<<((c+xoff)&3));
|
||
vidpos = (((((d+yoff)+16-panyoff)*panxdim)+(c+xoff))>>2)+VIDEOBASE;
|
||
drawpixel(vidpos,dat);
|
||
|
||
return(0);
|
||
}
|
||
|
||
void updatepanning(void)
|
||
{
|
||
long num, opanyoff;
|
||
|
||
panx = 0;
|
||
pany = 0;
|
||
if (xdim > 320)
|
||
{
|
||
panx = c-160;
|
||
if (panx < 0) panx = 0;
|
||
if (panx > xdim-320) panx = xdim-320;
|
||
}
|
||
if (ydim > 184)
|
||
{
|
||
pany = d-92;
|
||
if (pany < 0) pany = 0;
|
||
if (pany > ydim-184) pany = ydim-184;
|
||
}
|
||
|
||
opanyoff = panyoff;
|
||
while ((pany > panyoff+56) && (panyoff < 512)) panyoff += 56;
|
||
while ((pany < panyoff) && (panyoff > 0)) panyoff -= 56;
|
||
|
||
num = (pany-panyoff+16)*panxdim+panx;
|
||
outp(0x3d4,0xc); outp(0x3d5,num>>10);
|
||
outp(0x3d4,0xd); outp(0x3d5,(num>>2)&255);
|
||
outp(0x3c0,inp(0x3c0)|0x13); outp(0x3c0,(num&3)<<1);
|
||
|
||
if (panyoff != opanyoff)
|
||
copywalltoscreen(buf,picnum,0);
|
||
}
|
||
|
||
/* Panning... ick! This should be fun stuff to port - DDOI */
|
||
void updatepanningforumode(long dax, long day)
|
||
{
|
||
long num;
|
||
|
||
panxforu = 0;
|
||
panyforu = 0;
|
||
if (xres > 320)
|
||
{
|
||
panxforu = dax-160;
|
||
if (panxforu < 0) panxforu = 0;
|
||
if (panxforu > xres-320) panxforu = xres-320;
|
||
}
|
||
if (yres > 200)
|
||
{
|
||
panyforu = day-100;
|
||
if (panyforu < 0) panyforu = 0;
|
||
if (panyforu > yres-200) panyforu = yres-200;
|
||
}
|
||
|
||
num = panyforu*panxdim+panxforu;
|
||
outp(0x3d4,0xc); outp(0x3d5,num>>10);
|
||
outp(0x3d4,0xd); outp(0x3d5,(num>>2)&255);
|
||
outp(0x3c0,inp(0x3c0)|0x13); outp(0x3c0,(num&3)<<1);
|
||
}
|
||
|
||
void drawcolordot(char thecol)
|
||
{
|
||
long vidpos, dat;
|
||
|
||
outp(0x3c4,2); outp(0x3c5,1<<(((col&31)*3+1)&3));
|
||
vidpos = ((((col>>5)*2)*panxdim+((col&31)*3+225))>>2)+VIDEOBASE;
|
||
drawpixel(vidpos,(long)thecol);
|
||
drawpixel(vidpos+(panxdim>>2),(long)thecol);
|
||
}
|
||
|
||
void loadpicture(char *filename)
|
||
{
|
||
long i;
|
||
|
||
outp(0x3c4,2); outp(0x3c5,0xf);
|
||
clearbuf(VIDEOBASE,16384L,0L); //clear frame (for small pictures)
|
||
|
||
i = 0;
|
||
while (filename[i] != '.') i++;
|
||
switch(filename[i+1])
|
||
{
|
||
case 'B': loadbmp(filename); break;
|
||
case 'P': loadpcx(filename); break;
|
||
case 'G': loadgif(filename); break;
|
||
}
|
||
|
||
outp(0x3c7,0);
|
||
for(i=0;i<768;i++)
|
||
palette2[i] = inp(0x3c9);
|
||
getpaletteconversion();
|
||
}
|
||
|
||
int loadbmp(char *filename)
|
||
{
|
||
long fil, i, j;
|
||
|
||
if ((fil = open(filename,O_BINARY|O_RDWR,S_IREAD)) == -1)
|
||
return(-1);
|
||
read(fil,&tempbuf[0],4);
|
||
if ((tempbuf[0] == 'B') && (tempbuf[1] == 'M') && (tempbuf[2] == 'Z') && (tempbuf[3] == 34))
|
||
{
|
||
read(fil,&tempbuf[0],22);
|
||
read(fil,&tempbuf[0],768);
|
||
outp(0x3c8,0);
|
||
for(i=0;i<256;i++)
|
||
{
|
||
outp(0x3c9,tempbuf[i+i+i+2]>>2);
|
||
outp(0x3c9,tempbuf[i+i+i+1]>>2);
|
||
outp(0x3c9,tempbuf[i+i+i+0]>>2);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
read(fil,&tempbuf[0],50);
|
||
read(fil,&tempbuf[0],1024);
|
||
outp(0x3c8,0);
|
||
for(i=0;i<1024;i++)
|
||
if ((i&3) != 0)
|
||
outp(0x3c9,tempbuf[i^3]>>2);
|
||
}
|
||
|
||
xres = 320;
|
||
yres = 200;
|
||
|
||
for(j=0;j<200;j++)
|
||
{
|
||
read(fil,&tempbuf[0],320);
|
||
for(i=0;i<320;i++)
|
||
{
|
||
outp(0x3c4,2); outp(0x3c5,1<<(i&3));
|
||
drawpixel((((199-j)*panxdim+i)>>2)+(long)VIDEOBASE,tempbuf[i]);
|
||
}
|
||
}
|
||
close(fil);
|
||
return(0);
|
||
}
|
||
|
||
int loadpcx(char *filename)
|
||
{
|
||
unsigned char dat;
|
||
long fil, i, x, y, datcnt, leng;
|
||
|
||
if ((fil = open(filename,O_BINARY|O_RDWR,S_IREAD)) == -1)
|
||
return(-1);
|
||
read(fil,&tempbuf[0],128);
|
||
|
||
x = 0;
|
||
y = 0;
|
||
xres = ((long)tempbuf[12])+(((long)tempbuf[13])<<8);
|
||
yres = ((long)tempbuf[14])+(((long)tempbuf[15])<<8);
|
||
|
||
read(fil,&tempbuf[0],4096), datcnt = 0;
|
||
while (y < yres)
|
||
{
|
||
dat = tempbuf[datcnt++];
|
||
if (datcnt == 4096)
|
||
read(fil,&tempbuf[0],4096), datcnt = 0;
|
||
if ((dat&0xc0) == 0xc0)
|
||
{
|
||
leng = (dat&0x3f);
|
||
dat = tempbuf[datcnt++];
|
||
if (datcnt == 4096)
|
||
read(fil,&tempbuf[0],4096), datcnt = 0;
|
||
for(i=0;i<leng;i++)
|
||
{
|
||
if (y < 256)
|
||
{
|
||
outp(0x3c4,0x2); outp(0x3c5,1<<(x&3));
|
||
drawpixel((((y*panxdim)+x)>>2)+(long)VIDEOBASE,dat);
|
||
}
|
||
x++;
|
||
if (x >= xres)
|
||
{
|
||
x = 0;
|
||
y++;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (y < 256)
|
||
{
|
||
outp(0x3c4,0x2); outp(0x3c5,1<<(x&3));
|
||
drawpixel((((y*panxdim)+x)>>2)+(long)VIDEOBASE,dat);
|
||
}
|
||
x++;
|
||
if (x >= xres)
|
||
{
|
||
x = 0;
|
||
y++;
|
||
}
|
||
}
|
||
}
|
||
dat = tempbuf[datcnt++];
|
||
if (datcnt == 4096)
|
||
read(fil,&tempbuf[0],4096), datcnt = 0;
|
||
if (dat == 0xc)
|
||
{
|
||
outp(0x3c8,0);
|
||
for(i=0;i<768;i++)
|
||
{
|
||
dat = tempbuf[datcnt++];
|
||
if (datcnt == 4096)
|
||
read(fil,&tempbuf[0],4096), datcnt = 0;
|
||
outp(0x3c9,dat>>2);
|
||
}
|
||
}
|
||
close(fil);
|
||
|
||
return(0);
|
||
}
|
||
|
||
int loadgif(char *filename)
|
||
{
|
||
unsigned char header[13], imagestat[10], bitcnt, numbits;
|
||
unsigned char globalflag, chunkind;
|
||
short i, j, k, m;
|
||
short currstr, bytecnt, numbitgoal;
|
||
short numcols, numpals, dat, fil, blocklen, firstring;
|
||
short unsigned int numlines, gifdatacnt;
|
||
long x, y;
|
||
|
||
if ((strstr(filename,".gif") == 0) && (strstr(filename,".GIF") == 0))
|
||
strcat(filename,".gif");
|
||
if ((fil = open(filename,O_BINARY|O_RDONLY,S_IREAD)) == -1)
|
||
return(-1);
|
||
gifdatacnt = 0;
|
||
read(fil,&gifdata[0],(unsigned)GIFBUFLEN);
|
||
for(j=0;j<13;j++)
|
||
header[j] = gifdata[j+gifdatacnt];
|
||
gifdatacnt += 13;
|
||
if ((header[0] != 'G') || (header[1] != 'I') || (header[2] != 'F'))
|
||
return(-1);
|
||
globalflag = header[10];
|
||
numcols = (1<<((globalflag&7)+1));
|
||
firstring = numcols+2;
|
||
if (header[12] != 0)
|
||
return(-1);
|
||
if ((globalflag&128) > 0)
|
||
{
|
||
numpals = numcols+numcols+numcols;
|
||
for(j=0;j<numpals;j++)
|
||
giffilbuffer[j] = gifdata[j+gifdatacnt];
|
||
gifdatacnt += numpals;
|
||
}
|
||
chunkind = gifdata[gifdatacnt], gifdatacnt++;
|
||
while (chunkind == '!')
|
||
{
|
||
gifdatacnt++;
|
||
do
|
||
{
|
||
chunkind = gifdata[gifdatacnt], gifdatacnt++;
|
||
if (chunkind > 0)
|
||
gifdatacnt += chunkind;
|
||
}
|
||
while (chunkind > 0);
|
||
chunkind = gifdata[gifdatacnt], gifdatacnt++;
|
||
}
|
||
if (chunkind == ',')
|
||
{
|
||
for(j=0;j<9;j++)
|
||
imagestat[j] = gifdata[j+gifdatacnt];
|
||
gifdatacnt += 9;
|
||
xres = imagestat[4]+(imagestat[5]<<8);
|
||
yres = imagestat[6]+(imagestat[7]<<8);
|
||
if ((imagestat[8]&128) > 0) //localflag
|
||
{
|
||
numpals = numcols+numcols+numcols;
|
||
for(j=0;j<numpals;j++)
|
||
giffilbuffer[j] = gifdata[j+gifdatacnt];
|
||
gifdatacnt += numpals;
|
||
}
|
||
gifdatacnt++;
|
||
|
||
outp(0x3c8,0);
|
||
for(i=0;i<numpals;i++)
|
||
outp(0x3c9,giffilbuffer[i]>>2);
|
||
|
||
x = 0;
|
||
y = 0;
|
||
|
||
bitcnt = 0;
|
||
for(i=0;i<numcols;i++)
|
||
{
|
||
gifsuffix[i] = i;
|
||
gifprefix[i] = i;
|
||
}
|
||
currstr = firstring;
|
||
numbits = (globalflag&7)+2;
|
||
numbitgoal = (numcols<<1);
|
||
blocklen = 0;
|
||
blocklen = gifdata[gifdatacnt], gifdatacnt++;
|
||
for(j=0;j<blocklen;j++)
|
||
giffilbuffer[j] = gifdata[j+gifdatacnt];
|
||
gifdatacnt += blocklen;
|
||
bytecnt = 0;
|
||
while (y < yres)
|
||
{
|
||
dat = gifgetdat(bytecnt,numbits,bitcnt);
|
||
bytecnt += ((bitcnt+numbits)>>3);
|
||
bitcnt = ((bitcnt+numbits)&7);
|
||
if (bytecnt > blocklen-3)
|
||
{
|
||
giffilbuffer[0] = giffilbuffer[bytecnt];
|
||
giffilbuffer[1] = giffilbuffer[bytecnt+1];
|
||
i = blocklen-bytecnt;
|
||
blocklen = (short)gifdata[gifdatacnt++];
|
||
if (gifdatacnt+blocklen < GIFBUFLEN)
|
||
{
|
||
for(m=0;m<blocklen;m++)
|
||
giffilbuffer[i+m] = gifdata[gifdatacnt+m];
|
||
gifdatacnt += blocklen;
|
||
}
|
||
else
|
||
{
|
||
k = GIFBUFLEN-gifdatacnt;
|
||
for(m=0;m<k;m++)
|
||
giffilbuffer[i+m] = gifdata[gifdatacnt+m];
|
||
read(fil,&gifdata[0],(unsigned)GIFBUFLEN);
|
||
for(m=k;m<blocklen;m++)
|
||
giffilbuffer[i+m] = gifdata[m-k];
|
||
gifdatacnt = blocklen-k;
|
||
}
|
||
bytecnt = 0;
|
||
blocklen += i;
|
||
}
|
||
if (currstr == numbitgoal)
|
||
if (numbits < 12)
|
||
{
|
||
numbits++;
|
||
numbitgoal <<= 1;
|
||
}
|
||
if (dat == numcols)
|
||
{
|
||
currstr = firstring;
|
||
numbits = (globalflag&7)+2;
|
||
numbitgoal = (numcols<<1);
|
||
}
|
||
else
|
||
{
|
||
gifprefix[currstr] = dat;
|
||
k = 0;
|
||
while (dat > numcols+1)
|
||
{
|
||
giftempstack[k++] = gifsuffix[dat];
|
||
dat = gifprefix[dat];
|
||
}
|
||
giftempstack[k++] = gifprefix[dat];
|
||
gifsuffix[currstr-1] = dat;
|
||
gifsuffix[currstr] = dat;
|
||
for(i=k-1;i>=0;i--)
|
||
{
|
||
if (y < 256)
|
||
{
|
||
outp(0x3c4,0x2); outp(0x3c5,1<<(x&3));
|
||
drawpixel((((y*panxdim)+x)>>2)+(long)VIDEOBASE,giftempstack[i]);
|
||
}
|
||
x++;
|
||
if (x >= xres)
|
||
{
|
||
x = 0;
|
||
y++;
|
||
}
|
||
}
|
||
currstr++;
|
||
}
|
||
}
|
||
}
|
||
close(fil);
|
||
return(0);
|
||
}
|
||
|
||
void drawmainscreen(void)
|
||
{
|
||
long i, j, lin, templong, dat;
|
||
|
||
outp(0x3c4,2); outp(0x3c5,15);
|
||
clearbuf(VIDEOBASE,16384,0L);
|
||
|
||
/* Doh! 'Line compare' aren't words I like to see here - DDOI */
|
||
inp(0x3da); outp(0x3c0,0x30); outp(0x3c0,113); //FIX FOR LINE COMPARE
|
||
outp(0x3d4,0x11); outp(0x3d5,inp(0x3d5)&(255-128)); //Unlock indeces 0-7
|
||
outp(0x3d4,21); outp(0x3d5,142);
|
||
|
||
lin = 399 - 32;
|
||
outp(0x3d4,0x18); outp(0x3d5,lin&255);
|
||
outp(0x3d4,0x7); outp(0x3d5,(inp(0x3d5)&239)|((lin&256)>>4));
|
||
outp(0x3d4,0x9); outp(0x3d5,(inp(0x3d5)&191)|((lin&512)>>3));
|
||
|
||
outp(0x3c8,0);
|
||
for(i=0;i<768;i++)
|
||
outp(0x3c9,palette[i]);
|
||
for(i=0;i<32;i++)
|
||
for(j=0;j<8;j++)
|
||
{
|
||
templong = (j*2*panxdim)+(i*3+224);
|
||
dat = (j<<5)+i;
|
||
drawchainpixel(templong,dat);
|
||
drawchainpixel(templong+1,dat);
|
||
drawchainpixel(templong+2,dat);
|
||
drawchainpixel(templong+panxdim,dat);
|
||
drawchainpixel(templong+panxdim+1,dat);
|
||
drawchainpixel(templong+panxdim+2,dat);
|
||
}
|
||
|
||
showall(buf);
|
||
drawdot((buf[(d<<10)+c]+16)&255);
|
||
drawcolordot((col+16)&255);
|
||
}
|
||
|
||
int drawxorbox(long x1, long y1, long x2, long y2, char col)
|
||
{
|
||
long i, p, dat, temp;
|
||
|
||
dat = (long)col;
|
||
dat += (dat<<8);
|
||
if (x1 > x2) temp = x1, x1 = x2, x2 = temp;
|
||
if (y1 > y2) temp = y1, y1 = y2, y2 = temp;
|
||
|
||
outp(0x3c4,2); outp(0x3c5,1<<(x1&3));
|
||
outp(0x3ce,4); outp(0x3cf,x1&3);
|
||
p = VIDEOBASE + (((y1+1)*panxdim+x1)>>2);
|
||
for(i=y1+1;i<y2;i++)
|
||
{
|
||
drawpixel(p,getpixel(p)^col);
|
||
p += (panxdim>>2);
|
||
}
|
||
|
||
outp(0x3c4,2); outp(0x3c5,1<<(x2&3));
|
||
outp(0x3ce,4); outp(0x3cf,x2&3);
|
||
p = VIDEOBASE + (((y1+1)*panxdim+x2)>>2);
|
||
for(i=y1+1;i<y2;i++)
|
||
{
|
||
drawpixel(p,getpixel(p)^col);
|
||
p += (panxdim>>2);
|
||
}
|
||
|
||
for(i=x1;i<=x2;i++)
|
||
{
|
||
outp(0x3c4,2); outp(0x3c5,1<<(i&3));
|
||
outp(0x3ce,4); outp(0x3cf,i&3);
|
||
|
||
p = VIDEOBASE + ((y1*panxdim+i)>>2);
|
||
drawpixel(p,getpixel(p)^col);
|
||
|
||
p = VIDEOBASE + ((y2*panxdim+i)>>2);
|
||
drawpixel(p,getpixel(p)^col);
|
||
}
|
||
|
||
return(0);
|
||
}
|
||
|
||
int drawmaskedbox(long x1, long y1, long x2, long y2, char col, char mask1, char mask2)
|
||
{
|
||
long i, j, p, pinc, dat, temp;
|
||
|
||
dat = (long)col; dat += (dat<<8); dat += (dat<<16);
|
||
if (x1 > x2) temp = x1, x1 = x2, x2 = temp;
|
||
if (y1 > y2) temp = y1, y1 = y2, y2 = temp;
|
||
|
||
pinc = (panxdim>>1);
|
||
|
||
outp(0x3c4,2);
|
||
outp(0x3c5,mask1);
|
||
for(j=y1;j<y2;j+=2)
|
||
{
|
||
p = VIDEOBASE + ((j*panxdim+x1)>>2);
|
||
for(i=((x2-x1)>>4);i>0;i--) { drawpixelses(p,dat); p += 4; }
|
||
}
|
||
|
||
outp(0x3c5,mask2);
|
||
for(j=(y1+1);j<y2;j+=2)
|
||
{
|
||
p = VIDEOBASE + ((j*panxdim+x1)>>2);
|
||
for(i=((x2-x1)>>4);i>0;i--) { drawpixelses(p,dat); p += 4; }
|
||
}
|
||
|
||
return(0);
|
||
}
|
||
|
||
void getpaletteconversion(void)
|
||
{
|
||
long i, j, totintens1, totintens2, brichang, c1, c2, c3, bestcol, dadist;
|
||
long zx;
|
||
|
||
totintens1 = 0;
|
||
totintens2 = 0;
|
||
for(i=0;i<768;i++)
|
||
{
|
||
totintens1 += palette[i];
|
||
totintens2 += palette2[i];
|
||
}
|
||
brichang = (totintens1-totintens2)/768;
|
||
for(i=0;i<768;i+=3)
|
||
{
|
||
c1 = palette2[i]+brichang;
|
||
c2 = palette2[i+1]+brichang;
|
||
c3 = palette2[i+2]+brichang;
|
||
bestcol = 0;
|
||
dadist = 65536;
|
||
for(j=0;j<768;j+=3)
|
||
{
|
||
zx = 30*(c1-palette[j])*(c1-palette[j]);
|
||
zx += 59*(c2-palette[j+1])*(c2-palette[j+1]);
|
||
zx += 11*(c3-palette[j+2])*(c3-palette[j+2]);
|
||
if (zx < dadist)
|
||
dadist = zx, bestcol = j/3;
|
||
}
|
||
palookupe[i/3] = bestcol;
|
||
}
|
||
palookupe[255] = 255;
|
||
}
|
||
|
||
int fillregion(long x, long y, char col, char bound)
|
||
{
|
||
unsigned char tstat, bstat, tlast, blast;
|
||
int i, leftz, z, zz, c;
|
||
|
||
c = 1;
|
||
xfillbuf[c] = x;
|
||
yfillbuf[c] = y;
|
||
if (buf[(y<<10)+x] == bound)
|
||
return(-1);
|
||
while (c > 0)
|
||
{
|
||
z = xfillbuf[c];
|
||
zz = yfillbuf[c];
|
||
c--;
|
||
while ((buf[(zz<<10)+(z-1)] != bound) && (z > 0))
|
||
z--;
|
||
leftz = z;
|
||
tlast = 0;
|
||
blast = 0;
|
||
while ((buf[(zz<<10)+z] != bound) && (z < xdim))
|
||
{
|
||
if (zz > 0)
|
||
{
|
||
tstat = buf[((zz-1)<<10)+z];
|
||
if ((tstat != bound) && (tstat != col))
|
||
{
|
||
if (tlast == 0)
|
||
{
|
||
c++;
|
||
xfillbuf[c] = z;
|
||
yfillbuf[c] = zz-1;
|
||
tlast = 1;
|
||
}
|
||
}
|
||
else
|
||
tlast = 0;
|
||
}
|
||
if (zz < ydim-1)
|
||
{
|
||
bstat = buf[((zz+1)<<10)+z];
|
||
if ((bstat != bound) && (bstat != col))
|
||
{
|
||
if (blast == 0)
|
||
{
|
||
c++;
|
||
xfillbuf[c] = z;
|
||
yfillbuf[c] = zz+1;
|
||
blast = 1;
|
||
}
|
||
}
|
||
else
|
||
blast = 0;
|
||
}
|
||
z++;
|
||
}
|
||
z--;
|
||
while (z >= leftz)
|
||
{
|
||
if ((z >= 0) && (z < xdim))
|
||
buf[(zz<<10)+z] = col;
|
||
z--;
|
||
}
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
void getpalookup(void)
|
||
{
|
||
long i, j, k, dist, mindist, c1, c2, c3, closest;
|
||
|
||
for(i=0;i<NUMPALOOKUPS;i++)
|
||
{
|
||
for(j=0;j<256;j++)
|
||
{
|
||
c1 = (palette[j+j+j+0]*((NUMPALOOKUPS-1)-i))/NUMPALOOKUPS;
|
||
c2 = (palette[j+j+j+1]*((NUMPALOOKUPS-1)-i))/NUMPALOOKUPS;
|
||
c3 = (palette[j+j+j+2]*((NUMPALOOKUPS-1)-i))/NUMPALOOKUPS;
|
||
|
||
mindist = 32767, closest = -1;
|
||
for(k=0;k<256;k++)
|
||
{
|
||
dist = (c1-palette[k+k+k+0])*(c1-palette[k+k+k+0]);
|
||
dist += (c2-palette[k+k+k+1])*(c2-palette[k+k+k+1]);
|
||
dist += (c3-palette[k+k+k+2])*(c3-palette[k+k+k+2]);
|
||
if (dist < mindist)
|
||
{
|
||
mindist = dist;
|
||
closest = k;
|
||
}
|
||
}
|
||
|
||
palookup[i][j] = closest;
|
||
}
|
||
}
|
||
}
|
||
|
||
long gettile(long tilenum)
|
||
{
|
||
char ch, xorcol;
|
||
long i, j, lin, num, otilenum, topleft, x1, y1, x2, y2;
|
||
long movetilenum, movetilenum1, movetilenum2, templong;
|
||
|
||
lin = 400;
|
||
outp(0x3d4,0x18); outp(0x3d5,lin&255);
|
||
outp(0x3d4,0x7); outp(0x3d5,(inp(0x3d5)&239)|((lin&256)>>4));
|
||
outp(0x3d4,0x9); outp(0x3d5,(inp(0x3d5)&191)|((lin&512)>>3));
|
||
num = 0;
|
||
outp(0x3d4,0xc); outp(0x3d5,num>>10);
|
||
outp(0x3d4,0xd); outp(0x3d5,(num>>2)&255);
|
||
outp(0x3c0,inp(0x3c0)|0x13); outp(0x3c0,(num&3)<<1);
|
||
|
||
panxdim = 512;
|
||
outp(0x3d4,0x9); outp(0x3d5,inp(0x3d5) & ~1);
|
||
outp(0x3d4,0x13); outp(0x3d5,panxdim>>3);
|
||
|
||
otilenum = tilenum;
|
||
movetilenum = -1;
|
||
movetilenum1 = -1;
|
||
movetilenum2 = -1;
|
||
|
||
topleft = ((tilenum/(5<<gettilezoom))*(5<<gettilezoom))-(5<<gettilezoom);
|
||
if (topleft < 0) topleft = 0;
|
||
if (topleft > MAXTILES-(15<<(gettilezoom<<1))) topleft = MAXTILES-(15<<(gettilezoom<<1));
|
||
drawtilescreen(topleft);
|
||
|
||
xorcol = (rand()&255);
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
|
||
ch = 0;
|
||
while ((ch != 27) && (ch != 13))
|
||
{
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
while (kbhit() == 0)
|
||
{
|
||
limitrate();
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
xorcol = (rand()&255);
|
||
limitrate();
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
}
|
||
ch = getch();
|
||
if ((ch == '*') && (gettilezoom < 2))
|
||
{
|
||
gettilezoom++;
|
||
topleft = ((tilenum/(5<<gettilezoom))*(5<<gettilezoom))-(5<<gettilezoom);
|
||
if (topleft < 0) topleft = 0;
|
||
if (topleft > MAXTILES-(15<<(gettilezoom<<1))) topleft = MAXTILES-(15<<(gettilezoom<<1));
|
||
drawtilescreen(topleft);
|
||
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
}
|
||
if ((ch == '/') && (gettilezoom > 0))
|
||
{
|
||
gettilezoom--;
|
||
topleft = ((tilenum/(5<<gettilezoom))*(5<<gettilezoom))-(5<<gettilezoom);
|
||
if (topleft < 0) topleft = 0;
|
||
if (topleft > MAXTILES-(15<<(gettilezoom<<1))) topleft = MAXTILES-(15<<(gettilezoom<<1));
|
||
drawtilescreen(topleft);
|
||
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
}
|
||
|
||
if (ch == 32)
|
||
{
|
||
if (tilesreported != 0) //Toggle registered / shareware
|
||
{
|
||
picanm[tilenum] ^= 0x80000000;
|
||
allasksave = 1;
|
||
asksave = 1;
|
||
drawtilescreen(topleft);
|
||
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
}
|
||
else //Swap walls
|
||
{
|
||
if (movetilenum == -1)
|
||
movetilenum = tilenum;
|
||
else
|
||
{
|
||
if (swapwalls(tilenum,movetilenum) == 1)
|
||
{
|
||
//Redraw screen
|
||
drawtilescreen(topleft);
|
||
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
}
|
||
movetilenum = -1;
|
||
movetilenum1 = -1;
|
||
movetilenum2 = -1;
|
||
}
|
||
}
|
||
}
|
||
if (ch == '1') movetilenum1 = tilenum;
|
||
if (ch == '2') movetilenum2 = tilenum;
|
||
if (ch == '3')
|
||
{
|
||
if ((movetilenum1 >= 0) && (movetilenum2 >= 0))
|
||
{
|
||
if (movetilenum1 > movetilenum2)
|
||
templong = movetilenum1, movetilenum1 = movetilenum2, movetilenum2 = templong;
|
||
|
||
j = 0;
|
||
for(i=movetilenum1;i<=movetilenum2;i++)
|
||
j |= swapwalls(i,tilenum+i-movetilenum1);
|
||
|
||
if (j != 0)
|
||
{
|
||
//Redraw screen
|
||
drawtilescreen(topleft);
|
||
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
}
|
||
}
|
||
movetilenum = -1;
|
||
movetilenum1 = -1;
|
||
movetilenum2 = -1;
|
||
}
|
||
|
||
if (ch == 0)
|
||
{
|
||
ch = getch();
|
||
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
|
||
if (ch == 19) //ALT-R (tile frequency report)
|
||
{
|
||
tilesreported ^= 1;
|
||
if (tilesreported == 1) reportmaps();
|
||
|
||
//Redraw screen
|
||
drawtilescreen(topleft);
|
||
}
|
||
if (ch == 32) //Alt-D DELETE ALL REGISTERED TILES!!!
|
||
{
|
||
drawmaskedbox(0,0,319,7,blackcol,0xff,0xff);
|
||
printext256(0L,0L,whitecol,-2,"DELETE ALL REGISTERED TILES NOW?");
|
||
while ((ch != 'y') && (ch != 'Y') && (ch != 'n') && (ch != 'N'))
|
||
ch = getch();
|
||
if ((ch == 'y') || (ch == 'Y'))
|
||
{
|
||
drawmaskedbox(0,0,319,15,blackcol,0xff,0xff);
|
||
printext256(0L,0L,whitecol,-2,"DELETING!!! Now you've done it!");
|
||
printext256(0L,0L,whitecol,-2,"(Have a nice day)");
|
||
for(i=0;i<MAXTILES;i++)
|
||
if (picanm[i]&0x80000000)
|
||
{
|
||
picanm[i] &= ~0x80000000;
|
||
if (tilesizx[i]|tilesizy[i])
|
||
{
|
||
loadpics(i);
|
||
if (resizetile(i,(long)tilesizx[i],(long)tilesizy[i],0L,0L) != -1)
|
||
{
|
||
tilesizx[i] = 0;
|
||
tilesizy[i] = 0;
|
||
}
|
||
}
|
||
}
|
||
allasksave = 1;
|
||
savepics();
|
||
}
|
||
drawtilescreen(topleft);
|
||
}
|
||
if (ch == 22) //Alt-U
|
||
{
|
||
if ((movetilenum1 >= 0) && (movetilenum2 >= 0))
|
||
{
|
||
if (movetilenum1 > movetilenum2)
|
||
templong = movetilenum1, movetilenum1 = movetilenum2, movetilenum2 = templong;
|
||
|
||
updatescript(movetilenum1,movetilenum2);
|
||
|
||
outp(0x3c8,0);
|
||
for(i=0;i<768;i++)
|
||
outp(0x3c9,palette[i]);
|
||
|
||
drawtilescreen(topleft);
|
||
}
|
||
}
|
||
if (ch == 82) //Insert tile (localtile trick - fast!)
|
||
{
|
||
loadpics(tilenum);
|
||
|
||
for(i=localtileend[curtilefile];i>=tilenum+1;i--)
|
||
{
|
||
tilesizx[i] = tilesizx[i-1];
|
||
tilesizy[i] = tilesizy[i-1];
|
||
picanm[i] = picanm[i-1];
|
||
waloff[i] = waloff[i-1];
|
||
|
||
tilookup[i] = tilookup[i-1];
|
||
|
||
for(j=0;j<17;j++)
|
||
names[i][j] = names[i-1][j];
|
||
}
|
||
tilesizx[tilenum] = 0;
|
||
tilesizy[tilenum] = 0;
|
||
picanm[tilenum] = 0;
|
||
for(j=0;j<17;j++)
|
||
names[tilenum][j] = 0;
|
||
|
||
needtosavenames = 1;
|
||
mustsavelocals = 1;
|
||
allasksave = 1;
|
||
savepics();
|
||
|
||
drawtilescreen(topleft);
|
||
}
|
||
if (ch == 83) //Delete tile (localtile trick - fast!)
|
||
{
|
||
if (tilesreported == 0)
|
||
{
|
||
loadpics(tilenum);
|
||
|
||
if (resizetile(tilenum,(long)tilesizx[tilenum],(long)tilesizy[tilenum],0L,0L) != -1)
|
||
{
|
||
for(i=tilenum;i<=localtileend[curtilefile];i++)
|
||
{
|
||
tilesizx[i] = tilesizx[i+1];
|
||
tilesizy[i] = tilesizy[i+1];
|
||
picanm[i] = picanm[i+1];
|
||
waloff[i] = waloff[i+1];
|
||
|
||
tilookup[i] = tilookup[i+1];
|
||
|
||
for(j=0;j<17;j++)
|
||
names[i][j] = names[i+1][j];
|
||
}
|
||
tilesizx[localtileend[curtilefile]] = 0;
|
||
tilesizy[localtileend[curtilefile]] = 0;
|
||
picanm[localtileend[curtilefile]] = 0;
|
||
for(j=0;j<17;j++)
|
||
names[localtileend[curtilefile]][j] = 0;
|
||
|
||
needtosavenames = 1;
|
||
mustsavelocals = 1;
|
||
allasksave = 1;
|
||
savepics();
|
||
}
|
||
drawtilescreen(topleft);
|
||
}
|
||
else
|
||
{
|
||
loadpics(tilenum);
|
||
|
||
if (resizetile(tilenum,(long)tilesizx[tilenum],(long)tilesizy[tilenum],0L,0L) != -1)
|
||
{
|
||
tilesizx[tilenum] = 0;
|
||
tilesizy[tilenum] = 0;
|
||
allasksave = 1;
|
||
savepics();
|
||
}
|
||
drawtilescreen(topleft);
|
||
}
|
||
}
|
||
if ((ch == 75) && (tilenum > 0)) tilenum--;
|
||
if ((ch == 77) && (tilenum < MAXTILES-1)) tilenum++;
|
||
if ((ch == 72) && (tilenum >= (5<<gettilezoom))) tilenum-=(5<<gettilezoom);
|
||
if ((ch == 80) && (tilenum < MAXTILES-(5<<gettilezoom))) tilenum+=(5<<gettilezoom);
|
||
if ((ch == 73) && (tilenum >= (5<<gettilezoom)))
|
||
{
|
||
tilenum-=(15<<(gettilezoom<<1));
|
||
if (tilenum < 0) tilenum = 0;
|
||
}
|
||
if ((ch == 81) && (tilenum < MAXTILES-(5<<gettilezoom)))
|
||
{
|
||
tilenum+=(15<<(gettilezoom<<1));
|
||
if (tilenum >= MAXTILES) tilenum = MAXTILES-1;
|
||
}
|
||
if (tilenum < topleft)
|
||
{
|
||
while (tilenum < topleft)
|
||
topleft -= (5<<gettilezoom);
|
||
if (topleft < 0) topleft = 0;
|
||
drawtilescreen(topleft);
|
||
}
|
||
if (tilenum >= topleft+(15<<(gettilezoom<<1)))
|
||
{
|
||
while (tilenum >= topleft+(15<<(gettilezoom<<1)))
|
||
topleft += (5<<gettilezoom);
|
||
if (topleft > MAXTILES-(15<<(gettilezoom<<1))) topleft = MAXTILES-(15<<(gettilezoom<<1));
|
||
drawtilescreen(topleft);
|
||
}
|
||
|
||
x1 = ((tilenum-topleft)%(5<<gettilezoom))*(64>>gettilezoom);
|
||
y1 = ((tilenum-topleft)/(5<<gettilezoom))*(128>>gettilezoom);
|
||
x2 = x1+(64>>gettilezoom)-1;
|
||
y2 = y1+(128>>gettilezoom)-1;
|
||
drawxorbox(x1,y1,x2,y2,xorcol);
|
||
}
|
||
}
|
||
|
||
panxdim = 1024;
|
||
outp(0x3d4,0x9); outp(0x3d5,inp(0x3d5) | 1);
|
||
outp(0x3d4,0x13); outp(0x3d5,panxdim>>3);
|
||
|
||
if (ch != 13) tilenum = otilenum;
|
||
return(tilenum);
|
||
}
|
||
|
||
int drawtilescreen(long pictopleft)
|
||
{
|
||
long i, j, k, vidpos, vidpos2, wallnum, xdime, ydime, cnt, scaledown;
|
||
long dat, dat2, ocurtilefile;
|
||
char *picptr, buffer[16];
|
||
|
||
outp(0x3c4,2); outp(0x3c5,0xf);
|
||
clearbuf(VIDEOBASE,(512L*400L)>>4,0L); //clear frame first
|
||
|
||
loadpics(pictopleft);
|
||
|
||
for(cnt=0;cnt<(15<<(gettilezoom<<1));cnt++) //draw the (5*3)<<gettilezoom grid
|
||
{
|
||
wallnum = cnt+pictopleft;
|
||
|
||
ocurtilefile = curtilefile;
|
||
loadpics(wallnum);
|
||
if (ocurtilefile != curtilefile)
|
||
{
|
||
i = (cnt%(5<<gettilezoom))*(64>>gettilezoom);
|
||
j = (cnt/(5<<gettilezoom))*(128>>gettilezoom);
|
||
if (i > 2)
|
||
{
|
||
drawxorbox(i-2,j,i-1,j+(128>>gettilezoom)-1,whitecol);
|
||
drawxorbox(0,j+(128>>gettilezoom)-2,i-3,j+(128>>gettilezoom)-1,whitecol);
|
||
}
|
||
if (j > 2)
|
||
{
|
||
if (i < 2) i = 2; //Safety precaution
|
||
drawxorbox(i-2,j-2,319,j-1,whitecol);
|
||
}
|
||
}
|
||
|
||
if ((tilesizx[wallnum] != 0) && (tilesizy[wallnum] != 0))
|
||
{
|
||
picptr = (char *)(waloff[wallnum]);
|
||
xdime = tilesizx[wallnum];
|
||
ydime = tilesizy[wallnum];
|
||
|
||
vidpos = (cnt/(5<<gettilezoom))*(panxdim*(128>>gettilezoom))+(cnt%(5<<gettilezoom))*(64>>gettilezoom);
|
||
if ((xdime <= (64>>gettilezoom)) && (ydime <= (64>>gettilezoom)))
|
||
{
|
||
for(i=0;i<xdime;i++)
|
||
{
|
||
outp(0x3c4,2); outp(0x3c5,1<<(vidpos&3));
|
||
vidpos2 = (vidpos>>2)+VIDEOBASE;
|
||
for(j=0;j<ydime;j++)
|
||
{
|
||
dat = *picptr++;
|
||
drawpixel(vidpos2,dat);
|
||
drawpixel(vidpos2+(panxdim>>2),dat);
|
||
vidpos2 += (panxdim>>1);
|
||
}
|
||
vidpos++;
|
||
}
|
||
}
|
||
else //if 1 dimension > (64>>gettilezoom)
|
||
{
|
||
if (xdime > ydime)
|
||
scaledown = ((xdime+(63>>gettilezoom))>>(6-gettilezoom));
|
||
else
|
||
scaledown = ((ydime+(63>>gettilezoom))>>(6-gettilezoom));
|
||
|
||
for(i=0;i<xdime;i+=scaledown)
|
||
{
|
||
picptr = (char *)(waloff[wallnum]) + ydime*i;
|
||
|
||
outp(0x3c4,2); outp(0x3c5,1<<(vidpos&3));
|
||
vidpos2 = (vidpos>>2)+VIDEOBASE;
|
||
|
||
j = 0;
|
||
while (j < ydime)
|
||
{
|
||
dat = *picptr; drawpixel(vidpos2,dat);
|
||
picptr += (scaledown>>1);
|
||
|
||
if (j+(scaledown>>1) >= ydime)
|
||
break;
|
||
|
||
dat2 = *picptr; drawpixel(vidpos2+(panxdim>>2),dat2);
|
||
picptr += scaledown-(scaledown>>1);
|
||
|
||
vidpos2 += (panxdim>>1);
|
||
j += scaledown;
|
||
}
|
||
vidpos++;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (tilesreported == 1)
|
||
{
|
||
i = (cnt%(5<<gettilezoom))*(64>>gettilezoom);
|
||
j = (cnt/(5<<gettilezoom))*(128>>gettilezoom);
|
||
if (picanm[wallnum]&0x80000000)
|
||
{
|
||
drawmaskedbox(i,j,i+(64>>gettilezoom),j+(128>>gettilezoom),whitecol,0x55,0xaa);
|
||
printext256(i+(32>>gettilezoom)-11,j+(64>>gettilezoom)-3,blackcol,-1,"Pay");
|
||
printext256(i+(32>>gettilezoom)-12,j+(64>>gettilezoom)-4,whitecol,-1,"Pay");
|
||
}
|
||
sprintf(buffer,"%ld",tilookup2[wallnum]);
|
||
printext256(i,j,whitecol,blackcol,buffer);
|
||
}
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
int loadnames(void)
|
||
{
|
||
char buffer[160], firstch, ch;
|
||
short int fil, i, num, buffercnt;
|
||
|
||
if ((fil = open("names.h",O_BINARY|O_RDWR,S_IREAD)) == -1)
|
||
return(-1);
|
||
|
||
do
|
||
{
|
||
i = read(fil,&firstch,1);
|
||
}
|
||
while ((firstch != '#') && (i > 0));
|
||
|
||
while ((firstch == '#') || (firstch == '/'))
|
||
{
|
||
do
|
||
{
|
||
read(fil,&ch,1);
|
||
}
|
||
while (ch > 32);
|
||
|
||
buffercnt = 0;
|
||
do
|
||
{
|
||
read(fil,&ch,1);
|
||
if (ch > 32)
|
||
buffer[buffercnt++] = ch;
|
||
}
|
||
while (ch > 32);
|
||
|
||
num = 0;
|
||
do
|
||
{
|
||
read(fil,&ch,1);
|
||
if ((ch >= 48) && (ch <= 57))
|
||
num = num*10+(ch-48);
|
||
}
|
||
while (ch != 13);
|
||
for(i=0;i<buffercnt;i++)
|
||
names[num][i] = buffer[i];
|
||
names[num][buffercnt] = 0;
|
||
|
||
if (read(fil,&firstch,1) <= 0)
|
||
firstch = 0;
|
||
if (firstch == 10)
|
||
read(fil,&firstch,1);
|
||
}
|
||
close(fil);
|
||
return(0);
|
||
}
|
||
|
||
void savenames(void)
|
||
{
|
||
char buffer[160];
|
||
short int fil, i, j;
|
||
|
||
if (needtosavenames == 0)
|
||
return;
|
||
|
||
i = 0;
|
||
while (curpath[i] != 0) i++;
|
||
curpath[i] = 92;
|
||
curpath[i+1] = 0;
|
||
chdir(curpath);
|
||
curpath[i] = 0;
|
||
|
||
if ((fil = open("names.h",O_BINARY|O_TRUNC|O_CREAT|O_WRONLY,UC_PERMS)) == -1)
|
||
return;
|
||
|
||
strcpy((char *)&buffer,"//Be careful when changing this file - it is parsed by Editart and Build.");
|
||
buffer[73] = 13, buffer[74] = 10, buffer[75] = 0;
|
||
write(fil,&buffer[0],75);
|
||
|
||
strcpy((char *)&buffer,"#define ");
|
||
for(i=0;i<MAXTILES;i++)
|
||
if (names[i][0] != 0)
|
||
{
|
||
j = 8;
|
||
while (names[i][j-8] != 0)
|
||
{
|
||
buffer[j] = names[i][j-8];
|
||
j++;
|
||
}
|
||
buffer[j++] = 32;
|
||
|
||
if (i >= 10000) buffer[j++] = ((i/10000)%10)+48;
|
||
if (i >= 1000) buffer[j++] = ((i/1000)%10)+48;
|
||
if (i >= 100) buffer[j++] = ((i/100)%10)+48;
|
||
if (i >= 10) buffer[j++] = ((i/10)%10)+48;
|
||
buffer[j++] = (i%10)+48;
|
||
|
||
buffer[j++] = 13;
|
||
buffer[j++] = 10;
|
||
write(fil,&buffer[0],j);
|
||
}
|
||
|
||
close(fil);
|
||
return;
|
||
}
|
||
|
||
void initmenupaths(char *filename)
|
||
{
|
||
long i;
|
||
|
||
strcpy((char *)&curpath,filename);
|
||
i = 0;
|
||
while ((i < 160) && (curpath[i] != 0)) i++;
|
||
while ((i > 0) && (curpath[i] != 92)) i--;
|
||
curpath[i] = 0;
|
||
strcpy((char *)&menupath,curpath);
|
||
}
|
||
|
||
int getfilenames(char *kind)
|
||
{
|
||
#ifdef PLATFORM_DOS
|
||
short type;
|
||
struct find_t fileinfo;
|
||
|
||
if (strcmp(kind,"SUBD") == 0)
|
||
{
|
||
strcpy(kind,"*.*");
|
||
if (_dos_findfirst(kind,_A_SUBDIR,&fileinfo) != 0)
|
||
return(-1);
|
||
type = 1;
|
||
}
|
||
else
|
||
{
|
||
if (_dos_findfirst(kind,_A_NORMAL,&fileinfo) != 0)
|
||
return(-1);
|
||
type = 0;
|
||
}
|
||
do
|
||
{
|
||
if ((type == 0) || ((fileinfo.attrib&16) > 0))
|
||
if ((fileinfo.name[0] != '.') || (fileinfo.name[1] != 0))
|
||
{
|
||
if (menunamecnt < 256)
|
||
{
|
||
strcpy(menuname[menunamecnt],fileinfo.name);
|
||
menuname[menunamecnt][16] = type;
|
||
menunamecnt++;
|
||
}
|
||
else
|
||
printmessage("Too many files! (max=256)");
|
||
}
|
||
}
|
||
while (_dos_findnext(&fileinfo) == 0);
|
||
#else
|
||
// Similar to the one in build.c, which makes things easy :) - DDOI
|
||
DIR *dir;
|
||
struct dirent *dent;
|
||
struct stat statbuf;
|
||
int add_this;
|
||
int subdirs = 0;
|
||
|
||
if (strcmp (kind, "SUBD") == 0)
|
||
subdirs = 1;
|
||
dir = opendir (".");
|
||
if (dir == NULL)
|
||
return (-1);
|
||
|
||
do
|
||
{
|
||
add_this = 0;
|
||
dent = readdir(dir);
|
||
if (dent != NULL)
|
||
{
|
||
if (stat(dent->d_name, &statbuf) == 0)
|
||
{
|
||
if ((subdirs) && (S_ISDIR(statbuf.st_mode)))
|
||
add_this = 1;
|
||
else if (fnmatch(kind, dent->d_name, FNM_CASEFOLD) == 0)
|
||
add_this = 1;
|
||
|
||
if (add_this)
|
||
{
|
||
if (menunamecnt >= 256) {
|
||
printmessage("Too many files! (max=256)");
|
||
} else {
|
||
strcpy (menuname[menunamecnt], dent->d_name);
|
||
menuname[menunamecnt][16] = subdirs;
|
||
menunamecnt++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} while (dent != NULL);
|
||
|
||
closedir (dir);
|
||
#endif
|
||
return(0);
|
||
}
|
||
|
||
void sortfilenames(void)
|
||
{
|
||
char sortbuffer[17];
|
||
long i, j, k, m;
|
||
|
||
for(i=1;i<menunamecnt;i++)
|
||
for(j=0;j<i;j++)
|
||
{
|
||
k = 0;
|
||
while ((menuname[i][k] == menuname[j][k]) && (menuname[i][k] != 0) && (menuname[j][k] != 0))
|
||
k++;
|
||
if (menuname[i][k] < menuname[j][k])
|
||
{
|
||
memcpy(&sortbuffer[0],&menuname[i][0],sizeof(menuname[0]));
|
||
memcpy(&menuname[i][0],&menuname[j][0],sizeof(menuname[0]));
|
||
memcpy(&menuname[j][0],&sortbuffer[0],sizeof(menuname[0]));
|
||
}
|
||
}
|
||
}
|
||
|
||
int menuselect(void)
|
||
{
|
||
long newhighlight, i, j, topplc;
|
||
char ch, buffer[42];
|
||
|
||
printmessage("Select with arrows&enter.");
|
||
|
||
chdir(menupath);
|
||
menunamecnt = 0;
|
||
getfilenames("SUBD");
|
||
getfilenames("*.BMP");
|
||
getfilenames("*.PCX");
|
||
getfilenames("*.GIF");
|
||
sortfilenames();
|
||
if (menunamecnt == 0)
|
||
return(-2);
|
||
|
||
cleartopbox();
|
||
if (menuhighlight < 0) menuhighlight = 0;
|
||
if (menuhighlight >= menunamecnt) menuhighlight = menunamecnt-1;
|
||
|
||
newhighlight = menuhighlight;
|
||
do
|
||
{
|
||
if (menunamecnt <= 22)
|
||
{
|
||
topplc = 0;
|
||
}
|
||
else
|
||
{
|
||
topplc = newhighlight-11;
|
||
if (topplc < 0) topplc = 0;
|
||
if (topplc > menunamecnt-23) topplc = menunamecnt-23;
|
||
}
|
||
|
||
for(i=0;i<menunamecnt;i++)
|
||
{
|
||
for(j=0;j<24;j++)
|
||
buffer[j] = 32;
|
||
buffer[24] = 0;
|
||
if (i == newhighlight)
|
||
{
|
||
buffer[0] = '-';
|
||
buffer[1] = '-';
|
||
buffer[2] = '>';
|
||
}
|
||
j = 0;
|
||
while (menuname[i][j] != 0)
|
||
{
|
||
buffer[j+4] = menuname[i][j];
|
||
j++;
|
||
}
|
||
if ((i-topplc >= 0) && (i-topplc <= 22))
|
||
{
|
||
if (menuname[i][16] == 1)
|
||
{
|
||
printext256(panx,((i-topplc)<<3)+16L+pany-panyoff,greencol,blackcol,buffer);
|
||
}
|
||
else
|
||
{
|
||
printext256(panx,((i-topplc)<<3)+16L+pany-panyoff,whitecol,blackcol,buffer);
|
||
}
|
||
}
|
||
}
|
||
ch = getch();
|
||
if (ch == 0)
|
||
{
|
||
ch = getch();
|
||
if ((ch == 75) || (ch == 72))
|
||
{
|
||
newhighlight--;
|
||
if (newhighlight < 0)
|
||
newhighlight = menunamecnt-1;
|
||
}
|
||
if ((ch == 77) || (ch == 80))
|
||
{
|
||
newhighlight++;
|
||
if (newhighlight >= menunamecnt)
|
||
newhighlight = 0;
|
||
}
|
||
}
|
||
if ((ch == 13) && (menuname[newhighlight][16] == 1))
|
||
{
|
||
if ((menuname[newhighlight][0] == '.') && (menuname[newhighlight][1] == '.'))
|
||
{
|
||
i = 0;
|
||
while ((i < 160) && (menupath[i] != 0)) i++;
|
||
while ((i > 0) && (menupath[i] != 92)) i--;
|
||
menupath[i] = 0;
|
||
}
|
||
else
|
||
{
|
||
strcat(&menupath,"\\");
|
||
strcat(&menupath,menuname[newhighlight]);
|
||
}
|
||
chdir(menuname[newhighlight]);
|
||
menunamecnt = 0;
|
||
getfilenames("SUBD");
|
||
getfilenames("*.BMP");
|
||
getfilenames("*.PCX");
|
||
getfilenames("*.GIF");
|
||
sortfilenames();
|
||
newhighlight = 0;
|
||
ch = 0;
|
||
cleartopbox();
|
||
}
|
||
}
|
||
while ((ch != 13) && (ch != 27));
|
||
if (ch == 13)
|
||
{
|
||
menuhighlight = newhighlight;
|
||
return(newhighlight);
|
||
}
|
||
cleartopbox();
|
||
return(-1);
|
||
}
|
||
|
||
// Grab this from sdl_driver.c if you can - DDOI
|
||
int printext256(long xpos, long ypos, short col, short backcol, char *name)
|
||
{
|
||
char ch, damask;
|
||
short shift;
|
||
long p, startp, z, zz, zzz;
|
||
|
||
outp(0x3c4,2);
|
||
startp = ((ypos*panxdim+xpos)>>2)+VIDEOBASE;
|
||
|
||
z = 0;
|
||
while (name[z] != 0)
|
||
{
|
||
ch = name[z];
|
||
z++;
|
||
|
||
if ((xpos&3) == 0)
|
||
{
|
||
p = startp;
|
||
for(zz=0;zz<8;zz++)
|
||
{
|
||
if (backcol >= 0)
|
||
{
|
||
outp(0x3c5,15-reversemask[textfont[ch][zz]>>4]);
|
||
drawpixel(p,backcol);
|
||
outp(0x3c5,15-reversemask[textfont[ch][zz]&15]);
|
||
drawpixel(p+1,backcol);
|
||
}
|
||
if (backcol == -2)
|
||
{
|
||
damask = reversemask[textfont[ch][zz]>>4];
|
||
for(zzz=0;zzz<4;zzz++)
|
||
{
|
||
if ((damask&(1<<zzz)) > 0)
|
||
{
|
||
outp(0x3c5,1<<zzz);
|
||
outp(0x3ce,4); outp(0x3cf,zzz);
|
||
drawpixel(p,getpixel(p)^col);
|
||
}
|
||
}
|
||
damask = reversemask[textfont[ch][zz]&15];
|
||
for(zzz=0;zzz<4;zzz++)
|
||
{
|
||
if ((damask&(1<<zzz)) > 0)
|
||
{
|
||
outp(0x3c5,1<<zzz);
|
||
outp(0x3ce,4); outp(0x3cf,zzz);
|
||
drawpixel(p+1,getpixel(p+1)^col);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
outp(0x3c5,reversemask[textfont[ch][zz]>>4]);
|
||
drawpixel(p,col);
|
||
outp(0x3c5,reversemask[textfont[ch][zz]&15]);
|
||
drawpixel(p+1,col);
|
||
}
|
||
p += (panxdim>>2);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
shift = (xpos&3);
|
||
|
||
p = startp;
|
||
for(zz=0;zz<8;zz++)
|
||
{
|
||
if (backcol >= 0)
|
||
{
|
||
outp(0x3c5,(16-(1<<shift)) - (reversemask[(textfont[ch][zz]>>(shift+4))&reversemask[16-(1<<shift)]]));
|
||
drawpixel(p,backcol);
|
||
outp(0x3c5,15-reversemask[(textfont[ch][zz]>>shift)&15]);
|
||
drawpixel(p+1,backcol);
|
||
outp(0x3c5,((1<<shift)-1) - (reversemask[(textfont[ch][zz]<<(4-shift))&reversemask[(1<<shift)-1]]));
|
||
drawpixel(p+2,backcol);
|
||
}
|
||
if (backcol == -2)
|
||
{
|
||
damask = reversemask[(textfont[ch][zz]>>(shift+4))&reversemask[16-(1<<shift)]];
|
||
for(zzz=0;zzz<4;zzz++)
|
||
{
|
||
if ((damask&(1<<zzz)) > 0)
|
||
{
|
||
outp(0x3c5,1<<zzz);
|
||
outp(0x3ce,4); outp(0x3cf,zzz);
|
||
drawpixel(p,getpixel(p)^col);
|
||
}
|
||
}
|
||
damask = reversemask[(textfont[ch][zz]>>shift)&15];
|
||
for(zzz=0;zzz<4;zzz++)
|
||
{
|
||
if ((damask&(1<<zzz)) > 0)
|
||
{
|
||
outp(0x3c5,1<<zzz);
|
||
outp(0x3ce,4); outp(0x3cf,zzz);
|
||
drawpixel(p+1,getpixel(p+1)^col);
|
||
}
|
||
}
|
||
damask = reversemask[(textfont[ch][zz]<<(4-shift))&reversemask[(1<<shift)-1]];
|
||
for(zzz=0;zzz<4;zzz++)
|
||
{
|
||
if ((damask&(1<<zzz)) > 0)
|
||
{
|
||
outp(0x3c5,1<<zzz);
|
||
outp(0x3ce,4); outp(0x3cf,zzz);
|
||
drawpixel(p+2,getpixel(p+2)^col);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
outp(0x3c5,reversemask[(textfont[ch][zz]>>(shift+4))&reversemask[16-(1<<shift)]]);
|
||
drawpixel(p,col);
|
||
outp(0x3c5,reversemask[(textfont[ch][zz]>>shift)&15]);
|
||
drawpixel(p+1,col);
|
||
outp(0x3c5,reversemask[(textfont[ch][zz]<<(4-shift))&reversemask[(1<<shift)-1]]);
|
||
drawpixel(p+2,col);
|
||
}
|
||
p += (panxdim>>2);
|
||
}
|
||
}
|
||
|
||
startp += 2;
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
// Figure out if this is w.r.t screen or line compare - DDOI
|
||
void printmessage(char name[82])
|
||
{
|
||
cleartext();
|
||
printext256(0L,8L,yellowcol,browncol,name);
|
||
}
|
||
|
||
int screencapture(void)
|
||
{
|
||
char filename[15], *ptr;
|
||
long fil, i, bufplc, p, col, ncol, leng, x, y, capturecount;
|
||
|
||
menunamecnt = 0;
|
||
getfilenames("CAPT????.PCX");
|
||
sortfilenames();
|
||
|
||
if (menunamecnt >= 256)
|
||
{
|
||
printmessage("MAXIMUM FILES is 256!");
|
||
return(-1);
|
||
}
|
||
|
||
capturecount = 0;
|
||
if (menunamecnt > 0)
|
||
{
|
||
capturecount = (menuname[menunamecnt-1][7]-48);
|
||
capturecount += (menuname[menunamecnt-1][6]-48)*10;
|
||
capturecount += (menuname[menunamecnt-1][5]-48)*100;
|
||
capturecount += (menuname[menunamecnt-1][4]-48)*1000;
|
||
capturecount++;
|
||
}
|
||
|
||
strcpy(filename,"captxxxx.pcx");
|
||
filename[4] = ((capturecount/1000)%10)+48;
|
||
filename[5] = ((capturecount/100)%10)+48;
|
||
filename[6] = ((capturecount/10)%10)+48;
|
||
filename[7] = (capturecount%10)+48;
|
||
if ((fil=open(filename,O_BINARY|O_CREAT|O_TRUNC|O_WRONLY,UC_PERMS))==-1)
|
||
return(-1);
|
||
|
||
pcxheader[8] = ((xdim-1)&255); pcxheader[9] = (((xdim-1)>>8)&255);
|
||
pcxheader[10] = ((ydim-1)&255); pcxheader[11] = (((ydim-1)>>8)&255);
|
||
pcxheader[12] = (xdim&255); pcxheader[13] = ((xdim>>8)&255);
|
||
pcxheader[14] = (ydim&255); pcxheader[15] = ((ydim>>8)&255);
|
||
pcxheader[66] = (xdim&255); pcxheader[67] = ((xdim>>8)&255);
|
||
|
||
write(fil,&pcxheader[0],128);
|
||
|
||
bufplc = 0;
|
||
x = 0; y = 0;
|
||
while (y < ydim)
|
||
{
|
||
outp(97,inp(97)|3);
|
||
|
||
col = buf[(y<<10)+x];
|
||
x++; if (x == xdim) x = 0, y++;
|
||
ncol = buf[(y<<10)+x];
|
||
|
||
leng = 1;
|
||
|
||
while ((ncol == col) && (x != 0) && (leng < 63))
|
||
{
|
||
leng++;
|
||
|
||
x++; if (x == xdim) x = 0, y++;
|
||
if (y > ydim) break;
|
||
ncol = buf[(y<<10)+x];
|
||
}
|
||
|
||
outp(97,inp(97)&252);
|
||
|
||
if ((leng > 1) || (col >= 0xc0))
|
||
{
|
||
tempbuf[bufplc++] = (leng|0xc0);
|
||
if (bufplc == 256)
|
||
{
|
||
bufplc = 0;
|
||
if (write(fil,&tempbuf[0],256) < 256)
|
||
{ close(fil); capturecount--; return(-1); }
|
||
}
|
||
}
|
||
tempbuf[bufplc++] = col;
|
||
if (bufplc == 256)
|
||
{
|
||
bufplc = 0;
|
||
if (write(fil,&tempbuf[0],256) < 256)
|
||
{ close(fil); capturecount--; return(-1); }
|
||
}
|
||
}
|
||
|
||
tempbuf[bufplc++] = 0xc;
|
||
if (bufplc == 256)
|
||
{
|
||
bufplc = 0;
|
||
if (write(fil,&tempbuf[0],256) < 256)
|
||
{ close(fil); capturecount--; return(-1); }
|
||
}
|
||
|
||
outp(0x3c7,0);
|
||
for(i=0;i<768;i++)
|
||
{
|
||
tempbuf[bufplc++] = (inp(0x3c9)<<2);
|
||
if (bufplc == 256)
|
||
{
|
||
bufplc = 0;
|
||
if (write(fil,&tempbuf[0],256) < 256)
|
||
{ close(fil); capturecount--; return(-1); }
|
||
}
|
||
}
|
||
if (bufplc > 0)
|
||
if (write(fil,&tempbuf[0],bufplc) < bufplc)
|
||
{ close(fil); return(-1); }
|
||
close(fil);
|
||
return(0);
|
||
}
|
||
|
||
int resizetile(long picnume, long oldx, long oldy, long newx, long newy)
|
||
{
|
||
char *charptr1, *charptr2;
|
||
long *longptr1, *longptr2;
|
||
long i, j, dat, templong;
|
||
|
||
templong = newx*newy-oldx*oldy;
|
||
|
||
if (totpicsiz+templong > totpicmem)
|
||
return(-1);
|
||
|
||
j = 0L;
|
||
for(i=localtilestart[curtilefile];i<picnume;i++)
|
||
j += tilesizx[i]*tilesizy[i];
|
||
if (templong < 0)
|
||
{
|
||
longptr1 = (long *)(FP_OFF(pic)+j-templong);
|
||
longptr2 = (long *)(FP_OFF(pic)+j);
|
||
i = j-templong;
|
||
while (i < totpicsiz-3)
|
||
{
|
||
dat = *longptr1++;
|
||
*longptr2++ = dat;
|
||
i += 4;
|
||
}
|
||
charptr1 = (char *)(longptr1);
|
||
charptr2 = (char *)(longptr2);
|
||
while (i < totpicsiz)
|
||
{
|
||
dat = *charptr1++;
|
||
*charptr2++ = dat;
|
||
i++;
|
||
}
|
||
|
||
if ((newx|newy) == 0)
|
||
picanm[picnume] = 0L;
|
||
}
|
||
else if (templong > 0)
|
||
{
|
||
//Be careful with long pointers! The offset of 3 is because
|
||
//long pointers still point to the lowest of the 4 bytes
|
||
|
||
longptr1 = (long *)(FP_OFF(pic)+totpicsiz-1 - 3);
|
||
longptr2 = (long *)(FP_OFF(pic)+totpicsiz-1+templong - 3);
|
||
i = j;
|
||
while (i < totpicsiz-3)
|
||
{
|
||
dat = *longptr1--;
|
||
*longptr2-- = dat;
|
||
i += 4;
|
||
}
|
||
charptr1 = (char *)(longptr1);
|
||
charptr2 = (char *)(longptr2);
|
||
charptr1 += 3;
|
||
charptr2 += 3;
|
||
while (i < totpicsiz)
|
||
{
|
||
dat = *charptr1--;
|
||
*charptr2-- = dat;
|
||
i++;
|
||
}
|
||
}
|
||
for(j=picnume+1;j<=localtileend[curtilefile];j++)
|
||
waloff[j] += templong;
|
||
totpicsiz += templong;
|
||
return(0);
|
||
}
|
||
|
||
void gettextcolors(void)
|
||
{
|
||
long i, j, whitedist, browndist, yellowdist, greendist, blackdist, dist;
|
||
long r, g, b, dr, dg, db;
|
||
|
||
whitedist = 0x7fffffff;
|
||
browndist = 0x7fffffff;
|
||
yellowdist = 0x7fffffff;
|
||
greendist = 0x7fffffff;
|
||
blackdist = 0x7fffffff;
|
||
j = 0;
|
||
for(i=0;i<256;i++)
|
||
{
|
||
r = palette[j+0]; g = palette[j+1]; b = palette[j+2];
|
||
|
||
dr = r-48; dg = g-48; db = b-48; dist = dr*dr+dg*dg+db*db;
|
||
if (dist < whitedist) whitedist = dist, whitecol = i;
|
||
|
||
dr = r-32; dg = g-16; db = b-12; dist = dr*dr+dg*dg+db*db;
|
||
if (dist < browndist) browndist = dist, browncol = i;
|
||
|
||
dr = r-48; dg = g-48; db = b-50; dist = dr*dr+dg*dg+db*db;
|
||
if (dist < yellowdist) yellowdist = dist, yellowcol = i;
|
||
|
||
dr = r-32; dg = g-63; db = b-32; dist = dr*dr+dg*dg+db*db;
|
||
if (dist < greendist) greendist = dist, greencol = i;
|
||
|
||
dr = r-0; dg = g-0; db = b-0; dist = dr*dr+dg*dg+db*db;
|
||
if (dist < blackdist) blackdist = dist, blackcol = i;
|
||
|
||
j += 3;
|
||
}
|
||
}
|
||
|
||
char gettrans(char dat1, char dat2)
|
||
{
|
||
char retcol;
|
||
long ravg, gavg, bavg;
|
||
long tripledat1, tripledat2, closest, zx, triplezx, dar, dag, dab, dist;
|
||
|
||
tripledat1 = ((long)dat1<<1)+(long)dat1;
|
||
tripledat2 = ((long)dat2<<1)+(long)dat2;
|
||
|
||
ravg = ((palette[tripledat1+0] + palette[tripledat2+0])>>1);
|
||
gavg = ((palette[tripledat1+1] + palette[tripledat2+1])>>1);
|
||
bavg = ((palette[tripledat1+2] + palette[tripledat2+2])>>1);
|
||
|
||
retcol = 0;
|
||
closest = 0x7fffffff;
|
||
triplezx = 0;
|
||
for(zx=0;zx<256;zx++)
|
||
{
|
||
dar = (palette[triplezx+0]-ravg) * 30;
|
||
dag = (palette[triplezx+1]-gavg) * 59;
|
||
dab = (palette[triplezx+2]-bavg) * 11;
|
||
dist = dar*dar + dag*dag + dab*dab;
|
||
if (dist < closest)
|
||
{
|
||
closest = dist;
|
||
retcol = zx;
|
||
}
|
||
triplezx += 3;
|
||
}
|
||
|
||
return(retcol);
|
||
}
|
||
|
||
#ifdef PLATFORM_DOS
|
||
long convalloc32(long size)
|
||
{
|
||
union REGS r;
|
||
|
||
r.x.eax = 0x0100; //DPMI allocate DOS memory
|
||
r.x.ebx = ((size+15)>>4); //Number of paragraphs requested
|
||
int386(0x31,&r,&r);
|
||
|
||
if (r.x.cflag != 0) //Failed
|
||
return ((long)0);
|
||
return ((long)((r.x.eax&0xffff)<<4)); //Returns full 32-bit offset
|
||
}
|
||
#else
|
||
long convalloc32(long size)
|
||
{
|
||
#warning convalloc32() needs filling
|
||
fprintf (stderr, "Stub, convalloc32: %s line %d\n", __FILE__, __LINE__);
|
||
}
|
||
#endif
|
||
|
||
int swapwalls(long swapwall1, long swapwall2)
|
||
{
|
||
char tempchar, *charptr1, *charptr2, *bakcharptr1, *bakcharptr2;
|
||
long i, j, templong, numbytes1, numbytes2, numbytes3;
|
||
|
||
outp(67,182); outp(66,16); outp(66,16);
|
||
|
||
if (swapwall1 == swapwall2)
|
||
return(0);
|
||
|
||
if (swapwall1 > swapwall2)
|
||
templong = swapwall1, swapwall1 = swapwall2, swapwall2 = templong;
|
||
|
||
// charptr1 numbytes1 numbytes3 charptr2 numbytes2
|
||
// <20> / <20> <20> /
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ä¿
|
||
// <20> TILE1 <20> -----walls between----- <20> TILE2 <20>
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
//Swap memory
|
||
numbytes1 = tilesizx[swapwall1]*tilesizy[swapwall1];
|
||
numbytes2 = tilesizx[swapwall2]*tilesizy[swapwall2];
|
||
|
||
charptr1 = (char *)FP_OFF(pic);
|
||
for(i=localtilestart[curtilefile];i<swapwall1;i++)
|
||
charptr1 += tilesizx[i]*tilesizy[i];
|
||
|
||
numbytes3 = 0;
|
||
for(i=swapwall1;i<swapwall2;i++)
|
||
numbytes3 += tilesizx[i]*tilesizy[i];
|
||
|
||
charptr2 = charptr1 + numbytes3;
|
||
|
||
numbytes3 -= numbytes1; //num bytes in between
|
||
|
||
if (numbytes1 >= numbytes2)
|
||
{
|
||
outp(97,inp(97)|3);
|
||
bakcharptr1 = charptr1;
|
||
for(i=0;i<numbytes1;i++)
|
||
buf[i] = *bakcharptr1++;
|
||
|
||
outp(97,inp(97)&252);
|
||
bakcharptr1 = charptr1;
|
||
bakcharptr2 = charptr2;
|
||
for(i=0;i<numbytes2;i++)
|
||
*bakcharptr1++ = *bakcharptr2++;
|
||
|
||
outp(97,inp(97)|3);
|
||
bakcharptr2 = charptr1+numbytes1;
|
||
for(i=0;i<numbytes3;i++)
|
||
*bakcharptr1++ = *bakcharptr2++;
|
||
|
||
outp(97,inp(97)&252);
|
||
for(i=0;i<numbytes1;i++)
|
||
*bakcharptr1++ = buf[i];
|
||
}
|
||
else
|
||
{
|
||
|
||
outp(97,inp(97)|3);
|
||
bakcharptr1 = charptr2;
|
||
for(i=0;i<numbytes2;i++)
|
||
buf[i] = *bakcharptr1++;
|
||
|
||
outp(97,inp(97)&252);
|
||
bakcharptr1 = charptr2+numbytes2-1;
|
||
bakcharptr2 = charptr1+numbytes1-1;
|
||
for(i=0;i<numbytes1;i++)
|
||
*bakcharptr1-- = *bakcharptr2--;
|
||
|
||
outp(97,inp(97)|3);
|
||
bakcharptr2 = charptr2-1;
|
||
for(i=0;i<numbytes3;i++)
|
||
*bakcharptr1-- = *bakcharptr2--;
|
||
|
||
outp(97,inp(97)&252);
|
||
bakcharptr1 = charptr1;
|
||
for(i=0;i<numbytes2;i++)
|
||
*bakcharptr1++ = buf[i];
|
||
}
|
||
|
||
//Swap attributes
|
||
templong = tilookup[swapwall1]; tilookup[swapwall1] = tilookup[swapwall2]; tilookup[swapwall2] = templong;
|
||
|
||
templong = tilesizx[swapwall1]; tilesizx[swapwall1] = tilesizx[swapwall2]; tilesizx[swapwall2] = templong;
|
||
templong = tilesizy[swapwall1]; tilesizy[swapwall1] = tilesizy[swapwall2]; tilesizy[swapwall2] = templong;
|
||
templong = picanm[swapwall1]; picanm[swapwall1] = picanm[swapwall2]; picanm[swapwall2] = templong;
|
||
|
||
needtosavenames = 1;
|
||
for(i=0;i<17;i++)
|
||
{
|
||
tempchar = names[swapwall1][i];
|
||
names[swapwall1][i] = names[swapwall2][i];
|
||
names[swapwall2][i] = tempchar;
|
||
}
|
||
|
||
for(i=swapwall1+1;i<=swapwall2;i++)
|
||
waloff[i] = waloff[i-1]+(tilesizx[i-1]*tilesizy[i-1]);
|
||
|
||
allasksave = 1;
|
||
return(1);
|
||
}
|
||
|
||
void updatemaps(void)
|
||
{
|
||
char ch;
|
||
long i, j, k, fil, bad, mapversion;
|
||
short type, mapnumsectors, mapnumwalls, mapnumsprites;
|
||
#ifdef PLATFORM_DOS
|
||
struct find_t fileinfo;
|
||
#endif
|
||
|
||
i = 0;
|
||
while (curpath[i] != 0) i++;
|
||
curpath[i] = 92;
|
||
curpath[i+1] = 0;
|
||
chdir(curpath);
|
||
curpath[i] = 0;
|
||
|
||
bad = 0;
|
||
for(i=0;i<MAXTILES;i++)
|
||
if (tilookup[i] != i)
|
||
{
|
||
bad = 1;
|
||
break;
|
||
}
|
||
|
||
if (bad == 1)
|
||
{
|
||
printf("Some tiles have been moved around.\n");
|
||
printf("Update tilenum's to *.MAP? (Y/N)\n");
|
||
do
|
||
{
|
||
ch = getch();
|
||
}
|
||
while ((ch != 'y') && (ch != 'Y') && (ch != 'n') && (ch != 'N') && (ch != 27));
|
||
if ((ch == 'y') || (ch == 'Y'))
|
||
{
|
||
for(i=0;i<MAXTILES;i++)
|
||
tilookup2[tilookup[i]] = i;
|
||
|
||
#ifdef PLATFORM_DOS
|
||
if (_dos_findfirst("*.MAP",_A_NORMAL,&fileinfo) == 0)
|
||
{
|
||
do
|
||
{
|
||
printf("Updating %s...\n",fileinfo.name);
|
||
|
||
if ((fil = open(fileinfo.name,O_BINARY|O_RDWR,S_IREAD|S_IWRITE)) != -1)
|
||
{
|
||
read(fil,&mapversion,4);
|
||
if (mapversion == 0x00000007) //Build map format
|
||
{
|
||
lseek(fil,4 + 4+4+4+2+2,SEEK_SET);
|
||
read(fil,&mapnumsectors,2);
|
||
for(i=0;i<mapnumsectors;i++)
|
||
{
|
||
read(fil,&mapsector,sizeof(struct sectortype));
|
||
lseek(fil,-sizeof(struct sectortype),SEEK_CUR);
|
||
mapsector.ceilingpicnum = tilookup2[mapsector.ceilingpicnum];
|
||
mapsector.floorpicnum = tilookup2[mapsector.floorpicnum];
|
||
write(fil,&mapsector,sizeof(struct sectortype));
|
||
}
|
||
read(fil,&mapnumwalls,2);
|
||
for(i=0;i<mapnumwalls;i++)
|
||
{
|
||
read(fil,&mapwall,sizeof(struct walltype));
|
||
lseek(fil,-sizeof(struct walltype),SEEK_CUR);
|
||
mapwall.picnum = tilookup2[mapwall.picnum];
|
||
if (mapwall.cstat&48) //1-way or masked wall
|
||
mapwall.overpicnum = tilookup2[mapwall.overpicnum];
|
||
write(fil,&mapwall,sizeof(struct walltype));
|
||
}
|
||
read(fil,&mapnumsprites,2);
|
||
for(i=0;i<mapnumsprites;i++)
|
||
{
|
||
read(fil,&mapsprite,sizeof(struct spritetype));
|
||
lseek(fil,-sizeof(struct spritetype),SEEK_CUR);
|
||
mapsprite.picnum = tilookup2[mapsprite.picnum];
|
||
write(fil,&mapsprite,sizeof(struct spritetype));
|
||
}
|
||
}
|
||
else if ((mapversion>>16) == 1) //2Draw map format
|
||
{
|
||
read(fil,&nummaps,2);
|
||
read(fil,&numsprites[0],MAXMAPS<<1);
|
||
|
||
i = 4+2+(MAXMAPS<<1); //Global header
|
||
for(j=0;j<nummaps;j++)
|
||
{
|
||
lseek(fil,i+4+4+4+2,SEEK_SET);
|
||
|
||
//used xfillbuf becuase 64*64 shorts
|
||
read(fil,&xfillbuf,8192);
|
||
for(k=0;k<4096;k++)
|
||
xfillbuf[k] = tilookup2[xfillbuf[k]];
|
||
lseek(fil,-8192,SEEK_CUR);
|
||
write(fil,&xfillbuf,8192);
|
||
|
||
for(k=0;k<numsprites[j];k++)
|
||
{
|
||
//2draw sprite structure:
|
||
// 2+4+4+4+(spritepicnum(2))+2
|
||
|
||
read(fil,&xfillbuf,18);
|
||
xfillbuf[7] = tilookup2[xfillbuf[7]];
|
||
lseek(fil,-18,SEEK_CUR);
|
||
write(fil,&xfillbuf,18);
|
||
}
|
||
|
||
i += (4+4+4+2+8192+(numsprites[j]*18)); //Individual map header
|
||
}
|
||
}
|
||
else if ((mapversion>>16) == 2) //Polytex map format
|
||
{
|
||
}
|
||
close(fil);
|
||
}
|
||
|
||
}
|
||
while (_dos_findnext(&fileinfo) == 0);
|
||
}
|
||
#else
|
||
#warning Fix updatemaps()
|
||
#endif
|
||
printf("MAPS UPDATED.\n");
|
||
printf("Don't forget to recompile - NAMES.H may have changed!\n");
|
||
}
|
||
else
|
||
printf("MAPS NOT UPDATED.\n");
|
||
}
|
||
}
|
||
|
||
void updatepalette(void)
|
||
{
|
||
unsigned char ch, *ptr;
|
||
long i, j, k, m, fil;
|
||
|
||
for(i=0;i<768;i++) //Swap palette and palette2
|
||
{
|
||
j = palette[i];
|
||
palette[i] = palette2[i];
|
||
palette2[i] = j;
|
||
}
|
||
getpaletteconversion();
|
||
|
||
getpalookup();
|
||
if ((fil = open("palette.dat",O_BINARY|O_CREAT|O_WRONLY,UC_PERMS)) != -1)
|
||
{
|
||
write(fil,&palette[0],768);
|
||
write(fil,&palookup[0][0],NUMPALOOKUPS*256);
|
||
gettextcolors();
|
||
close(fil);
|
||
}
|
||
|
||
for(m=0;m<numtilefiles;m++)
|
||
{
|
||
loadpics(localtilestart[m]);
|
||
for(i=localtilestart[m];i<=localtileend[m];i++)
|
||
if ((tilesizx[i] > 0) && (tilesizy[i] > 0))
|
||
{
|
||
loadwall(buf,i);
|
||
k = tilesizx[i]*tilesizy[i];
|
||
ptr = (char *)waloff[i];
|
||
for(j=0;j<k;j++)
|
||
{
|
||
ch = *ptr;
|
||
*ptr = palookupe[ch];
|
||
ptr++;
|
||
}
|
||
savewall(buf,i);
|
||
}
|
||
allasksave = 1;
|
||
savepics();
|
||
}
|
||
loadpics(picnum);
|
||
loadwall(buf,picnum);
|
||
|
||
for(i=0;i<768;i++)
|
||
palette2[i] = palette[i];
|
||
|
||
asksave = 1;
|
||
}
|
||
|
||
int selectbox(long *dax1, long *day1, long *dax2, long *day2)
|
||
{
|
||
char ch, xorcol;
|
||
long i, x1, y1, x2, y2, templong, lin, num, updatx, updaty;
|
||
|
||
lin = 400;
|
||
outp(0x3d4,0x18); outp(0x3d5,lin&255);
|
||
outp(0x3d4,0x7); outp(0x3d5,(inp(0x3d5)&239)|((lin&256)>>4));
|
||
outp(0x3d4,0x9); outp(0x3d5,(inp(0x3d5)&191)|((lin&512)>>3));
|
||
num = 0;
|
||
outp(0x3d4,0xc); outp(0x3d5,num>>10);
|
||
outp(0x3d4,0xd); outp(0x3d5,(num>>2)&255);
|
||
outp(0x3c0,inp(0x3c0)|0x13); outp(0x3c0,(num&3)<<1);
|
||
|
||
if (xres > 1024) xres = 1024;
|
||
if (yres > 256) yres = 256;
|
||
if (xdim < 1) xdim = 1;
|
||
if (ydim < 1) ydim = 1;
|
||
|
||
if (*dax1 == 0x80000000)
|
||
{
|
||
x1 = ((xres-xdim)>>1); x2 = x1+xdim;
|
||
y1 = ((yres-ydim)>>1); y2 = y1+ydim;
|
||
if (x1 < 0) x1 = 0;
|
||
if (y1 < 0) y1 = 0;
|
||
if (x2 > xres) x2 = xres;
|
||
if (y2 > yres) y2 = yres;
|
||
}
|
||
else
|
||
{
|
||
x1 = *dax1;
|
||
y1 = *day1;
|
||
x2 = *dax2;
|
||
y2 = *day2;
|
||
if ((x2 <= x1) && (y2 <= y1))
|
||
if ((x1 > 4) && (y1 > 4) && (x1 < xres-4) && (y1 < xres-4))
|
||
{
|
||
x1 -= 4;
|
||
y1 -= 4;
|
||
x2 = x1+8;
|
||
y2 = y1+8;
|
||
}
|
||
}
|
||
updatx = ((x1+x2)>>1); updaty = ((y1+y2)>>1);
|
||
|
||
xorcol = (rand()&255);
|
||
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
ch = 0;
|
||
while ((ch != 13) && (ch != ' ') && (ch != 27) && (ch != 'o') && (ch != 'O'))
|
||
{
|
||
if (kbhit() == 0)
|
||
{
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
limitrate();
|
||
xorcol = (rand()&255);
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
limitrate();
|
||
}
|
||
else
|
||
{
|
||
ch = getch();
|
||
|
||
if ((ch == 'p') || (ch == 'P'))
|
||
{
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
printext256(panxforu,panyforu,xorcol,-2,"Make this the new build palette?");
|
||
do
|
||
{
|
||
printext256(panxforu,panyforu,xorcol,-2,"Make this the new build palette?");
|
||
limitrate();
|
||
xorcol = (rand()&255);
|
||
printext256(panxforu,panyforu,xorcol,-2,"Make this the new build palette?");
|
||
limitrate();
|
||
|
||
if (kbhit() != 0)
|
||
ch = getch();
|
||
}
|
||
while ((ch != 'y') && (ch != 'Y') && (ch != 'n') && (ch != 'N'));
|
||
printext256(panxforu,panyforu,xorcol,-2,"Make this the new build palette?");
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
|
||
if ((ch == 'y') || (ch == 'Y'))
|
||
updatepalette();
|
||
}
|
||
|
||
if (ch == 0)
|
||
{
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
|
||
ch = getch();
|
||
if (bstatus == 0)
|
||
{
|
||
if ((ch == 75) && (x1 > 0)) x1--, x2--;
|
||
if ((ch == 77) && (x2 < xres)) x1++, x2++;
|
||
if ((ch == 72) && (y1 > 0)) y1--, y2--;
|
||
if ((ch == 80) && (y2 < yres)) y1++, y2++;
|
||
updatx = x1; updaty = y1;
|
||
}
|
||
else
|
||
{
|
||
if ((ch == 75) && (x2 > x1+1)) x2--;
|
||
if ((ch == 77) && (x2 < xres)) x2++;
|
||
if ((ch == 72) && (y2 > y1+1)) y2--;
|
||
if ((ch == 80) && (y2 < yres)) y2++;
|
||
updatx = x2-1; updaty = y2-1;
|
||
}
|
||
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
}
|
||
}
|
||
if (moustat == 1)
|
||
{
|
||
readmouse();
|
||
if ((mousx != 0) || (mousy != 0))
|
||
{
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
|
||
if (bstatus == 0)
|
||
{
|
||
x1 += mousx; x2 += mousx;
|
||
if (x1 < 0) templong = -x1, x1 += templong, x2 += templong;
|
||
if (x2 > xres) templong = x2-xres, x1 -= templong, x2 -= templong;
|
||
y1 += mousy; y2 += mousy;
|
||
if (y1 < 0) templong = -y1, y1 += templong, y2 += templong;
|
||
if (y2 > yres) templong = y2-yres, y1 -= templong, y2 -= templong;
|
||
updatx = x1; updaty = y1;
|
||
}
|
||
else
|
||
{
|
||
x2 += mousx;
|
||
if (x2 < x1+1) x2 = x1+1;
|
||
if (x2 > xres) x2 = xres;
|
||
y2 += mousy;
|
||
if (y2 < y1+1) y2 = y1+1;
|
||
if (y2 > yres) y2 = yres;
|
||
updatx = x2-1; updaty = y2-1;
|
||
}
|
||
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
}
|
||
}
|
||
updatepanningforumode(updatx,updaty);
|
||
}
|
||
drawxorbox(x1,y1,x2-1,y2-1,xorcol);
|
||
|
||
if ((ch == 13) || (ch == ' ') || (ch == 'o') || (ch == 'O'))
|
||
{
|
||
if (ch == ' ')
|
||
for(i=0;i<256;i++)
|
||
palookupe[i] = i;
|
||
|
||
if ((ch == 'o') || (ch == 'O'))
|
||
{
|
||
*dax1 = ((x1+x2)>>1);
|
||
*day1 = ((y1+y2)>>1);
|
||
*dax2 = ((x1+x2)>>1);
|
||
*day2 = ((y1+y2)>>1);
|
||
}
|
||
else
|
||
{
|
||
*dax1 = x1;
|
||
*day1 = y1;
|
||
*dax2 = x2;
|
||
*day2 = y2;
|
||
}
|
||
return(1);
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
void updatescript(long picnumrangestart, long picnumrangeend)
|
||
{
|
||
char buffer[160], dafilename[160];
|
||
long i, j, k, datilenum, x1, y1, x2, y2;
|
||
|
||
if (capfil == -1)
|
||
{
|
||
capfil = open("capfil.txt",O_BINARY|O_RDWR,S_IREAD);
|
||
if (capfil == -1) return;
|
||
}
|
||
|
||
lseek(capfil,0L,SEEK_SET);
|
||
while (eof(capfil) == 0) // FIXME - DDOI
|
||
{
|
||
i = 0;
|
||
do
|
||
{
|
||
read(capfil,&buffer[i],1);
|
||
if ((i == 0) && ((buffer[i] == 10) || (buffer[i] == 13)))
|
||
i--;
|
||
i++;
|
||
} while (((buffer[i-1] != 10) && (buffer[i-1] != 13)) && (eof(capfil) == 0));
|
||
buffer[i] = 0;
|
||
|
||
j = 0; k = 0;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",&datilenum);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%s",&dafilename[0]);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",&x1);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",&y1);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",&x2);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",&y2);
|
||
|
||
x2 += x1;
|
||
y2 += y1;
|
||
|
||
if ((datilenum >= picnumrangestart) && (datilenum <= picnumrangeend) && (i > 4))
|
||
{
|
||
i = 0;
|
||
while ((i < 160) && (dafilename[i] != 0)) i++;
|
||
while ((i > 0) && (dafilename[i] != 92)) i--;
|
||
dafilename[i] = 0;
|
||
chdir(dafilename);
|
||
loadpicture(&dafilename[i+1]);
|
||
|
||
loadpics(datilenum);
|
||
|
||
outp(67,182); outp(66,16); outp(66,16);
|
||
outp(97,inp(97)|3);
|
||
captureit(x1,y1,x2,y2,datilenum,dafilename,0);
|
||
outp(97,inp(97)&252);
|
||
|
||
asksave = 2, savewall(buf,datilenum);
|
||
}
|
||
}
|
||
chdir(curpath);
|
||
}
|
||
|
||
int loadtileofscript(long tilenume, char *filespec, long *x1, long *y1, long *x2, long *y2)
|
||
{
|
||
char buffer[160];
|
||
long i, j, k, datilenum;
|
||
|
||
if (capfil == -1)
|
||
{
|
||
capfil = open("capfil.txt",O_BINARY|O_RDWR,S_IREAD);
|
||
if (capfil == -1) return(0);
|
||
}
|
||
|
||
lseek(capfil,0L,SEEK_SET);
|
||
while (eof(capfil) == 0)
|
||
{
|
||
i = 0;
|
||
do
|
||
{
|
||
read(capfil,&buffer[i],1);
|
||
if ((i == 0) && ((buffer[i] == 10) || (buffer[i] == 13)))
|
||
i--;
|
||
i++;
|
||
} while (((buffer[i-1] != 10) && (buffer[i-1] != 13)) && (eof(capfil) == 0));
|
||
buffer[i] = 0;
|
||
|
||
j = 0; k = 0;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",&datilenum);
|
||
|
||
if (datilenum == tilenume)
|
||
{
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%s",filespec);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",x1);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",y1);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",x2);
|
||
|
||
j = k+1; k = j;
|
||
while ((buffer[k] != ',') && (k < i)) k++;
|
||
buffer[k] = 0;
|
||
sscanf(&buffer[j],"%ld",y2);
|
||
|
||
*x2 = (*x2) + (*x1);
|
||
*y2 = (*y2) + (*y1);
|
||
|
||
chdir(curpath);
|
||
return(1);
|
||
}
|
||
}
|
||
chdir(curpath);
|
||
return(0);
|
||
}
|
||
|
||
void captureit(long x1, long y1, long x2, long y2, long datilenum, char *dafilename, char capfilmode)
|
||
{
|
||
char buffer[160];
|
||
long i, j, k, vidpos, bad, dafileng, daothertilenum;
|
||
|
||
if (capfilmode == 1)
|
||
{
|
||
if (capfil == -1)
|
||
capfil = open("capfil.txt",O_BINARY|O_RDWR,S_IREAD);
|
||
if (capfil != -1)
|
||
{
|
||
lseek(capfil,0L,SEEK_SET);
|
||
dafileng = read(capfil,&buf[0],524288);
|
||
if (dafileng < 0) dafileng = 0;
|
||
close(capfil);
|
||
|
||
j = 0;
|
||
while (j < dafileng)
|
||
{
|
||
i = j; daothertilenum = 0;
|
||
while ((buf[i] >= 48) && (buf[i] <= 57) && (i < dafileng))
|
||
daothertilenum = (daothertilenum*10)+(buf[i++]-48);
|
||
if (daothertilenum >= datilenum) break;
|
||
while (((buf[j] != 10) && (buf[j] != 13)) && (j < dafileng)) j++;
|
||
while (((buf[j] == 10) || (buf[j] == 13)) && (j < dafileng)) j++;
|
||
}
|
||
k = j;
|
||
while (k < dafileng)
|
||
{
|
||
i = k; daothertilenum = 0;
|
||
while ((buf[i] >= 48) && (buf[i] <= 57) && (i < dafileng))
|
||
daothertilenum = (daothertilenum*10)+(buf[i++]-48);
|
||
if (daothertilenum > datilenum) break;
|
||
while (((buf[k] != 10) && (buf[k] != 13)) && (k < dafileng)) k++;
|
||
while (((buf[k] == 10) || (buf[k] == 13)) && (k < dafileng)) k++;
|
||
}
|
||
|
||
capfil = open("capfil.txt",O_BINARY|O_CREAT|O_TRUNC|O_WRONLY,UC_PERMS);
|
||
|
||
if (j > 0) write(capfil,&buf[0],j);
|
||
sprintf(buffer,"%ld,%s,%ld,%ld,%ld,%ld\r\n",datilenum,dafilename,x1,y1,x2-x1,y2-y1);
|
||
write(capfil,buffer,strlen(buffer));
|
||
if (dafileng > k) write(capfil,&buf[k],dafileng-k);
|
||
|
||
close(capfil);
|
||
capfil = -1;
|
||
}
|
||
else
|
||
{
|
||
capfil = open("capfil.txt",O_BINARY|O_CREAT|O_TRUNC|O_WRONLY,UC_PERMS);
|
||
|
||
sprintf(buffer,"%ld,%s,%ld,%ld,%ld,%ld\r\n",datilenum,dafilename,x1,y1,x2-x1,y2-y1);
|
||
write(capfil,buffer,strlen(buffer));
|
||
|
||
close(capfil);
|
||
capfil = -1;
|
||
}
|
||
}
|
||
|
||
if ((x2 <= x1) || (y2 <= y1))
|
||
{
|
||
x2 = x1+1; y2 = y1+1;
|
||
|
||
outp(0x3ce,4);
|
||
|
||
do
|
||
{
|
||
bad = 0;
|
||
|
||
if (x1 > 0)
|
||
{
|
||
for(j=0;j<y2-y1;j++)
|
||
{
|
||
vidpos = (y1+j)*panxdim+(x1-1);
|
||
|
||
outp(0x3cf,vidpos&3);
|
||
if (getpixel((vidpos>>2)+VIDEOBASE) != 255)
|
||
{
|
||
x1--, bad = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (x2 < xres-1)
|
||
{
|
||
for(j=0;j<y2-y1;j++)
|
||
{
|
||
vidpos = (y1+j)*panxdim+(x2+1);
|
||
|
||
outp(0x3cf,vidpos&3);
|
||
if (getpixel((vidpos>>2)+VIDEOBASE) != 255)
|
||
{
|
||
x2++, bad = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (y1 > 0)
|
||
{
|
||
for(i=0;i<x2-x1;i++)
|
||
{
|
||
vidpos = (y1-1)*panxdim+(x1+i);
|
||
|
||
outp(0x3cf,vidpos&3);
|
||
if (getpixel((vidpos>>2)+VIDEOBASE) != 255)
|
||
{
|
||
y1--, bad = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (y2 < yres-1)
|
||
{
|
||
for(i=0;i<x2-x1;i++)
|
||
{
|
||
vidpos = (y2+1)*panxdim+(x1+i);
|
||
|
||
outp(0x3cf,vidpos&3);
|
||
if (getpixel((vidpos>>2)+VIDEOBASE) != 255)
|
||
{
|
||
y2++, bad = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} while (bad == 1);
|
||
|
||
x2++;
|
||
y2++;
|
||
}
|
||
|
||
xdim = x2-x1; c = (xdim>>1);
|
||
ydim = y2-y1; d = (ydim>>1);
|
||
|
||
outp(0x3ce,4);
|
||
for(j=0;j<ydim;j++)
|
||
{
|
||
vidpos = (y1+j)*panxdim+x1;
|
||
for(i=0;i<xdim;i++)
|
||
{
|
||
outp(0x3cf,vidpos&3);
|
||
buf[((j+pany)<<10)+(i+panx)] = palookupe[getpixel((vidpos>>2)+VIDEOBASE)];
|
||
vidpos++;
|
||
}
|
||
}
|
||
asksave = 1;
|
||
}
|
||
|
||
void reportmaps(void)
|
||
{
|
||
long i, j, k, fil, mapversion;
|
||
short mapnumsectors, mapnumwalls, mapnumsprites;
|
||
#ifdef PLATFORM_DOS
|
||
struct find_t fileinfo;
|
||
#else
|
||
DIR *dir;
|
||
struct dirent *dent;
|
||
#endif
|
||
|
||
i = 0;
|
||
while (curpath[i] != 0) i++;
|
||
curpath[i] = 92;
|
||
curpath[i+1] = 0;
|
||
chdir(curpath);
|
||
curpath[i] = 0;
|
||
|
||
for(i=MAXTILES-1;i>=0;i--)
|
||
tilookup2[i] = 0;
|
||
#ifdef PLATFORM_DOS
|
||
if (_dos_findfirst("*.MAP",_A_NORMAL,&fileinfo) == 0)
|
||
{
|
||
do
|
||
{
|
||
if ((fil = open(fileinfo.name,O_BINARY|O_RDWR,S_IREAD)) != -1)
|
||
{
|
||
read(fil,&mapversion,4);
|
||
if (mapversion == 0x00000007) //Build map format
|
||
{
|
||
lseek(fil,4 + 4+4+4+2+2,SEEK_SET);
|
||
read(fil,&mapnumsectors,2);
|
||
for(i=0;i<mapnumsectors;i++)
|
||
{
|
||
read(fil,&mapsector,sizeof(struct sectortype));
|
||
tilookup2[mapsector.ceilingpicnum]++;
|
||
tilookup2[mapsector.floorpicnum]++;
|
||
}
|
||
read(fil,&mapnumwalls,2);
|
||
for(i=0;i<mapnumwalls;i++)
|
||
{
|
||
read(fil,&mapwall,sizeof(struct walltype));
|
||
tilookup2[mapwall.picnum]++;
|
||
if (mapwall.cstat&48) tilookup2[mapwall.overpicnum]++;
|
||
}
|
||
read(fil,&mapnumsprites,2);
|
||
for(i=0;i<mapnumsprites;i++)
|
||
{
|
||
read(fil,&mapsprite,sizeof(struct spritetype));
|
||
tilookup2[mapsprite.picnum]++;
|
||
}
|
||
}
|
||
else if ((mapversion>>16) == 1) //2Draw map format
|
||
{
|
||
read(fil,&nummaps,2);
|
||
read(fil,&numsprites[0],MAXMAPS<<1);
|
||
|
||
i = 4+2+(MAXMAPS<<1); //Global header
|
||
for(j=0;j<nummaps;j++)
|
||
{
|
||
lseek(fil,i+4+4+4+2,SEEK_SET);
|
||
|
||
//used xfillbuf becuase 64*64 shorts
|
||
read(fil,&xfillbuf,8192);
|
||
for(k=0;k<4096;k++)
|
||
xfillbuf[k] = tilookup2[xfillbuf[k]];
|
||
|
||
for(k=0;k<numsprites[j];k++)
|
||
{
|
||
//2draw sprite structure:
|
||
// 2+4+4+4+(spritepicnum(2))+2
|
||
|
||
read(fil,&xfillbuf,18);
|
||
xfillbuf[7] = tilookup2[xfillbuf[7]];
|
||
}
|
||
|
||
i += (4+4+4+2+8192+(numsprites[j]*18)); //Individual map header
|
||
}
|
||
}
|
||
else if ((mapversion>>16) == 2) //Polytex map format
|
||
{
|
||
}
|
||
close(fil);
|
||
}
|
||
} while (_dos_findnext(&fileinfo) == 0);
|
||
}
|
||
#else
|
||
dir = opendir(".");
|
||
if (dir == NULL) return;
|
||
|
||
do {
|
||
dent = readdir(dir);
|
||
if (dent != NULL) {
|
||
if (fnmatch("*.MAP", dent->d_name, FNM_CASEFOLD))
|
||
{
|
||
// Where the real fun starts - DDOI
|
||
if ((fil = open(dent->d_name, O_RDWR, S_IREAD)) != -1) {
|
||
read(fil, &mapversion, 4);
|
||
if (mapversion == 0x00000007) // Build map format
|
||
{
|
||
lseek(fil,4+4+4+4+2+2, SEEK_SET);
|
||
read(fil, &mapnumsectors, 2);
|
||
for (i=0;i<mapnumsectors;i++)
|
||
{
|
||
read(fil,&mapsector,sizeof(struct sectortype));
|
||
tilookup2[mapsector.ceilingpicnum]++;
|
||
tilookup2[mapsector.floorpicnum]++;
|
||
} // for
|
||
read(fil,&mapnumwalls,2);
|
||
for(i=0;i<mapnumwalls;i++)
|
||
{
|
||
read(fil,&mapwall,sizeof(struct walltype));
|
||
tilookup2[mapwall.picnum]++;
|
||
if (mapwall.cstat&48) tilookup2[mapwall.overpicnum]++;
|
||
} // for
|
||
read(fil,&mapnumsprites,2);
|
||
for(i=0;i<mapnumsprites;i++)
|
||
{
|
||
read(fil,&mapsprite,sizeof(struct spritetype));
|
||
tilookup2[mapsprite.picnum]++;
|
||
} // for
|
||
} // if
|
||
else if((mapversion>>16) == 1) //2Draw map format
|
||
{
|
||
read(fil,&nummaps,2);
|
||
read(fil,&numsprites[0],MAXMAPS<<1);
|
||
|
||
i = 4+2+(MAXMAPS<<1);
|
||
//Global header
|
||
for(j=0;j<nummaps;j++)
|
||
{
|
||
lseek(fil,i+4+4+4+2,SEEK_SET);
|
||
//used xfillbuf because 64*64 shorts
|
||
read(fil,&xfillbuf,8192);
|
||
for(k=0;k<4096;k++)
|
||
xfillbuf[k] = tilookup2[xfillbuf[k]];
|
||
|
||
for(k=0;k<numsprites[j];k++)
|
||
{
|
||
read(fil,&xfillbuf,18);
|
||
xfillbuf[7] = tilookup2[xfillbuf[7]];
|
||
} // for
|
||
i += (4+4+4+2+8192+(numsprites[j]*18)); // Individual map header
|
||
} // for
|
||
} // else if
|
||
else if ((mapversion>>16) == 2) //Polytex map format
|
||
{
|
||
} // else if
|
||
close(fil);
|
||
} // if
|
||
} // if
|
||
} // if
|
||
} while (dent != NULL);
|
||
closedir(dir);
|
||
#endif
|
||
}
|