Quasar
Moderator

Posts: 5148
Registered: 08-00 |
I reported not too long ago on discovering that several classes of BOOM generalized linedefs have odd quirks in the way they do or do not tolerate use of zero tags and other strangeness.
Now I'm here to discuss another problem I've found while working on a new line special system for Eternity. In vanilla DOOM there was a non-working line type, type 40, which was supposed to raise the ceiling and lower the floor of a sector at the same time. Romero must have forgotten that DOOM had a one-thinker-per-sector limit when he wrote this, as it never worked - only the ceiling would ever move.
Along comes BOOM team, and in addition to this broken W1 Raise Ceiling, Lower Floor, they added the following variants of it which are all meant to work:
- 151 WR Raise Ceiling, Lower Floor
- 166 S1 Raise Ceiling, Lower Floor
- 186 SR Raise Ceiling, Lower Floor
The first line type works as expected. The second two, however, share a bizarre quirk: Jim Flynn accidentally coded them in a way that fails due to short-circuiting logic in C:
code:
if(EV_DoCeiling(line, raiseToHighest) ||
EV_DoFloor(line, lowerFloorToLowest))
What happens is, if the ceiling is not occupied, the ceiling will be raised. The OR operation "||" is then satisfied, so the second condition is never evaluated - meaning the floor won't lower.
Now, if the ceiling is busy already, the OR *will* evaluate the second condition, and only the floor will be lowered.
To compound these mistakes, BOOM team forgot to document these line types at all in boomref.txt, so they're largely unknown!
|