- converted the remaining sector iterators in Duke.

This commit is contained in:
Christoph Oelckers 2020-10-14 21:40:15 +02:00
parent 758fab1804
commit 760a557f73
7 changed files with 66 additions and 122 deletions

View file

@ -478,41 +478,6 @@ SPRITE VARIABLES:
be in some sector, and must have some kind of status that you define. be in some sector, and must have some kind of status that you define.
Coding example #1:
To go through all the sprites in sector 1, the code can look like this:
sectnum = 1;
i = headspritesect[sectnum];
while (i != -1)
{
nexti = nextspritesect[i];
//your code goes here
//ex: printf("Sprite %d is in sector %d\n",i,sectnum);
i = nexti;
}
Coding example #2:
To go through all sprites with status = 1, the code can look like this:
statnum = 1; //status 1
i = headspritestat[statnum];
while (i != -1)
{
nexti = nextspritestat[i];
//your code goes here
//ex: printf("Sprite %d has a status of 1 (active)\n",i,statnum);
i = nexti;
}
insertsprite(short sectnum, short statnum);
deletesprite(short spritenum);
changespritesect(short spritenum, short newsectnum);
changespritestat(short spritenum, short newstatnum);
TILE VARIABLES: TILE VARIABLES:
NUMTILES - the number of tiles found TILES.DAT. NUMTILES - the number of tiles found TILES.DAT.

View file

@ -333,7 +333,6 @@ void shoot_d(int i, int atwith)
{ {
if (sprite[k].statnum == 3 && sprite[k].lotag == 13) if (sprite[k].statnum == 3 && sprite[k].lotag == 13)
return; return;
k = nextspritesect[k];
} }
} }
@ -592,7 +591,6 @@ void shoot_d(int i, int atwith)
{ {
if (sprite[l].statnum == 3 && sprite[l].lotag == 13) if (sprite[l].statnum == 3 && sprite[l].lotag == 13)
goto SKIPBULLETHOLE; goto SKIPBULLETHOLE;
l = nextspritesect[l];
} }
} }

View file

@ -222,7 +222,6 @@ void shoot_r(int i, int atwith)
{ {
if (sprite[k].statnum == 3 && sprite[k].lotag == 13) if (sprite[k].statnum == 3 && sprite[k].lotag == 13)
return; return;
k = nextspritesect[k];
} }
} }
@ -505,7 +504,6 @@ void shoot_r(int i, int atwith)
{ {
if (sprite[l].statnum == 3 && sprite[l].lotag == 13) if (sprite[l].statnum == 3 && sprite[l].lotag == 13)
goto SKIPBULLETHOLE; goto SKIPBULLETHOLE;
l = nextspritesect[l];
} }
} }

View file

@ -389,7 +389,7 @@ void setdrugmode(player_struct *p, int oyrepeat)
static void geometryEffect(int cposx, int cposy, int cposz, binangle cang, fixedhoriz choriz, int sect, int smoothratio) static void geometryEffect(int cposx, int cposy, int cposz, binangle cang, fixedhoriz choriz, int sect, int smoothratio)
{ {
short gs, tgsect, nextspr, geosect, geoid = 0; short gs, tgsect, geosect, geoid = 0;
int spr; int spr;
renderDrawRoomsQ16(cposx, cposy, cposz, cang.asq16(), choriz.asq16(), sect); renderDrawRoomsQ16(cposx, cposy, cposz, cang.asq16(), choriz.asq16(), sect);
fi.animatesprites(cposx, cposy, cang.asbuild(), smoothratio); fi.animatesprites(cposx, cposy, cang.asbuild(), smoothratio);
@ -397,13 +397,12 @@ static void geometryEffect(int cposx, int cposy, int cposz, binangle cang, fixed
for (gs = 0; gs < geocnt; gs++) for (gs = 0; gs < geocnt; gs++)
{ {
tgsect = geosector[gs]; tgsect = geosector[gs];
spr = headspritesect[tgsect];
while (spr != -1) SectIterator it(tgsect);
while ((spr = it.NextIndex()) >= 0)
{ {
nextspr = nextspritesect[spr];
changespritesect((short)spr, geosectorwarp[gs]); changespritesect((short)spr, geosectorwarp[gs]);
setsprite((short)spr, sprite[spr].x -= geox[gs], sprite[spr].y -= geoy[gs], sprite[spr].z); setsprite((short)spr, sprite[spr].x -= geox[gs], sprite[spr].y -= geoy[gs], sprite[spr].z);
spr = nextspr;
} }
if (geosector[gs] == sect) if (geosector[gs] == sect)
{ {
@ -419,13 +418,11 @@ static void geometryEffect(int cposx, int cposy, int cposz, binangle cang, fixed
for (gs = 0; gs < geocnt; gs++) for (gs = 0; gs < geocnt; gs++)
{ {
tgsect = geosectorwarp[gs]; tgsect = geosectorwarp[gs];
spr = headspritesect[tgsect]; SectIterator it(tgsect);
while (spr != -1) while ((spr = it.NextIndex()) >= 0)
{ {
nextspr = nextspritesect[spr];
changespritesect((short)spr, geosector[gs]); changespritesect((short)spr, geosector[gs]);
setsprite((short)spr, sprite[spr].x += geox[gs], sprite[spr].y += geoy[gs], sprite[spr].z); setsprite((short)spr, sprite[spr].x += geox[gs], sprite[spr].y += geoy[gs], sprite[spr].z);
spr = nextspr;
} }
} }
fi.animatesprites(cposx, cposy, cang.asbuild(), smoothratio); fi.animatesprites(cposx, cposy, cang.asbuild(), smoothratio);
@ -433,13 +430,11 @@ static void geometryEffect(int cposx, int cposy, int cposz, binangle cang, fixed
for (gs = 0; gs < geocnt; gs++) for (gs = 0; gs < geocnt; gs++)
{ {
tgsect = geosector[gs]; tgsect = geosector[gs];
spr = headspritesect[tgsect]; SectIterator it(tgsect);
while (spr != -1) while ((spr = it.NextIndex()) >= 0)
{ {
nextspr = nextspritesect[spr];
changespritesect((short)spr, geosectorwarp2[gs]); changespritesect((short)spr, geosectorwarp2[gs]);
setsprite((short)spr, sprite[spr].x -= geox2[gs], sprite[spr].y -= geoy2[gs], sprite[spr].z); setsprite((short)spr, sprite[spr].x -= geox2[gs], sprite[spr].y -= geoy2[gs], sprite[spr].z);
spr = nextspr;
} }
if (geosector[gs] == sect) if (geosector[gs] == sect)
{ {
@ -455,13 +450,11 @@ static void geometryEffect(int cposx, int cposy, int cposz, binangle cang, fixed
for (gs = 0; gs < geocnt; gs++) for (gs = 0; gs < geocnt; gs++)
{ {
tgsect = geosectorwarp2[gs]; tgsect = geosectorwarp2[gs];
spr = headspritesect[tgsect]; SectIterator it(tgsect);
while (spr != -1) while ((spr = it.NextIndex()) >= 0)
{ {
nextspr = nextspritesect[spr];
changespritesect((short)spr, geosector[gs]); changespritesect((short)spr, geosector[gs]);
setsprite((short)spr, sprite[spr].x += geox2[gs], sprite[spr].y += geoy2[gs], sprite[spr].z); setsprite((short)spr, sprite[spr].x += geox2[gs], sprite[spr].y += geoy2[gs], sprite[spr].z);
spr = nextspr;
} }
} }
fi.animatesprites(cposx, cposy, cang.asbuild(), smoothratio); fi.animatesprites(cposx, cposy, cang.asbuild(), smoothratio);

View file

@ -57,18 +57,20 @@ int callsound(int sn, int whatsprite)
return -1; return -1;
} }
int i = headspritesect[sn]; int i;
while (i >= 0) SectIterator it(sn);
while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == MUSICANDSFX && sprite[i].lotag < 1000) auto si = &sprite[i];
if (si->picnum == MUSICANDSFX && si->lotag < 1000)
{ {
if (whatsprite == -1) whatsprite = i; if (whatsprite == -1) whatsprite = i;
int snum = sprite[i].lotag; int snum = si->lotag;
auto flags = S_GetUserFlags(snum); auto flags = S_GetUserFlags(snum);
// Reset if the desired actor isn't playing anything. // Reset if the desired actor isn't playing anything.
bool hival = S_IsSoundValid(sprite[i].hitag); bool hival = S_IsSoundValid(si->hitag);
if (hittype[i].temp_data[0] == 1 && !hival) if (hittype[i].temp_data[0] == 1 && !hival)
{ {
if (!S_CheckActorSoundPlaying(hittype[i].temp_data[5], snum)) if (!S_CheckActorSoundPlaying(hittype[i].temp_data[5], snum))
@ -81,27 +83,26 @@ int callsound(int sn, int whatsprite)
{ {
if (snum) if (snum)
{ {
if (sprite[i].hitag && snum != sprite[i].hitag) if (si->hitag && snum != si->hitag)
S_StopSound(sprite[i].hitag, hittype[i].temp_data[5]); S_StopSound(si->hitag, hittype[i].temp_data[5]);
S_PlayActorSound(snum, whatsprite); S_PlayActorSound(snum, whatsprite);
hittype[i].temp_data[5] = whatsprite; hittype[i].temp_data[5] = whatsprite;
} }
if ((sector[sprite[i].sectnum].lotag & 0xff) != ST_22_SPLITTING_DOOR) if ((sector[si->sectnum].lotag & 0xff) != ST_22_SPLITTING_DOOR)
hittype[i].temp_data[0] = 1; hittype[i].temp_data[0] = 1;
} }
} }
else if (sprite[i].hitag < 1000) else if (si->hitag < 1000)
{ {
if ((flags & SF_LOOP) || (sprite[i].hitag && sprite[i].hitag != sprite[i].lotag)) if ((flags & SF_LOOP) || (si->hitag && si->hitag != si->lotag))
S_StopSound(sprite[i].lotag, hittype[i].temp_data[5]); S_StopSound(si->lotag, hittype[i].temp_data[5]);
if (sprite[i].hitag) S_PlayActorSound(sprite[i].hitag, whatsprite); if (si->hitag) S_PlayActorSound(si->hitag, whatsprite);
hittype[i].temp_data[0] = 0; hittype[i].temp_data[0] = 0;
hittype[i].temp_data[5] = whatsprite; hittype[i].temp_data[5] = whatsprite;
} }
return sprite[i].lotag; return si->lotag;
} }
i = nextspritesect[i];
} }
return -1; return -1;
} }
@ -355,13 +356,16 @@ void doanimations(void)
ps[p].poszv = 0; ps[p].poszv = 0;
} }
for (j = headspritesect[dasect]; j >= 0; j = nextspritesect[j]) SectIterator it(dasect);
while ((j = it.NextIndex()) >= 0)
{
if (sprite[j].statnum != STAT_EFFECTOR) if (sprite[j].statnum != STAT_EFFECTOR)
{ {
hittype[j].bposz = sprite[j].z; hittype[j].bposz = sprite[j].z;
sprite[j].z += v; sprite[j].z += v;
hittype[j].floorz = sector[dasect].floorz + v; hittype[j].floorz = sector[dasect].floorz + v;
} }
}
} }
*animateptr(i) = a; *animateptr(i) = a;
@ -634,15 +638,14 @@ void operatesectors(int sn, int ii)
return; return;
case ST_15_WARP_ELEVATOR://Warping elevators case ST_15_WARP_ELEVATOR://Warping elevators
{
if (sprite[ii].picnum != TILE_APLAYER) return; if (sprite[ii].picnum != TILE_APLAYER) return;
// if(ps[sprite[ii].yvel].select_dir == 1) return; // if(ps[sprite[ii].yvel].select_dir == 1) return;
i = headspritesect[sn]; SectIterator it(sn);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == SECTOREFFECTOR && sprite[i].lotag == 17) break; if (sprite[i].picnum == SECTOREFFECTOR && sprite[i].lotag == 17) break;
i = nextspritesect[i];
} }
if (sprite[ii].sectnum == sn) if (sprite[ii].sectnum == sn)
@ -662,7 +665,7 @@ void operatesectors(int sn, int ii)
} }
return; return;
}
case ST_16_PLATFORM_DOWN: case ST_16_PLATFORM_DOWN:
case ST_17_PLATFORM_UP: case ST_17_PLATFORM_UP:
@ -741,15 +744,14 @@ void operatesectors(int sn, int ii)
if (sptr->lotag & 0x8000) if (sptr->lotag & 0x8000)
{ {
i = headspritesect[sn]; SectIterator it(sn);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].statnum == 3 && sprite[i].lotag == 9) if (sprite[i].statnum == 3 && sprite[i].lotag == 9)
{ {
j = sprite[i].z; j = sprite[i].z;
break; break;
} }
i = nextspritesect[i];
} }
if (i == -1) if (i == -1)
j = sptr->floorz; j = sptr->floorz;
@ -910,14 +912,14 @@ void operatesectors(int sn, int ii)
case ST_28_DROP_FLOOR: case ST_28_DROP_FLOOR:
{
//activate the rest of them //activate the rest of them
j = headspritesect[sn]; SectIterator it(sn);
while (j >= 0) while ((j = it.NextIndex()) >= 0)
{ {
if (sprite[j].statnum == 3 && (sprite[j].lotag & 0xff) == 21) if (sprite[j].statnum == 3 && (sprite[j].lotag & 0xff) == 21)
break; //Found it break; //Found it
j = nextspritesect[j];
} }
j = sprite[j].hitag; j = sprite[j].hitag;
@ -934,6 +936,7 @@ void operatesectors(int sn, int ii)
return; return;
} }
}
} }
@ -1005,8 +1008,8 @@ void operateactivators(int low, int snum)
if (sector[sprite[i].sectnum].lotag < 3) if (sector[sprite[i].sectnum].lotag < 3)
{ {
j = headspritesect[sprite[i].sectnum]; SectIterator it(sprite[i].sectnum);
while (j >= 0) while ((j = it.NextIndex()) >= 0)
{ {
if (sprite[j].statnum == 3) switch (sprite[j].lotag) if (sprite[j].statnum == 3) switch (sprite[j].lotag)
{ {
@ -1019,7 +1022,6 @@ void operateactivators(int low, int snum)
callsound(sprite[i].sectnum, j); callsound(sprite[i].sectnum, j);
break; break;
} }
j = nextspritesect[j];
} }
} }

