sector.c and related cleanup, round 2.

- use SPRITES_OF* iterator macros
- new function: E_SpriteIsValid(); add some safety checks
  (e.g. hitag used as sprite index)
- the rest is mostly "the usual code transformations"

git-svn-id: https://svn.eduke32.com/eduke32@4281 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2014-01-31 21:12:56 +00:00
parent 8fbefe829a
commit ab5c89430c
3 changed files with 182 additions and 233 deletions

View file

@ -1203,6 +1203,11 @@ static inline int32_t redwallp(const walltype *wal)
return (wal->nextwall >= 0 && wal->nextsector >= 0); return (wal->nextwall >= 0 && wal->nextsector >= 0);
} }
static inline int32_t E_SpriteIsValid(const int32_t i)
{
return ((unsigned)i < MAXSPRITES && sprite[i].statnum != MAXSTATUS);
}
void alignceilslope(int16_t dasect, int32_t x, int32_t y, int32_t z); void alignceilslope(int16_t dasect, int32_t x, int32_t y, int32_t z);
void alignflorslope(int16_t dasect, int32_t x, int32_t y, int32_t z); void alignflorslope(int16_t dasect, int32_t x, int32_t y, int32_t z);
int32_t sectorofwall(int16_t theline); int32_t sectorofwall(int16_t theline);

View file

@ -11915,7 +11915,7 @@ int32_t nextsectorneighborz(int16_t sectnum, int32_t thez, int16_t topbottom, in
int32_t nextz = (direction==1) ? INT32_MAX : INT32_MIN; int32_t nextz = (direction==1) ? INT32_MAX : INT32_MIN;
int32_t sectortouse = -1; int32_t sectortouse = -1;
walltype *wal = &wall[sector[sectnum].wallptr]; const walltype *wal = &wall[sector[sectnum].wallptr];
int32_t i = sector[sectnum].wallnum; int32_t i = sector[sectnum].wallnum;
do do
@ -11924,20 +11924,17 @@ int32_t nextsectorneighborz(int16_t sectnum, int32_t thez, int16_t topbottom, in
if (ns >= 0) if (ns >= 0)
{ {
const int32_t testz = (topbottom==1) ? const int32_t testz = (topbottom == 1) ?
sector[ns].floorz : sector[ns].ceilingz; sector[ns].floorz : sector[ns].ceilingz;
int32_t ok; const int32_t update = (direction == 1) ?
(testz > thez && testz < nextz) :
(testz < thez && testz > nextz);
if (direction == 1) if (update)
ok = (testz > thez && testz < nextz);
else
ok = (testz < thez && testz > nextz);
if (ok)
{ {
nextz = testz; nextz = testz;
sectortouse = wal->nextsector; sectortouse = ns;
} }
} }
@ -11946,7 +11943,7 @@ int32_t nextsectorneighborz(int16_t sectnum, int32_t thez, int16_t topbottom, in
} }
while (i != 0); while (i != 0);
return(sectortouse); return sectortouse;
} }

View file

