From a506b45369167ec85a5290ce58138ad13807dc56 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 15 Oct 2020 17:30:55 +0200 Subject: [PATCH] - one third of SW's iterators. --- source/sw/src/ai.cpp | 3 ++- source/sw/src/break.cpp | 6 +++-- source/sw/src/bunny.cpp | 3 ++- source/sw/src/cache.cpp | 3 ++- source/sw/src/copysect.cpp | 14 +++++++---- source/sw/src/draw.cpp | 32 +++++++++++++++---------- source/sw/src/game.cpp | 7 +++--- source/sw/src/hornet.cpp | 3 ++- source/sw/src/jsector.cpp | 3 ++- source/sw/src/jweapon.cpp | 9 ++++--- source/sw/src/miscactr.cpp | 3 ++- source/sw/src/player.cpp | 48 +++++++++++++++++++++++++------------- source/sw/src/quake.cpp | 12 ++++++---- source/sw/src/rooms.cpp | 29 +++++++++++++++-------- source/sw/src/rotator.cpp | 12 ++++++---- source/sw/src/sector.cpp | 33 +++++++++++++++++--------- source/sw/src/sprite.cpp | 17 +++++++++----- source/sw/src/sumo.cpp | 3 ++- source/sw/src/track.cpp | 3 ++- source/sw/src/weapon.cpp | 8 ++++--- 20 files changed, 164 insertions(+), 87 deletions(-) diff --git a/source/sw/src/ai.cpp b/source/sw/src/ai.cpp index 176bcf76a..1f69c99b7 100644 --- a/source/sw/src/ai.cpp +++ b/source/sw/src/ai.cpp @@ -490,7 +490,8 @@ TARGETACTOR: if (!found && TEST(u->Flags2, SPR2_DONT_TARGET_OWNER)) { near_dist = MAX_ACTIVE_RANGE; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { if (i == SpriteNum) continue; diff --git a/source/sw/src/break.cpp b/source/sw/src/break.cpp index ed7f70a86..1c75eb89d 100644 --- a/source/sw/src/break.cpp +++ b/source/sw/src/break.cpp @@ -545,7 +545,8 @@ short FindBreakSpriteMatch(short match) { short i,nexti; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_BREAKABLE], i, nexti) + StatIterator it(STAT_BREAKABLE); + while ((i = it.NextIndex()) >= 0) { if (SPRITE_TAG2(i) == match && sprite[i].picnum == ST1) { @@ -1120,7 +1121,8 @@ static void DoWallBreakSpriteMatch(short match) { short i,nexti; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { SPRITEp sp = &sprite[i]; diff --git a/source/sw/src/bunny.cpp b/source/sw/src/bunny.cpp index f3ac162a9..7614df02f 100644 --- a/source/sw/src/bunny.cpp +++ b/source/sw/src/bunny.cpp @@ -932,7 +932,8 @@ DoPickCloseBunny(short SpriteNum) int look_height = SPRITEp_TOS(sp); bool ICanSee = false; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { tsp = &sprite[i]; tu = User[i]; diff --git a/source/sw/src/cache.cpp b/source/sw/src/cache.cpp index 77a8a2045..c90ae5562 100644 --- a/source/sw/src/cache.cpp +++ b/source/sw/src/cache.cpp @@ -295,7 +295,8 @@ void PreCacheOverride(void) { int i,nexti; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_CEILING_FLOOR_PIC_OVERRIDE], i, nexti) + StatIterator it(STAT_CEILING_FLOOR_PIC_OVERRIDE); + while ((i = it.NextIndex()) >= 0) { ASSERT(SPRITE_TAG2(i) >= 0 && SPRITE_TAG2(i) <= MAXTILES); SET_GOTPIC(SPRITE_TAG2(i)); diff --git a/source/sw/src/copysect.cpp b/source/sw/src/copysect.cpp index 70e1e6e23..7f5db241b 100644 --- a/source/sw/src/copysect.cpp +++ b/source/sw/src/copysect.cpp @@ -107,13 +107,14 @@ void CopySectorWalls(short dest_sectnum, short src_sectnum) void CopySectorMatch(short match) { - short ed,nexted,ss,nextss; + int ed,ss; SPRITEp dest_sp, src_sp; SECTORp dsectp,ssectp; short kill, nextkill; SPRITEp k; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_DEST], ed, nexted) + StatIterator it(STAT_COPY_DEST); + while ((ed = it.NextIndex()) >= 0) { dest_sp = &sprite[ed]; dsectp = §or[dest_sp->sectnum]; @@ -121,7 +122,8 @@ void CopySectorMatch(short match) if (match != sprite[ed].lotag) continue; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_SOURCE], ss, nextss) + StatIterator it2(STAT_COPY_SOURCE); + while ((ss = it2.NextIndex()) >= 0) { src_sp = &sprite[ss]; @@ -247,14 +249,16 @@ void CopySectorMatch(short match) // do this outside of processing loop for safety // kill all matching dest - TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_DEST], ed, nexted) + it.Reset(STAT_COPY_DEST); + while ((ed = it.NextIndex()) >= 0) { if (match == sprite[ed].lotag) KillSprite(ed); } // kill all matching sources - TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_SOURCE], ss, nextss) + it.Reset(STAT_COPY_SOURCE); + while ((ss = it.NextIndex()) >= 0) { if (match == sprite[ss].lotag) KillSprite(ss); diff --git a/source/sw/src/draw.cpp b/source/sw/src/draw.cpp index 23a606929..05fea8717 100644 --- a/source/sw/src/draw.cpp +++ b/source/sw/src/draw.cpp @@ -453,21 +453,22 @@ void SetVoxelSprite(SPRITEp sp, short pic) void WarpCopySprite(void) { SPRITEp sp1, sp2, sp; - short sn, nsn; - short sn2, nsn2; - short spnum, next_spnum; + int sn, sn2; + int spnum, next_spnum; int xoff,yoff,zoff; short match; short sect1, sect2; // look for the first one - TRAVERSE_SPRITE_STAT(headspritestat[STAT_WARP_COPY_SPRITE1], sn, nsn) + StatIterator it(STAT_WARP_COPY_SPRITE1); + while ((sn = it.NextIndex()) >= 0) { sp1 = &sprite[sn]; match = sp1->lotag; // look for the second one - TRAVERSE_SPRITE_STAT(headspritestat[STAT_WARP_COPY_SPRITE2], sn2, nsn2) + StatIterator it1(STAT_WARP_COPY_SPRITE2); + while ((sn2 = it1.NextIndex()) >= 0) { sp = &sprite[sn2]; @@ -1272,7 +1273,8 @@ void CameraView(PLAYERp pp, int *tx, int *ty, int *tz, short *tsectnum, binangle if (pp == &Player[screenpeek]) { - TRAVERSE_SPRITE_STAT(headspritestat[STAT_DEMO_CAMERA], i, nexti) + StatIterator it(STAT_DEMO_CAMERA); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -1381,7 +1383,8 @@ PreDraw(void) PreDrawStackedWater(); - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FLOOR_SLOPE_DONT_DRAW], i, nexti) + StatIterator it(STAT_FLOOR_SLOPE_DONT_DRAW); + while ((i = it.NextIndex()) >= 0) { RESET(sector[sprite[i].sectnum].floorstat, FLOOR_STAT_SLOPE); } @@ -1392,12 +1395,14 @@ PostDraw(void) { short i, nexti; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FLOOR_SLOPE_DONT_DRAW], i, nexti) + StatIterator it(STAT_FLOOR_SLOPE_DONT_DRAW); + while ((i = it.NextIndex()) >= 0) { SET(sector[sprite[i].sectnum].floorstat, FLOOR_STAT_SLOPE); } - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF_COPY], i, nexti) + it.Reset(STAT_FAF_COPY); + while ((i = it.NextIndex()) >= 0) { if (User[i]) { @@ -1483,7 +1488,8 @@ void PreDrawStackedWater(void) USERp u,nu; short New; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_CEILING_FLOOR_PIC_OVERRIDE], si, snexti) + StatIterator it(STAT_CEILING_FLOOR_PIC_OVERRIDE); + while ((si = it.NextIndex()) >= 0) { TRAVERSE_SPRITE_SECT(headspritesect[sprite[si].sectnum], i, nexti) { @@ -1542,7 +1548,8 @@ void FAF_DrawRooms(int x, int y, int z, fixed_t q16ang, fixed_t q16horiz, short { short i,nexti; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_CEILING_FLOOR_PIC_OVERRIDE], i, nexti) + StatIterator it(STAT_CEILING_FLOOR_PIC_OVERRIDE); + while ((i = it.NextIndex()) >= 0) { if (SPRITE_TAG3(i) == 0) { @@ -1567,7 +1574,8 @@ void FAF_DrawRooms(int x, int y, int z, fixed_t q16ang, fixed_t q16horiz, short renderDrawRoomsQ16(x,y,z,q16ang,q16horiz,sectnum); - TRAVERSE_SPRITE_STAT(headspritestat[STAT_CEILING_FLOOR_PIC_OVERRIDE], i, nexti) + it.Reset(STAT_CEILING_FLOOR_PIC_OVERRIDE); + while ((i = it.NextIndex()) >= 0) { // manually set gotpic if (TEST_GOTSECTOR(sprite[i].sectnum)) diff --git a/source/sw/src/game.cpp b/source/sw/src/game.cpp index 834470143..b0fb3fdf0 100644 --- a/source/sw/src/game.cpp +++ b/source/sw/src/game.cpp @@ -507,7 +507,8 @@ void TerminateLevel(void) pnum = stat - STAT_PLAYER0; - TRAVERSE_SPRITE_STAT(headspritestat[stat], i, nexti) + StatIterator it(stat); + while ((i = it.NextIndex()) >= 0) { if (User[i]) memcpy(&puser[pnum], User[i], sizeof(USER)); @@ -515,10 +516,10 @@ void TerminateLevel(void) } // Kill User memory and delete sprites - // for (stat = 0; stat < STAT_ALL; stat++) for (stat = 0; stat < MAXSTATUS; stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[stat], i, nexti) + StatIterator it(stat); + while ((i = it.NextIndex()) >= 0) { KillSprite(i); } diff --git a/source/sw/src/hornet.cpp b/source/sw/src/hornet.cpp index 11bec35f1..e1297a12f 100644 --- a/source/sw/src/hornet.cpp +++ b/source/sw/src/hornet.cpp @@ -574,7 +574,8 @@ int DoCheckSwarm(short SpriteNum) return 0; // all enemys - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { tsp = &sprite[i]; tu = User[i]; diff --git a/source/sw/src/jsector.cpp b/source/sw/src/jsector.cpp index 831f197d9..2e7d31787 100644 --- a/source/sw/src/jsector.cpp +++ b/source/sw/src/jsector.cpp @@ -486,7 +486,8 @@ JS_ProcessEchoSpot() bool reverb_set = false; // Process echo sprites - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ECHO], i, nexti) + StatIterator it(STAT_ECHO); + while ((i = it.NextIndex()) >= 0) { dist = 0x7fffffff; diff --git a/source/sw/src/jweapon.cpp b/source/sw/src/jweapon.cpp index 311079a0c..b84d60dd4 100644 --- a/source/sw/src/jweapon.cpp +++ b/source/sw/src/jweapon.cpp @@ -1598,7 +1598,8 @@ PlayerInitFlashBomb(PLAYERp pp) for (stat = 0; stat < SIZ(StatDamageList); stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[StatDamageList[stat]], i, nexti) + StatIterator it(StatDamageList[stat]); + while ((i = it.NextIndex()) >= 0) { hp = &sprite[i]; hu = User[i]; @@ -1665,7 +1666,8 @@ InitFlashBomb(int16_t SpriteNum) for (stat = 0; stat < SIZ(StatDamageList); stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[StatDamageList[stat]], i, nexti) + StatIterator it(StatDamageList[stat]); + while ((i = it.NextIndex()) >= 0) { hp = &sprite[i]; hu = User[i]; @@ -2143,7 +2145,8 @@ DoFlagRangeTest(short Weapon, short range) for (stat = 0; stat < SIZ(StatDamageList); stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[StatDamageList[stat]], i, nexti) + StatIterator it(StatDamageList[stat]); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; diff --git a/source/sw/src/miscactr.cpp b/source/sw/src/miscactr.cpp index 259fd3aae..2bf0377c1 100644 --- a/source/sw/src/miscactr.cpp +++ b/source/sw/src/miscactr.cpp @@ -836,7 +836,8 @@ int PachinkoCheckWin(short SpriteNum) SET_BOOL1(sp); // Turn on the pachinko lights - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { tsp = &sprite[i]; tu = User[i]; diff --git a/source/sw/src/player.cpp b/source/sw/src/player.cpp index b71d8255e..8c2e7b661 100644 --- a/source/sw/src/player.cpp +++ b/source/sw/src/player.cpp @@ -1164,7 +1164,8 @@ DoPickTarget(SPRITEp sp, uint32_t max_delta_ang, int skip_targets) for (shp = StatDamageList; shp < &StatDamageList[SIZ(StatDamageList)]; shp++) { - TRAVERSE_SPRITE_STAT(headspritestat[*shp], i, nexti) + StatIterator it(*shp); + while ((i = it.NextIndex()) >= 0) { ep = &sprite[i]; eu = User[i]; @@ -2403,7 +2404,8 @@ void PlaySOsound(short sectnum, short sound_num) short i,nexti; // play idle sound - sound 1 - TRAVERSE_SPRITE_SECT(headspritesect[sectnum], i, nexti) + SectIterator it(StatDamageList[sectnum]); + while ((i = it.NextIndex()) >= 0) { if (sprite[i].statnum == STAT_SOUND_SPOT) { @@ -2418,7 +2420,8 @@ void StopSOsound(short sectnum) short i,nexti; // play idle sound - sound 1 - TRAVERSE_SPRITE_SECT(headspritesect[sectnum], i, nexti) + SectIterator it(StatDamageList[sectnum]); + while ((i = it.NextIndex()) >= 0) { if (sprite[i].statnum == STAT_SOUND_SPOT) DoSoundSpotStopSound(sprite[i].lotag); @@ -2531,7 +2534,8 @@ void DoTankTreads(PLAYERp pp) for (sectp = pp->sop->sectp, j = 0; *sectp; sectp++, j++) { - TRAVERSE_SPRITE_SECT(headspritesect[*sectp - sector], i, nexti) + SectIterator it(*sectp - sector); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -2650,7 +2654,8 @@ DriveCrush(PLAYERp pp, int *x, int *y) return; // main sector - TRAVERSE_SPRITE_SECT(headspritesect[sop->op_main_sector], i, nexti) + SectIterator it(StatDamageList[sop->op_main_sector]); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; u = User[i]; @@ -2687,7 +2692,8 @@ DriveCrush(PLAYERp pp, int *x, int *y) } // all enemys - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it2(STAT_ENEMY); + while ((i = it2.NextIndex()) >= 0) { sp = &sprite[i]; @@ -2715,7 +2721,8 @@ DriveCrush(PLAYERp pp, int *x, int *y) } // all dead actors - TRAVERSE_SPRITE_STAT(headspritestat[STAT_DEAD_ACTOR], i, nexti) + it2.Reset(STAT_DEAD_ACTOR); + while ((i = it2.NextIndex()) >= 0) { sp = &sprite[i]; @@ -2763,7 +2770,8 @@ DriveCrush(PLAYERp pp, int *x, int *y) // if it ends up actually in the drivable sector kill it for (sectp = sop->sectp; *sectp; sectp++) { - TRAVERSE_SPRITE_SECT(headspritesect[(*sectp) - sector], i, nexti) + SectIterator it((*sectp) - sector); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; u = User[i]; @@ -4390,7 +4398,8 @@ DoPlayerWarpToUnderwater(PLAYERp pp) // search for DIVE_AREA "over" sprite for reference point - TRAVERSE_SPRITE_STAT(headspritestat[STAT_DIVE_AREA], i, nexti) + StatIterator it(STAT_DIVE_AREA); + while ((i = it.NextIndex()) >= 0) { over_sp = &sprite[i]; @@ -4407,7 +4416,8 @@ DoPlayerWarpToUnderwater(PLAYERp pp) Found = false; // search for UNDERWATER "under" sprite for reference point - TRAVERSE_SPRITE_STAT(headspritestat[STAT_UNDERWATER], i, nexti) + it.Reset(STAT_UNDERWATER); + while ((i = it.NextIndex()) >= 0) { under_sp = &sprite[i]; @@ -4465,7 +4475,8 @@ DoPlayerWarpToSurface(PLAYERp pp) return; // search for UNDERWATER "under" sprite for reference point - TRAVERSE_SPRITE_STAT(headspritestat[STAT_UNDERWATER], i, nexti) + StatIterator it(STAT_UNDERWATER); + while ((i = it.NextIndex()) >= 0) { under_sp = &sprite[i]; @@ -4482,7 +4493,8 @@ DoPlayerWarpToSurface(PLAYERp pp) Found = false; // search for DIVE_AREA "over" sprite for reference point - TRAVERSE_SPRITE_STAT(headspritestat[STAT_DIVE_AREA], i, nexti) + it.Reset(STAT_DIVE_AREA); + while ((i = it.NextIndex()) >= 0) { over_sp = &sprite[i]; @@ -5294,7 +5306,8 @@ void DoPlayerOperateMatch(PLAYERp pp, bool starting) if (!pp->sop) return; - TRAVERSE_SPRITE_SECT(headspritesect[pp->sop->mid_sector], i, nexti) + SectIterator it(pp->sop->mid_sector); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -6343,7 +6356,8 @@ SPRITEp DoPlayerDeathCheckKick(PLAYERp pp) for (stat = 0; stat < SIZ(StatDamageList); stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[StatDamageList[stat]], i, nexti) + StatIterator it(StatDamageList[stat]); + while ((i = it.NextIndex()) >= 0) { hp = &sprite[i]; hu = User[i]; @@ -6972,7 +6986,8 @@ MoveSkipSavePos(void) for (stat = STAT_SKIP4_START; stat <= STAT_SKIP4_INTERP_END; stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[stat], i, nexti) + StatIterator it(stat); + while ((i = it.NextIndex()) >= 0) { if ((unsigned)i >= MAXSPRITES) continue; @@ -6997,7 +7012,8 @@ MoveSkipSavePos(void) for (stat = STAT_SKIP2_START; stat <= STAT_SKIP2_INTERP_END; stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[stat], i, nexti) + StatIterator it(stat); + while ((i = it.NextIndex()) >= 0) { if ((unsigned)i >= MAXSPRITES) continue; diff --git a/source/sw/src/quake.cpp b/source/sw/src/quake.cpp index 9f4a31515..f8b7727b3 100644 --- a/source/sw/src/quake.cpp +++ b/source/sw/src/quake.cpp @@ -82,7 +82,8 @@ void DoQuakeMatch(short match) short i, nexti; SPRITEp sp; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_QUAKE_SPOT], i, nexti) + StatIterator it(STAT_QUAKE_SPOT); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -112,7 +113,8 @@ void ProcessQuakeOn(void) short i, nexti; SPRITEp sp; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_QUAKE_ON], i, nexti) + StatIterator it(STAT_QUAKE_ON); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -133,7 +135,8 @@ void ProcessQuakeSpot(void) int rand_test; // check timed quakes and random quakes - TRAVERSE_SPRITE_STAT(headspritestat[STAT_QUAKE_SPOT], i, nexti) + StatIterator it(STAT_QUAKE_SPOT); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -193,7 +196,8 @@ void QuakeViewChange(PLAYERp pp, int *z_diff, int *x_diff, int *y_diff, short *a return; // find the closest quake - should be a strength value - TRAVERSE_SPRITE_STAT(headspritestat[STAT_QUAKE_ON], i, nexti) + StatIterator it(STAT_QUAKE_ON); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; diff --git a/source/sw/src/rooms.cpp b/source/sw/src/rooms.cpp index 0a7f2c92f..245c6baf6 100644 --- a/source/sw/src/rooms.cpp +++ b/source/sw/src/rooms.cpp @@ -355,7 +355,8 @@ GetZadjustment(short sectnum, short hitag) if (sectnum < 0 || !TEST(sector[sectnum].extra, SECTFX_Z_ADJUST)) return 0L; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ST1], i, nexti) + StatIterator it(STAT_ST1); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -650,10 +651,11 @@ PicInView(short tile_num, bool reset) void SetupMirrorTiles(void) { - short i, nexti; + int i, nexti; SPRITEp sp; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + StatIterator it(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -809,7 +811,8 @@ FindCeilingView(short match, int32_t* x, int32_t* y, int32_t z, int16_t* sectnum // Search Stat List For closest ceiling view sprite // Get the match, xoff, yoff from this point - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + StatIterator it(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -821,7 +824,8 @@ FindCeilingView(short match, int32_t* x, int32_t* y, int32_t z, int16_t* sectnum } } - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + it.Reset(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -852,7 +856,8 @@ FindCeilingView(short match, int32_t* x, int32_t* y, int32_t z, int16_t* sectnum pix_diff = labs(z - sector[sp->sectnum].floorz) >> 8; newz = sector[sp->sectnum].floorz + ((pix_diff / 128) + 1) * Z(128); - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + it.Reset(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -896,7 +901,8 @@ FindFloorView(short match, int32_t* x, int32_t* y, int32_t z, int16_t* sectnum) // Search Stat List For closest ceiling view sprite // Get the match, xoff, yoff from this point - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + StatIterator it(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -909,7 +915,8 @@ FindFloorView(short match, int32_t* x, int32_t* y, int32_t z, int16_t* sectnum) } - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + it.Reset(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -941,7 +948,8 @@ FindFloorView(short match, int32_t* x, int32_t* y, int32_t z, int16_t* sectnum) pix_diff = labs(z - sector[sp->sectnum].ceilingz) >> 8; newz = sector[sp->sectnum].ceilingz - ((pix_diff / 128) + 1) * Z(128); - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + it.Reset(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -979,7 +987,8 @@ ViewSectorInScene(short cursectnum, short level) SPRITEp sp; short match; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + StatIterator it(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; diff --git a/source/sw/src/rotator.cpp b/source/sw/src/rotator.cpp index 0a1257927..b5d377b5b 100644 --- a/source/sw/src/rotator.cpp +++ b/source/sw/src/rotator.cpp @@ -80,7 +80,8 @@ RotatorSwitch(short match, short setting) short i,nexti; bool found = false; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_DEFAULT], i, nexti) + StatIterator it(STAT_DEFAULT); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -162,7 +163,8 @@ DoRotatorMatch(PLAYERp pp, short match, bool manual) //RotatorSwitch(match, ON); - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ROTATOR], i, nexti) + StatIterator it(STAT_ROTATOR); + while ((i = it.NextIndex()) >= 0) { fsp = &sprite[i]; @@ -238,7 +240,8 @@ TestRotatorMatchActive(short match) short i,nexti; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ROTATOR], i, nexti) + StatIterator it(STAT_ROTATOR); + while ((i = it.NextIndex()) >= 0) { fsp = &sprite[i]; @@ -390,7 +393,8 @@ int DoRotatorMove(short SpriteNum) } closest = 99999; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ROTATOR_PIVOT], i, nexti) + StatIterator it(STAT_ROTATOR_PIVOT); + while ((i = it.NextIndex()) >= 0) { if (sprite[i].lotag == sp->lotag) { diff --git a/source/sw/src/sector.cpp b/source/sw/src/sector.cpp index de1382ae6..7b5395863 100644 --- a/source/sw/src/sector.cpp +++ b/source/sw/src/sector.cpp @@ -836,7 +836,8 @@ DoSpawnActorTrigger(short match) short spawn_count = 0; SPRITEp sp; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_SPAWN_TRIGGER], i, nexti) + StatIterator it(STAT_SPAWN_TRIGGER); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -1347,7 +1348,8 @@ SearchExplodeSectorMatch(short match) short i,nexti; // THIS IS ONLY CALLED FROM DoMatchEverything - TRAVERSE_SPRITE_STAT(headspritestat[STAT_SPRITE_HIT_MATCH], i, nexti) + StatIterator it(STAT_SPRITE_HIT_MATCH); + while ((i = it.NextIndex()) >= 0) { SPRITEp sp = &sprite[i]; @@ -1368,7 +1370,8 @@ KillMatchingCrackSprites(short match) short i,nexti; SPRITEp sp; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_SPRITE_HIT_MATCH], i, nexti) + StatIterator it(STAT_SPRITE_HIT_MATCH); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -1392,7 +1395,8 @@ WeaponExplodeSectorInRange(short weapon) int dist; int radius; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_SPRITE_HIT_MATCH], i, nexti) + StatIterator it(STAT_SPRITE_HIT_MATCH); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -1474,7 +1478,8 @@ void DoDeleteSpriteMatch(short match) found = -1; // search for a DELETE_SPRITE with same match tag - TRAVERSE_SPRITE_STAT(headspritestat[STAT_DELETE_SPRITE], i, nexti) + StatIterator it(STAT_DELETE_SPRITE); + while ((i = it.NextIndex()) >= 0) { if (sprite[i].lotag == match) { @@ -1490,7 +1495,8 @@ void DoDeleteSpriteMatch(short match) for (stat = 0; stat < SIZ(StatList); stat++) { - TRAVERSE_SPRITE_STAT(headspritestat[StatList[stat]], i, nexti) + StatIterator it(StatList[stat]); + while ((i = it.NextIndex()) >= 0) { if (del_x == sprite[i].x && del_y == sprite[i].y) { @@ -1627,7 +1633,8 @@ bool ComboSwitchTest(short combo_type, short match) SPRITEp sp; int state; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_DEFAULT], i, nexti) + StatIterator it(STAT_DEFAULT); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; @@ -1977,7 +1984,8 @@ int DoTrapReset(short match) SPRITEp sp; USERp u; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_TRAP], i, nexti) + StatIterator it(STAT_TRAP); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; u = User[i]; @@ -2008,7 +2016,8 @@ int DoTrapMatch(short match) // may need to be reset to fire immediately - TRAVERSE_SPRITE_STAT(headspritestat[STAT_TRAP], i, nexti) + StatIterator it(STAT_TRAP); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; u = User[i]; @@ -2162,7 +2171,8 @@ OperateTripTrigger(PLAYERp pp) dist = sectp->hitag; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; u = User[i]; @@ -2235,7 +2245,8 @@ OperateContinuousTrigger(PLAYERp pp) SPRITEp sp; USERp u; - TRAVERSE_SPRITE_STAT(headspritestat[STAT_TRAP], i, nexti) + StatIterator it(STAT_TRAP); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; u = User[i]; diff --git a/source/sw/src/sprite.cpp b/source/sw/src/sprite.cpp index 55f93eda2..5c47c6b40 100644 --- a/source/sw/src/sprite.cpp +++ b/source/sw/src/sprite.cpp @@ -769,7 +769,8 @@ KillSprite(int16_t SpriteNum) if (sp->statnum == STAT_ENEMY) { - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { if ((unsigned)i < MAXSPRITES && User[i] != NULL && User[i]->tgt_sp == sp) { @@ -1592,7 +1593,7 @@ void PreMapCombineFloors(void) #define MAX_FLOORS 32 SPRITEp sp; int i, j, k; - int16_t SpriteNum, NextSprite; + int SpriteNum; int base_offset; int dx,dy; short sectlist[MAXSECTORS]; @@ -1608,7 +1609,8 @@ void PreMapCombineFloors(void) memset(BoundList, 0, MAX_FLOORS * sizeof(BOUND_LIST)); - TRAVERSE_SPRITE_STAT(headspritestat[0], SpriteNum, NextSprite) + StatIterator it(0); + while ((SpriteNum = it.NextIndex()) >= 0) { sp = &sprite[SpriteNum]; @@ -1689,7 +1691,8 @@ void PreMapCombineFloors(void) } // get rid of the sprites used - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], SpriteNum, NextSprite) + it.Reset(STAT_FAF); + while ((SpriteNum = it.NextIndex()) >= 0) { KillSprite(SpriteNum); } @@ -2878,7 +2881,8 @@ SpriteSetup(void) { int i,nexti; // make sure there is only one set per level of these - TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti) + StatIterator it(STAT_FAF); + while ((i = it.NextIndex()) >= 0) { if (sprite[i].hitag == sp->hitag && sprite[i].lotag == sp->lotag) { @@ -6733,7 +6737,8 @@ SpriteControl(void) if (MoveSkip2 == 0) // limit to 20 times a second { // move bad guys around - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { ASSERT(User[i]); diff --git a/source/sw/src/sumo.cpp b/source/sw/src/sumo.cpp index 0ef6e9a46..5063ee1e2 100644 --- a/source/sw/src/sumo.cpp +++ b/source/sw/src/sumo.cpp @@ -835,7 +835,8 @@ BossHealthMeter(void) (currentLevel->levelNumber == 5 && BossSpriteNum[0] == -1) || (currentLevel->levelNumber == 11 && BossSpriteNum[1] == -1)) { - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { sp = &sprite[i]; u = User[i]; diff --git a/source/sw/src/track.cpp b/source/sw/src/track.cpp index d9f04782b..ee7e91ca9 100644 --- a/source/sw/src/track.cpp +++ b/source/sw/src/track.cpp @@ -1550,7 +1550,8 @@ PlaceActorsOnTracks(void) TRACK_POINTp tpoint = NULL; // place each actor on the track - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { int low_dist = 999999, dist; diff --git a/source/sw/src/weapon.cpp b/source/sw/src/weapon.cpp index ea163104d..fb9999d2d 100644 --- a/source/sw/src/weapon.cpp +++ b/source/sw/src/weapon.cpp @@ -4945,7 +4945,7 @@ SetSuicide(short SpriteNum) ChangeState(SpriteNum, s_Suicide); #else // this will NOT work because - // TRAVERSE_SPRITE_STAT(headspritestat[STAT_MISSILE], i, nexti) + // TRAVERSE_SPRITE_STAT([STAT_MISSILE], i, nexti) // nexti will still be valid but will be on a different list // and will have a different nextspritestat[nexti] result changespritestat(SpriteNum, STAT_SUICIDE); @@ -12285,7 +12285,8 @@ DoBloodWorm(int16_t Weapon) InitBloodSpray(Weapon, false, 1); // Kill any old zombies you own - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { tsp = &sprite[i]; tu = User[i]; @@ -12398,7 +12399,8 @@ DoBloodWorm(int16_t Weapon) InitBloodSpray(Weapon, false, 1); // Kill any old zombies you own - TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti) + StatIterator it(STAT_ENEMY); + while ((i = it.NextIndex()) >= 0) { tsp = &sprite[i]; tu = User[i];