View file

@ -620,8 +620,8 @@ void activatebysector_d(int sect, int j)
didit = 0; didit = 0;
i = headspritesect[sect]; SectIterator it(sect);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == ACTIVATOR) if (sprite[i].picnum == ACTIVATOR)
{ {
@ -629,7 +629,6 @@ void activatebysector_d(int sect, int j)
didit = 1; didit = 1;
// return; // return;
} }
i = nextspritesect[i];
} }
if (didit == 0) if (didit == 0)
@ -986,8 +985,8 @@ bool checkhitceiling_d(int sn)
if (!sector[sn].hitag) if (!sector[sn].hitag)
{ {
i = headspritesect[sn]; SectIterator it(sn);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == SECTOREFFECTOR && sprite[i].lotag == 12) if (sprite[i].picnum == SECTOREFFECTOR && sprite[i].lotag == 12)
{ {
@ -1000,7 +999,6 @@ bool checkhitceiling_d(int sn)
} }
break; break;
} }
i = nextspritesect[i];
} }
} }
@ -1782,12 +1780,11 @@ void checksectors_d(int snum)
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]; SectIterator it(neartagsector);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH) if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH)
return; return;
i = nextspritesect[i];
} }
operatesectors(neartagsector, p->i); operatesectors(neartagsector, p->i);
} }
@ -1795,11 +1792,10 @@ void checksectors_d(int snum)
{ {
if (isanunderoperator(sector[sprite[p->i].sectnum].lotag)) if (isanunderoperator(sector[sprite[p->i].sectnum].lotag))
{ {
i = headspritesect[sprite[p->i].sectnum]; SectIterator it(sprite[p->i].sectnum);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH) return; if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH) return;
i = nextspritesect[i];
} }
operatesectors(sprite[p->i].sectnum, p->i); operatesectors(sprite[p->i].sectnum, p->i);
} }

