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

📄 engine.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 5 页
字号:
	if (ynice) tsizy = (picsiz[globalpicnum]>>4);	fpalookup = (long)FP_OFF(palookup[globalpal]);	setupvlineasm(globalshiftval);	x = x1;	while ((umost[x] > dmost[x]) && (x <= x2)) x++;	for(;(x<=x2)&&((x+frameoffset)&3);x++)	{		y1ve[0] = max(uwal[x],umost[x]);		y2ve[0] = min(dwal[x],dmost[x]);		if (y2ve[0] <= y1ve[0]) continue;		palookupoffse[0] = fpalookup+(getpalookup((long)mulscale16(swal[x],globvis),globalshade)<<8);		bufplce[0] = lwal[x] + globalxpanning;		if (bufplce[0] >= tsizx) { if (xnice == 0) bufplce[0] %= tsizx; else bufplce[0] &= tsizx; }		if (ynice == 0) bufplce[0] *= tsizy; else bufplce[0] <<= tsizy;		vince[0] = swal[x]*globalyscale;		vplce[0] = globalzd + vince[0]*(y1ve[0]-globalhoriz+1);		vlineasm1(vince[0],palookupoffse[0],y2ve[0]-y1ve[0]-1,vplce[0],bufplce[0]+waloff[globalpicnum],x+frameoffset+ylookup[y1ve[0]]);	}	for(;x<=x2-3;x+=4)	{		bad = 0;		for(z=3;z>=0;z--)		{			y1ve[z] = max(uwal[x+z],umost[x+z]);			y2ve[z] = min(dwal[x+z],dmost[x+z])-1;			if (y2ve[z] < y1ve[z]) { bad += pow2char[z]; continue; }			i = lwal[x+z] + globalxpanning;			if (i >= tsizx) { if (xnice == 0) i %= tsizx; else i &= tsizx; }			if (ynice == 0) i *= tsizy; else i <<= tsizy;			bufplce[z] = waloff[globalpicnum]+i;			vince[z] = swal[x+z]*globalyscale;			vplce[z] = globalzd + vince[z]*(y1ve[z]-globalhoriz+1);		}		if (bad == 15) continue;		palookupoffse[0] = fpalookup+(getpalookup((long)mulscale16(swal[x],globvis),globalshade)<<8);		palookupoffse[3] = fpalookup+(getpalookup((long)mulscale16(swal[x+3],globvis),globalshade)<<8);		if ((palookupoffse[0] == palookupoffse[3]) && ((bad&0x9) == 0))		{			palookupoffse[1] = palookupoffse[0];			palookupoffse[2] = palookupoffse[0];		}		else		{			palookupoffse[1] = fpalookup+(getpalookup((long)mulscale16(swal[x+1],globvis),globalshade)<<8);			palookupoffse[2] = fpalookup+(getpalookup((long)mulscale16(swal[x+2],globvis),globalshade)<<8);		}		u4 = max(max(y1ve[0],y1ve[1]),max(y1ve[2],y1ve[3]));		d4 = min(min(y2ve[0],y2ve[1]),min(y2ve[2],y2ve[3]));		if ((bad != 0) || (u4 >= d4))		{			if (!(bad&1)) prevlineasm1(vince[0],palookupoffse[0],y2ve[0]-y1ve[0],vplce[0],bufplce[0],ylookup[y1ve[0]]+x+frameoffset+0);			if (!(bad&2)) prevlineasm1(vince[1],palookupoffse[1],y2ve[1]-y1ve[1],vplce[1],bufplce[1],ylookup[y1ve[1]]+x+frameoffset+1);			if (!(bad&4)) prevlineasm1(vince[2],palookupoffse[2],y2ve[2]-y1ve[2],vplce[2],bufplce[2],ylookup[y1ve[2]]+x+frameoffset+2);			if (!(bad&8)) prevlineasm1(vince[3],palookupoffse[3],y2ve[3]-y1ve[3],vplce[3],bufplce[3],ylookup[y1ve[3]]+x+frameoffset+3);			continue;		}		if (u4 > y1ve[0]) vplce[0] = prevlineasm1(vince[0],palookupoffse[0],u4-y1ve[0]-1,vplce[0],bufplce[0],ylookup[y1ve[0]]+x+frameoffset+0);		if (u4 > y1ve[1]) vplce[1] = prevlineasm1(vince[1],palookupoffse[1],u4-y1ve[1]-1,vplce[1],bufplce[1],ylookup[y1ve[1]]+x+frameoffset+1);		if (u4 > y1ve[2]) vplce[2] = prevlineasm1(vince[2],palookupoffse[2],u4-y1ve[2]-1,vplce[2],bufplce[2],ylookup[y1ve[2]]+x+frameoffset+2);		if (u4 > y1ve[3]) vplce[3] = prevlineasm1(vince[3],palookupoffse[3],u4-y1ve[3]-1,vplce[3],bufplce[3],ylookup[y1ve[3]]+x+frameoffset+3);		if (d4 >= u4) vlineasm4(d4-u4+1,ylookup[u4]+x+frameoffset);		i = x+frameoffset+ylookup[d4+1];		if (y2ve[0] > d4) prevlineasm1(vince[0],palookupoffse[0],y2ve[0]-d4-1,vplce[0],bufplce[0],i+0);		if (y2ve[1] > d4) prevlineasm1(vince[1],palookupoffse[1],y2ve[1]-d4-1,vplce[1],bufplce[1],i+1);		if (y2ve[2] > d4) prevlineasm1(vince[2],palookupoffse[2],y2ve[2]-d4-1,vplce[2],bufplce[2],i+2);		if (y2ve[3] > d4) prevlineasm1(vince[3],palookupoffse[3],y2ve[3]-d4-1,vplce[3],bufplce[3],i+3);	}	for(;x<=x2;x++)	{		y1ve[0] = max(uwal[x],umost[x]);		y2ve[0] = min(dwal[x],dmost[x]);		if (y2ve[0] <= y1ve[0]) continue;		palookupoffse[0] = fpalookup+(getpalookup((long)mulscale16(swal[x],globvis),globalshade)<<8);		bufplce[0] = lwal[x] + globalxpanning;		if (bufplce[0] >= tsizx) { if (xnice == 0) bufplce[0] %= tsizx; else bufplce[0] &= tsizx; }		if (ynice == 0) bufplce[0] *= tsizy; else bufplce[0] <<= tsizy;		vince[0] = swal[x]*globalyscale;		vplce[0] = globalzd + vince[0]*(y1ve[0]-globalhoriz+1);		vlineasm1(vince[0],palookupoffse[0],y2ve[0]-y1ve[0]-1,vplce[0],bufplce[0]+waloff[globalpicnum],x+frameoffset+ylookup[y1ve[0]]);	}	faketimerhandler();}/* this renders masking sprites. See wallscan(). --ryan. */static void maskwallscan(long x1, long x2,                         short *uwal, short *dwal,                         long *swal, long *lwal){	long i, x, startx, xnice, ynice, fpalookup;	long y1ve[4], y2ve[4], u4, d4, dax, z, p, tsizx, tsizy;	char bad;	tsizx = tilesizx[globalpicnum];	tsizy = tilesizy[globalpicnum];	setgotpic(globalpicnum);	if ((tsizx <= 0) || (tsizy <= 0)) return;	if ((uwal[x1] > ydimen) && (uwal[x2] > ydimen)) return;	if ((dwal[x1] < 0) && (dwal[x2] < 0)) return;	if (waloff[globalpicnum] == 0) loadtile(globalpicnum);	startx = x1;	xnice = (pow2long[picsiz[globalpicnum]&15] == tsizx);	if (xnice) tsizx = (tsizx-1);	ynice = (pow2long[picsiz[globalpicnum]>>4] == tsizy);	if (ynice) tsizy = (picsiz[globalpicnum]>>4);	fpalookup = (long)FP_OFF(palookup[globalpal]);	setupmvlineasm(globalshiftval);	x = startx;	while ((startumost[x+windowx1] > startdmost[x+windowx1]) && (x <= x2)) x++;	p = x+frameoffset;	for(;(x<=x2)&&(p&3);x++,p++)	{		y1ve[0] = max(uwal[x],startumost[x+windowx1]-windowy1);		y2ve[0] = min(dwal[x],startdmost[x+windowx1]-windowy1);		if (y2ve[0] <= y1ve[0]) continue;		palookupoffse[0] = fpalookup+(getpalookup((long)mulscale16(swal[x],globvis),globalshade)<<8);		bufplce[0] = lwal[x] + globalxpanning;		if (bufplce[0] >= tsizx) { if (xnice == 0) bufplce[0] %= tsizx; else bufplce[0] &= tsizx; }		if (ynice == 0) bufplce[0] *= tsizy; else bufplce[0] <<= tsizy;		vince[0] = swal[x]*globalyscale;		vplce[0] = globalzd + vince[0]*(y1ve[0]-globalhoriz+1);		mvlineasm1(vince[0],palookupoffse[0],y2ve[0]-y1ve[0]-1,vplce[0],bufplce[0]+waloff[globalpicnum],p+ylookup[y1ve[0]]);	}	for(;x<=x2-3;x+=4,p+=4)	{		bad = 0;		for(z=3,dax=x+3;z>=0;z--,dax--)		{			y1ve[z] = max(uwal[dax],startumost[dax+windowx1]-windowy1);			y2ve[z] = min(dwal[dax],startdmost[dax+windowx1]-windowy1)-1;			if (y2ve[z] < y1ve[z]) { bad += pow2char[z]; continue; }			i = lwal[dax] + globalxpanning;			if (i >= tsizx) { if (xnice == 0) i %= tsizx; else i &= tsizx; }			if (ynice == 0) i *= tsizy; else i <<= tsizy;			bufplce[z] = waloff[globalpicnum]+i;			vince[z] = swal[dax]*globalyscale;			vplce[z] = globalzd + vince[z]*(y1ve[z]-globalhoriz+1);		}		if (bad == 15) continue;		palookupoffse[0] = fpalookup+(getpalookup((long)mulscale16(swal[x],globvis),globalshade)<<8);		palookupoffse[3] = fpalookup+(getpalookup((long)mulscale16(swal[x+3],globvis),globalshade)<<8);		if ((palookupoffse[0] == palookupoffse[3]) && ((bad&0x9) == 0))		{			palookupoffse[1] = palookupoffse[0];			palookupoffse[2] = palookupoffse[0];		}		else		{			palookupoffse[1] = fpalookup+(getpalookup((long)mulscale16(swal[x+1],globvis),globalshade)<<8);			palookupoffse[2] = fpalookup+(getpalookup((long)mulscale16(swal[x+2],globvis),globalshade)<<8);		}		u4 = max(max(y1ve[0],y1ve[1]),max(y1ve[2],y1ve[3]));		d4 = min(min(y2ve[0],y2ve[1]),min(y2ve[2],y2ve[3]));		if ((bad > 0) || (u4 >= d4))		{			if (!(bad&1)) mvlineasm1(vince[0],palookupoffse[0],y2ve[0]-y1ve[0],vplce[0],bufplce[0],ylookup[y1ve[0]]+p+0);			if (!(bad&2)) mvlineasm1(vince[1],palookupoffse[1],y2ve[1]-y1ve[1],vplce[1],bufplce[1],ylookup[y1ve[1]]+p+1);			if (!(bad&4)) mvlineasm1(vince[2],palookupoffse[2],y2ve[2]-y1ve[2],vplce[2],bufplce[2],ylookup[y1ve[2]]+p+2);			if (!(bad&8)) mvlineasm1(vince[3],palookupoffse[3],y2ve[3]-y1ve[3],vplce[3],bufplce[3],ylookup[y1ve[3]]+p+3);			continue;		}		if (u4 > y1ve[0]) vplce[0] = mvlineasm1(vince[0],palookupoffse[0],u4-y1ve[0]-1,vplce[0],bufplce[0],ylookup[y1ve[0]]+p+0);		if (u4 > y1ve[1]) vplce[1] = mvlineasm1(vince[1],palookupoffse[1],u4-y1ve[1]-1,vplce[1],bufplce[1],ylookup[y1ve[1]]+p+1);		if (u4 > y1ve[2]) vplce[2] = mvlineasm1(vince[2],palookupoffse[2],u4-y1ve[2]-1,vplce[2],bufplce[2],ylookup[y1ve[2]]+p+2);		if (u4 > y1ve[3]) vplce[3] = mvlineasm1(vince[3],palookupoffse[3],u4-y1ve[3]-1,vplce[3],bufplce[3],ylookup[y1ve[3]]+p+3);		if (d4 >= u4) mvlineasm4(d4-u4+1,ylookup[u4]+p);		i = p+ylookup[d4+1];		if (y2ve[0] > d4) mvlineasm1(vince[0],palookupoffse[0],y2ve[0]-d4-1,vplce[0],bufplce[0],i+0);		if (y2ve[1] > d4) mvlineasm1(vince[1],palookupoffse[1],y2ve[1]-d4-1,vplce[1],bufplce[1],i+1);		if (y2ve[2] > d4) mvlineasm1(vince[2],palookupoffse[2],y2ve[2]-d4-1,vplce[2],bufplce[2],i+2);		if (y2ve[3] > d4) mvlineasm1(vince[3],palookupoffse[3],y2ve[3]-d4-1,vplce[3],bufplce[3],i+3);	}	for(;x<=x2;x++,p++)	{		y1ve[0] = max(uwal[x],startumost[x+windowx1]-windowy1);		y2ve[0] = min(dwal[x],startdmost[x+windowx1]-windowy1);		if (y2ve[0] <= y1ve[0]) continue;		palookupoffse[0] = fpalookup+(getpalookup((long)mulscale16(swal[x],globvis),globalshade)<<8);		bufplce[0] = lwal[x] + globalxpanning;		if (bufplce[0] >= tsizx) { if (xnice == 0) bufplce[0] %= tsizx; else bufplce[0] &= tsizx; }		if (ynice == 0) bufplce[0] *= tsizy; else bufplce[0] <<= tsizy;		vince[0] = swal[x]*globalyscale;		vplce[0] = globalzd + vince[0]*(y1ve[0]-globalhoriz+1);		mvlineasm1(vince[0],palookupoffse[0],y2ve[0]-y1ve[0]-1,vplce[0],bufplce[0]+waloff[globalpicnum],p+ylookup[y1ve[0]]);	}	faketimerhandler();}/* renders parallaxed skies/floors  --ryan. */static void parascan(long dax1, long dax2, long sectnum,                     char dastat, long bunch){	sectortype *sec;	long j, k, l, m, n, x, z, wallnum, nextsectnum, globalhorizbak;	short *topptr, *botptr;	sectnum = thesector[bunchfirst[bunch]]; sec = &sector[sectnum];	globalhorizbak = globalhoriz;	if (parallaxyscale != 65536)		globalhoriz = mulscale16(globalhoriz-(ydimen>>1),parallaxyscale) + (ydimen>>1);	globvis = globalpisibility;	/* globalorientation = 0L; */	if (sec->visibility != 0) globvis = mulscale4(globvis,(long)((unsigned char)(sec->visibility+16)));	if (dastat == 0)	{		globalpal = sec->ceilingpal;		globalpicnum = sec->ceilingpicnum;		globalshade = (long)sec->ceilingshade;		globalxpanning = (long)sec->ceilingxpanning;		globalypanning = (long)sec->ceilingypanning;		topptr = umost;		botptr = uplc;	}	else	{		globalpal = sec->floorpal;		globalpicnum = sec->floorpicnum;		globalshade = (long)sec->floorshade;		globalxpanning = (long)sec->floorxpanning;		globalypanning = (long)sec->floorypanning;		topptr = dplc;		botptr = dmost;	}	if ((unsigned)globalpicnum >= (unsigned)MAXTILES) globalpicnum = 0;	if (picanm[globalpicnum]&192) globalpicnum += animateoffs(globalpicnum,(short)sectnum);	globalshiftval = (picsiz[globalpicnum]>>4);	if (pow2long[globalshiftval] != tilesizy[globalpicnum]) globalshiftval++;	globalshiftval = 32-globalshiftval;	globalzd = (((tilesizy[globalpicnum]>>1)+parallaxyoffs)<<globalshiftval)+(globalypanning<<24);	globalyscale = (8<<(globalshiftval-19));	/*if (globalorientation&256) globalyscale = -globalyscale, globalzd = -globalzd;*/	k = 11 - (picsiz[globalpicnum]&15) - pskybits;	x = -1;	for(z=bunchfirst[bunch];z>=0;z=p2[z])	{		wallnum = thewall[z]; nextsectnum = wall[wallnum].nextsector;		if (dastat == 0) j = sector[nextsectnum].ceilingstat;						else j = sector[nextsectnum].floorstat;		if ((nextsectnum < 0) || (wall[wallnum].cstat&32) || ((j&1) == 0))		{			if (x == -1) x = xb1[z];			if (parallaxtype == 0)			{				n = mulscale16(xdimenrecip,viewingrange);				for(j=xb1[z];j<=xb2[z];j++)					lplc[j] = (((mulscale23(j-halfxdimen,n)+globalang)&2047)>>k);			}			else			{				for(j=xb1[z];j<=xb2[z];j++)					lplc[j] = ((((long)radarang2[j]+globalang)&2047)>>k);			}			if (parallaxtype == 2)			{				n = mulscale16(xdimscale,viewingrange);				for(j=xb1[z];j<=xb2[z];j++)					swplc[j] = mulscale14(sintable[((long)radarang2[j]+512)&2047],n);			}			else				clearbuf(&swplc[xb1[z]],xb2[z]-xb1[z]+1,mulscale16(xdimscale,viewingrange));		}		else if (x >= 0)		{			l = globalpicnum; m = (picsiz[globalpicnum]&15);			globalpicnum = l+pskyoff[lplc[x]>>m];			if (((lplc[x]^lplc[xb1[z]-1])>>m) == 0)				wallscan(x,xb1[z]-1,topptr,botptr,swplc,lplc);			else			{				j = x;				while (x < xb1[z])				{					n = l+pskyoff[lplc[x]>>m];					if (n != globalpicnum)					{						wallscan(j,x-1,topptr,botptr,swplc,lplc);						j = x;						globalpicnum = n;					}					x++;				}				if (j < x)					wallscan(j,x-1,topptr,botptr,swplc,lplc);			}			globalpicnum = l;			x = -1;		}	}	if (x >= 0)	{		l = globalpicnum; m = (picsiz[globalpicnum]&15);		globalpicnum = l+pskyoff[lplc[x]>>m];		if (((lplc[x]^lplc[xb2[bunchlast[bunch]]])>>m) == 0)			wallscan(x,xb2[bunchlast[bunch]],topptr,botptr,swplc,lplc);		else		{			j = x;			while (x <= xb2[bunchlast[bunch]])			{				n = l+pskyoff[lplc[x]>>m];				if (n != globalpicnum)				{					wallscan(j,x-1,topptr,botptr,swplc,lplc);					j = x;					globalpicnum = n;				}				x++;			}			if (j <= x)				wallscan(j,x,topptr,botptr,swplc,lplc);		}		globalpicnum = l;	}	globalhoriz = globalhorizbak;}#define BITSOFPRECISION 3  /* Don't forget to change this in A.ASM also! */static void grouscan (long dax1, long dax2, long sectnum, char dastat){	long i, j, l, x, y, dx, dy, wx, wy, y1, y2, daz;	long daslope, dasqr;	long shoffs, shinc, m1, m2, *mptr1, *mptr2, *nptr1, *nptr2;	walltype *wal;	sectortype *sec;	sec = &sector[sectnum];	if (dastat == 0)	{		if (globalposz <= getceilzofslope(sectnum,globalposx,globalposy))			return;  /* Back-face culling */		globalorientation = sec->ceilingstat;		globalpicnum = sec->ceilingpicnum;		globalshade = sec->ceilingshade;		globalpal = sec->ceilingpal;		daslope = sec->ceilingheinum;		daz = sec->ceilingz;	}	else	{		if (globalposz >= getflorzofslope(sectnum,globalposx,globalposy))			return;  /* Back-face culling */		globalorientation = sec->floorstat;		globalpicnum = sec->floorpicnum;		globalshade = sec->floorshade;		globalpal = sec->floorpal;		daslope = sec->floorheinum;		daz = sec->floorz;	}	if ((picanm[globalpicnum]&192) != 0) globalpicnum += animateoffs(globalpicnum,sectnum);	setgotpic(globalpicnum);	if ((tilesizx[globalpicnum] <= 0) || (tilesizy[globalpicnum] <= 0)) return;	if (waloff[globalpicnum] == 0) loadtile(globalpicnum);	wal = &wall[sec->wallptr];	wx = wall[wal->point2].x - wal->x;	wy = wall[wal->point2].y - wal->y;	dasqr = krecipasm(nsqrtasm(wx*wx+wy*wy));	i = mulscale21(daslope,dasqr);	wx *= i; wy *= i;	globalx = -mulscale19(singlobalang,xdimenrecip);

⌨️ 快捷键说明

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