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

📄 game.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 5 页
字号:
	curipos[numinterpolations] = posptr;	oldipos[numinterpolations] = *posptr;	numinterpolations++;}void stopinterpolation(long *posptr){	long i;	for(i=numinterpolations-1;i>=startofdynamicinterpolations;i--)		if (curipos[i] == posptr)		{			numinterpolations--;			oldipos[i] = oldipos[numinterpolations];			bakipos[i] = bakipos[numinterpolations];			curipos[i] = curipos[numinterpolations];		}}void updateinterpolations()  /* Stick at beginning of domovethings */{	long i;	for(i=numinterpolations-1;i>=0;i--) oldipos[i] = *curipos[i];}void dointerpolations()       /* Stick at beginning of drawscreen */{	long i, j, odelta, ndelta;	ndelta = 0; j = 0;	for(i=numinterpolations-1;i>=0;i--)	{		bakipos[i] = *curipos[i];		odelta = ndelta; ndelta = (*curipos[i])-oldipos[i];		if (odelta != ndelta) j = mulscale16(ndelta,smoothratio);		*curipos[i] = oldipos[i]+j;	}}void restoreinterpolations()  /* Stick at end of drawscreen */{	long i;	for(i=numinterpolations-1;i>=0;i--) *curipos[i] = bakipos[i];}void searchmap(short startsector){	long i, j, dasect, splc, send, startwall, endwall;	short dapic;	walltype *wal;	if ((startsector < 0) || (startsector >= numsectors)) return;	for(i=0;i<(MAXSECTORS>>3);i++) show2dsector[i] = 0;	for(i=0;i<(MAXWALLS>>3);i++) show2dwall[i] = 0;	for(i=0;i<(MAXSPRITES>>3);i++) show2dsprite[i] = 0;	automapping = 0;		/* Search your area recursively & set all show2dsector/show2dwalls */	tempshort[0] = startsector;	show2dsector[startsector>>3] |= (1<<(startsector&7));	dapic = sector[startsector].ceilingpicnum;	if (waloff[dapic] == 0) loadtile(dapic);	dapic = sector[startsector].floorpicnum;	if (waloff[dapic] == 0) loadtile(dapic);	for(splc=0,send=1;splc<send;splc++)	{		dasect = tempshort[splc];		startwall = sector[dasect].wallptr;		endwall = startwall + sector[dasect].wallnum;		for(i=startwall,wal=&wall[startwall];i<endwall;i++,wal++)		{			show2dwall[i>>3] |= (1<<(i&7));			dapic = wall[i].picnum;			if (waloff[dapic] == 0) loadtile(dapic);			dapic = wall[i].overpicnum;			if (((dapic&0xfffff000) == 0) && (waloff[dapic] == 0)) loadtile(dapic);			j = wal->nextsector;			if ((j >= 0) && ((show2dsector[j>>3]&(1<<(j&7))) == 0))			{				show2dsector[j>>3] |= (1<<(j&7));				dapic = sector[j].ceilingpicnum;				if (waloff[dapic] == 0) loadtile(dapic);				dapic = sector[j].floorpicnum;				if (waloff[dapic] == 0) loadtile(dapic);				tempshort[send++] = (short)j;			}		}		for(i=headspritesect[dasect];i>=0;i=nextspritesect[i])		{			show2dsprite[i>>3] |= (1<<(i&7));			dapic = sprite[i].picnum;			if (waloff[dapic] == 0) loadtile(dapic);		}	}}void prepareboard(char *daboardfilename){	short startwall, endwall, dasector;	/*long i, j, k, s, dax, day, daz, dax2, day2;*/	long i, j, k=0, s, dax, day, dax2, day2;	getmessageleng = 0;	typemessageleng = 0;	randomseed = 17L;		/* Clear (do)animation's list */	animatecnt = 0;	typemode = 0;	locselectedgun = 0;	locselectedgun2 = 0;	if (loadboard(daboardfilename,&posx[0],&posy[0],&posz[0],&ang[0],&cursectnum[0]) == -1)	{		musicoff();		uninitmultiplayers();		uninittimer();		uninitkeys();		uninitengine();		uninitsb();		uninitgroupfile();		setvmode(0x3);        /* Set back to text mode */		printf("Board not found\n");		exit(0);	}	setup3dscreen();	for(i=0;i<MAXPLAYERS;i++)	{		posx[i] = posx[0];		posy[i] = posy[0];		posz[i] = posz[0];		ang[i] = ang[0];		cursectnum[i] = cursectnum[0];		ocursectnum[i] = cursectnum[0];		horiz[i] = 100;		lastchaingun[i] = 0;		health[i] = 100;		dimensionmode[i] = 3;		numbombs[i] = 0;		numgrabbers[i] = 0;		nummissiles[i] = 0;		flytime[i] = 0L;		zoom[i] = 768L;		deaths[i] = 0L;		playersprite[i] = -1;		screensize = xdim;		oposx[i] = posx[0];		oposy[i] = posy[0];		oposz[i] = posz[0];		ohoriz[i] = horiz[0];		ozoom[i] = zoom[0];		oang[i] = ang[0];	}	myx = omyx = posx[myconnectindex];	myy = omyy = posy[myconnectindex];	myz = omyz = posz[myconnectindex];	myhoriz = omyhoriz = horiz[myconnectindex];	myang = omyang = ang[myconnectindex];	mycursectnum = cursectnum[myconnectindex];	myzvel = 0;	movefifoplc = fakemovefifoplc = 0;	syncvalhead = 0L; othersyncvalhead = 0L;	syncvaltottail = 0L; syncvaltail = 0L;	numinterpolations = 0;	clearbufbyte(&oloc,sizeof(input),0L);	for(i=0;i<MAXPLAYERS;i++)	{		movefifoend[i] = 0;		clearbufbyte(&ffsync[i],sizeof(input),0L);		clearbufbyte(&_sync[i],sizeof(input),0L);		clearbufbyte(&osync[i],sizeof(input),0L);	}		/* Scan sector tags */	for(i=0;i<MAXPLAYERS;i++)	{		waterfountainwall[i] = -1;		waterfountaincnt[i] = 0;	}	slimesoundcnt[i] = 0;	warpsectorcnt = 0;      /* Make a list of warping sectors */	xpanningsectorcnt = 0;  /* Make a list of wall x-panning sectors */	floorpanningcnt = 0;    /* Make a list of slime sectors */	dragsectorcnt = 0;      /* Make a list of moving platforms */	swingcnt = 0;           /* Make a list of swinging doors */	revolvecnt = 0;         /* Make a list of revolving doors */	subwaytrackcnt = 0;     /* Make a list of subways */	floormirrorcnt = 0;	tilesizx[FLOORMIRROR] = 0;	tilesizy[FLOORMIRROR] = 0;	for(i=0;i<numsectors;i++)	{		switch(sector[i].lotag)		{			case 4:				floorpanninglist[floorpanningcnt++] = i;				break;			case 10:				warpsectorlist[warpsectorcnt++] = i;				break;			case 11:				xpanningsectorlist[xpanningsectorcnt++] = i;				break;			case 12:				dasector = i;				dax = 0x7fffffff;				day = 0x7fffffff;				dax2 = 0x80000000;				day2 = 0x80000000;				startwall = sector[i].wallptr;				endwall = startwall+sector[i].wallnum;				for(j=startwall;j<endwall;j++)				{					if (wall[j].x < dax) dax = wall[j].x;					if (wall[j].y < day) day = wall[j].y;					if (wall[j].x > dax2) dax2 = wall[j].x;					if (wall[j].y > day2) day2 = wall[j].y;					if (wall[j].lotag == 3) k = j;				}				if (wall[k].x == dax) dragxdir[dragsectorcnt] = -16;				if (wall[k].y == day) dragydir[dragsectorcnt] = -16;				if (wall[k].x == dax2) dragxdir[dragsectorcnt] = 16;				if (wall[k].y == day2) dragydir[dragsectorcnt] = 16;				dasector = wall[startwall].nextsector;				dragx1[dragsectorcnt] = 0x7fffffff;				dragy1[dragsectorcnt] = 0x7fffffff;				dragx2[dragsectorcnt] = 0x80000000;				dragy2[dragsectorcnt] = 0x80000000;				startwall = sector[dasector].wallptr;				endwall = startwall+sector[dasector].wallnum;				for(j=startwall;j<endwall;j++)				{					if (wall[j].x < dragx1[dragsectorcnt]) dragx1[dragsectorcnt] = wall[j].x;					if (wall[j].y < dragy1[dragsectorcnt]) dragy1[dragsectorcnt] = wall[j].y;					if (wall[j].x > dragx2[dragsectorcnt]) dragx2[dragsectorcnt] = wall[j].x;					if (wall[j].y > dragy2[dragsectorcnt]) dragy2[dragsectorcnt] = wall[j].y;					setinterpolation(&sector[dasector].floorz);					setinterpolation(&wall[j].x);					setinterpolation(&wall[j].y);					setinterpolation(&wall[wall[j].nextwall].x);					setinterpolation(&wall[wall[j].nextwall].y);				}				dragx1[dragsectorcnt] += (wall[sector[i].wallptr].x-dax);				dragy1[dragsectorcnt] += (wall[sector[i].wallptr].y-day);				dragx2[dragsectorcnt] -= (dax2-wall[sector[i].wallptr].x);				dragy2[dragsectorcnt] -= (day2-wall[sector[i].wallptr].y);				dragfloorz[dragsectorcnt] = sector[i].floorz;				dragsectorlist[dragsectorcnt++] = i;				break;			case 13:				startwall = sector[i].wallptr;				endwall = startwall+sector[i].wallnum;				for(j=startwall;j<endwall;j++)				{					if (wall[j].lotag == 4)					{						k = wall[wall[wall[wall[j].point2].point2].point2].point2;						if ((wall[j].x == wall[k].x) && (wall[j].y == wall[k].y))						{     /* Door opens counterclockwise */							swingwall[swingcnt][0] = j;							swingwall[swingcnt][1] = wall[j].point2;							swingwall[swingcnt][2] = wall[wall[j].point2].point2;							swingwall[swingcnt][3] = wall[wall[wall[j].point2].point2].point2;							swingangopen[swingcnt] = 1536;							swingangclosed[swingcnt] = 0;							swingangopendir[swingcnt] = -1;						}						else						{     /* Door opens clockwise */							swingwall[swingcnt][0] = wall[j].point2;							swingwall[swingcnt][1] = j;							swingwall[swingcnt][2] = lastwall(j);							swingwall[swingcnt][3] = lastwall(swingwall[swingcnt][2]);							swingwall[swingcnt][4] = lastwall(swingwall[swingcnt][3]);							swingangopen[swingcnt] = 512;							swingangclosed[swingcnt] = 0;							swingangopendir[swingcnt] = 1;						}						for(k=0;k<4;k++)						{							swingx[swingcnt][k] = wall[swingwall[swingcnt][k]].x;							swingy[swingcnt][k] = wall[swingwall[swingcnt][k]].y;						}						swingsector[swingcnt] = i;						swingang[swingcnt] = swingangclosed[swingcnt];						swinganginc[swingcnt] = 0;						swingcnt++;					}				}				break;			case 14:				startwall = sector[i].wallptr;				endwall = startwall+sector[i].wallnum;				dax = 0L;				day = 0L;				for(j=startwall;j<endwall;j++)				{					dax += wall[j].x;					day += wall[j].y;				}				revolvepivotx[revolvecnt] = dax / (endwall-startwall);				revolvepivoty[revolvecnt] = day / (endwall-startwall);				k = 0;				for(j=startwall;j<endwall;j++)				{					revolvex[revolvecnt][k] = wall[j].x;					revolvey[revolvecnt][k] = wall[j].y;					setinterpolation(&wall[j].x);					setinterpolation(&wall[j].y);					setinterpolation(&wall[wall[j].nextwall].x);					setinterpolation(&wall[wall[j].nextwall].y);					k++;				}				revolvesector[revolvecnt] = i;				revolveang[revolvecnt] = 0;				revolvecnt++;				break;			case 15:				subwaytracksector[subwaytrackcnt][0] = i;				subwaystopcnt[subwaytrackcnt] = 0;				dax = 0x7fffffff;				day = 0x7fffffff;				dax2 = 0x80000000;				day2 = 0x80000000;				startwall = sector[i].wallptr;				endwall = startwall+sector[i].wallnum;				for(j=startwall;j<endwall;j++)				{					if (wall[j].x < dax) dax = wall[j].x;					if (wall[j].y < day) day = wall[j].y;					if (wall[j].x > dax2) dax2 = wall[j].x;					if (wall[j].y > day2) day2 = wall[j].y;				}				for(j=startwall;j<endwall;j++)				{					if (wall[j].lotag == 5)					{						if ((wall[j].x > dax) && (wall[j].y > day) && (wall[j].x < dax2) && (wall[j].y < day2))						{							subwayx[subwaytrackcnt] = wall[j].x;						}						else						{							subwaystop[subwaytrackcnt][subwaystopcnt[subwaytrackcnt]] = wall[j].x;							subwaystopcnt[subwaytrackcnt]++;						}					}				}				for(j=1;j<subwaystopcnt[subwaytrackcnt];j++)					for(k=0;k<j;k++)						if (subwaystop[subwaytrackcnt][j] < subwaystop[subwaytrackcnt][k])						{							s = subwaystop[subwaytrackcnt][j];							subwaystop[subwaytrackcnt][j] = subwaystop[subwaytrackcnt][k];							subwaystop[subwaytrackcnt][k] = s;						}				subwaygoalstop[subwaytrackcnt] = 0;				for(j=0;j<subwaystopcnt[subwaytrackcnt];j++)					if (klabs(subwaystop[subwaytrackcnt][j]-subwayx[subwaytrackcnt]) < klabs(subwaystop[subwaytrackcnt][subwaygoalstop[subwaytrackcnt]]-subwayx[subwaytrackcnt]))						subwaygoalstop[subwaytrackcnt] = j;				subwaytrackx1[subwaytrackcnt] = dax;				subwaytracky1[subwaytrackcnt] = day;				subwaytrackx2[subwaytrackcnt] = dax2;				subwaytracky2[subwaytrackcnt] = day2;				subwaynumsectors[subwaytrackcnt] = 1;				for(j=0;j<numsectors;j++)					if (j != i)					{						startwall = sector[j].wallptr;						if (wall[startwall].x > subwaytrackx1[subwaytrackcnt])							if (wall[startwall].y > subwaytracky1[subwaytrackcnt])								if (wall[startwall].x < subwaytrackx2[subwaytrackcnt])									if (wall[startwall].y < subwaytracky2[subwaytrackcnt])									{										if (sector[j].floorz != sector[i].floorz)										{

⌨️ 快捷键说明

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