📄 playern.c
字号:
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 + -