diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 49ef130e8..7d56bce95 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -791,7 +791,7 @@ int DPhased::PhaseHelper (sector_t *sector, int index, int light, sector_t *prev index + 1, l->m_BaseLevel, sector); l->m_Phase = ((numsteps - index - 1) * 64) / numsteps; - sector->special &= 0xff00; + sector->special = 0; return numsteps; } @@ -820,7 +820,6 @@ DPhased::DPhased (sector_t *sector, int baselevel, int phase) { m_BaseLevel = baselevel; m_Phase = phase; - sector->special &= 0xff00; } //============================================================================ diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 2547933bc..21e6605b9 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -410,19 +410,8 @@ void P_SerializeWorld (FArchive &arc) short secretsector; arc << secretsector; if (secretsector) sec->Flags |= SECF_WASSECRET; - if (sec->special & SECRET_MASK) - { - sec->Flags |= SECF_SECRET; - } - if (sec->special & FRICTION_MASK) - { - sec->Flags |= SECF_FRICTION; - } - if (sec->special & PUSH_MASK) - { - sec->Flags |= SECF_PUSH; - } sec->special &= ~(SECRET_MASK|FRICTION_MASK|PUSH_MASK); + P_InitSectorSpecial(sec, sec->special, true); } arc << sec->interpolations[0] << sec->interpolations[1] diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 807e6e64b..789e44a27 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -1098,7 +1098,7 @@ static void P_SetupSectorDamage(sector_t *sector, int damage, int interval, int // ('fromload' is necessary to allow conversion upon savegame load.) // -void P_InitSectorSpecial(sector_t *sector, int special) +void P_InitSectorSpecial(sector_t *sector, int special, bool nothinkers) { // [RH] All secret sectors are marked with a BOOM-ish bitfield if (sector->special & SECRET_MASK) @@ -1133,28 +1133,28 @@ void P_InitSectorSpecial(sector_t *sector, int special) switch (sector->special) { case Light_Phased: - new DPhased (sector, 48, 63 - (sector->lightlevel & 63)); + if (!nothinkers) new DPhased (sector, 48, 63 - (sector->lightlevel & 63)); break; // [RH] Hexen-like phased lighting case LightSequenceStart: - new DPhased (sector); + if (!nothinkers) new DPhased (sector); break; case dLight_Flicker: - new DLightFlash (sector); + if (!nothinkers) new DLightFlash (sector); break; case dLight_StrobeFast: - new DStrobe (sector, STROBEBRIGHT, FASTDARK, false); + if (!nothinkers) new DStrobe (sector, STROBEBRIGHT, FASTDARK, false); break; case dLight_StrobeSlow: - new DStrobe (sector, STROBEBRIGHT, SLOWDARK, false); + if (!nothinkers) new DStrobe (sector, STROBEBRIGHT, SLOWDARK, false); break; case dLight_Strobe_Hurt: - new DStrobe (sector, STROBEBRIGHT, FASTDARK, false); + if (!nothinkers) new DStrobe (sector, STROBEBRIGHT, FASTDARK, false); P_SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); break; @@ -1167,7 +1167,7 @@ void P_InitSectorSpecial(sector_t *sector, int special) break; case dLight_Glow: - new DGlow (sector); + if (!nothinkers) new DGlow (sector); break; case dSector_DoorCloseIn30: @@ -1179,11 +1179,11 @@ void P_InitSectorSpecial(sector_t *sector, int special) break; case dLight_StrobeSlowSync: - new DStrobe (sector, STROBEBRIGHT, SLOWDARK, true); + if (!nothinkers) new DStrobe (sector, STROBEBRIGHT, SLOWDARK, true); break; case dLight_StrobeFastSync: - new DStrobe (sector, STROBEBRIGHT, FASTDARK, true); + if (!nothinkers) new DStrobe (sector, STROBEBRIGHT, FASTDARK, true); break; case dSector_DoorRaiseIn5Mins: @@ -1201,7 +1201,7 @@ void P_InitSectorSpecial(sector_t *sector, int special) break; case dLight_FireFlicker: - new DFireFlicker (sector); + if (!nothinkers) new DFireFlicker (sector); break; case dDamage_LavaWimpy: @@ -1214,9 +1214,12 @@ void P_InitSectorSpecial(sector_t *sector, int special) case dScroll_EastLavaDamage: P_SetupSectorDamage(sector, 5, 32, 256, NAME_Fire, SECF_DMGTERRAINFX); - new DStrobe (sector, STROBEBRIGHT, FASTDARK, false); - new DScroller (DScroller::sc_floor, (-FRACUNIT/2)<<3, - 0, -1, int(sector-sectors), 0); + if (!nothinkers) + { + new DStrobe(sector, STROBEBRIGHT, FASTDARK, false); + new DScroller(DScroller::sc_floor, (-FRACUNIT / 2) << 3, + 0, -1, int(sector - sectors), 0); + } break; case hDamage_Sludge: @@ -1225,7 +1228,7 @@ void P_InitSectorSpecial(sector_t *sector, int special) case sLight_Strobe_Hurt: P_SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); - new DStrobe (sector, STROBEBRIGHT, FASTDARK, false); + if (!nothinkers) new DStrobe (sector, STROBEBRIGHT, FASTDARK, false); break; case sDamage_Hellslime: @@ -1270,16 +1273,17 @@ void P_InitSectorSpecial(sector_t *sector, int special) { 1, -1 }, { 2, -2 }, { 4, -4 } }; + int i = (sector->special & 0xff) - Scroll_North_Slow; fixed_t dx = hexenScrollies[i][0] * (FRACUNIT/2); fixed_t dy = hexenScrollies[i][1] * (FRACUNIT/2); - new DScroller (DScroller::sc_floor, dx, dy, -1, int(sector-sectors), 0); + if (!nothinkers) new DScroller (DScroller::sc_floor, dx, dy, -1, int(sector-sectors), 0); } else if (sector->special >= Carry_East5 && sector->special <= Carry_East35) { // Heretic scroll special // Only east scrollers also scroll the texture - new DScroller (DScroller::sc_floor, + if (!nothinkers) new DScroller (DScroller::sc_floor, (-FRACUNIT/2)<<((sector->special & 0xff) - Carry_East5), 0, -1, int(sector-sectors), 0); } @@ -1309,7 +1313,7 @@ void P_SpawnSpecials (void) if (sector->special == 0) continue; - P_InitSectorSpecial(sector, sector->special); + P_InitSectorSpecial(sector, sector->special, false); } // Init other misc stuff diff --git a/src/p_spec.h b/src/p_spec.h index 0c3ee8745..da508fda1 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -158,6 +158,7 @@ bool PIT_PushThing (AActor *thing); bool CheckIfExitIsGood (AActor *self, level_info_t *info); // at map load +void P_InitSectorSpecial(sector_t *sector, int special, bool nothinkers); void P_SpawnSpecials (void); // every tic