📄 actors.c
字号:
short j,k,p,x,nextj,sect;
char statlist[] = {0,1,6,10,12,2,5};
short *tempshort = (short *)tempbuf;
s = &sprite[i];
if(s->picnum == RPG && s->xrepeat < 11) goto SKIPWALLCHECK;
if(s->picnum != SHRINKSPARK)
{
tempshort[0] = s->sectnum;
dasect = s->sectnum;
sectcnt = 0; sectend = 1;
do
{
dasect = tempshort[sectcnt++];
if(((sector[dasect].ceilingz-s->z)>>8) < r)
{
d = klabs(wall[sector[dasect].wallptr].x-s->x)+klabs(wall[sector[dasect].wallptr].y-s->y);
if(d < r)
checkhitceiling(dasect);
else
{
d = klabs(wall[wall[wall[sector[dasect].wallptr].point2].point2].x-s->x)+klabs(wall[wall[wall[sector[dasect].wallptr].point2].point2].y-s->y);
if(d < r)
checkhitceiling(dasect);
}
}
startwall = sector[dasect].wallptr;
endwall = startwall+sector[dasect].wallnum;
for(x=startwall,wal=&wall[startwall];x<endwall;x++,wal++)
if( ( klabs(wal->x-s->x)+klabs(wal->y-s->y) ) < r)
{
nextsect = wal->nextsector;
if (nextsect >= 0)
{
for(dasect=sectend-1;dasect>=0;dasect--)
if (tempshort[dasect] == nextsect) break;
if (dasect < 0) tempshort[sectend++] = nextsect;
}
x1 = (((wal->x+wall[wal->point2].x)>>1)+s->x)>>1;
y1 = (((wal->y+wall[wal->point2].y)>>1)+s->y)>>1;
updatesector(x1,y1,§);
if( sect >= 0 && cansee(x1,y1,s->z,sect,s->x,s->y,s->z,s->sectnum ) )
checkhitwall(i,x,wal->x,wal->y,s->z,s->picnum);
}
}
while (sectcnt < sectend);
}
SKIPWALLCHECK:
q = -(16<<8)+(TRAND&((32<<8)-1));
for(x = 0;x<7;x++)
{
j = headspritestat[statlist[x]];
while(j >= 0)
{
nextj = nextspritestat[j];
sj = &sprite[j];
if( x == 0 || x >= 5 || AFLAMABLE(sj->picnum) )
{
if( s->picnum != SHRINKSPARK || (sj->cstat&257) )
if( dist( s, sj ) < r )
{
if( badguy(sj) && !cansee( sj->x, sj->y,sj->z+q, sj->sectnum, s->x, s->y, s->z+q, s->sectnum) )
goto BOLT;
checkhitsprite( j, i );
}
}
else if( sj->extra >= 0 && sj != s && ( sj->picnum == TRIPBOMB || badguy(sj) || sj->picnum == QUEBALL || sj->picnum == STRIPEBALL || (sj->cstat&257) || sj->picnum == DUKELYINGDEAD ) )
{
if( s->picnum == SHRINKSPARK && sj->picnum != SHARK && ( j == s->owner || sj->xrepeat < 24 ) )
{
j = nextj;
continue;
}
if( s->picnum == MORTER && j == s->owner)
{
j = nextj;
continue;
}
if(sj->picnum == APLAYER) sj->z -= PHEIGHT;
d = dist( s, sj );
if(sj->picnum == APLAYER) sj->z += PHEIGHT;
if ( d < r && cansee( sj->x, sj->y, sj->z-(8<<8), sj->sectnum, s->x, s->y, s->z-(12<<8), s->sectnum) )
{
hittype[j].ang = getangle(sj->x-s->x,sj->y-s->y);
if ( s->picnum == RPG && sj->extra > 0)
hittype[j].picnum = RPG;
else
{
if( s->picnum == SHRINKSPARK )
hittype[j].picnum = SHRINKSPARK;
else hittype[j].picnum = RADIUSEXPLOSION;
}
if(s->picnum != SHRINKSPARK)
{
if ( d < r/3 )
{
if(hp4 == hp3) hp4++;
hittype[j].extra = hp3 + (TRAND%(hp4-hp3));
}
else if ( d < 2*r/3 )
{
if(hp3 == hp2) hp3++;
hittype[j].extra = hp2 + (TRAND%(hp3-hp2));
}
else if ( d < r )
{
if(hp2 == hp1) hp2++;
hittype[j].extra = hp1 + (TRAND%(hp2-hp1));
}
if( sprite[j].picnum != TANK && sprite[j].picnum != ROTATEGUN && sprite[j].picnum != RECON && sprite[j].picnum != BOSS1 && sprite[j].picnum != BOSS2 && sprite[j].picnum != BOSS3 && sprite[j].picnum != BOSS4 )
{
if(sj->xvel < 0) sj->xvel = 0;
sj->xvel += (s->extra<<2);
}
if( sj->picnum == PODFEM1 || sj->picnum == FEM1 ||
sj->picnum == FEM2 || sj->picnum == FEM3 ||
sj->picnum == FEM4 || sj->picnum == FEM5 ||
sj->picnum == FEM6 || sj->picnum == FEM7 ||
sj->picnum == FEM8 || sj->picnum == FEM9 ||
sj->picnum == FEM10 || sj->picnum == STATUE ||
sj->picnum == STATUEFLASH || sj->picnum == SPACEMARINE || sj->picnum == QUEBALL || sj->picnum == STRIPEBALL)
checkhitsprite( j, i );
}
else if(s->extra == 0) hittype[j].extra = 0;
if ( sj->picnum != RADIUSEXPLOSION &&
s->owner >= 0 && sprite[s->owner].statnum < MAXSTATUS )
{
if(sj->picnum == APLAYER)
{
p = sj->yvel;
if(ps[p].newowner >= 0)
{
ps[p].newowner = -1;
ps[p].posx = ps[p].oposx;
ps[p].posy = ps[p].oposy;
ps[p].posz = ps[p].oposz;
ps[p].ang = ps[p].oang;
updatesector(ps[p].posx,ps[p].posy,&ps[p].cursectnum);
setpal(&ps[p]);
k = headspritestat[1];
while(k >= 0)
{
if(sprite[k].picnum==CAMERA1)
sprite[k].yvel = 0;
k = nextspritestat[k];
}
}
}
hittype[j].owner = s->owner;
}
}
}
BOLT:
j = nextj;
}
}
}
movesprite(short spritenum, long xchange, long ychange, long zchange, unsigned long cliptype)
{
long daz,h, oldx, oldy;
short retval, dasectnum, a, cd;
char bg;
bg = badguy(&sprite[spritenum]);
if(sprite[spritenum].statnum == 5 || (bg && sprite[spritenum].xrepeat < 4 ) )
{
sprite[spritenum].x += (xchange*TICSPERFRAME)>>2;
sprite[spritenum].y += (ychange*TICSPERFRAME)>>2;
sprite[spritenum].z += (zchange*TICSPERFRAME)>>2;
if(bg)
setsprite(spritenum,sprite[spritenum].x,sprite[spritenum].y,sprite[spritenum].z);
return 0;
}
dasectnum = sprite[spritenum].sectnum;
daz = sprite[spritenum].z;
h = ((tilesizy[sprite[spritenum].picnum]*sprite[spritenum].yrepeat)<<1);
daz -= h;
if( bg )
{
oldx = sprite[spritenum].x;
oldy = sprite[spritenum].y;
if( sprite[spritenum].xrepeat > 60 )
retval = clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),1024L,(4<<8),(4<<8),cliptype);
else
{
if(sprite[spritenum].picnum == LIZMAN)
cd = 292L;
else if( (actortype[sprite[spritenum].picnum]&3) )
cd = sprite[spritenum].clipdist<<2;
else
cd = 192L;
retval = clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),cd,(4<<8),(4<<8),cliptype);
}
if( dasectnum < 0 || ( dasectnum >= 0 &&
( ( hittype[spritenum].actorstayput >= 0 && hittype[spritenum].actorstayput != dasectnum ) ||
( ( sprite[spritenum].picnum == BOSS2 ) && sprite[spritenum].pal == 0 && sector[dasectnum].lotag != 3 ) ||
( ( sprite[spritenum].picnum == BOSS1 || sprite[spritenum].picnum == BOSS2 ) && sector[dasectnum].lotag == 1 ) ||
( sector[dasectnum].lotag == 1 && ( sprite[spritenum].picnum == LIZMAN || ( sprite[spritenum].picnum == LIZTROOP && sprite[spritenum].zvel == 0 ) ) )
) )
)
{
sprite[spritenum].x = oldx;
sprite[spritenum].y = oldy;
if(sector[dasectnum].lotag == 1 && sprite[spritenum].picnum == LIZMAN)
sprite[spritenum].ang = (TRAND&2047);
else if( (hittype[spritenum].temp_data[0]&3) == 1 && sprite[spritenum].picnum != COMMANDER )
sprite[spritenum].ang = (TRAND&2047);
setsprite(spritenum,oldx,oldy,sprite[spritenum].z);
if(dasectnum < 0) dasectnum = 0;
return (16384+dasectnum);
}
if( (retval&49152) >= 32768 && (hittype[spritenum].cgg==0) ) sprite[spritenum].ang += 768;
}
else
{
if(sprite[spritenum].statnum == 4)
retval =
clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),8L,(4<<8),(4<<8),cliptype);
else
retval =
clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),(long)(sprite[spritenum].clipdist<<2),(4<<8),(4<<8),cliptype);
}
if( dasectnum >= 0)
if ( (dasectnum != sprite[spritenum].sectnum) )
changespritesect(spritenum,dasectnum);
daz = sprite[spritenum].z + ((zchange*TICSPERFRAME)>>3);
if ((daz > hittype[spritenum].ceilingz) && (daz <= hittype[spritenum].floorz))
sprite[spritenum].z = daz;
else
if (retval == 0)
return(16384+dasectnum);
return(retval);
}
short ssp(short i,unsigned long cliptype) //The set sprite function
{
spritetype *s;
long movetype;
s = &sprite[i];
movetype = movesprite(i,
(s->xvel*(sintable[(s->ang+512)&2047]))>>14,
(s->xvel*(sintable[s->ang&2047]))>>14,s->zvel,
cliptype);
return (movetype==0);
}
void insertspriteq(short i)
{
if(spriteqamount > 0)
{
if(spriteq[spriteqloc] >= 0)
sprite[spriteq[spriteqloc]].xrepeat = 0;
spriteq[spriteqloc] = i;
spriteqloc = (spriteqloc+1)%spriteqamount;
}
else sprite[i].xrepeat = sprite[i].yrepeat = 0;
}
void lotsofmoney(spritetype *s, short n)
{
short i ,j;
for(i=n;i>0;i--)
{
j = EGS(s->sectnum,s->x,s->y,s->z-(TRAND%(47<<8)),MONEY,-32,8,8,TRAND&2047,0,0,0,5);
sprite[j].cstat = TRAND&12;
}
}
void lotsofmail(spritetype *s, short n)
{
short i ,j;
for(i=n;i>0;i--)
{
j = EGS(s->sectnum,s->x,s->y,s->z-(TRAND%(47<<8)),MAIL,-32,8,8,TRAND&2047,0,0,0,5);
sprite[j].cstat = TRAND&12;
}
}
void lotsofpaper(spritetype *s, short n)
{
short i ,j;
for(i=n;i>0;i--)
{
j = EGS(s->sectnum,s->x,s->y,s->z-(TRAND%(47<<8)),PAPER,-32,8,8,TRAND&2047,0,0,0,5);
sprite[j].cstat = TRAND&12;
}
}
void guts(spritetype *s,short gtype, short n, short p)
{
long gutz,floorz;
short i,a,j;
char sx,sy;
signed char pal;
if(badguy(s) && s->xrepeat < 16)
sx = sy = 8;
else sx = sy = 32;
gutz = s->z-(8<<8);
floorz = getflorzofslope(s->sectnum,s->x,s->y);
if( gutz > ( floorz-(8<<8) ) )
gutz = floorz-(8<<8);
if(s->picnum == COMMANDER)
gutz -= (24<<8);
if( badguy(s) && s->pal == 6)
pal = 6;
else pal = 0;
for(j=0;j<n;j++)
{
a = TRAND&2047;
i = EGS(s->sectnum,s->x+(TRAND&255)-128,s->y+(TRAND&255)-128,gutz-(TRAND&8191),gtype,-32,sx,sy,a,48+(TRAND&31),-512-(TRAND&2047),ps[p].i,5);
if(PN == JIBS2)
{
sprite[i].xrepeat >>= 2;
sprite[i].yrepeat >>= 2;
}
if(pal == 6)
sprite[i].pal = 6;
}
}
void gutsdir(spritetype *s,short gtype, short n, short p)
{
long gutz,floorz;
short i,a,j;
char sx,sy;
if(badguy(s) && s->xrepeat < 16)
sx = sy = 8;
else sx = sy = 32;
gutz = s->z-(8<<8);
floorz = getflorzofslope(s->sectnum,s->x,s->y);
if( gutz > ( floorz-(8<<8) ) )
gutz = floorz-(8<<8);
if(s->picnum == COMMANDER)
gutz -= (24<<8);
for(j=0;j<n;j++)
{
a = TRAND&2047;
i = EGS(s->sectnum,s->x,s->y,gutz,gtype,-32,sx,sy,a,256+(TRAND&127),-512-(TRAND&2047),ps[p].i,5);
}
}
void setsectinterpolate(short i)
{
long j, k, startwall,endwall;
startwall = sector[SECT].wallptr;
endwall = startwall+sector[SECT].wallnum;
for(j=startwall;j<endwall;j++)
{
setinterpolation(&wall[j].x);
setinterpolation(&wall[j].y);
k = wall[j].nextwall;
if(k >= 0)
{
setinterpolation(&wall[k].x);
setinterpolation(&wall[k].y);
k = wall[k].point2;
setinterpolation(&wall[k].x);
setinterpolation(&wall[k].y);
}
}
}
void clearsectinterpolate(short i)
{
short j,startwall,endwall;
startwall = sector[SECT].wallptr;
endwall = startwall+sector[SECT].wallnum;
for(j=startwall;j<endwall;j++)
{
stopinterpolation(&wall[j].x);
stopinterpolation(&wall[j].y);
if(wall[j].nextwall >= 0)
{
stopinterpolation(&wall[wall[j].nextwall].x);
stopinterpolation(&wall[wall[j].nextwall].y);
}
}
}
void ms(short i)
{
//T1,T2 and T3 are used for all the sector moving stuff!!!
short startwall,endwall,x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -