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

📄 playern.c

📁 game duke3d source
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (fightdist)
		{
			j = totalclock+snum*13468;
			i = sintable[(j<<6)&2047];
			i += sintable[((j+4245)<<5)&2047];
			i += sintable[((j+6745)<<4)&2047];
			i += sintable[((j+15685)<<3)&2047];
			dx = sintable[(sprite[ps[goalplayer[snum]].i].ang+512)&2047];
			dy = sintable[sprite[ps[goalplayer[snum]].i].ang&2047];
			if ((x1-x2)*dy > (y1-y2)*dx) i += 8192; else i -= 8192;
			syn->fvel += ((sintable[(daang+1024)&2047]*i)>>17);
			syn->svel += ((sintable[(daang+512)&2047]*i)>>17);
		}

		syn->avel = min(max((((daang+1024-damyang)&2047)-1024)>>1,-127),127);
		syn->horz = min(max((zang-p->horiz)>>1,-MAXHORIZ),MAXHORIZ);
		syn->bits |= (1<<23);
		return;
	}

	goalsect[snum] = -1;
	if (goalsect[snum] < 0)
	{
		goalwall[snum] = -1;
		startsect = sprite[p->i].sectnum;
		endsect = sprite[ps[goalplayer[snum]].i].sectnum;

		clearbufbyte(show2dsector,(MAXSECTORS+7)>>3,0L);
		searchsect[0] = startsect;
		searchparent[0] = -1;
		show2dsector[startsect>>3] |= (1<<(startsect&7));
		for(splc=0,send=1;splc<send;splc++)
		{
			startwall = sector[searchsect[splc]].wallptr;
			endwall = startwall + sector[searchsect[splc]].wallnum;
			for(i=startwall,wal=&wall[startwall];i<endwall;i++,wal++)
			{
				j = wal->nextsector; if (j < 0) continue;

				dx = ((wall[wal->point2].x+wal->x)>>1);
				dy = ((wall[wal->point2].y+wal->y)>>1);
				if ((getceilzofslope(j,dx,dy) > getflorzofslope(j,dx,dy)-(28<<8)) && ((sector[j].lotag < 15) || (sector[j].lotag > 22)))
					continue;
				if (getflorzofslope(j,dx,dy) < getflorzofslope(searchsect[splc],dx,dy)-(72<<8))
					continue;
				if ((show2dsector[j>>3]&(1<<(j&7))) == 0)
				{
					show2dsector[j>>3] |= (1<<(j&7));
					searchsect[send] = (short)j;
					searchparent[send] = (short)splc;
					send++;
					if (j == endsect)
					{
						clearbufbyte(show2dsector,(MAXSECTORS+7)>>3,0L);
						for(k=send-1;k>=0;k=searchparent[k])
							show2dsector[searchsect[k]>>3] |= (1<<(searchsect[k]&7));

						for(k=send-1;k>=0;k=searchparent[k])
							if (!searchparent[k]) break;

						goalsect[snum] = searchsect[k];
						startwall = sector[goalsect[snum]].wallptr;
						endwall = startwall+sector[goalsect[snum]].wallnum;
						x3 = y3 = 0;
						for(i=startwall;i<endwall;i++)
						{
							x3 += wall[i].x;
							y3 += wall[i].y;
						}
						x3 /= (endwall-startwall);
						y3 /= (endwall-startwall);

						startwall = sector[startsect].wallptr;
						endwall = startwall+sector[startsect].wallnum;
						l = 0; k = startwall;
						for(i=startwall;i<endwall;i++)
						{
							if (wall[i].nextsector != goalsect[snum]) continue;
							dx = wall[wall[i].point2].x-wall[i].x;
							dy = wall[wall[i].point2].y-wall[i].y;

							//if (dx*(y1-wall[i].y) <= dy*(x1-wall[i].x))
							//   if (dx*(y2-wall[i].y) >= dy*(x2-wall[i].x))
									if ((x3-x1)*(wall[i].y-y1) <= (y3-y1)*(wall[i].x-x1))
										if ((x3-x1)*(wall[wall[i].point2].y-y1) >= (y3-y1)*(wall[wall[i].point2].x-x1))
											{ k = i; break; }

							dist = ksqrt(dx*dx+dy*dy);
							if (dist > l) { l = dist; k = i; }
						}
						goalwall[snum] = k;
						daang = ((getangle(wall[wall[k].point2].x-wall[k].x,wall[wall[k].point2].y-wall[k].y)+1536)&2047);
						goalx[snum] = ((wall[k].x+wall[wall[k].point2].x)>>1)+(sintable[(daang+512)&2047]>>8);
						goaly[snum] = ((wall[k].y+wall[wall[k].point2].y)>>1)+(sintable[daang&2047]>>8);
						goalz[snum] = sector[goalsect[snum]].floorz-(32<<8);
						break;
					}
				}
			}

			for(i=headspritesect[searchsect[splc]];i>=0;i=nextspritesect[i])
				if (sprite[i].lotag == 7)
				{
					j = sprite[sprite[i].owner].sectnum;
					if ((show2dsector[j>>3]&(1<<(j&7))) == 0)
					{
						show2dsector[j>>3] |= (1<<(j&7));
						searchsect[send] = (short)j;
						searchparent[send] = (short)splc;
						send++;
						if (j == endsect)
						{
							clearbufbyte(show2dsector,(MAXSECTORS+7)>>3,0L);
							for(k=send-1;k>=0;k=searchparent[k])
								show2dsector[searchsect[k]>>3] |= (1<<(searchsect[k]&7));

							for(k=send-1;k>=0;k=searchparent[k])
								if (!searchparent[k]) break;

							goalsect[snum] = searchsect[k];
							startwall = sector[startsect].wallptr;
							endwall = startwall+sector[startsect].wallnum;
							l = 0; k = startwall;
							for(i=startwall;i<endwall;i++)
							{
								dx = wall[wall[i].point2].x-wall[i].x;
								dy = wall[wall[i].point2].y-wall[i].y;
								dist = ksqrt(dx*dx+dy*dy);
								if ((wall[i].nextsector == goalsect[snum]) && (dist > l))
									{ l = dist; k = i; }
							}
							goalwall[snum] = k;
							daang = ((getangle(wall[wall[k].point2].x-wall[k].x,wall[wall[k].point2].y-wall[k].y)+1536)&2047);
							goalx[snum] = ((wall[k].x+wall[wall[k].point2].x)>>1)+(sintable[(daang+512)&2047]>>8);
							goaly[snum] = ((wall[k].y+wall[wall[k].point2].y)>>1)+(sintable[daang&2047]>>8);
							goalz[snum] = sector[goalsect[snum]].floorz-(32<<8);
							break;
						}
					}
				}
			if (goalwall[snum] >= 0) break;
		}
	}

	if ((goalsect[snum] < 0) || (goalwall[snum] < 0))
	{
		if (goalsprite[snum] < 0)
		{
			for(k=0;k<4;k++)
			{
				i = (rand()%numsectors);
				for(j=headspritesect[i];j>=0;j=nextspritesect[j])
				{
					if ((sprite[j].xrepeat <= 0) || (sprite[j].yrepeat <= 0)) continue;
					if (getspritescore(snum,sprite[j].picnum) <= 0) continue;
					if (cansee(x1,y1,z1-(32<<8),damysect,sprite[j].x,sprite[j].y,sprite[j].z-(4<<8),i))
						{ goalx[snum] = sprite[j].x; goaly[snum] = sprite[j].y; goalz[snum] = sprite[j].z; goalsprite[snum] = j; break; }
				}
			}
		}
		x2 = goalx[snum];
		y2 = goaly[snum];
		dist = ksqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); if (!dist) return;
		daang = getangle(x2-x1,y2-y1);
		syn->fvel += (x2-x1)*2047/dist;
		syn->svel += (y2-y1)*2047/dist;
		syn->avel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-127),127);
	}
	else
		goalsprite[snum] = -1;

	x3 = p->posx; y3 = p->posy; z3 = p->posz; dasect = p->cursectnum;
	i = clipmove(&x3,&y3,&z3,&dasect,p->posxv,p->posyv,164L,4L<<8,4L<<8,CLIPMASK0);
	if (!i)
	{
		x3 = p->posx; y3 = p->posy; z3 = p->posz+(24<<8); dasect = p->cursectnum;
		i = clipmove(&x3,&y3,&z3,&dasect,p->posxv,p->posyv,164L,4L<<8,4L<<8,CLIPMASK0);
	}
	if (i)
	{
		clipmovecount[snum]++;

		j = 0;
		if ((i&0xc000) == 32768)  //Hit a wall (49152 for sprite)
			if (wall[i&(MAXWALLS-1)].nextsector >= 0)
			{
				if (getflorzofslope(wall[i&(MAXWALLS-1)].nextsector,p->posx,p->posy) <= p->posz+(24<<8)) j |= 1;
				if (getceilzofslope(wall[i&(MAXWALLS-1)].nextsector,p->posx,p->posy) >= p->posz-(24<<8)) j |= 2;
			}
		if ((i&0xc000) == 49152) j = 1;
		if (j&1) if (clipmovecount[snum] == 4) syn->bits |= (1<<0);
		if (j&2) syn->bits |= (1<<1);

			//Strafe attack
		daang = getangle(x2-x1,y2-y1);
		if ((i&0xc000) == 32768)
			daang = getangle(wall[wall[i&(MAXWALLS-1)].point2].x-wall[i&(MAXWALLS-1)].x,wall[wall[i&(MAXWALLS-1)].point2].y-wall[i&(MAXWALLS-1)].y);
		j = totalclock+snum*13468;
		i = sintable[(j<<6)&2047];
		i += sintable[((j+4245)<<5)&2047];
		i += sintable[((j+6745)<<4)&2047];
		i += sintable[((j+15685)<<3)&2047];
		syn->fvel += ((sintable[(daang+1024)&2047]*i)>>17);
		syn->svel += ((sintable[(daang+512)&2047]*i)>>17);

		if ((clipmovecount[snum]&31) == 2) syn->bits |= (1<<29);
		if ((clipmovecount[snum]&31) == 17) syn->bits |= (1<<22);
		if (clipmovecount[snum] > 32) { goalsect[snum] = -1; goalwall[snum] = -1; clipmovecount[snum] = 0; }

		goalsprite[snum] = -1;
	}
	else
		clipmovecount[snum] = 0;

	if ((goalsect[snum] >= 0) && (goalwall[snum] >= 0))
	{
		x2 = goalx[snum];
		y2 = goaly[snum];
		dist = ksqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); if (!dist) return;
		daang = getangle(x2-x1,y2-y1);
		if ((goalwall[snum] >= 0) && (dist < 4096))
			daang = ((getangle(wall[wall[goalwall[snum]].point2].x-wall[goalwall[snum]].x,wall[wall[goalwall[snum]].point2].y-wall[goalwall[snum]].y)+1536)&2047);
		syn->fvel += (x2-x1)*2047/dist;
		syn->svel += (y2-y1)*2047/dist;
		syn->avel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-127),127);
	}
}

⌨️ 快捷键说明

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