📄 sector.c
字号:
if(wall[i].picnum == (SCREENBREAK6+3) )
wall[i].picnum = SCREENBREAK6;
}
continue;
}
if(wall[i].cstat&16)
switch(wall[i].overpicnum)
{
case W_FORCEFIELD:
case W_FORCEFIELD+1:
case W_FORCEFIELD+2:
t = animwall[p].tag;
if(wall[i].cstat&254)
{
wall[i].xpanning -= t>>10; // sintable[(t+512)&2047]>>12;
wall[i].ypanning -= t>>10; // sintable[t&2047]>>12;
if(wall[i].extra == 1)
{
wall[i].extra = 0;
animwall[p].tag = 0;
}
else
animwall[p].tag+=128;
if( animwall[p].tag < (128<<4) )
{
if( animwall[p].tag&128 )
wall[i].overpicnum = W_FORCEFIELD;
else wall[i].overpicnum = W_FORCEFIELD+1;
}
else
{
if( (TRAND&255) < 32 )
animwall[p].tag = 128<<(TRAND&3);
else wall[i].overpicnum = W_FORCEFIELD+1;
}
}
break;
}
}
}
char activatewarpelevators(short s,short d) //Parm = sectoreffectornum
{
short i, sn;
sn = sprite[s].sectnum;
// See if the sector exists
i = headspritestat[3];
while(i >= 0)
{
if( SLT == 17 )
if( SHT == sprite[s].hitag )
if( (klabs(sector[sn].floorz-hittype[s].temp_data[2]) > SP) ||
(sector[SECT].hitag == (sector[sn].hitag-d) ) )
break;
i = nextspritestat[i];
}
if(i==-1)
{
d = 0;
return 1; // No find
}
else
{
if(d == 0)
spritesound(ELEVATOR_OFF,s);
else spritesound(ELEVATOR_ON,s);
}
i = headspritestat[3];
while(i >= 0)
{
if( SLT == 17 )
if( SHT == sprite[s].hitag )
{
T1 = d;
T2 = d; //Make all check warp
}
i = nextspritestat[i];
}
return 0;
}
void operatesectors(short sn,short ii)
{
long j, l, q, startwall, endwall;
short i;
char sect_error;
sectortype *sptr;
sect_error = 0;
sptr = §or[sn];
switch(sptr->lotag&(0xffff-49152))
{
case 30:
j = sector[sn].hitag;
if( hittype[j].tempang == 0 ||
hittype[j].tempang == 256)
callsound(sn,ii);
if(sprite[j].extra == 1)
sprite[j].extra = 3;
else sprite[j].extra = 1;
break;
case 31:
j = sector[sn].hitag;
if(hittype[j].temp_data[4] == 0)
hittype[j].temp_data[4] = 1;
callsound(sn,ii);
break;
case 26: //The split doors
i = getanimationgoal(&sptr->ceilingz);
if(i == -1) //if the door has stopped
{
haltsoundhack = 1;
sptr->lotag &= 0xff00;
sptr->lotag |= 22;
operatesectors(sn,ii);
sptr->lotag &= 0xff00;
sptr->lotag |= 9;
operatesectors(sn,ii);
sptr->lotag &= 0xff00;
sptr->lotag |= 26;
}
return;
case 9:
{
long dax,day,dax2,day2,sp;
long wallfind[2];
startwall = sptr->wallptr;
endwall = startwall+sptr->wallnum-1;
sp = sptr->extra>>4;
//first find center point by averaging all points
dax = 0L, day = 0L;
for(i=startwall;i<=endwall;i++)
{
dax += wall[i].x;
day += wall[i].y;
}
dax /= (endwall-startwall+1);
day /= (endwall-startwall+1);
//find any points with either same x or same y coordinate
// as center (dax, day) - should be 2 points found.
wallfind[0] = -1;
wallfind[1] = -1;
for(i=startwall;i<=endwall;i++)
if ((wall[i].x == dax) || (wall[i].y == day))
{
if (wallfind[0] == -1)
wallfind[0] = i;
else wallfind[1] = i;
}
for(j=0;j<2;j++)
{
if ((wall[wallfind[j]].x == dax) && (wall[wallfind[j]].y == day))
{
//find what direction door should open by averaging the
// 2 neighboring points of wallfind[0] & wallfind[1].
i = wallfind[j]-1; if (i < startwall) i = endwall;
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)
{
dax2 = wall[wall[wall[wallfind[j]].point2].point2].x;
dax2 -= wall[wall[wallfind[j]].point2].x;
setanimation(sn,&wall[wallfind[j]].x,wall[wallfind[j]].x+dax2,sp);
setanimation(sn,&wall[i].x,wall[i].x+dax2,sp);
setanimation(sn,&wall[wall[wallfind[j]].point2].x,wall[wall[wallfind[j]].point2].x+dax2,sp);
callsound(sn,ii);
}
else if (day2 != 0)
{
day2 = wall[wall[wall[wallfind[j]].point2].point2].y;
day2 -= wall[wall[wallfind[j]].point2].y;
setanimation(sn,&wall[wallfind[j]].y,wall[wallfind[j]].y+day2,sp);
setanimation(sn,&wall[i].y,wall[i].y+day2,sp);
setanimation(sn,&wall[wall[wallfind[j]].point2].y,wall[wall[wallfind[j]].point2].y+day2,sp);
callsound(sn,ii);
}
}
else
{
i = wallfind[j]-1; if (i < startwall) i = endwall;
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(sn,&wall[wallfind[j]].x,dax,sp);
setanimation(sn,&wall[i].x,dax+dax2,sp);
setanimation(sn,&wall[wall[wallfind[j]].point2].x,dax+dax2,sp);
callsound(sn,ii);
}
else if (day2 != 0)
{
setanimation(sn,&wall[wallfind[j]].y,day,sp);
setanimation(sn,&wall[i].y,day+day2,sp);
setanimation(sn,&wall[wall[wallfind[j]].point2].y,day+day2,sp);
callsound(sn,ii);
}
}
}
}
return;
case 15://Warping elevators
if(sprite[ii].picnum != APLAYER) return;
// if(ps[sprite[ii].yvel].select_dir == 1) return;
i = headspritesect[sn];
while(i >= 0)
{
if(PN==SECTOREFFECTOR && SLT == 17 ) break;
i = nextspritesect[i];
}
if(sprite[ii].sectnum == sn)
{
if( activatewarpelevators(i,-1) )
activatewarpelevators(i,1);
else if( activatewarpelevators(i,1) )
activatewarpelevators(i,-1);
return;
}
else
{
if(sptr->floorz > SZ)
activatewarpelevators(i,-1);
else
activatewarpelevators(i,1);
}
return;
case 16:
case 17:
i = getanimationgoal(&sptr->floorz);
if(i == -1)
{
i = nextsectorneighborz(sn,sptr->floorz,1,1);
if( i == -1 )
{
i = nextsectorneighborz(sn,sptr->floorz,1,-1);
if( i == -1 ) return;
j = sector[i].floorz;
setanimation(sn,&sptr->floorz,j,sptr->extra);
}
else
{
j = sector[i].floorz;
setanimation(sn,&sptr->floorz,j,sptr->extra);
}
callsound(sn,ii);
}
return;
case 18:
case 19:
i = getanimationgoal(&sptr->floorz);
if(i==-1)
{
i = nextsectorneighborz(sn,sptr->floorz,1,-1);
if(i==-1) i = nextsectorneighborz(sn,sptr->floorz,1,1);
if(i==-1) return;
j = sector[i].floorz;
q = sptr->extra;
l = sptr->ceilingz-sptr->floorz;
setanimation(sn,&sptr->floorz,j,q);
setanimation(sn,&sptr->ceilingz,j+l,q);
callsound(sn,ii);
}
return;
case 29:
if(sptr->lotag&0x8000)
j = sector[nextsectorneighborz(sn,sptr->ceilingz,1,1)].floorz;
else
j = sector[nextsectorneighborz(sn,sptr->ceilingz,-1,-1)].ceilingz;
i = headspritestat[3]; //Effectors
while(i >= 0)
{
if( (SLT == 22) &&
(SHT == sptr->hitag) )
{
sector[SECT].extra = -sector[SECT].extra;
T1 = sn;
T2 = 1;
}
i = nextspritestat[i];
}
sptr->lotag ^= 0x8000;
setanimation(sn,&sptr->ceilingz,j,sptr->extra);
callsound(sn,ii);
return;
case 20:
REDODOOR:
if(sptr->lotag&0x8000)
{
i = headspritesect[sn];
while(i >= 0)
{
if(sprite[i].statnum == 3 && SLT==9)
{
j = SZ;
break;
}
i = nextspritesect[i];
}
if(i==-1)
j = sptr->floorz;
}
else
{
j = nextsectorneighborz(sn,sptr->ceilingz,-1,-1);
if(j >= 0) j = sector[j].ceilingz;
else
{
sptr->lotag |= 32768;
goto REDODOOR;
}
}
sptr->lotag ^= 0x8000;
setanimation(sn,&sptr->ceilingz,j,sptr->extra);
callsound(sn,ii);
return;
case 21:
i = getanimationgoal(&sptr->floorz);
if (i >= 0)
{
if (animategoal[sn] == sptr->ceilingz)
animategoal[i] = sector[nextsectorneighborz(sn,sptr->ceilingz,1,1)].floorz;
else animategoal[i] = sptr->ceilingz;
j = animategoal[i];
}
else
{
if (sptr->ceilingz == sptr->floorz)
j = sector[nextsectorneighborz(sn,sptr->ceilingz,1,1)].floorz;
else j = sptr->ceilingz;
sptr->lotag ^= 0x8000;
if(setanimation(sn,&sptr->floorz,j,sptr->extra) >= 0)
callsound(sn,ii);
}
return;
case 22:
// REDODOOR22:
if ( (sptr->lotag&0x8000) )
{
q = (sptr->ceilingz+sptr->floorz)>>1;
j = setanimation(sn,&sptr->floorz,q,sptr->extra);
j = setanimation(sn,&sptr->ceilingz,q,sptr->extra);
}
else
{
q = sector[nextsectorneighborz(sn,sptr->floorz,1,1)].floorz;
j = setanimation(sn,&sptr->floorz,q,sptr->extra);
q = sector[nextsectorneighborz(sn,sptr->ceilingz,-1,-1)].ceilingz;
j = setanimation(sn,&sptr->ceilingz,q,sptr->extra);
}
sptr->lotag ^= 0x8000;
callsound(sn,ii);
return;
case 23: //Swingdoor
j = -1;
q = 0;
i = headspritestat[3];
while(i >= 0)
{
if( SLT == 11 && SECT == sn && !T5)
{
j = i;
break;
}
i = nextspritestat[i];
}
l = sector[SECT].lotag&0x8000;
if(j >= 0)
{
i = headspritestat[3];
while(i >= 0)
{
if( l == (sector[SECT].lotag&0x8000) && SLT == 11 && sprite[j].hitag == SHT && !T5 )
{
if(sector[SECT].lotag&0x8000) sector[SECT].lotag &= 0x7fff;
else sector[SECT].lotag |= 0x8000;
T5 = 1;
T4 = -T4;
if(q == 0)
{
callsound(sn,i);
q = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -