diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 0e8528a2ce3..b7d5540cafa 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -96,27 +96,43 @@ static void AddToList(uint8_t *hitlist, FTextureID texid, int bitmask) if (hitlist[texid.GetIndex()] & bitmask) return; // already done, no need to process everything again. hitlist[texid.GetIndex()] |= (uint8_t)bitmask; - for (auto anim : TexMan.mAnimations) + const auto addAnimations = [hitlist, bitmask](const FTextureID texid) { - if (texid == anim->BasePic || (!anim->bDiscrete && anim->BasePic < texid && texid < anim->BasePic + anim->NumFrames)) + for (auto anim : TexMan.mAnimations) { - for (int i = anim->BasePic.GetIndex(); i < anim->BasePic.GetIndex() + anim->NumFrames; i++) + if (texid == anim->BasePic || (!anim->bDiscrete && anim->BasePic < texid && texid < anim->BasePic + anim->NumFrames)) { - hitlist[i] |= (uint8_t)bitmask; + for (int i = anim->BasePic.GetIndex(); i < anim->BasePic.GetIndex() + anim->NumFrames; i++) + { + hitlist[i] |= (uint8_t)bitmask; + } } } - } + }; + + addAnimations(texid); auto switchdef = TexMan.FindSwitch(texid); if (switchdef) { - for (int i = 0; i < switchdef->NumFrames; i++) + const FSwitchDef *const pair = switchdef->PairDef; + const uint16_t numFrames = switchdef->NumFrames; + const uint16_t pairNumFrames = pair->NumFrames; + + for (int i = 0; i < numFrames; i++) { hitlist[switchdef->frames[i].Texture.GetIndex()] |= (uint8_t)bitmask; } - for (int i = 0; i < switchdef->PairDef->NumFrames; i++) + for (int i = 0; i < pairNumFrames; i++) + { + hitlist[pair->frames[i].Texture.GetIndex()] |= (uint8_t)bitmask; + } + + if (numFrames == 1 && pairNumFrames == 1) { - hitlist[switchdef->PairDef->frames[i].Texture.GetIndex()] |= (uint8_t)bitmask; + // Switch can still be animated via BOOM binary definition from ANIMATED lump + addAnimations(switchdef->frames[0].Texture); + addAnimations(pair->frames[0].Texture); } }