@ -46,19 +46,22 @@ int32_t A_CallSound(int32_t sn, int32_t whatsprite)
for (SPRITES_OF_SECT(sn, i)) for (SPRITES_OF_SECT(sn, i))
{ {
if (PN == MUSICANDSFX && (unsigned)SLT < 1000) // XXX: in other places, 999 const int32_t snd = sprite[i].lotag;
EDUKE32_STATIC_ASSERT(MAXSOUNDS >= 1000);
if (PN == MUSICANDSFX && (unsigned)snd < 1000) // XXX: in other places, 999
{ {
if (whatsprite == -1) if (whatsprite == -1)
whatsprite = i; whatsprite = i;
if (T1 == 0) if (T1 == 0)
{ {
if ((g_sounds[SLT].m & SF_GLOBAL) == 0) if ((g_sounds[snd].m & SF_GLOBAL) == 0)
{ {
if (SLT) if (snd)
{ {
A_PlaySound(SLT,whatsprite); A_PlaySound(snd, whatsprite);
if (SHT && SLT != SHT && SHT < MAXSOUNDS) if (SHT && snd != SHT && SHT < MAXSOUNDS)
S_StopEnvSound(SHT,T6); S_StopEnvSound(SHT,T6);
T6 = whatsprite; T6 = whatsprite;
} }
@ -69,15 +72,18 @@ int32_t A_CallSound(int32_t sn, int32_t whatsprite)
} }
else if (SHT < MAXSOUNDS) else if (SHT < MAXSOUNDS)
{ {
if (SHT) A_PlaySound(SHT,whatsprite); if (SHT)
if ((g_sounds[SLT].m & SF_LOOP) || (SHT && SHT != SLT)) A_PlaySound(SHT, whatsprite);
S_StopEnvSound(SLT,T6); if ((g_sounds[snd].m & SF_LOOP) || (SHT && SHT != snd))
S_StopEnvSound(snd, T6);
T6 = whatsprite; T6 = whatsprite;
T1 = 0; T1 = 0;
} }
return SLT;
return snd;
} }
} }
return -1; return -1;
} }
@ -271,13 +277,9 @@ void G_DoSectorAnimations(void)
} }
if (v > 0) if (v > 0)
{ a = min(a+v, animategoal[i]);
a = min(a+v,animategoal[i]);
}
else else
{ a = max(a+v, animategoal[i]);
a = max(a+v,animategoal[i]);
}
if (animateptr[i] == &sector[animatesect[i]].floorz) if (animateptr[i] == &sector[animatesect[i]].floorz)
{ {
@ -470,59 +472,58 @@ void G_AnimateWalls(void)
int32_t G_ActivateWarpElevators(int32_t s, int32_t d) //Parm = sectoreffectornum int32_t G_ActivateWarpElevators(int32_t s, int32_t d) //Parm = sectoreffectornum
{ {
int32_t i = headspritestat[STAT_EFFECTOR], sn = sprite[s].sectnum; int32_t i;
const int32_t sn = sprite[s].sectnum;
while (i >= 0) for (SPRITES_OF(STAT_EFFECTOR, i))
{
if (SLT == SE_17_WARP_ELEVATOR && SHT == sprite[s].hitag) if (SLT == SE_17_WARP_ELEVATOR && SHT == sprite[s].hitag)
if ((klabs(sector[sn].floorz-actor[s].t_data[2]) > SP) || {
(sector[SECT].hitag == (sector[sn].hitag-d))) if (klabs(sector[sn].floorz - actor[s].t_data[2]) > SP ||
sector[SECT].hitag == sector[sn].hitag - d)
break; break;
i = nextspritestat[i]; }
}
if (i == -1) if (i == -1)
return 1; // No find return 1; // No find
else
A_PlaySound(d ? ELEVATOR_ON : ELEVATOR_OFF, s);
i = headspritestat[STAT_EFFECTOR]; A_PlaySound(d ? ELEVATOR_ON : ELEVATOR_OFF, s);
do
{ for (SPRITES_OF(STAT_EFFECTOR, i))
if (SLT == SE_17_WARP_ELEVATOR && SHT == sprite[s].hitag) if (SLT == SE_17_WARP_ELEVATOR && SHT == sprite[s].hitag)
T1 = T2 = d; //Make all check warp T1 = T2 = d; //Make all check warp
i = nextspritestat[i];
}
while (i >= 0);
return 0; return 0;
} }
void G_OperateSectors(int32_t sn, int32_t ii) void G_OperateSectors(int32_t sn, int32_t ii)
{ {
int32_t j=0, l, q, startwall, endwall; int32_t j=0, l;
int32_t i; int32_t i;
sectortype *sptr = &sector[sn]; sectortype *const sptr = &sector[sn];
switch (sptr->lotag&(0xffff-49152)) switch (sptr->lotag&(0xffff-49152))
{ {
case ST_30_ROTATE_RISE_BRIDGE: case ST_30_ROTATE_RISE_BRIDGE:
j = sector[sn].hitag; j = sector[sn].hitag;
if (actor[j].tempang == 0 || actor[j].tempang == 256)
A_CallSound(sn,ii); if (E_SpriteIsValid(j))
if (sprite[j].extra == 1) {
sprite[j].extra = 3; if (actor[j].tempang == 0 || actor[j].tempang == 256)
else sprite[j].extra = 1; A_CallSound(sn,ii);
sprite[j].extra = (sprite[j].extra == 1) ? 3 : 1;
}
break; break;
case ST_31_TWO_WAY_TRAIN: case ST_31_TWO_WAY_TRAIN:
j = sector[sn].hitag; j = sector[sn].hitag;
if (actor[j].t_data[4] == 0)
actor[j].t_data[4] = 1;
A_CallSound(sn,ii); if (E_SpriteIsValid(j))
{
if (actor[j].t_data[4] == 0)
actor[j].t_data[4] = 1;
A_CallSound(sn,ii);
}
break; break;
case ST_26_SPLITTING_ST_DOOR: //The split doors case ST_26_SPLITTING_ST_DOOR: //The split doors
@ -542,16 +543,16 @@ void G_OperateSectors(int32_t sn, int32_t ii)
case ST_9_SLIDING_ST_DOOR: case ST_9_SLIDING_ST_DOOR:
{ {
int32_t dax,day,dax2,day2,sp; int32_t dax, day;
int32_t wallfind[2]; int32_t wallfind[2];
startwall = sptr->wallptr; const int32_t startwall = sptr->wallptr;
endwall = startwall+sptr->wallnum-1; const int32_t endwall = startwall+sptr->wallnum-1;
sp = sptr->extra>>4; const int32_t sp = sptr->extra>>4;
//first find center point by averaging all points //first find center point by averaging all points
dax = 0L, day = 0L; dax = 0, day = 0;
for (i=startwall; i<=endwall; i++) for (i=startwall; i<=endwall; i++)
{ {
dax += wall[i].x; dax += wall[i].x;
@ -565,7 +566,7 @@ void G_OperateSectors(int32_t sn, int32_t ii)
wallfind[0] = -1; wallfind[0] = -1;
wallfind[1] = -1; wallfind[1] = -1;
for (i=startwall; i<=endwall; i++) for (i=startwall; i<=endwall; i++)
if ((wall[i].x == dax) || (wall[i].y == day)) if (wall[i].x == dax || wall[i].y == day)
{ {
if (wallfind[0] == -1) if (wallfind[0] == -1)
wallfind[0] = i; wallfind[0] = i;
@ -577,51 +578,51 @@ void G_OperateSectors(int32_t sn, int32_t ii)
for (j=0; j<2; j++) for (j=0; j<2; j++)
{ {
if ((wall[wallfind[j]].x == dax) && (wall[wallfind[j]].y == day)) const int32_t wf = wallfind[j];
int32_t dax2, day2;
i = wf-1;
if (i < startwall) i = endwall;
dax2 = ((wall[i].x+wall[wall[wf].point2].x)>>1) - wall[wf].x;
day2 = ((wall[i].y+wall[wall[wf].point2].y)>>1) - wall[wf].y;
if (wall[wf].x == dax && wall[wf].y == day)
{ {
//find what direction door should open by averaging the //find what direction door should open by averaging the
// 2 neighboring points of wallfind[0] & wallfind[1]. // 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) if (dax2 != 0)
{ {
dax2 = wall[wall[wall[wallfind[j]].point2].point2].x; dax2 = wall[wall[wall[wf].point2].point2].x;
dax2 -= wall[wall[wallfind[j]].point2].x; dax2 -= wall[wall[wf].point2].x;
SetAnimation(sn,&wall[wallfind[j]].x,wall[wallfind[j]].x+dax2,sp); SetAnimation(sn,&wall[wf].x,wall[wf].x+dax2,sp);
SetAnimation(sn,&wall[i].x,wall[i].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); SetAnimation(sn,&wall[wall[wf].point2].x,wall[wall[wf].point2].x+dax2,sp);
A_CallSound(sn,ii); A_CallSound(sn,ii);
} }
else if (day2 != 0) else if (day2 != 0)
{ {
day2 = wall[wall[wall[wallfind[j]].point2].point2].y; day2 = wall[wall[wall[wf].point2].point2].y;
day2 -= wall[wall[wallfind[j]].point2].y; day2 -= wall[wall[wf].point2].y;
SetAnimation(sn,&wall[wallfind[j]].y,wall[wallfind[j]].y+day2,sp); SetAnimation(sn,&wall[wf].y,wall[wf].y+day2,sp);
SetAnimation(sn,&wall[i].y,wall[i].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); SetAnimation(sn,&wall[wall[wf].point2].y,wall[wall[wf].point2].y+day2,sp);
A_CallSound(sn,ii); A_CallSound(sn,ii);
} }
} }
else 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) if (dax2 != 0)
{ {
SetAnimation(sn,&wall[wallfind[j]].x,dax,sp); SetAnimation(sn,&wall[wf].x,dax,sp);
SetAnimation(sn,&wall[i].x,dax+dax2,sp); SetAnimation(sn,&wall[i].x,dax+dax2,sp);
SetAnimation(sn,&wall[wall[wallfind[j]].point2].x,dax+dax2,sp); SetAnimation(sn,&wall[wall[wf].point2].x,dax+dax2,sp);
A_CallSound(sn,ii); A_CallSound(sn,ii);
} }
else if (day2 != 0) else if (day2 != 0)
{ {
SetAnimation(sn,&wall[wallfind[j]].y,day,sp); SetAnimation(sn,&wall[wf].y,day,sp);
SetAnimation(sn,&wall[i].y,day+day2,sp); SetAnimation(sn,&wall[i].y,day+day2,sp);
SetAnimation(sn,&wall[wall[wallfind[j]].point2].y,day+day2,sp); SetAnimation(sn,&wall[wall[wf].point2].y,day+day2,sp);
A_CallSound(sn,ii); A_CallSound(sn,ii);
} }
} }
@ -634,12 +635,12 @@ void G_OperateSectors(int32_t sn, int32_t ii)
if (sprite[ii].picnum != APLAYER) if (sprite[ii].picnum != APLAYER)
return; return;
i = headspritesect[sn]; for (SPRITES_OF_SECT(sn, i))
while (i >= 0) if (PN==SECTOREFFECTOR && SLT == SE_17_WARP_ELEVATOR)
{ break;
if (PN==SECTOREFFECTOR && SLT == SE_17_WARP_ELEVATOR) break;
i = nextspritesect[i]; if (i < 0)
} return;
if (sprite[ii].sectnum == sn) if (sprite[ii].sectnum == sn)
{ {
@ -647,7 +648,6 @@ void G_OperateSectors(int32_t sn, int32_t ii)
G_ActivateWarpElevators(i,1); G_ActivateWarpElevators(i,1);
else if (G_ActivateWarpElevators(i,1)) else if (G_ActivateWarpElevators(i,1))
G_ActivateWarpElevators(i,-1); G_ActivateWarpElevators(i,-1);
return;
} }
else else
{ {
@ -691,6 +691,8 @@ void G_OperateSectors(int32_t sn, int32_t ii)
if (i==-1) if (i==-1)
{ {
int32_t q;
i = nextsectorneighborz(sn,sptr->floorz,1,-1); i = nextsectorneighborz(sn,sptr->floorz,1,-1);
if (i==-1) i = nextsectorneighborz(sn,sptr->floorz,1,1); if (i==-1) i = nextsectorneighborz(sn,sptr->floorz,1,1);
if (i==-1) return; if (i==-1) return;
@ -705,19 +707,14 @@ void G_OperateSectors(int32_t sn, int32_t ii)
case ST_29_TEETH_DOOR: case ST_29_TEETH_DOOR:
i = headspritestat[STAT_EFFECTOR]; //Effectors for (SPRITES_OF(STAT_EFFECTOR, i))
while (i >= 0) if (SLT == SE_22_TEETH_DOOR && SHT == sptr->hitag)
{
if ((SLT == SE_22_TEETH_DOOR) &&
(SHT == sptr->hitag))
{ {
sector[SECT].extra = -sector[SECT].extra; sector[SECT].extra = -sector[SECT].extra;
T1 = sn; T1 = sn;
T2 = 1; T2 = 1;
} }
i = nextspritestat[i];
}
A_CallSound(sn, ii); A_CallSound(sn, ii);
@ -755,16 +752,13 @@ REDODOOR:
if (sptr->lotag&0x8000) if (sptr->lotag&0x8000)
{ {
i = headspritesect[sn]; for (SPRITES_OF_SECT(sn, i))
while (i >= 0)
{
if (sprite[i].statnum == STAT_EFFECTOR && SLT==SE_9_DOWN_OPEN_DOOR_LIGHTS) if (sprite[i].statnum == STAT_EFFECTOR && SLT==SE_9_DOWN_OPEN_DOOR_LIGHTS)
{ {
j = SZ; j = SZ;
break; break;
} }
i = nextspritesect[i];
}
if (i==-1) if (i==-1)
j = sptr->floorz; j = sptr->floorz;
} }
@ -794,7 +788,6 @@ REDODOOR:
if (animategoal[sn] == sptr->ceilingz) if (animategoal[sn] == sptr->ceilingz)
animategoal[i] = sector[nextsectorneighborz(sn,sptr->ceilingz,1,1)].floorz; animategoal[i] = sector[nextsectorneighborz(sn,sptr->ceilingz,1,1)].floorz;
else animategoal[i] = sptr->ceilingz; else animategoal[i] = sptr->ceilingz;
j = animategoal[i];
} }
else else
{ {
@ -811,18 +804,16 @@ REDODOOR:
case ST_22_SPLITTING_DOOR: case ST_22_SPLITTING_DOOR:
// REDODOOR22: if (sptr->lotag&0x8000)
if ((sptr->lotag&0x8000))
{ {
q = (sptr->ceilingz+sptr->floorz)>>1; int32_t q = (sptr->ceilingz+sptr->floorz)>>1;
j = SetAnimation(sn,&sptr->floorz,q,sptr->extra); j = SetAnimation(sn, &sptr->floorz, q, sptr->extra);
j = SetAnimation(sn,&sptr->ceilingz,q,sptr->extra); j = SetAnimation(sn, &sptr->ceilingz, q, sptr->extra);
} }
else else
{ {
int32_t fneigh=nextsectorneighborz(sn,sptr->floorz,1,1); int32_t fneigh = nextsectorneighborz(sn, sptr->floorz, 1, 1);
int32_t cneigh=nextsectorneighborz(sn,sptr->ceilingz,-1,-1); int32_t cneigh = nextsectorneighborz(sn, sptr->ceilingz, -1, -1);
if (fneigh>=0 && cneigh>=0) if (fneigh>=0 && cneigh>=0)
{ {
@ -846,121 +837,102 @@ REDODOOR:
case ST_23_SWINGING_DOOR: //Swingdoor case ST_23_SWINGING_DOOR: //Swingdoor
j = -1; j = -1;
q = 0;
i = headspritestat[STAT_EFFECTOR]; for (SPRITES_OF(STAT_EFFECTOR, i))
while (i >= 0)
{
if (SLT == SE_11_SWINGING_DOOR && SECT == sn && !T5) if (SLT == SE_11_SWINGING_DOOR && SECT == sn && !T5)
{ {
j = i; j = i;
break; break;
} }
i = nextspritestat[i];
} if (i < 0)
if (i<0)
{ {
OSD_Printf("WARNING: SE23 i<0!\n"); OSD_Printf("WARNING: SE23 i<0!\n");
return; return;
} // JBF } // JBF
l = sector[SECT].lotag&0x8000; l = sector[SECT].lotag&0x8000;
if (j >= 0) if (j >= 0)
{ {
i = headspritestat[STAT_EFFECTOR]; int32_t playedsnd = 0;
while (i >= 0)
{ for (SPRITES_OF(STAT_EFFECTOR, i))
if (l == (sector[SECT].lotag&0x8000) && SLT == SE_11_SWINGING_DOOR && sprite[j].hitag == SHT && !T5) if (l == (sector[SECT].lotag&0x8000) && SLT == SE_11_SWINGING_DOOR && sprite[j].hitag == SHT && !T5)
{ {
if (sector[SECT].lotag&0x8000) sector[SECT].lotag &= 0x7fff; if (sector[SECT].lotag&0x8000) sector[SECT].lotag &= 0x7fff;
else sector[SECT].lotag |= 0x8000; else sector[SECT].lotag |= 0x8000;
T5 = 1; T5 = 1;
T4 = -T4; T4 = -T4;
if (q == 0)
if (!playedsnd)
{ {
A_CallSound(sn,i); A_CallSound(sn,i);
q = 1; playedsnd = 1;
} }
} }
i = nextspritestat[i];
}
} }
return; return;
case ST_25_SLIDING_DOOR: //Subway type sliding doors case ST_25_SLIDING_DOOR: //Subway type sliding doors
j = headspritestat[STAT_EFFECTOR]; for (SPRITES_OF(STAT_EFFECTOR, j))
while (j >= 0)//Find the sprite if (sprite[j].lotag == SE_15_SLIDING_DOOR && sprite[j].sectnum == sn)
{
if ((sprite[j].lotag) == SE_15_SLIDING_DOOR && sprite[j].sectnum == sn)
break; //Found the sectoreffector. break; //Found the sectoreffector.
j = nextspritestat[j];
}
if (j < 0) if (j < 0)
return; return;
i = headspritestat[STAT_EFFECTOR]; for (SPRITES_OF(STAT_EFFECTOR, i))
while (i >= 0)
{
if (SHT==sprite[j].hitag) if (SHT==sprite[j].hitag)
{ {
if (SLT == SE_15_SLIDING_DOOR) if (SLT == SE_15_SLIDING_DOOR)
{ {
sector[SECT].lotag ^= 0x8000; // Toggle the open or close sector[SECT].lotag ^= 0x8000; // Toggle the open or close
SA += 1024; SA += 1024;
if (T5) A_CallSound(SECT,i);
if (T5)
A_CallSound(SECT,i);
A_CallSound(SECT,i); A_CallSound(SECT,i);
if (sector[SECT].lotag&0x8000) T5 = 1;
else T5 = 2; T5 = (sector[SECT].lotag&0x8000) ? 1 : 2;
} }
} }
i = nextspritestat[i];
}
return; return;
case ST_27_STRETCH_BRIDGE: //Extended bridge case ST_27_STRETCH_BRIDGE: //Extended bridge
j = headspritestat[STAT_EFFECTOR]; for (SPRITES_OF(STAT_EFFECTOR, j))
while (j >= 0)
{
if ((sprite[j].lotag&0xff)==SE_20_STRETCH_BRIDGE && sprite[j].sectnum == sn) //Bridge if ((sprite[j].lotag&0xff)==SE_20_STRETCH_BRIDGE && sprite[j].sectnum == sn) //Bridge
{ {
sector[sn].lotag ^= 0x8000; sector[sn].lotag ^= 0x8000;
if (sector[sn].lotag&0x8000) //OPENING // Highest bit now set means we're opening.
actor[j].t_data[0] = 1;
else actor[j].t_data[0] = 2; actor[j].t_data[0] = (sector[sn].lotag&0x8000) ? 1 : 2;
A_CallSound(sn,ii); A_CallSound(sn,ii);
break; break;
} }
j = nextspritestat[j];
}
return;
return;
case ST_28_DROP_FLOOR: case ST_28_DROP_FLOOR:
//activate the rest of them //activate the rest of them
j = headspritesect[sn]; for (SPRITES_OF_SECT(sn, j))
while (j >= 0)
{
if (sprite[j].statnum==STAT_EFFECTOR && (sprite[j].lotag&0xff)==SE_21_DROP_FLOOR) if (sprite[j].statnum==STAT_EFFECTOR && (sprite[j].lotag&0xff)==SE_21_DROP_FLOOR)
break; //Found it break;
j = nextspritesect[j];
}
if (j >= 0) // PK: The matching SE21 might have gone, see SE_21_KILLIT in actors.c if (j >= 0) // PK: The matching SE21 might have gone, see SE_21_KILLIT in actors.c
{ {
j = sprite[j].hitag; j = sprite[j].hitag;
l = headspritestat[STAT_EFFECTOR]; for (SPRITES_OF(STAT_EFFECTOR, l))
while (l >= 0)
{ {
if ((sprite[l].lotag&0xff)==SE_21_DROP_FLOOR && !actor[l].t_data[0] && if ((sprite[l].lotag&0xff)==SE_21_DROP_FLOOR && !actor[l].t_data[0] &&
(sprite[l].hitag) == j) sprite[l].hitag == j)
actor[l].t_data[0] = 1; actor[l].t_data[0] = 1;
l = nextspritestat[l];
} }
A_CallSound(sn,ii); A_CallSound(sn,ii);
@ -994,13 +966,12 @@ void G_OperateRespawns(int32_t low)
void G_OperateActivators(int32_t low, int32_t snum) void G_OperateActivators(int32_t low, int32_t snum)
{ {
int32_t i, j, k; int32_t i, nexti, j, k;
int16_t *p;
walltype *wal; walltype *wal;
for (i=g_numCyclers-1; i>=0; i--) for (i=g_numCyclers-1; i>=0; i--)
{ {
p = &cyclers[i][0]; int16_t *const p = &cyclers[i][0];
if (p[4] == low) if (p[4] == low)
{ {
@ -1013,56 +984,40 @@ void G_OperateActivators(int32_t low, int32_t snum)
} }
} }
i = headspritestat[STAT_ACTIVATOR];
k = -1; k = -1;
while (i >= 0) for (SPRITES_OF_STAT_SAFE(STAT_ACTIVATOR, i, nexti))
{ {
if (sprite[i].lotag == low) if (sprite[i].lotag == low)
{ {
if (sprite[i].picnum == ACTIVATORLOCKED) if (sprite[i].picnum == ACTIVATORLOCKED)
{ {
if (sector[SECT].lotag&16384) sector[SECT].lotag ^= 16384;
sector[SECT].lotag &= ~16384;
else
sector[SECT].lotag |= 16384;
if (snum >= 0 && snum < ud.multimode) if (snum >= 0 && snum < ud.multimode)
{ P_DoQuote((sector[SECT].lotag&16384) ? QUOTE_LOCKED : QUOTE_UNLOCKED,
if (sector[SECT].lotag&16384) g_player[snum].ps);
P_DoQuote(QUOTE_LOCKED,g_player[snum].ps);
else P_DoQuote(QUOTE_UNLOCKED,g_player[snum].ps);
}
} }
else else
{ {
switch (SHT) switch (SHT)
{ {
case 0:
break;
case 1: case 1:
if (sector[SECT].floorz != sector[SECT].ceilingz) if (sector[SECT].floorz != sector[SECT].ceilingz)
{
i = nextspritestat[i];
continue; continue;
}
break; break;
case 2: case 2:
if (sector[SECT].floorz == sector[SECT].ceilingz) if (sector[SECT].floorz == sector[SECT].ceilingz)
{
i = nextspritestat[i];
continue; continue;
}
break; break;
} }
// ST_2_UNDERWATER // ST_2_UNDERWATER
if (sector[sprite[i].sectnum].lotag < 3) if (sector[sprite[i].sectnum].lotag < 3)
{ {
j = headspritesect[sprite[i].sectnum]; for (SPRITES_OF_SECT(sprite[i].sectnum, j))
while (j >= 0) if (sprite[j].statnum == STAT_EFFECTOR)
{ switch (sprite[j].lotag)
if (sprite[j].statnum == STAT_EFFECTOR) switch (sprite[j].lotag)
{ {
case SE_36_PROJ_SHOOTER: case SE_36_PROJ_SHOOTER:
case SE_31_FLOOR_RISE_FALL: case SE_31_FLOOR_RISE_FALL:
@ -1072,8 +1027,6 @@ void G_OperateActivators(int32_t low, int32_t snum)
A_CallSound(SECT,j); A_CallSound(SECT,j);
break; break;
} }
j = nextspritesect[j];
}
} }
if (k == -1 && (sector[SECT].lotag&0xff) == ST_22_SPLITTING_DOOR) if (k == -1 && (sector[SECT].lotag&0xff) == ST_22_SPLITTING_DOOR)
@ -1082,7 +1035,6 @@ void G_OperateActivators(int32_t low, int32_t snum)
G_OperateSectors(SECT,i); G_OperateSectors(SECT,i);
} }
} }
i = nextspritestat[i];
} }
G_OperateRespawns(low); G_OperateRespawns(low);
@ -1090,22 +1042,20 @@ void G_OperateActivators(int32_t low, int32_t snum)
void G_OperateMasterSwitches(int32_t low) void G_OperateMasterSwitches(int32_t low)
{ {
int32_t i = headspritestat[STAT_STANDABLE]; int32_t i;
while (i >= 0)
{ for (SPRITES_OF(STAT_STANDABLE, i))
if (PN == MASTERSWITCH && SLT == low && SP == 0) if (PN == MASTERSWITCH && SLT == low && SP == 0)
SP = 1; SP = 1;
i = nextspritestat[i];
}
} }
void G_OperateForceFields(int32_t s, int32_t low) void G_OperateForceFields(int32_t s, int32_t low)
{ {
int32_t i, p=g_numAnimWalls; int32_t p=g_numAnimWalls;
for (; p>=0; p--) for (; p>=0; p--)
{ {
i = animwall[p].wallnum; const int32_t i = animwall[p].wallnum;
if (low == wall[i].lotag || low == -1) if (low == wall[i].lotag || low == -1)
if (G_GetForcefieldPicnum(i) == W_FORCEFIELD if (G_GetForcefieldPicnum(i) == W_FORCEFIELD
@ -1590,18 +1540,15 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchissprite)
void G_ActivateBySector(int32_t sect, int32_t j) void G_ActivateBySector(int32_t sect, int32_t j)
{ {
int32_t i = headspritesect[sect]; int32_t i;
int32_t didit = 0; int32_t didit = 0;
while (i >= 0) for (SPRITES_OF_SECT(sect, i))
{
if (PN == ACTIVATOR) if (PN == ACTIVATOR)
{ {
G_OperateActivators(SLT,-1); G_OperateActivators(SLT,-1);
didit = 1; didit = 1;
} }
i = nextspritesect[i];
}
if (didit == 0) if (didit == 0)
G_OperateSectors(sect,j); G_OperateSectors(sect,j);
@ -1659,11 +1606,9 @@ void A_DamageWall(int32_t spr, int32_t dawallnum, const vec3_t *pos, int32_t atw
if (((wal->cstat&16) || wal->overpicnum == BIGFORCE) && wal->nextsector >= 0) if (((wal->cstat&16) || wal->overpicnum == BIGFORCE) && wal->nextsector >= 0)
if (sector[wal->nextsector].floorz > pos->z) if (sector[wal->nextsector].floorz > pos->z)
if (sector[wal->nextsector].floorz-sector[wal->nextsector].ceilingz) if (sector[wal->nextsector].floorz != sector[wal->nextsector].ceilingz)
{ {
int32_t switchpicnum = wal->overpicnum; int32_t switchpicnum = G_GetForcefieldPicnum(dawallnum);
if (switchpicnum > W_FORCEFIELD && switchpicnum <= W_FORCEFIELD+2)
switchpicnum = W_FORCEFIELD;
switch (DYNAMICTILEMAP(switchpicnum)) switch (DYNAMICTILEMAP(switchpicnum))
{ {
@ -1836,10 +1781,7 @@ void A_DamageWall(int32_t spr, int32_t dawallnum, const vec3_t *pos, int32_t atw
case WALLLIGHT4__STATIC: case WALLLIGHT4__STATIC:
case TECHLIGHT2__STATIC: case TECHLIGHT2__STATIC:
case TECHLIGHT4__STATIC: case TECHLIGHT4__STATIC:
A_PlaySound(rnd(128) ? GLASS_HEAVYBREAK : GLASS_BREAKING, spr);
if (rnd(128))
A_PlaySound(GLASS_HEAVYBREAK,spr);
else A_PlaySound(GLASS_BREAKING,spr);
A_SpawnWallGlass(spr,dawallnum,30); A_SpawnWallGlass(spr,dawallnum,30);
if (wal->picnum == WALLLIGHT1) if (wal->picnum == WALLLIGHT1)
@ -2470,7 +2412,7 @@ void P_HandleSharedKeys(int32_t snum)
{ {
int32_t i, k = 0, dainv; int32_t i, k = 0, dainv;
uint32_t sb_snum = g_player[snum].sync->bits, j; uint32_t sb_snum = g_player[snum].sync->bits, j;
DukePlayer_t *p = g_player[snum].ps; DukePlayer_t *const p = g_player[snum].ps;
if (p->cheat_phase == 1) return; if (p->cheat_phase == 1) return;
@ -3035,9 +2977,9 @@ static int32_t our_neartag_blacklist(int32_t i)
void P_CheckSectors(int32_t snum) void P_CheckSectors(int32_t snum)
{ {
int32_t i = -1,oldz; int32_t i = -1;
DukePlayer_t *p = g_player[snum].ps; DukePlayer_t *const p = g_player[snum].ps;
int16_t j,hitscanwall; int16_t hitscanwall = -1; // CAUTION with goto's!!!
if (p->cursectnum > -1) if (p->cursectnum > -1)
switch (sector[p->cursectnum].lotag) switch (sector[p->cursectnum].lotag)
@ -3134,12 +3076,8 @@ void P_CheckSectors(int32_t snum)
} }
if (hitscanwall >= 0 && (wall[hitscanwall].cstat&16)) if (hitscanwall >= 0 && (wall[hitscanwall].cstat&16))
switch (wall[hitscanwall].overpicnum) if (wall[hitscanwall].lotag)
{ return;
default:
if (wall[hitscanwall].lotag)
return;
}
if (p->newowner >= 0) if (p->newowner >= 0)
neartag(p->opos.x,p->opos.y,p->opos.z,sprite[p->i].sectnum,p->oang,&neartagsector, neartag(p->opos.x,p->opos.y,p->opos.z,sprite[p->i].sectnum,p->oang,&neartagsector,
@ -3196,8 +3134,9 @@ void P_CheckSectors(int32_t snum)
if (neartagsprite == -1 && neartagwall == -1) if (neartagsprite == -1 && neartagwall == -1)
if (p->cursectnum >= 0 && sector[p->cursectnum].lotag == 2) if (p->cursectnum >= 0 && sector[p->cursectnum].lotag == 2)
{ {
oldz = A_CheckHitSprite(p->i,&neartagsprite); int32_t oldz = A_CheckHitSprite(p->i,&neartagsprite);
if (oldz > 1280) neartagsprite = -1; if (oldz > 1280)
neartagsprite = -1;
} }
if (neartagsprite >= 0) if (neartagsprite >= 0)
@ -3233,7 +3172,11 @@ void P_CheckSectors(int32_t snum)
return; return;
case NUKEBUTTON__STATIC: case NUKEBUTTON__STATIC:
P_FindWall(p,&j); {
int16_t j;
P_FindWall(p, &j);
if (j >= 0 && wall[j].overpicnum == 0) if (j >= 0 && wall[j].overpicnum == 0)
if (actor[neartagsprite].t_data[0] == 0) if (actor[neartagsprite].t_data[0] == 0)
{ {
@ -3252,6 +3195,7 @@ void P_CheckSectors(int32_t snum)
} }
} }
return; return;
}
case WATERFOUNTAIN__STATIC: case WATERFOUNTAIN__STATIC:
if (actor[neartagsprite].t_data[0] != 1) if (actor[neartagsprite].t_data[0] != 1)
@ -3288,11 +3232,12 @@ void P_CheckSectors(int32_t snum)
sprite[neartagsprite].owner = i; sprite[neartagsprite].owner = i;
sprite[neartagsprite].yvel = 1; sprite[neartagsprite].yvel = 1;
{
j = p->cursectnum; int32_t j = p->cursectnum;
p->cursectnum = SECT; p->cursectnum = SECT;
P_UpdateScreenPal(p); P_UpdateScreenPal(p);
p->cursectnum = j; p->cursectnum = j;
}
// parallaxtype = 2; // parallaxtype = 2;
p->newowner = i; p->newowner = i;
@ -3317,8 +3262,10 @@ CLEARCAMERAS:
} // switch } // switch
} }
if (TEST_SYNC_KEY(g_player[snum].sync->bits, SK_OPEN) == 0) return; if (TEST_SYNC_KEY(g_player[snum].sync->bits, SK_OPEN) == 0)
else if (p->newowner >= 0) return;
if (p->newowner >= 0)
{ {
i = -1; i = -1;
goto CLEARCAMERAS; goto CLEARCAMERAS;
@ -3348,27 +3295,27 @@ CLEARCAMERAS:
} }
} }
if (neartagsector >= 0 && (sector[neartagsector].lotag&16384) == 0 && isanearoperator(sector[neartagsector].lotag)) if (neartagsector >= 0 && (sector[neartagsector].lotag&16384) == 0 &&
isanearoperator(sector[neartagsector].lotag))
{ {
i = headspritesect[neartagsector]; for (SPRITES_OF_SECT(neartagsector, i))
while (i >= 0)
{ {
if (PN == ACTIVATOR || PN == MASTERSWITCH) if (PN == ACTIVATOR || PN == MASTERSWITCH)
return; return;
i = nextspritesect[i];
} }
G_OperateSectors(neartagsector,p->i); G_OperateSectors(neartagsector,p->i);
} }
else if ((sector[sprite[p->i].sectnum].lotag&16384) == 0) else if ((sector[sprite[p->i].sectnum].lotag&16384) == 0)
{ {
if (isanunderoperator(sector[sprite[p->i].sectnum].lotag)) if (isanunderoperator(sector[sprite[p->i].sectnum].lotag))
{ {
i = headspritesect[sprite[p->i].sectnum]; for (SPRITES_OF_SECT(sprite[p->i].sectnum, i))
while (i >= 0)
{ {
if (PN == ACTIVATOR || PN == MASTERSWITCH) return; if (PN == ACTIVATOR || PN == MASTERSWITCH)
i = nextspritesect[i]; return;
} }
G_OperateSectors(sprite[p->i].sectnum,p->i); G_OperateSectors(sprite[p->i].sectnum,p->i);
} }
else P_ActivateSwitch(snum,neartagwall,0); else P_ActivateSwitch(snum,neartagwall,0);