⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 build.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 5 页
字号:
		keystatus[0xcb] = 0;		keystatus[0xcd] = 0;		keystatus[0xc8] = 0;		keystatus[0xd0] = 0;		keystatus[0x1c] = 0;		keystatus[1] = 0;		ch = 0;                      /* Interesting fakery of ch = getch() */		while (ch == 0)		{            _idle();			if (keystatus[0xcb] > 0) ch = 75;			if (keystatus[0xcd] > 0) ch = 77;			if (keystatus[0xc8] > 0) ch = 72;			if (keystatus[0xd0] > 0) ch = 80;			if (keystatus[0x1c] > 0) ch = 13;			if (keystatus[1] > 0) ch = 27;		}		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 < 80) && (menupath[i] != 0)) i++;				while ((i > 0) && (menupath[i] != 92)) i--;				menupath[i] = 0;			}			else			{                #if ((defined PLATFORM_DOS) || (defined PLATFORM_WIN32))    				strcat(menupath,"\\");                #elif PLATFORM_UNIX    				strcat(menupath,"/");                #else                    #error Define your platform!                #endif				strcat(menupath,menuname[newhighlight]);			}			chdir(menuname[newhighlight]);			menunamecnt = 0;			getfilenames("SUBD");			getfilenames("*.MAP");			sortfilenames();			newhighlight = 0;			ch = 0;#ifdef PLATFORM_DOS			fillscreen16((399360-pageoffset)>>3,0L,640L*336L);#else			fillscreen16(0, 0L,640L*336L);#endif		}	}	while ((ch != 13) && (ch != 27));	if (ch == 13)	{		menuhighlight = newhighlight;		return(newhighlight);	}	return(-1);}int fillsector(short sectnum, char fillcolor){	long x1, x2, y1, y2, sy, y, templong;	long lborder, rborder, uborder, dborder, miny, maxy, dax;	short z, zz, startwall, endwall, fillcnt;	lborder = 0; rborder = 640;	uborder = 0; dborder = ydim16;	if (sectnum == -1)		return(0);	miny = dborder-1;	maxy = uborder;	startwall = sector[sectnum].wallptr;	endwall = startwall + sector[sectnum].wallnum - 1;	for(z=startwall;z<=endwall;z++)	{		y1 = (((wall[z].y-posy)*zoom)>>14)+200;		y2 = (((wall[wall[z].point2].y-posy)*zoom)>>14)+200;		if (y1 < miny) miny = y1;		if (y2 < miny) miny = y2;		if (y1 > maxy) maxy = y1;		if (y2 > maxy) maxy = y2;	}	if (miny < uborder) miny = uborder;	if (maxy >= dborder) maxy = dborder-1;	for(sy=miny+(numframes%3);sy<=maxy;sy+=3)	{		y = posy+(((sy-200)<<14)/zoom);		fillist[0] = lborder; fillcnt = 1;		for(z=startwall;z<=endwall;z++)		{			x1 = wall[z].x; x2 = wall[wall[z].point2].x;			y1 = wall[z].y; y2 = wall[wall[z].point2].y;			if (y1 > y2)			{				templong = x1; x1 = x2; x2 = templong;				templong = y1; y1 = y2; y2 = templong;			}			if ((y1 <= y) && (y2 > y))				/*if (x1*(y-y2) + x2*(y1-y) <= 0)*/				{					dax = x1+scale(y-y1,x2-x1,y2-y1);					dax = (((dax-posx)*zoom)>>14)+320;					if (dax >= lborder)						fillist[fillcnt++] = dax;				}		}		if (fillcnt > 0)		{			for(z=1;z<fillcnt;z++)				for (zz=0;zz<z;zz++)					if (fillist[z] < fillist[zz])					{						templong = fillist[z]; fillist[z] = fillist[zz]; fillist[zz] = templong;					}			for (z=(fillcnt&1);z<fillcnt-1;z+=2)			{				if (fillist[z] > rborder) break;				if (fillist[z+1] > rborder)					fillist[z+1] = rborder;				drawline16(fillist[z],sy,fillist[z+1],sy,fillcolor);			}		}	}	return(0);}int clockdir(short wallstart)   /* Returns: 0 is CW, 1 is CCW */{	short i, themin;	long minx, templong, x0, x1, x2, y0, y1, y2;	minx = 0x7fffffff;	themin = -1;	i = wallstart-1;	do	{		i++;		if (wall[wall[i].point2].x < minx)		{			minx = wall[wall[i].point2].x;			themin = i;		}	}	while ((wall[i].point2 != wallstart) && (i < MAXWALLS));	x0 = wall[themin].x;	y0 = wall[themin].y;	x1 = wall[wall[themin].point2].x;	y1 = wall[wall[themin].point2].y;	x2 = wall[wall[wall[themin].point2].point2].x;	y2 = wall[wall[wall[themin].point2].point2].y;	if ((y1 >= y2) && (y1 <= y0)) return(0);	if ((y1 >= y0) && (y1 <= y2)) return(1);	templong = (x0-x1)*(y2-y1) - (x2-x1)*(y0-y1);	if (templong < 0)		return(0);	else		return(1);}short whitelinescan(short dalinehighlight){	long i, j, k;	short sucksect, newnumwalls;	sucksect = sectorofwall(dalinehighlight);	memcpy(&sector[numsectors],&sector[sucksect],sizeof(sectortype));	sector[numsectors].wallptr = numwalls;	sector[numsectors].wallnum = 0;	i = dalinehighlight;	newnumwalls = numwalls;	do	{		j = lastwall((short)i);		if (wall[j].nextwall >= 0)		{			j = wall[j].point2;			for(k=0;k<numwalls;k++)			{				if (wall[wall[k].point2].x == wall[j].x)					if (wall[wall[k].point2].y == wall[j].y)						if (wall[k].nextwall == -1)						{							j = k;							break;						}			}		}		memcpy(&wall[newnumwalls],&wall[i],sizeof(walltype));		wall[newnumwalls].nextwall = j;		wall[newnumwalls].nextsector = sectorofwall((short)j);		newnumwalls++;		sector[numsectors].wallnum++;		i = j;	}	while (i != dalinehighlight);	for(i=numwalls;i<newnumwalls-1;i++)		wall[i].point2 = i+1;	wall[newnumwalls-1].point2 = numwalls;	if (clockdir(numwalls) == 1)		return(-1);	else		return(newnumwalls);}void printcoords16(long posxe, long posye, short ange){	char snotbuf[80];	long i;	sprintf(snotbuf,"x=%ld y=%ld ang=%d",posxe,posye,ange);	i = 0;	while ((snotbuf[i] != 0) && (i < 30))		i++;	while (i < 30)	{		snotbuf[i] = 32;		i++;	}	snotbuf[30] = 0;	statusbar_printext16(8, 128, 11, 6, snotbuf,0);	sprintf(snotbuf,"%d/%d sect. %d/%d walls %d/%d spri.",numsectors,MAXSECTORS,numwalls,MAXWALLS,numsprites,MAXSPRITES);	i = 0;	while ((snotbuf[i] != 0) && (i < 46))		i++;	while (i < 46)	{		snotbuf[i] = 32;		i++;	}	snotbuf[46] = 0;	statusbar_printext16(264, 128, 14, 6, snotbuf,0);}int checksectorpointer(short i, short sectnum){	long j, k, startwall, endwall, x1, y1, x2, y2;	x1 = wall[i].x;	y1 = wall[i].y;	x2 = wall[wall[i].point2].x;	y2 = wall[wall[i].point2].y;	if (wall[i].nextwall >= 0)          /* Check for early exit */	{		k = wall[i].nextwall;		if ((wall[k].x == x2) && (wall[k].y == y2))			if ((wall[wall[k].point2].x == x1) && (wall[wall[k].point2].y == y1))				return(0);	}	wall[i].nextsector = -1;	wall[i].nextwall = -1;	for(j=0;j<numsectors;j++)	{		startwall = sector[j].wallptr;		endwall = startwall + sector[j].wallnum - 1;		for(k=startwall;k<=endwall;k++)		{			if ((wall[k].x == x2) && (wall[k].y == y2))				if ((wall[wall[k].point2].x == x1) && (wall[wall[k].point2].y == y1))					if (j != sectnum)					{						wall[i].nextsector = j;						wall[i].nextwall = k;						wall[k].nextsector = sectnum;						wall[k].nextwall = i;					}		}	}	return(0);}void copysector(short soursector, short destsector, short deststartwall, char copystat){	short j, k, m, newnumwalls, startwall, endwall;	newnumwalls = deststartwall;  /* erase existing sector fragments */		/* duplicate walls */	startwall = sector[soursector].wallptr;	endwall = startwall + sector[soursector].wallnum;	for(j=startwall;j<endwall;j++)	{		memcpy(&wall[newnumwalls],&wall[j],sizeof(walltype));		wall[newnumwalls].point2 += deststartwall-startwall;		if (wall[newnumwalls].nextwall >= 0)		{			wall[newnumwalls].nextwall += deststartwall-startwall;			wall[newnumwalls].nextsector += destsector-soursector;		}		newnumwalls++;	}#if 0	for(j=deststartwall;j<newnumwalls;j++)	{	   if (wall[j].nextwall >= 0)	      checksectorpointer(wall[j].nextwall,wall[j].nextsector);	   checksectorpointer((short)j,destsector);	}#endif	if (newnumwalls > deststartwall)	{			/* duplicate sectors */		memcpy(&sector[destsector],&sector[soursector],sizeof(sectortype));		sector[destsector].wallptr = deststartwall;		sector[destsector].wallnum = newnumwalls-deststartwall;		if (copystat == 1)		{				/* duplicate sprites */			j = headspritesect[soursector];			while (j >= 0)			{				k = nextspritesect[j];				m = insertsprite(destsector,sprite[j].statnum);				memcpy(&sprite[m],&sprite[j],sizeof(spritetype));				sprite[m].sectnum = destsector;   /* Don't let memcpy overwrite sector! */				j = k;			}		}	}}void showsectordata(short sectnum){	char snotbuf[80];	sprintf(snotbuf,"Sector %d",sectnum);	statusbar_printext16(8,32,11,-1,snotbuf,0);	sprintf(snotbuf,"Firstwall: %d",sector[sectnum].wallptr);	statusbar_printext16(8,48,11,-1,snotbuf,0);	sprintf(snotbuf,"Numberofwalls: %d",sector[sectnum].wallnum);	statusbar_printext16(8,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Firstsprite: %d",headspritesect[sectnum]);	statusbar_printext16(8,64,11,-1,snotbuf,0);	sprintf(snotbuf,"Tags: %d, %d",sector[sectnum].hitag,sector[sectnum].lotag);	statusbar_printext16(8,72,11,-1,snotbuf,0);	sprintf(snotbuf,"     (0x%x), (0x%x)",sector[sectnum].hitag,sector[sectnum].lotag);	statusbar_printext16(8,80,11,-1,snotbuf,0);	sprintf(snotbuf,"Extra: %d",sector[sectnum].extra);	statusbar_printext16(8,88,11,-1,snotbuf,0);	sprintf(snotbuf,"Visibility: %d",sector[sectnum].visibility);	statusbar_printext16(8,96,11,-1,snotbuf,0);	sprintf(snotbuf,"Pixel height: %ld",(sector[sectnum].floorz-sector[sectnum].ceilingz)>>8);	statusbar_printext16(8,104,11,-1,snotbuf,0);	statusbar_printext16(200,32,11,-1,"CEILINGS:",0);	sprintf(snotbuf,"Flags (hex): %x",sector[sectnum].ceilingstat);	statusbar_printext16(200,48,11,-1,snotbuf,0);	sprintf(snotbuf,"(X,Y)pan: %d, %d",sector[sectnum].ceilingxpanning,sector[sectnum].ceilingypanning);	statusbar_printext16(200,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Shade byte: %d",sector[sectnum].ceilingshade);	statusbar_printext16(200,64,11,-1,snotbuf,0);	sprintf(snotbuf,"Z-coordinate: %ld",sector[sectnum].ceilingz);	statusbar_printext16(200,72,11,-1,snotbuf,0);	sprintf(snotbuf,"Tile number: %d",sector[sectnum].ceilingpicnum);	statusbar_printext16(200,80,11,-1,snotbuf,0);	sprintf(snotbuf,"Ceiling heinum: %d",sector[sectnum].ceilingheinum);	statusbar_printext16(200,88,11,-1,snotbuf,0);	sprintf(snotbuf,"Palookup number: %d",sector[sectnum].ceilingpal);	statusbar_printext16(200,96,11,-1,snotbuf,0);	statusbar_printext16(400,32,11,-1,"FLOORS:",0);	sprintf(snotbuf,"Flags (hex): %x",sector[sectnum].floorstat);	statusbar_printext16(400,48,11,-1,snotbuf,0);	sprintf(snotbuf,"(X,Y)pan: %d, %d",sector[sectnum].floorxpanning,sector[sectnum].floorypanning);	statusbar_printext16(400,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Shade byte: %d",sector[sectnum].floorshade);	statusbar_printext16(400,64,11,-1,snotbuf,0);	sprintf(snotbuf,"Z-coordinate: %ld",sector[sectnum].floorz);	statusbar_printext16(400,72,11,-1,snotbuf,0);	sprintf(snotbuf,"Tile number: %d",sector[sectnum].floorpicnum);	statusbar_printext16(400,80,11,-1,snotbuf,0);	sprintf(snotbuf,"Floor heinum: %d",sector[sectnum].floorheinum);	statusbar_printext16(400,88,11,-1,snotbuf,0);	sprintf(snotbuf,"Palookup number: %d",sector[sectnum].floorpal);	statusbar_printext16(400,96,11,-1,snotbuf,0);}void showwalldata(short wallnum){	long dax, day, dist;	char snotbuf[80];	sprintf(snotbuf,"Wall %d",wallnum);	statusbar_printext16(8,32,11,-1,snotbuf,0);	sprintf(snotbuf,"X-coordinate: %ld",wall[wallnum].x);	statusbar_printext16(8,48,11,-1,snotbuf,0);	sprintf(snotbuf,"Y-coordinate: %ld",wall[wallnum].y);	statusbar_printext16(8,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Point2: %d",wall[wallnum].point2);	statusbar_printext16(8,64,11,-1,snotbuf,0);	sprintf(snotbuf,"Sector: %d",sectorofwall(wallnum));	statusbar_printext16(8,72,11,-1,snotbuf,0);	sprintf(snotbuf,"Tags: %d, %d",wall[wallnum].hitag,wall[wallnum].lotag);	statusbar_printext16(8,88,11,-1,snotbuf,0);	sprintf(snotbuf,"     (0x%x), (0x%x)",wall[wallnum].hitag,wall[wallnum].lotag);	statusbar_printext16(8,96,11,-1,snotbuf,0);	statusbar_printext16(200,32,11,-1,names[wall[wallnum].picnum],0);	sprintf(snotbuf,"Flags (hex): %x",wall[wallnum].cstat);	statusbar_printext16(200,48,11,-1,snotbuf,0);	sprintf(snotbuf,"Shade: %d",wall[wallnum].shade);	statusbar_printext16(200,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Pal: %d",wall[wallnum].pal);	statusbar_printext16(200,64,11,-1,snotbuf,0);	sprintf(snotbuf,"(X,Y)repeat: %d, %d",wall[wallnum].xrepeat,wall[wallnum].yrepeat);	statusbar_printext16(200,72,11,-1,snotbuf,0);	sprintf(snotbuf,"(X,Y)pan: %d, %d",wall[wallnum].xpanning,wall[wallnum].ypanning);	statusbar_printext16(200,80,11,-1,snotbuf,0);	sprintf(snotbuf,"Tile number: %d",wall[wallnum].picnum);	statusbar_printext16(200,88,11,-1,snotbuf,0);	sprintf(snotbuf,"OverTile number: %d",wall[wallnum].overpicnum);	statusbar_printext16(200,96,11,-1,snotbuf,0);	sprintf(snotbuf,"nextsector: %d",wall[wallnum].nextsector);	statusbar_printext16(400,48,11,-1,snotbuf,0);	sprintf(snotbuf,"nextwall: %d",wall[wallnum].nextwall);	statusbar_printext16(400,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Extra: %d",wall[wallnum].extra);	statusbar_printext16(400,72,11,-1,snotbuf,0);	dax = wall[wallnum].x-wall[wall[wallnum].point2].x;	day = wall[wallnum].y-wall[wall[wallnum].point2].y;	dist = ksqrt(dax*dax+day*day);	sprintf(snotbuf,"Wall length: %ld",dist>>4);	statusbar_printext16(400,96,11,-1,snotbuf,0);	dax = (long)sectorofwall(wallnum);	sprintf(snotbuf,"Pixel height: %ld",(sector[dax].floorz-sector[dax].ceilingz)>>8);	statusbar_printext16(400,104,11,-1,snotbuf,0);}void showspritedata(short spritenum){	char snotbuf[80];	sprintf(snotbuf,"Sprite %d",spritenum);	statusbar_printext16(8,32,11,-1,snotbuf,0);	sprintf(snotbuf,"X-coordinate: %ld",sprite[spritenum].x);	statusbar_printext16(8,48,11,-1,snotbuf,0);	sprintf(snotbuf,"Y-coordinate: %ld",sprite[spritenum].y);	statusbar_printext16(8,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Z-coordinate: %ld",sprite[spritenum].z);	statusbar_printext16(8,64,11,-1,snotbuf,0);	sprintf(snotbuf,"Sectnum: %d",sprite[spritenum].sectnum);	statusbar_printext16(8,72,11,-1,snotbuf,0);	sprintf(snotbuf,"Statnum: %d",sprite[spritenum].statnum);	statusbar_printext16(8,80,11,-1,snotbuf,0);	sprintf(snotbuf,"Tags: %d, %d",sprite[spritenum].hitag,sprite[spritenum].lotag);	statusbar_printext16(8,96,11,-1,snotbuf,0);	sprintf(snotbuf,"     (0x%x), (0x%x)",sprite[spritenum].hitag,sprite[spritenum].lotag);	statusbar_printext16(8,104,11,-1,snotbuf,0);	statusbar_printext16(200,32,11,-1,names[sprite[spritenum].picnum],0);	sprintf(snotbuf,"Flags (hex): %x",sprite[spritenum].cstat);	statusbar_printext16(200,48,11,-1,snotbuf,0);	sprintf(snotbuf,"Shade: %d",sprite[spritenum].shade);	statusbar_printext16(200,56,11,-1,snotbuf,0);	sprintf(snotbuf,"Pal: %d",sprite[spritenum].pal);	statusbar_printext16(200,64,11,-1,snotbuf,0);	sprintf(snotbuf,"(X,Y)repeat: %d, %d",sprite[spritenum].xrepeat,sprite[spritenum].yrepeat);	statusbar_printext16(200,72,11,-1,snotbuf,0);	sprintf(snotbuf,"(X,Y)offset: %d, %d",sprite[spritenum].xoffset,sprite[spritenum].yoffset);	statusbar_printext16(200,80,11,-1,snotbuf,0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -