- Renamed plane flags from SECF_* to PLANEF_*.

- Changed Heretic's plat raise type to use a flag to block further sector movement
  instead of keeping the dead thinker around.


SVN r1853 (trunk)
This commit is contained in:
Christoph Oelckers 2009-09-17 10:40:38 +00:00
parent 555f41b0ba
commit f3f209160e
13 changed files with 49 additions and 27 deletions

View file

@ -1,3 +1,8 @@
September 17, 2009 (Changes by Graf Zahl)
- Renamed plane flags from SECF_* to PLANEF_*.
- Changed Heretic's plat raise type to use a flag to block further sector movement
instead of keeping the dead thinker around to block the sector.
September 16, 2009 (Changes by Graf Zahl) September 16, 2009 (Changes by Graf Zahl)
- Fixed: A_LookEx did not work for monsters having the MF_NOSECTOR flag. - Fixed: A_LookEx did not work for monsters having the MF_NOSECTOR flag.
- Fixed: The deprecated flag handler for the old bounce flags needs to clear - Fixed: The deprecated flag handler for the old bounce flags needs to clear
@ -16897,7 +16902,7 @@ November 14, 2000
into c_cvars.cpp. Virtual inline functions are not inlined and cause the into c_cvars.cpp. Virtual inline functions are not inlined and cause the
function to be generated for every source file the class is used in. function to be generated for every source file the class is used in.
- Fixed bug with Transfer_CeilingLight special. I was or'ing CeilingLight - Fixed bug with Transfer_CeilingLight special. I was or'ing CeilingLight
with SECF_ABSLIGHTING instead of CeilingFlags. with PLANEF_ABSLIGHTING instead of CeilingFlags.
November 11, 2000 November 11, 2000
- Slopes don't work in mirrors. :-( - Slopes don't work in mirrors. :-(

View file

@ -381,7 +381,7 @@ static void LoadSectors (sectortype *bsec)
sec->SetXOffset(sector_t::floor, (bsec->floorxpanning << FRACBITS) + (32 << FRACBITS)); sec->SetXOffset(sector_t::floor, (bsec->floorxpanning << FRACBITS) + (32 << FRACBITS));
sec->SetYOffset(sector_t::floor, bsec->floorypanning << FRACBITS); sec->SetYOffset(sector_t::floor, bsec->floorypanning << FRACBITS);
sec->SetPlaneLight(sector_t::floor, SHADE2LIGHT (bsec->floorshade)); sec->SetPlaneLight(sector_t::floor, SHADE2LIGHT (bsec->floorshade));
sec->ChangeFlags(sector_t::floor, 0, SECF_ABSLIGHTING); sec->ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING);
sec->SetPlaneTexZ(sector_t::ceiling, -(LittleLong(bsec->ceilingz) << 8)); sec->SetPlaneTexZ(sector_t::ceiling, -(LittleLong(bsec->ceilingz) << 8));
sec->ceilingplane.d = sec->GetPlaneTexZ(sector_t::ceiling); sec->ceilingplane.d = sec->GetPlaneTexZ(sector_t::ceiling);
@ -399,7 +399,7 @@ static void LoadSectors (sectortype *bsec)
sec->SetXOffset(sector_t::ceiling, (bsec->ceilingxpanning << FRACBITS) + (32 << FRACBITS)); sec->SetXOffset(sector_t::ceiling, (bsec->ceilingxpanning << FRACBITS) + (32 << FRACBITS));
sec->SetYOffset(sector_t::ceiling, bsec->ceilingypanning << FRACBITS); sec->SetYOffset(sector_t::ceiling, bsec->ceilingypanning << FRACBITS);
sec->SetPlaneLight(sector_t::ceiling, SHADE2LIGHT (bsec->ceilingshade)); sec->SetPlaneLight(sector_t::ceiling, SHADE2LIGHT (bsec->ceilingshade));
sec->ChangeFlags(sector_t::ceiling, 0, SECF_ABSLIGHTING); sec->ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING);
sec->lightlevel = (sec->GetPlaneLight(sector_t::floor) + sec->GetPlaneLight(sector_t::ceiling)) / 2; sec->lightlevel = (sec->GetPlaneLight(sector_t::floor) + sec->GetPlaneLight(sector_t::ceiling)) / 2;

