void P_SpawnLightSequence(Sector* sector, int indexStep) { int count; { findlightsequencesectorparams_t params; params.seqSpecial = LIGHT_SEQUENCE; // Look for Light_Sequence, first. params.count = 1; params.sec = sector; do { // Make sure that the search doesn't back up. P_ToXSector(params.sec)->special = LIGHT_SEQUENCE_START; params.nextSec = NULL; P_Iteratep(params.sec, DMU_LINE, ¶ms, findLightSequenceSector); params.sec = params.nextSec; } while(params.sec); count = params.count; } { findlightsequencestartsectorparams_t params; float base; fixed_t index, indexDelta; params.sec = sector; count *= indexStep; index = 0; indexDelta = FixedDiv(64 * FRACUNIT, count * FRACUNIT); base = P_SectorLight(sector); do { if(P_SectorLight(params.sec)) { base = P_SectorLight(params.sec); } P_SpawnPhasedLight(params.sec, base, index >> FRACBITS); index += indexDelta; params.nextSec = NULL; P_Iteratep(params.sec, DMU_LINE, ¶ms, findLightSequenceStartSector); params.sec = params.nextSec; } while(params.sec); } }
Sector* P_FindSectorSurroundingHighestCeiling(Sector* sec, coord_t min, coord_t* val) { findextremalplaneheightparams_t params; params.flags = 0; params.val = min; params.baseSec = sec; params.foundSec = 0; P_Iteratep(sec, DMU_LINE, ¶ms, findExtremalPlaneHeight); if(val) *val = params.val; return params.foundSec; }
Sector* P_FindSectorSurroundingLowestFloor(Sector* sec, coord_t max, coord_t* val) { findextremalplaneheightparams_t params; params.flags = FEPHF_MIN | FEPHF_FLOOR; params.val = max; params.baseSec = sec; params.foundSec = 0; P_Iteratep(sec, DMU_LINE, ¶ms, findExtremalPlaneHeight); if(val) *val = params.val; return params.foundSec; }
Sector* P_FindSectorSurroundingLowestLight(Sector* sec, float* val) { findlightlevelparams_t params; params.flags = FELLF_MIN; params.val = DDMAXFLOAT; params.baseSec = sec; params.foundSec = 0; P_Iteratep(sec, DMU_LINE, ¶ms, findExtremalLightLevelInAdjacentSectors); if(*val) *val = params.val; return params.foundSec; }
Sector* P_FindSectorSurroundingNextLowestCeiling(Sector* sec, coord_t baseHeight, coord_t* val) { findnextplaneheightparams_t params; params.flags = 0; params.val = DDMINFLOAT; params.baseSec = sec; params.baseHeight = baseHeight; params.foundSec = 0; P_Iteratep(sec, DMU_LINE, ¶ms, findNextPlaneHeight); if(val) *val = params.val; return params.foundSec; }
Sector* P_FindSectorSurroundingNextHighestLight(Sector* sec, float baseLight, float* val) { findnextlightlevelparams_t params; params.flags = FNLLF_ABOVE; params.val = DDMAXFLOAT; params.baseSec = sec; params.baseLight = baseLight; params.foundSec = 0; P_Iteratep(sec, DMU_LINE, ¶ms, findNextLightLevel); if(*val) *val = params.val; return params.foundSec; }
Sector *P_FindSectorSurroundingNextHighestFloor(Sector *sec, coord_t baseHeight, coord_t *val) { findnextplaneheightparams_t params; params.flags = FNPHF_FLOOR | FNPHF_ABOVE; params.val = DDMAXFLOAT; params.baseSec = sec; params.baseHeight = baseHeight; params.foundSec = 0; P_Iteratep(sec, DMU_LINE, findNextPlaneHeight, ¶ms); if(val) *val = params.val; return params.foundSec; }
void P_RecursiveSound(struct mobj_s* soundTarget, Sector* sec, int soundBlocks) { spreadsoundtoneighborsparams_t params; xsector_t* xsec = P_ToXSector(sec); // Wake up all monsters in this sector. if(P_GetIntp(sec, DMU_VALID_COUNT) == VALIDCOUNT && xsec->soundTraversed <= soundBlocks + 1) return; // Already flooded. P_SetIntp(sec, DMU_VALID_COUNT, VALIDCOUNT); xsec->soundTraversed = soundBlocks + 1; xsec->soundTarget = soundTarget; params.baseSec = sec; params.soundBlocks = soundBlocks; params.soundTarget = soundTarget; P_Iteratep(sec, DMU_LINE, ¶ms, spreadSoundToNeighbors); }