View file

@ -901,15 +901,14 @@ void activatebysector_r(int sect, int j)
{ {
short i; short i;
i = headspritesect[sect]; SectIterator it(sect);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == ACTIVATOR) if (sprite[i].picnum == ACTIVATOR)
{ {
operateactivators(sprite[i].lotag, -1); operateactivators(sprite[i].lotag, -1);
// return; // return;
} }
i = nextspritesect[i];
} }
if (sector[sect].lotag != 22) if (sector[sect].lotag != 22)
@ -1072,16 +1071,14 @@ void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith)
case RRTILE3643 + 2: case RRTILE3643 + 2:
case RRTILE3643 + 3: case RRTILE3643 + 3:
{ {
short sect; int sect;
short unk = 0; int unk = 0;
short jj; int jj;
short nextjj; int startwall, endwall;
short startwall, endwall;
sect = wall[wal->nextwall].nextsector; sect = wall[wal->nextwall].nextsector;
jj = headspritesect[sect]; SectIterator it(sect);
while (jj != -1) while ((jj = it.NextIndex()) >= 0)
{ {
nextjj = nextspritesect[jj];
s = &sprite[jj]; s = &sprite[jj];
if (s->lotag == 6) if (s->lotag == 6)
{ {
@ -1099,7 +1096,6 @@ void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith)
deletesprite(jj); deletesprite(jj);
} }
} }
jj = nextjj;
} }
return; return;
} }
@ -1495,8 +1491,8 @@ bool checkhitceiling_r(int sn)
if (!sector[sn].hitag) if (!sector[sn].hitag)
{ {
i = headspritesect[sn]; SectIterator it(sn);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == SECTOREFFECTOR && (sprite[i].lotag == 12 || (isRRRA() && (sprite[i].lotag == 47 || sprite[i].lotag == 48)))) if (sprite[i].picnum == SECTOREFFECTOR && (sprite[i].lotag == 12 || (isRRRA() && (sprite[i].lotag == 47 || sprite[i].lotag == 48))))
{ {
@ -1509,7 +1505,6 @@ bool checkhitceiling_r(int sn)
} }
break; break;
} }
i = nextspritesect[i];
} }
} }
@ -2732,12 +2727,11 @@ void checksectors_r(int snum)
if (neartagsector >= 0 && (sector[neartagsector].lotag & 16384) == 0 && isanearoperator(sector[neartagsector].lotag)) if (neartagsector >= 0 && (sector[neartagsector].lotag & 16384) == 0 && isanearoperator(sector[neartagsector].lotag))
{ {
short unk = 0; short unk = 0;
i = headspritesect[neartagsector]; SectIterator it(neartagsector);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH) if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH)
return; return;
i = nextspritesect[i];
} }
if (haskey(neartagsector, snum)) if (haskey(neartagsector, snum))
operatesectors(neartagsector, p->i); operatesectors(neartagsector, p->i);
@ -2754,11 +2748,10 @@ void checksectors_r(int snum)
{ {
if (isanunderoperator(sector[sprite[p->i].sectnum].lotag)) if (isanunderoperator(sector[sprite[p->i].sectnum].lotag))
{ {
i = headspritesect[sprite[p->i].sectnum]; SectIterator it(sprite[p->i].sectnum);
while (i >= 0) while ((i = it.NextIndex()) >= 0)
{ {
if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH) return; if (sprite[i].picnum == ACTIVATOR || sprite[i].picnum == MASTERSWITCH) return;
i = nextspritesect[i];
} }
if (haskey(neartagsector, snum)) if (haskey(neartagsector, snum))
operatesectors(sprite[p->i].sectnum, p->i); operatesectors(sprite[p->i].sectnum, p->i);
@ -2902,16 +2895,15 @@ void dofurniture(int wl, int sect, int snum)
void tearitup(int sect) void tearitup(int sect)
{ {
int j = headspritesect[sect]; int j;
while (j != -1) SectIterator it(sect);
while ((j = it.NextIndex()) >= 0)
{ {
int nextj = nextspritesect[j];
if (sprite[j].picnum == DESTRUCTO) if (sprite[j].picnum == DESTRUCTO)
{ {
hittype[j].picnum = SHOTSPARK1; hittype[j].picnum = SHOTSPARK1;
hittype[j].extra = 1; hittype[j].extra = 1;
} }
j = nextj;
} }
} }
END_DUKE_NS END_DUKE_NS