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

📄 game.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 5 页
字号:
					setanimation(&wall[i].x,wall[i].x+dax2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].x,wall[wall[wallfind[j]].point2].x+dax2,4L,0L);				}				else if (day2 != 0)				{					day2 = wall[wall[wall[wallfind[j]].point2].point2].y;					day2 -= wall[wall[wallfind[j]].point2].y;					setanimation(&wall[wallfind[j]].y,wall[wallfind[j]].y+day2,4L,0L);					setanimation(&wall[i].y,wall[i].y+day2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].y,wall[wall[wallfind[j]].point2].y+day2,4L,0L);				}			}			else			{				i = wallfind[j]-1; if (i < startwall) i = endwall-1;				dax2 = ((wall[i].x+wall[wall[wallfind[j]].point2].x)>>1)-wall[wallfind[j]].x;				day2 = ((wall[i].y+wall[wall[wallfind[j]].point2].y)>>1)-wall[wallfind[j]].y;				if (dax2 != 0)				{					setanimation(&wall[wallfind[j]].x,centx,4L,0L);					setanimation(&wall[i].x,centx+dax2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].x,centx+dax2,4L,0L);				}				else if (day2 != 0)				{					setanimation(&wall[wallfind[j]].y,centy,4L,0L);					setanimation(&wall[i].y,centy+day2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].y,centy+day2,4L,0L);				}			}		}		wsayfollow("updowndr.wav",4096L-256L,256L,&centx,&centy,0);		wsayfollow("updowndr.wav",4096L+256L,256L,&centx,&centy,0);	}	if (datag == 13)  /* Swinging door */	{		for(i=0;i<swingcnt;i++)		{			if (swingsector[i] == dasector)			{				if (swinganginc[i] == 0)				{					if (swingang[i] == swingangclosed[i])					{						swinganginc[i] = swingangopendir[i];						wsayfollow("opendoor.wav",4096L+(krand()&511)-256,256L,&centx,&centy,0);					}					else						swinganginc[i] = -swingangopendir[i];				}				else					swinganginc[i] = -swinganginc[i];				for(j=1;j<=3;j++)				{					setinterpolation(&wall[swingwall[i][j]].x);					setinterpolation(&wall[swingwall[i][j]].y);				}			}		}	}	if (datag == 16)  /* True sideways double-sliding door */	{		 /* get 2 closest line segments to center (dax, day) */		wallfind[0] = -1;		wallfind[1] = -1;		for(i=startwall;i<endwall;i++)			if (wall[i].lotag == 6)			{				if (wallfind[0] == -1)					wallfind[0] = i;				else					wallfind[1] = i;			}		for(j=0;j<2;j++)		{			if ((((wall[wallfind[j]].x+wall[wall[wallfind[j]].point2].x)>>1) == centx) && (((wall[wallfind[j]].y+wall[wall[wallfind[j]].point2].y)>>1) == centy))			{     /* door was closed */					/* find what direction door should open */				i = wallfind[j]-1; if (i < startwall) i = endwall-1;				dax2 = wall[i].x-wall[wallfind[j]].x;				day2 = wall[i].y-wall[wallfind[j]].y;				if (dax2 != 0)				{					dax2 = wall[wall[wall[wall[wallfind[j]].point2].point2].point2].x;					dax2 -= wall[wall[wall[wallfind[j]].point2].point2].x;					setanimation(&wall[wallfind[j]].x,wall[wallfind[j]].x+dax2,4L,0L);					setanimation(&wall[i].x,wall[i].x+dax2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].x,wall[wall[wallfind[j]].point2].x+dax2,4L,0L);					setanimation(&wall[wall[wall[wallfind[j]].point2].point2].x,wall[wall[wall[wallfind[j]].point2].point2].x+dax2,4L,0L);				}				else if (day2 != 0)				{					day2 = wall[wall[wall[wall[wallfind[j]].point2].point2].point2].y;					day2 -= wall[wall[wall[wallfind[j]].point2].point2].y;					setanimation(&wall[wallfind[j]].y,wall[wallfind[j]].y+day2,4L,0L);					setanimation(&wall[i].y,wall[i].y+day2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].y,wall[wall[wallfind[j]].point2].y+day2,4L,0L);					setanimation(&wall[wall[wall[wallfind[j]].point2].point2].y,wall[wall[wall[wallfind[j]].point2].point2].y+day2,4L,0L);				}			}			else			{    /* door was not closed */				i = wallfind[j]-1; if (i < startwall) i = endwall-1;				dax2 = wall[i].x-wall[wallfind[j]].x;				day2 = wall[i].y-wall[wallfind[j]].y;				if (dax2 != 0)				{					setanimation(&wall[wallfind[j]].x,centx,4L,0L);					setanimation(&wall[i].x,centx+dax2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].x,centx,4L,0L);					setanimation(&wall[wall[wall[wallfind[j]].point2].point2].x,centx+dax2,4L,0L);				}				else if (day2 != 0)				{					setanimation(&wall[wallfind[j]].y,centy,4L,0L);					setanimation(&wall[i].y,centy+day2,4L,0L);					setanimation(&wall[wall[wallfind[j]].point2].y,centy,4L,0L);					setanimation(&wall[wall[wall[wallfind[j]].point2].point2].y,centy+day2,4L,0L);				}			}		}		wsayfollow("updowndr.wav",4096L-64L,256L,&centx,&centy,0);		wsayfollow("updowndr.wav",4096L+64L,256L,&centx,&centy,0);	}}	/*     * New movesprite using getzrange.  Note that I made the getzrange	 * parameters global (&globhiz,&globhihit,&globloz,&globlohit) so they	 * don't need to be passed everywhere.  Also this should make this	 * movesprite function compatible with the older movesprite functions.     */short movesprite(short spritenum, long dx, long dy, long dz, long ceildist, long flordist, long clipmask){	long daz, zoffs;	short retval, dasectnum, datempshort;	spritetype *spr;	spr = &sprite[spritenum];	if ((spr->cstat&128) == 0)		zoffs = -((tilesizy[spr->picnum]*spr->yrepeat)<<1);	else		zoffs = 0;	dasectnum = spr->sectnum;  /* Can't modify sprite sectors directly becuase of linked lists */	daz = spr->z+zoffs;  /* Must do this if not using the new centered centering (of course) */	retval = clipmove(&spr->x,&spr->y,&daz,&dasectnum,dx,dy,							((long)spr->clipdist)<<2,ceildist,flordist,clipmask);	if (dasectnum < 0) retval = -1;	if ((dasectnum != spr->sectnum) && (dasectnum >= 0))		changespritesect(spritenum,dasectnum);		/*         * Set the blocking bit to 0 temporarly so getzrange doesn't pick up		 * its own sprite         */	datempshort = spr->cstat; spr->cstat &= ~1;	getzrange(spr->x,spr->y,spr->z-1,spr->sectnum,				 &globhiz,&globhihit,&globloz,&globlohit,				 ((long)spr->clipdist)<<2,clipmask);	spr->cstat = datempshort;	daz = spr->z+zoffs + dz;	if ((daz <= globhiz) || (daz > globloz))	{		if (retval != 0) return(retval);		return(16384+dasectnum);	}	spr->z = daz-zoffs;	return(retval);}void shootgun(short snum, long x, long y, long z,			short daang, long dahoriz, short dasectnum, char guntype){	short hitsect, hitwall, hitsprite, daang2;	long j, daz2, hitx, hity, hitz;	switch(guntype)	{		case 0:    /* Shoot chain gun */			daang2 = ((daang + (krand()&31)-16)&2047);			daz2 = ((100-dahoriz)*2000) + ((krand()-32768)>>1);			hitscan(x,y,z,dasectnum,                   /* Start position */				sintable[(daang2+512)&2047],            /* X vector of 3D ang */				sintable[daang2&2047],                  /* Y vector of 3D ang */				daz2,                                   /* Z vector of 3D ang */				&hitsect,&hitwall,&hitsprite,&hitx,&hity,&hitz,CLIPMASK1);			if (wall[hitwall].picnum == KENPICTURE)			{				if (waloff[MAXTILES-1] != 0) wall[hitwall].picnum = MAXTILES-1;				wsayfollow("hello.wav",4096L+(krand()&127)-64,256L,&wall[hitwall].x,&wall[hitwall].y,0);			}			else if (((hitwall < 0) && (hitsprite < 0) && (hitz >= z) && ((sector[hitsect].floorpicnum == SLIME) || (sector[hitsect].floorpicnum == FLOORMIRROR))) || ((hitwall >= 0) && (wall[hitwall].picnum == SLIME)))			{    /* If you shoot slime, make a splash */				wsayfollow("splash.wav",4096L+(krand()&511)-256,256L,&hitx,&hity,0);				spawnsprite(j,hitx,hity,hitz,2,0,0,32,64,64,0,0,SPLASH,daang,					0,0,0,snum+4096,hitsect,4,63,0,0); /* 63=time left for splash */			}			else			{				wsayfollow("shoot.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0);				if ((hitsprite >= 0) && (sprite[hitsprite].statnum < MAXSTATUS))					switch(sprite[hitsprite].picnum)					{						case BROWNMONSTER:							if (sprite[hitsprite].lotag > 0) sprite[hitsprite].lotag -= 10;							if (sprite[hitsprite].lotag > 0)							{								wsayfollow("hurt.wav",4096L+(krand()&511)-256,256L,&hitx,&hity,0);								if (sprite[hitsprite].lotag <= 25)									sprite[hitsprite].cstat |= 2;							}							else							{								wsayfollow("mondie.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0);								sprite[hitsprite].z += ((tilesizy[sprite[hitsprite].picnum]*sprite[hitsprite].yrepeat)<<1);								sprite[hitsprite].picnum = GIFTBOX;								sprite[hitsprite].cstat &= ~0x83;    /* Should not clip, foot-z */								changespritestat(hitsprite,12);								spawnsprite(j,hitx,hity,hitz+(32<<8),0,-4,0,32,64,64,									0,0,EXPLOSION,daang,0,0,0,snum+4096,									hitsect,5,31,0,0);							}							break;						case EVILAL:							wsayfollow("blowup.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0);							sprite[hitsprite].picnum = EVILALGRAVE;							sprite[hitsprite].cstat = 0;							sprite[hitsprite].xvel = (krand()&255)-128;							sprite[hitsprite].yvel = (krand()&255)-128;							sprite[hitsprite].zvel = (krand()&4095)-3072;							changespritestat(hitsprite,9);							spawnsprite(j,hitx,hity,hitz+(32<<8),0,-4,0,32,64,64,0,								0,EXPLOSION,daang,0,0,0,snum+4096,hitsect,5,31,0,0);								 /* 31=time left for explosion */							break;						case PLAYER:							for(j=connecthead;j>=0;j=connectpoint2[j])								if (playersprite[j] == hitsprite)								{									wsayfollow("ouch.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0);									changehealth(j,-10);									break;								}							break;					}				spawnsprite(j,hitx,hity,hitz+(8<<8),2,-4,0,32,16,16,0,0,					EXPLOSION,daang,0,0,0,snum+4096,hitsect,3,63,0,0);					/*                     * Sprite starts out with center exactly on wall.					 *  This moves it back enough to see it at all angles.                     */				movesprite((short)j,-(((long)sintable[(512+daang)&2047]*TICSPERFRAME)<<4),-(((long)sintable[daang]*TICSPERFRAME)<<4),0L,4L<<8,4L<<8,CLIPMASK1);			}			break;		case 1:    /* Shoot silver sphere bullet */			spawnsprite(j,x,y,z,1+128,0,0,16,64,64,0,0,BULLET,daang,						  sintable[(daang+512)&2047]>>5,sintable[daang&2047]>>5,						  (100-dahoriz)<<6,snum+4096,dasectnum,6,0,0,0);			wsayfollow("shoot2.wav",4096L+(krand()&127)-64,128L,&sprite[j].x,&sprite[j].y,1);			break;		case 2:    /* Shoot bomb */		  spawnsprite(j,x,y,z,128,0,0,12,16,16,0,0,BOMB,daang,			  sintable[(daang+512)&2047]*5>>8,sintable[daang&2047]*5>>8,			  (80-dahoriz)<<6,snum+4096,dasectnum,6,0,0,0);			wsayfollow("shoot3.wav",4096L+(krand()&127)-64,192L,&sprite[j].x,&sprite[j].y,1);			break;		case 3:    /* Shoot missile (Andy did this) */			spawnsprite(j,x,y,z,1+128,0,0,16,32,32,0,0,MISSILE,daang,						  sintable[(daang+512)&2047]>>4,sintable[daang&2047]>>4,						  (100-dahoriz)<<7,snum+4096,dasectnum,6,0,0,0);			wsayfollow("shoot3.wav",4096L+(krand()&127)-64,192L,&sprite[j].x,&sprite[j].y,1);			break;		case 4:    /* Shoot grabber (Andy did this) */			spawnsprite(j,x,y,z,1+128,0,0,16,64,64,0,0,GRABBER,daang,						  sintable[(daang+512)&2047]>>5,sintable[daang&2047]>>5,						  (100-dahoriz)<<6,snum+4096,dasectnum,6,0,0,0);			wsayfollow("shoot4.wav",4096L+(krand()&127)-64,128L,&sprite[j].x,&sprite[j].y,1);			break;	}}void operatesprite(short dasprite){	long datag;	datag = sprite[dasprite].lotag;	if (datag == 2)    /* A sprite that shoots a bomb */	{		shootgun(dasprite,					sprite[dasprite].x,sprite[dasprite].y,sprite[dasprite].z,					sprite[dasprite].ang,100L,sprite[dasprite].sectnum,2);	}}void checktouchsprite(short snum, short sectnum){	long i, nexti;	if ((sectnum < 0) || (sectnum >= numsectors)) return;	for(i=headspritesect[sectnum];i>=0;i=nexti)	{		nexti = nextspritesect[i];		if (sprite[i].cstat&0x8000) continue;		if ((klabs(posx[snum]-sprite[i].x)+klabs(posy[snum]-sprite[i].y) < 512) && (klabs((posz[snum]>>8)-((sprite[i].z>>8)-(tilesizy[sprite[i].picnum]>>1))) <= 40))		{			switch(sprite[i].picnum)			{				case COIN:					wsayfollow("getstuff.wav",4096L+(krand()&127)-64,192L,&sprite[i].x,&sprite[i].y,0);					changehealth(snum,5);					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 120*60;						changespritestat((short)i,11);					}					break;				case DIAMONDS:					wsayfollow("getstuff.wav",4096L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0);					changehealth(snum,15);					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 120*120;						changespritestat((short)i,11);					}					break;				case COINSTACK:					wsayfollow("getstuff.wav",4096L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0);					changehealth(snum,25);					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 120*180;						changespritestat((short)i,11);					}					break;				case GIFTBOX:					wsayfollow("getstuff.wav",4096L+(krand()&127)+256-mulscale4(sprite[i].xrepeat,sprite[i].yrepeat),208L,&sprite[i].x,&sprite[i].y,0);					changehealth(snum,max(mulscale8(sprite[i].xrepeat,sprite[i].yrepeat),1));					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 90*(sprite[i].xrepeat+sprite[i].yrepeat);						changespritestat((short)i,11);					}					break;				case CANNON:					wsayfollow("getstuff.wav",3584L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0);					if (snum == myconnectindex) keystatus[4] = 1;					changenumbombs(snum,((sprite[i].xrepeat+sprite[i].yrepeat)>>1));					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 60*(sprite[i].xrepeat+sprite[i].yrepeat);						changespritestat((short)i,11);					}					break;				case LAUNCHER:					wsayfollow("getstuff.wav",3584L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0);					if (snum == myconnectindex) keystatus[5] = 1;					changenummissiles(snum,((sprite[i].xrepeat+sprite[i].yrepeat)>>1));					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 90*(sprite[i].xrepeat+sprite[i].yrepeat);						changespritestat((short)i,11);					}					break;				case GRABCANNON:					wsayfollow("getstuff.wav",3584L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0);					if (snum == myconnectindex) keystatus[6] = 1;					changenumgrabbers(snum,((sprite[i].xrepeat+sprite[i].yrepeat)>>1));					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 120*(sprite[i].xrepeat+sprite[i].yrepeat);						changespritestat((short)i,11);					}					break;				case AIRPLANE:					wsayfollow("getstuff.wav",4096L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0);					if (flytime[snum] < lockclock) flytime[snum] = lockclock;					flytime[snum] += 60*(sprite[i].xrepeat+sprite[i].yrepeat);					drawstatusflytime(snum);					if (sprite[i].statnum == 12) deletesprite((short)i);					else {						sprite[i].cstat |= 0x8000;						sprite[i].extra = 120*(sprite[i].xrepeat+sprite[i].yrepeat);						changespritestat((short)i,11);			

⌨️ 快捷键说明

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