View file

@ -232,7 +232,7 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
sec = &sectors[secnum]; sec = &sectors[secnum];
manual_ceiling: manual_ceiling:
// if ceiling already moving, don't start a second function on it // if ceiling already moving, don't start a second function on it
if (sec->ceilingdata) if (sec->PlaneMoving(sector_t::ceiling))
{ {
if (!manual) if (!manual)
continue; continue;

View file

@ -394,7 +394,7 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing,
secnum = int(sec-sectors); secnum = int(sec-sectors);
// if door already has a thinker, use it // if door already has a thinker, use it
if (sec->ceilingdata) if (sec->PlaneMoving(sector_t::ceiling))
{ {
if (sec->ceilingdata->IsKindOf (RUNTIME_CLASS(DDoor))) if (sec->ceilingdata->IsKindOf (RUNTIME_CLASS(DDoor)))
{ {
@ -447,7 +447,7 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing,
{ {
sec = &sectors[secnum]; sec = &sectors[secnum];
// if the ceiling already moving, don't start the door action // if the ceiling already moving, don't start the door action
if (sec->ceilingdata) if (sec->PlaneMoving(sector_t::ceiling))
continue; continue;
if (new DDoor (sec, type, speed, delay, lightTag)) if (new DDoor (sec, type, speed, delay, lightTag))

View file

@ -377,7 +377,7 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
manual_floor: manual_floor:
// ALREADY MOVING? IF SO, KEEP GOING... // ALREADY MOVING? IF SO, KEEP GOING...
if (sec->floordata) if (sec->PlaneMoving(sector_t::floor))
{ {
if (manual) if (manual)
continue; continue;
@ -748,7 +748,7 @@ manual_stair:
// ALREADY MOVING? IF SO, KEEP GOING... // ALREADY MOVING? IF SO, KEEP GOING...
//jff 2/26/98 add special lockout condition to wait for entire //jff 2/26/98 add special lockout condition to wait for entire
//staircase to build before retriggering //staircase to build before retriggering
if (sec->floordata || sec->stairlock) if (sec->PlaneMoving(sector_t::floor) || sec->stairlock)
{ {
if (!manual) if (!manual)
continue; continue;
@ -800,7 +800,7 @@ manual_stair:
// if sector's floor already moving, look for another // if sector's floor already moving, look for another
//jff 2/26/98 special lockout condition for retriggering //jff 2/26/98 special lockout condition for retriggering
if (tsec->floordata || tsec->stairlock) if (tsec->PlaneMoving(sector_t::floor) || tsec->stairlock)
{ {
prev = sec; prev = sec;
sec = tsec; sec = tsec;
@ -833,7 +833,7 @@ manual_stair:
// if sector's floor already moving, look for another // if sector's floor already moving, look for another
//jff 2/26/98 special lockout condition for retriggering //jff 2/26/98 special lockout condition for retriggering
if (tsec->floordata || tsec->stairlock) if (tsec->PlaneMoving(sector_t::floor) || tsec->stairlock)
continue; continue;
ok = true; ok = true;
@ -917,7 +917,7 @@ bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed)
s1 = &sectors[secnum]; // s1 is pillar's sector s1 = &sectors[secnum]; // s1 is pillar's sector
// ALREADY MOVING? IF SO, KEEP GOING... // ALREADY MOVING? IF SO, KEEP GOING...
if (s1->floordata) if (s1->PlaneMoving(sector_t::floor))
continue; continue;
rtn = true; rtn = true;
@ -925,7 +925,7 @@ bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed)
if (!s2) // note lowest numbered line around if (!s2) // note lowest numbered line around
continue; // pillar must be two-sided continue; // pillar must be two-sided
if (s2->floordata) if (s2->PlaneMoving(sector_t::floor))
continue; continue;
for (i = 0; i < s2->linecount; i++) for (i = 0; i < s2->linecount; i++)
@ -1007,7 +1007,7 @@ bool EV_DoElevator (line_t *line, DElevator::EElevator elevtype,
sec = &sectors[secnum]; sec = &sectors[secnum];
// If either floor or ceiling is already activated, skip it // If either floor or ceiling is already activated, skip it
if (sec->floordata || sec->ceilingdata) //jff 2/22/98 if (sec->PlaneMoving(sector_t::floor) || sec->ceilingdata) //jff 2/22/98
continue; continue;
// create and initialize new elevator thinker // create and initialize new elevator thinker
@ -1225,7 +1225,8 @@ bool EV_StartWaggle (int tag, int height, int speed, int offset,
while ((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0) while ((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0)
{ {
sector = &sectors[sectorIndex]; sector = &sectors[sectorIndex];
if ((!ceiling && sector->floordata) || (ceiling && sector->ceilingdata)) if ((!ceiling && sector->PlaneMoving(sector_t::floor)) ||
(ceiling && sector->PlaneMoving(sector_t::ceiling)))
{ // Already busy with another thinker { // Already busy with another thinker
continue; continue;
} }

View file

@ -300,7 +300,8 @@ bool P_AddSectorLinks(sector_t *control, int tag, INTBOOL ceiling, int movetype)
int param = movetype; int param = movetype;
// can't be done if the control sector is moving. // can't be done if the control sector is moving.
if ((ceiling && control->ceilingdata) || (!ceiling && control->floordata)) return false; if ((ceiling && control->PlaneMoving(sector_t::ceiling)) ||
(!ceiling && control->PlaneMoving(sector_t::floor))) return false;
// Make sure we have only valid combinations // Make sure we have only valid combinations
movetype &= LINK_FLAGMASK; movetype &= LINK_FLAGMASK;

View file

@ -205,7 +205,7 @@ bool EV_DoPillar (DPillar::EPillar type, int tag, fixed_t speed, fixed_t height,
{ {
sector_t *sec = &sectors[secnum]; sector_t *sec = &sectors[secnum];
if (sec->floordata || sec->ceilingdata) if (sec->PlaneMoving(sector_t::floor) || sec->PlaneMoving(sector_t::ceiling))
continue; continue;
fixed_t flor, ceil; fixed_t flor, ceil;

View file

@ -91,7 +91,10 @@ void DPlat::Tick ()
switch (m_Type) switch (m_Type)
{ {
case platRaiseAndStayLockout: case platRaiseAndStayLockout:
break; // Instead of keeping the dead thinker like Heretic did let's
// better use a flag to avoid problems elsewhere. For example,
// keeping the thinker would make tagwait wait indefinitely.
m_Sector->planes[sector_t::floor].Flags |= PLANEF_BLOCKED;
case platRaiseAndStay: case platRaiseAndStay:
case platDownByValue: case platDownByValue:
case platDownWaitUpStay: case platDownWaitUpStay:
@ -236,7 +239,7 @@ bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, int height,
sec = &sectors[secnum]; sec = &sectors[secnum];
manual_plat: manual_plat:
if (sec->floordata) if (sec->PlaneMoving(sector_t::floor))
{ {
if (!manual) if (!manual)
continue; continue;

View file

@ -761,3 +761,12 @@ void sector_t::ClosestPoint(fixed_t fx, fixed_t fy, fixed_t &ox, fixed_t &oy) co
ox = fixed_t(bestx); ox = fixed_t(bestx);
oy = fixed_t(besty); oy = fixed_t(besty);
} }
bool sector_t::PlaneMoving(int pos)
{
if (pos == floor)
return (floordata != NULL || (planes[floor].Flags & PLANEF_BLOCKED));
else
return (ceilingdata != NULL || (planes[ceiling].Flags & PLANEF_BLOCKED));
}

View file

@ -692,12 +692,12 @@ DLightTransfer::DLightTransfer (sector_t *srcSec, int target, bool copyFloor)
if (copyFloor) if (copyFloor)
{ {
for (secnum = -1; (secnum = P_FindSectorFromTag (target, secnum)) >= 0; ) for (secnum = -1; (secnum = P_FindSectorFromTag (target, secnum)) >= 0; )
sectors[secnum].ChangeFlags(sector_t::floor, 0, SECF_ABSLIGHTING); sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING);
} }
else else
{ {
for (secnum = -1; (secnum = P_FindSectorFromTag (target, secnum)) >= 0; ) for (secnum = -1; (secnum = P_FindSectorFromTag (target, secnum)) >= 0; )
sectors[secnum].ChangeFlags(sector_t::ceiling, 0, SECF_ABSLIGHTING); sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING);
} }
ChangeStatNum (STAT_LIGHTTRANSFER); ChangeStatNum (STAT_LIGHTTRANSFER);
} }

View file

@ -1125,13 +1125,13 @@ struct UDMFParser
continue; continue;
case NAME_Lightfloorabsolute: case NAME_Lightfloorabsolute:
if (CheckBool(key)) sec->ChangeFlags(sector_t::floor, 0, SECF_ABSLIGHTING); if (CheckBool(key)) sec->ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING);
else sec->ChangeFlags(sector_t::floor, SECF_ABSLIGHTING, 0); else sec->ChangeFlags(sector_t::floor, PLANEF_ABSLIGHTING, 0);
continue; continue;
case NAME_Lightceilingabsolute: case NAME_Lightceilingabsolute:
if (CheckBool(key)) sec->ChangeFlags(sector_t::ceiling, 0, SECF_ABSLIGHTING); if (CheckBool(key)) sec->ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING);
else sec->ChangeFlags(sector_t::ceiling, SECF_ABSLIGHTING, 0); else sec->ChangeFlags(sector_t::ceiling, PLANEF_ABSLIGHTING, 0);
continue; continue;
case NAME_Gravity: case NAME_Gravity:

View file

@ -270,7 +270,7 @@ void R_ClearClipSegs (short left, short right)
int GetFloorLight (const sector_t *sec) int GetFloorLight (const sector_t *sec)
{ {
if (sec->GetFlags(sector_t::floor) & SECF_ABSLIGHTING) if (sec->GetFlags(sector_t::floor) & PLANEF_ABSLIGHTING)
{ {
return sec->GetPlaneLight(sector_t::floor); return sec->GetPlaneLight(sector_t::floor);
} }
@ -282,7 +282,7 @@ int GetFloorLight (const sector_t *sec)
int GetCeilingLight (const sector_t *sec) int GetCeilingLight (const sector_t *sec)
{ {
if (sec->GetFlags(sector_t::ceiling) & SECF_ABSLIGHTING) if (sec->GetFlags(sector_t::ceiling) & PLANEF_ABSLIGHTING)
{ {
return sec->GetPlaneLight(sector_t::ceiling); return sec->GetPlaneLight(sector_t::ceiling);
} }

View file

@ -299,7 +299,8 @@ inline FArchive &operator<< (FArchive &arc, secplane_t &plane)
// Ceiling/floor flags // Ceiling/floor flags
enum enum
{ {
SECF_ABSLIGHTING = 1 // floor/ceiling light is absolute, not relative PLANEF_ABSLIGHTING = 1, // floor/ceiling light is absolute, not relative
PLANEF_BLOCKED = 2 // can not be moved anymore.
}; };
// Internal sector flags // Internal sector flags
@ -605,6 +606,8 @@ struct sector_t
return lightlevel; return lightlevel;
} }
bool PlaneMoving(int pos);
// Member variables // Member variables
fixed_t CenterFloor () const { return floorplane.ZatPoint (soundorg[0], soundorg[1]); } fixed_t CenterFloor () const { return floorplane.ZatPoint (soundorg[0], soundorg[1]); }