📄 actors.c
字号:
{
//T1,T2 and T3 are used for all the sector moving stuff!!!
short startwall,endwall,x;
long tx,ty,j,k;
spritetype *s;
s = &sprite[i];
s->x += (s->xvel*(sintable[(s->ang+512)&2047]))>>14;
s->y += (s->xvel*(sintable[s->ang&2047]))>>14;
j = T2;
k = T3;
startwall = sector[s->sectnum].wallptr;
endwall = startwall+sector[s->sectnum].wallnum;
for(x=startwall;x<endwall;x++)
{
rotatepoint(
0,0,
msx[j],msy[j],
k&2047,&tx,&ty);
dragpoint(x,s->x+tx,s->y+ty);
j++;
}
}
void movefta(void)
{
long x, px, py, sx, sy;
short i, j, p, psect, ssect, nexti;
spritetype *s;
i = headspritestat[2];
while(i >= 0)
{
nexti = nextspritestat[i];
s = &sprite[i];
p = findplayer(s,&x);
ssect = psect = s->sectnum;
if(sprite[ps[p].i].extra > 0 )
{
if( x < 30000 )
{
hittype[i].timetosleep++;
if( hittype[i].timetosleep >= (x>>8) )
{
if(badguy(s))
{
px = ps[p].oposx+64-(TRAND&127);
py = ps[p].oposy+64-(TRAND&127);
updatesector(px,py,&psect);
if(psect == -1)
{
i = nexti;
continue;
}
sx = s->x+64-(TRAND&127);
sy = s->y+64-(TRAND&127);
updatesector(px,py,&ssect);
if(ssect == -1)
{
i = nexti;
continue;
}
j = cansee(sx,sy,s->z-(TRAND%(52<<8)),s->sectnum,px,py,ps[p].oposz-(TRAND%(32<<8)),ps[p].cursectnum);
}
else
j = cansee(s->x,s->y,s->z-((TRAND&31)<<8),s->sectnum,ps[p].oposx,ps[p].oposy,ps[p].oposz-((TRAND&31)<<8),ps[p].cursectnum);
// j = 1;
if(j) switch(s->picnum)
{
case RUBBERCAN:
case EXPLODINGBARREL:
case WOODENHORSE:
case HORSEONSIDE:
case CANWITHSOMETHING:
case CANWITHSOMETHING2:
case CANWITHSOMETHING3:
case CANWITHSOMETHING4:
case FIREBARREL:
case FIREVASE:
case NUKEBARREL:
case NUKEBARRELDENTED:
case NUKEBARRELLEAKED:
case TRIPBOMB:
if (sector[s->sectnum].ceilingstat&1)
s->shade = sector[s->sectnum].ceilingshade;
else s->shade = sector[s->sectnum].floorshade;
hittype[i].timetosleep = 0;
changespritestat(i,6);
break;
default:
hittype[i].timetosleep = 0;
check_fta_sounds(i);
changespritestat(i,1);
break;
}
else hittype[i].timetosleep = 0;
}
}
if( badguy( s ) )
{
if (sector[s->sectnum].ceilingstat&1)
s->shade = sector[s->sectnum].ceilingshade;
else s->shade = sector[s->sectnum].floorshade;
}
}
i = nexti;
}
}
short ifhitsectors(short sectnum)
{
short i;
i = headspritestat[5];
while(i >= 0)
{
if( PN == EXPLOSION2 && sectnum == SECT )
return i;
i = nextspritestat[i];
}
return -1;
}
short ifhitbyweapon(short sn)
{
short j, k, p;
spritetype *npc;
if( hittype[sn].extra >= 0 )
{
if(sprite[sn].extra >= 0 )
{
npc = &sprite[sn];
if(npc->picnum == APLAYER)
{
if(ud.god && hittype[sn].picnum != SHRINKSPARK ) return -1;
p = npc->yvel;
j = hittype[sn].owner;
if( j >= 0 &&
sprite[j].picnum == APLAYER &&
ud.coop == 1 &&
ud.ffire == 0 )
return -1;
npc->extra -= hittype[sn].extra;
if(j >= 0)
{
if(npc->extra <= 0 && hittype[sn].picnum != FREEZEBLAST)
{
npc->extra = 0;
ps[p].wackedbyactor = j;
if( sprite[hittype[sn].owner].picnum == APLAYER && p != sprite[hittype[sn].owner].yvel )
ps[p].frag_ps = sprite[j].yvel;
hittype[sn].owner = ps[p].i;
}
}
switch(hittype[sn].picnum)
{
case RADIUSEXPLOSION:
case RPG:
case HYDRENT:
case HEAVYHBOMB:
case SEENINE:
case OOZFILTER:
case EXPLODINGBARREL:
ps[p].posxv +=
hittype[sn].extra*(sintable[(hittype[sn].ang+512)&2047])<<2;
ps[p].posyv +=
hittype[sn].extra*(sintable[hittype[sn].ang&2047])<<2;
break;
default:
ps[p].posxv +=
hittype[sn].extra*(sintable[(hittype[sn].ang+512)&2047])<<1;
ps[p].posyv +=
hittype[sn].extra*(sintable[hittype[sn].ang&2047])<<1;
break;
}
}
else
{
if(hittype[sn].extra == 0 )
if( hittype[sn].picnum == SHRINKSPARK && npc->xrepeat < 24 )
return -1;
npc->extra -= hittype[sn].extra;
if(npc->picnum != RECON && npc->owner >= 0 && sprite[npc->owner].statnum < MAXSTATUS )
npc->owner = hittype[sn].owner;
}
hittype[sn].extra = -1;
return hittype[sn].picnum;
}
}
hittype[sn].extra = -1;
return -1;
}
void movecyclers(void)
{
short q, j, x, t, s, *c;
walltype *wal;
char cshade;
for(q=numcyclers-1;q>=0;q--)
{
c = &cyclers[q][0];
s = c[0];
t = c[3];
j = t+(sintable[c[1]&2047]>>10);
cshade = c[2];
if( j < cshade ) j = cshade;
else if( j > t ) j = t;
c[1] += sector[s].extra;
if(c[5])
{
wal = &wall[sector[s].wallptr];
for(x = sector[s].wallnum;x>0;x--,wal++)
if( wal->hitag != 1 )
{
wal->shade = j;
if( (wal->cstat&2) && wal->nextwall >= 0)
wall[wal->nextwall].shade = j;
}
sector[s].floorshade = sector[s].ceilingshade = j;
}
}
}
void movedummyplayers(void)
{
short i, p, nexti;
i = headspritestat[13];
while(i >= 0)
{
nexti = nextspritestat[i];
p = sprite[OW].yvel;
if( ps[p].on_crane >= 0 || sector[ps[p].cursectnum].lotag != 1 || sprite[ps[p].i].extra <= 0 )
{
ps[p].dummyplayersprite = -1;
KILLIT(i);
}
else
{
if(ps[p].on_ground && ps[p].on_warping_sector == 1 && sector[ps[p].cursectnum].lotag == 1 )
{
CS = 257;
SZ = sector[SECT].ceilingz+(27<<8);
SA = ps[p].ang;
if(T1 == 8)
T1 = 0;
else T1++;
}
else
{
if(sector[SECT].lotag != 2) SZ = sector[SECT].floorz;
CS = (short) 32768;
}
}
SX += (ps[p].posx-ps[p].oposx);
SY += (ps[p].posy-ps[p].oposy);
setsprite(i,SX,SY,SZ);
BOLT:
i = nexti;
}
}
short otherp;
void moveplayers(void) //Players
{
short i , nexti;
long otherx;
spritetype *s;
struct player_struct *p;
i = headspritestat[10];
while(i >= 0)
{
nexti = nextspritestat[i];
s = &sprite[i];
p = &ps[s->yvel];
if(s->owner >= 0)
{
if(p->newowner >= 0 ) //Looking thru the camera
{
s->x = p->oposx;
s->y = p->oposy;
hittype[i].bposz = s->z = p->oposz+PHEIGHT;
s->ang = p->oang;
setsprite(i,s->x,s->y,s->z);
}
else
{
if(ud.multimode > 1)
otherp = findotherplayer(s->yvel,&otherx);
else
{
otherp = s->yvel;
otherx = 0;
}
execute(i,s->yvel,otherx);
if(ud.multimode > 1)
if( sprite[ps[otherp].i].extra > 0 )
{
if( s->yrepeat > 32 && sprite[ps[otherp].i].yrepeat < 32)
{
if( otherx < 1400 && p->knee_incs == 0 )
{
p->knee_incs = 1;
p->weapon_pos = -1;
p->actorsqu = ps[otherp].i;
}
}
}
if(ud.god)
{
s->extra = max_player_health;
s->cstat = 257;
p->jetpack_amount = 1599;
}
if( s->extra > 0 )
{
hittype[i].owner = i;
if(ud.god == 0)
if( ceilingspace(s->sectnum) || floorspace(s->sectnum) )
quickkill(p);
}
else
{
p->posx = s->x;
p->posy = s->y;
p->posz = s->z-(20<<8);
p->newowner = -1;
if( p->wackedbyactor >= 0 && sprite[p->wackedbyactor].statnum < MAXSTATUS )
{
p->ang += getincangle(p->ang,getangle(sprite[p->wackedbyactor].x-p->posx,sprite[p->wackedbyactor].y-p->posy))>>1;
p->ang &= 2047;
}
}
s->ang = p->ang;
}
}
else
{
if(p->holoduke_on == -1)
KILLIT(i);
hittype[i].bposx = s->x;
hittype[i].bposy = s->y;
hittype[i].bposz = s->z;
s->cstat = 0;
if(s->xrepeat < 42)
{
s->xrepeat += 4;
s->cstat |= 2;
}
else s->xrepeat = 42;
if(s->yrepeat < 36)
s->yrepeat += 4;
else
{
s->yrepeat = 36;
if(sector[s->sectnum].lotag != 2)
makeitfall(i);
if(s->zvel == 0 && sector[s->sectnum].lotag == 1)
s->z += (32<<8);
}
if(s->extra < 8)
{
s->xvel = 128;
s->ang = p->ang;
s->extra++;
IFMOVING;
}
else
{
s->ang = 2047-p->ang;
setsprite(i,s->x,s->y,s->z);
}
}
if (sector[s->sectnum].ceilingstat&1)
s->shade += (sector[s->sectnum].ceilingshade-s->shade)>>1;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -