- Added a new parameter to all crushing action specials that selects

which crushing mode is used: 0 uses the game's default for compatibility,
  1 uses Doom's mode (crushers continue to move while damaging any actors ) and
  2 uses Hexen's mode (crushers stay at blocking actor's top until they die).
  Since Generic_Crusher already used all 5 args I created a second version for
  Hexen crushing mode.
- Added PICKUP flag to DECORATE.


SVN r817 (trunk)
This commit is contained in:
Christoph Oelckers 2008-03-19 22:47:04 +00:00
parent b1241d7f06
commit 8244d1ea07
17 changed files with 140 additions and 109 deletions

View file

@ -1,4 +1,11 @@
March 19, 2008 (Changes by Graf Zahl) March 19, 2008 (Changes by Graf Zahl)
- Added a new parameter to all crushing action specials that selects
which crushing mode is used: 0 uses the game's default for compatibility,
1 uses Doom's mode (crushers continue to move while damaging any actors ) and
2 uses Hexen's mode (crushers stay at blocking actor's top until they die).
Since Generic_Crusher already used all 5 args I created a second version for
Hexen crushing mode.
- Added PICKUP flag to DECORATE.
- Integrated xlatcc into ZDoom.exe so that the linedef translation files - Integrated xlatcc into ZDoom.exe so that the linedef translation files
don't need to be compiled and can be stored as text in zdoom.pk3. don't need to be compiled and can be stored as text in zdoom.pk3.
- Removed thingdef_specials.h and thingdef_specials.gperf and replaced - Removed thingdef_specials.h and thingdef_specials.gperf and replaced

View file

@ -25,7 +25,7 @@ DEFINE_SPECIAL(Floor_RaiseToHighest, 24, 2, 2)
DEFINE_SPECIAL(Floor_RaiseToNearest, 25, 2, 2) DEFINE_SPECIAL(Floor_RaiseToNearest, 25, 2, 2)
DEFINE_SPECIAL(Stairs_BuildDown, 26, 5, 5) DEFINE_SPECIAL(Stairs_BuildDown, 26, 5, 5)
DEFINE_SPECIAL(Stairs_BuildUp, 27, 5, 5) DEFINE_SPECIAL(Stairs_BuildUp, 27, 5, 5)
DEFINE_SPECIAL(Floor_RaiseAndCrush, 28, 3, 3) DEFINE_SPECIAL(Floor_RaiseAndCrush, 28, 3, 4)
DEFINE_SPECIAL(Pillar_Build, 29, 3, 3) DEFINE_SPECIAL(Pillar_Build, 29, 3, 3)
DEFINE_SPECIAL(Pillar_Open, 30, 4, 4) DEFINE_SPECIAL(Pillar_Open, 30, 4, 4)
DEFINE_SPECIAL(Stairs_BuildDownSync, 31, 4, 4) DEFINE_SPECIAL(Stairs_BuildDownSync, 31, 4, 4)
@ -39,10 +39,10 @@ DEFINE_SPECIAL(Ceiling_Waggle, 38, 5, 5) // [RH] Complement of Floor_Waggle
DEFINE_SPECIAL(Teleport_ZombieChanger, 39, 2, 2) // [RH] Needed for Strife DEFINE_SPECIAL(Teleport_ZombieChanger, 39, 2, 2) // [RH] Needed for Strife
DEFINE_SPECIAL(Ceiling_LowerByValue, 40, 3, 3) DEFINE_SPECIAL(Ceiling_LowerByValue, 40, 3, 3)
DEFINE_SPECIAL(Ceiling_RaiseByValue, 41, 3, 3) DEFINE_SPECIAL(Ceiling_RaiseByValue, 41, 3, 3)
DEFINE_SPECIAL(Ceiling_CrushAndRaise, 42, 3, 3) DEFINE_SPECIAL(Ceiling_CrushAndRaise, 42, 3, 4)
DEFINE_SPECIAL(Ceiling_LowerAndCrush, 43, 3, 3) DEFINE_SPECIAL(Ceiling_LowerAndCrush, 43, 3, 4)
DEFINE_SPECIAL(Ceiling_CrushStop, 44, 1, 1) DEFINE_SPECIAL(Ceiling_CrushStop, 44, 1, 1)
DEFINE_SPECIAL(Ceiling_CrushRaiseAndStay, 45, 3, 3) DEFINE_SPECIAL(Ceiling_CrushRaiseAndStay, 45, 3, 4)
DEFINE_SPECIAL(Floor_CrushStop, 46, 1, 1) DEFINE_SPECIAL(Floor_CrushStop, 46, 1, 1)
DEFINE_SPECIAL(Ceiling_MoveToValue, 47, 3, 4) DEFINE_SPECIAL(Ceiling_MoveToValue, 47, 3, 4)
DEFINE_SPECIAL(Sector_Attach3dMidtex, 48, -1, -1) DEFINE_SPECIAL(Sector_Attach3dMidtex, 48, -1, -1)
@ -80,7 +80,7 @@ DEFINE_SPECIAL(Polyobj_OR_RotateLeft, 90, 3, 3)
DEFINE_SPECIAL(Polyobj_OR_RotateRight, 91, 3, 3) DEFINE_SPECIAL(Polyobj_OR_RotateRight, 91, 3, 3)
DEFINE_SPECIAL(Polyobj_OR_Move, 92, 4, 4) DEFINE_SPECIAL(Polyobj_OR_Move, 92, 4, 4)
DEFINE_SPECIAL(Polyobj_OR_MoveTimes8, 93, 4, 4) DEFINE_SPECIAL(Polyobj_OR_MoveTimes8, 93, 4, 4)
DEFINE_SPECIAL(Pillar_BuildAndCrush, 94, 4, 4) DEFINE_SPECIAL(Pillar_BuildAndCrush, 94, 4, 5)
DEFINE_SPECIAL(FloorAndCeiling_LowerByValue, 95, 3, 3) DEFINE_SPECIAL(FloorAndCeiling_LowerByValue, 95, 3, 3)
DEFINE_SPECIAL(FloorAndCeiling_RaiseByValue, 96, 3, 3) DEFINE_SPECIAL(FloorAndCeiling_RaiseByValue, 96, 3, 3)
@ -133,6 +133,7 @@ DEFINE_SPECIAL(Sector_Set3DFloor, 160, -1, -1)
DEFINE_SPECIAL(Sector_SetContents, 161, -1, -1) DEFINE_SPECIAL(Sector_SetContents, 161, -1, -1)
// [RH] Begin new specials for ZDoom // [RH] Begin new specials for ZDoom
DEFINE_SPECIAL(Generic_Crusher2, 169, 5, 5)
DEFINE_SPECIAL(Sector_SetCeilingScale2, 170, 3, 3) DEFINE_SPECIAL(Sector_SetCeilingScale2, 170, 3, 3)
DEFINE_SPECIAL(Sector_SetFloorScale2, 171, 3, 3) DEFINE_SPECIAL(Sector_SetFloorScale2, 171, 3, 3)
DEFINE_SPECIAL(Plat_UpNearestWaitDownStay, 172, 3, 3) DEFINE_SPECIAL(Plat_UpNearestWaitDownStay, 172, 3, 3)
@ -158,9 +159,9 @@ DEFINE_SPECIAL(SetPlayerProperty, 191, 3, 3)
DEFINE_SPECIAL(Ceiling_LowerToHighestFloor, 192, 2, 2) DEFINE_SPECIAL(Ceiling_LowerToHighestFloor, 192, 2, 2)
DEFINE_SPECIAL(Ceiling_LowerInstant, 193, 3, 3) DEFINE_SPECIAL(Ceiling_LowerInstant, 193, 3, 3)
DEFINE_SPECIAL(Ceiling_RaiseInstant, 194, 3, 3) DEFINE_SPECIAL(Ceiling_RaiseInstant, 194, 3, 3)
DEFINE_SPECIAL(Ceiling_CrushRaiseAndStayA, 195, 4, 4) DEFINE_SPECIAL(Ceiling_CrushRaiseAndStayA, 195, 4, 5)
DEFINE_SPECIAL(Ceiling_CrushAndRaiseA, 196, 4, 4) DEFINE_SPECIAL(Ceiling_CrushAndRaiseA, 196, 4, 5)
DEFINE_SPECIAL(Ceiling_CrushAndRaiseSilentA, 197, 4, 4) DEFINE_SPECIAL(Ceiling_CrushAndRaiseSilentA, 197, 4, 5)
DEFINE_SPECIAL(Ceiling_RaiseByValueTimes8, 198, 3, 3) DEFINE_SPECIAL(Ceiling_RaiseByValueTimes8, 198, 3, 3)
DEFINE_SPECIAL(Ceiling_LowerByValueTimes8, 199, 3, 3) DEFINE_SPECIAL(Ceiling_LowerByValueTimes8, 199, 3, 3)
DEFINE_SPECIAL(Generic_Floor, 200, 5, 5) DEFINE_SPECIAL(Generic_Floor, 200, 5, 5)
@ -218,6 +219,6 @@ DEFINE_SPECIAL(FloorAndCeiling_LowerRaise, 251, 3, 3)
DEFINE_SPECIAL(Ceiling_RaiseToNearest, 252, 2, 2) DEFINE_SPECIAL(Ceiling_RaiseToNearest, 252, 2, 2)
DEFINE_SPECIAL(Ceiling_LowerToLowest, 253, 2, 2) DEFINE_SPECIAL(Ceiling_LowerToLowest, 253, 2, 2)
DEFINE_SPECIAL(Ceiling_LowerToFloor, 254, 2, 2) DEFINE_SPECIAL(Ceiling_LowerToFloor, 254, 2, 2)
DEFINE_SPECIAL(Ceiling_CrushRaiseAndStaySilA, 255, 4, 4) DEFINE_SPECIAL(Ceiling_CrushRaiseAndStaySilA, 255, 4, 5)
#undef DEFINE_SPECIAL #undef DEFINE_SPECIAL

View file

@ -121,7 +121,7 @@ bool DMover::MoveAttached(int crush, fixed_t move, int floorOrCeiling, bool rese
// dest is the desired d value for the plane // dest is the desired d value for the plane
// //
DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush, DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
int floorOrCeiling, int direction) int floorOrCeiling, int direction, bool hexencrush)
{ {
bool flag; bool flag;
fixed_t lastpos; fixed_t lastpos;
@ -228,7 +228,7 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
flag = P_ChangeSector (m_Sector, crush, speed, 0); flag = P_ChangeSector (m_Sector, crush, speed, 0);
if (flag) if (flag)
{ {
if (crush >= 0 && gameinfo.gametype != GAME_Hexen) if (crush >= 0 && !hexencrush)
{ {
m_Sector->floortexz += m_Sector->floorplane.HeightDiff (lastpos); m_Sector->floortexz += m_Sector->floorplane.HeightDiff (lastpos);
m_Sector->AdjustFloorClip (); m_Sector->AdjustFloorClip ();
@ -294,7 +294,7 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
flag = P_ChangeSector (m_Sector, crush, -speed, 1); flag = P_ChangeSector (m_Sector, crush, -speed, 1);
if (flag) if (flag)
{ {
if (crush >= 0 && gameinfo.gametype != GAME_Hexen) if (crush >= 0 && !hexencrush)
{ {
m_Sector->ceilingtexz += m_Sector->ceilingplane.HeightDiff (lastpos); m_Sector->ceilingtexz += m_Sector->ceilingplane.HeightDiff (lastpos);
return crushed; return crushed;

View file

@ -30,24 +30,24 @@ protected:
enum EResult { ok, crushed, pastdest }; enum EResult { ok, crushed, pastdest };
private: private:
bool MoveAttached(int crush, fixed_t move, int floorOrCeiling, bool resetfailed); bool MoveAttached(int crush, fixed_t move, int floorOrCeiling, bool resetfailed);
EResult MovePlane (fixed_t speed, fixed_t dest, int crush, int floorOrCeiling, int direction); EResult MovePlane (fixed_t speed, fixed_t dest, int crush, int floorOrCeiling, int direction, bool hexencrush);
protected: protected:
DMover (); DMover ();
inline EResult MoveFloor (fixed_t speed, fixed_t dest, int crush, int direction) inline EResult MoveFloor (fixed_t speed, fixed_t dest, int crush, int direction, bool hexencrush)
{ {
return MovePlane (speed, dest, crush, 0, direction); return MovePlane (speed, dest, crush, 0, direction, hexencrush);
} }
inline EResult MoveFloor (fixed_t speed, fixed_t dest, int direction) inline EResult MoveFloor (fixed_t speed, fixed_t dest, int direction)
{ {
return MovePlane (speed, dest, -1, 0, direction); return MovePlane (speed, dest, -1, 0, direction, false);
} }
inline EResult MoveCeiling (fixed_t speed, fixed_t dest, int crush, int direction) inline EResult MoveCeiling (fixed_t speed, fixed_t dest, int crush, int direction, bool hexencrush)
{ {
return MovePlane (speed, dest, crush, 1, direction); return MovePlane (speed, dest, crush, 1, direction, hexencrush);
} }
inline EResult MoveCeiling (fixed_t speed, fixed_t dest, int direction) inline EResult MoveCeiling (fixed_t speed, fixed_t dest, int direction)
{ {
return MovePlane (speed, dest, -1, 1, direction); return MovePlane (speed, dest, -1, 1, direction, false);
} }
}; };

View file

@ -503,7 +503,7 @@ void A_AlienSpectreDeath (AActor *self)
if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre1)) if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre1))
{ {
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0, false);
log = 95; log = 95;
} }
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre2)) else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre2))
@ -575,7 +575,7 @@ void A_AlienSpectreDeath (AActor *self)
{ // Another Sigil piece. Woohoo! { // Another Sigil piece. Woohoo!
log = 83; log = 83;
} }
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false);
} }
else else
{ {

View file

@ -223,7 +223,7 @@ void A_CrusaderDeath (AActor *self)
{ {
if (CheckBossDeath (self)) if (CheckBossDeath (self))
{ {
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 667, FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorLowerToLowest, NULL, 667, FRACUNIT, 0, 0, 0, false);
} }
} }

View file

@ -674,7 +674,7 @@ void APowerCoupling::Die (AActor *source, AActor *inflictor)
P_NoiseAlert (source, this); P_NoiseAlert (source, this);
} }
EV_DoDoor (DDoor::doorClose, NULL, players[i].mo, 225, 2*FRACUNIT, 0, 0, 0); EV_DoDoor (DDoor::doorClose, NULL, players[i].mo, 225, 2*FRACUNIT, 0, 0, 0);
EV_DoFloor (DFloor::floorLowerToHighest, NULL, 44, FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorLowerToHighest, NULL, 44, FRACUNIT, 0, 0, 0, false);
players[i].mo->GiveInventoryType (QuestItemClasses[5]); players[i].mo->GiveInventoryType (QuestItemClasses[5]);
S_Sound (CHAN_VOICE, "svox/voc13", 1, ATTN_NORM); S_Sound (CHAN_VOICE, "svox/voc13", 1, ATTN_NORM);
players[i].SetLogNumber (13); players[i].SetLogNumber (13);

View file

@ -56,7 +56,8 @@ void DCeiling::Serialize (FArchive &arc)
<< m_Texture << m_Texture
<< m_NewSpecial << m_NewSpecial
<< m_Tag << m_Tag
<< m_OldDirection; << m_OldDirection
<< m_Hexencrush;
} }
void DCeiling::PlayCeilingSound () void DCeiling::PlayCeilingSound ()
@ -121,7 +122,7 @@ void DCeiling::Tick ()
case -1: case -1:
// DOWN // DOWN
res = MoveCeiling (m_Speed, m_BottomHeight, m_Crush, m_Direction); res = MoveCeiling (m_Speed, m_BottomHeight, m_Crush, m_Direction, m_Hexencrush);
if (res == pastdest) if (res == pastdest)
{ {
@ -180,6 +181,7 @@ DCeiling::DCeiling (sector_t *sec, fixed_t speed1, fixed_t speed2, int silent)
: DMovingCeiling (sec) : DMovingCeiling (sec)
{ {
m_Crush = -1; m_Crush = -1;
m_Hexencrush = false;
m_Speed = m_Speed1 = speed1; m_Speed = m_Speed1 = speed1;
m_Speed2 = speed2; m_Speed2 = speed2;
m_Silent = silent; m_Silent = silent;
@ -192,7 +194,7 @@ DCeiling::DCeiling (sector_t *sec, fixed_t speed1, fixed_t speed2, int silent)
// [RH] Added tag, speed, speed2, height, crush, silent, change params // [RH] Added tag, speed, speed2, height, crush, silent, change params
bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
int tag, fixed_t speed, fixed_t speed2, fixed_t height, int tag, fixed_t speed, fixed_t speed2, fixed_t height,
int crush, int silent, int change) int crush, int silent, int change, bool hexencrush)
{ {
int secnum; int secnum;
bool rtn; bool rtn;
@ -382,6 +384,7 @@ manual_ceiling:
ceiling->m_Tag = tag; ceiling->m_Tag = tag;
ceiling->m_Type = type; ceiling->m_Type = type;
ceiling->m_Crush = crush; ceiling->m_Crush = crush;
ceiling->m_Hexencrush = hexencrush;
// Do not interpolate instant movement ceilings. // Do not interpolate instant movement ceilings.
// Note for ZDoomGL: Check to make sure that you update the sector // Note for ZDoomGL: Check to make sure that you update the sector

View file

@ -121,7 +121,7 @@ void DDoor::Tick ()
case -1: case -1:
// DOWN // DOWN
res = MoveCeiling (m_Speed, m_BotDist, -1, m_Direction); res = MoveCeiling (m_Speed, m_BotDist, -1, m_Direction, false);
// killough 10/98: implement gradual lighting effects // killough 10/98: implement gradual lighting effects
if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.d) if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.d)
@ -168,7 +168,7 @@ void DDoor::Tick ()
case 1: case 1:
// UP // UP
res = MoveCeiling (m_Speed, m_TopDist, -1, m_Direction); res = MoveCeiling (m_Speed, m_TopDist, -1, m_Direction, false);
// killough 10/98: implement gradual lighting effects // killough 10/98: implement gradual lighting effects
if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.d) if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.d)
@ -552,7 +552,7 @@ bool DAnimatedDoor::StartClosing ()
} }
fixed_t topdist = m_Sector->ceilingplane.d; fixed_t topdist = m_Sector->ceilingplane.d;
if (MoveCeiling (2048*FRACUNIT, m_BotDist, 0, -1) == crushed) if (MoveCeiling (2048*FRACUNIT, m_BotDist, 0, -1, false) == crushed)
{ {
return false; return false;
} }

View file

@ -2707,13 +2707,13 @@ void A_BossDeath (AActor *actor)
{ {
if (type == NAME_Fatso) if (type == NAME_Fatso)
{ {
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false);
return; return;
} }
if (type == NAME_Arachnotron) if (type == NAME_Arachnotron)
{ {
EV_DoFloor (DFloor::floorRaiseByTexture, NULL, 667, FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorRaiseByTexture, NULL, 667, FRACUNIT, 0, 0, 0, false);
return; return;
} }
} }
@ -2722,7 +2722,7 @@ void A_BossDeath (AActor *actor)
switch (level.flags & LEVEL_SPECACTIONSMASK) switch (level.flags & LEVEL_SPECACTIONSMASK)
{ {
case LEVEL_SPECLOWERFLOOR: case LEVEL_SPECLOWERFLOOR:
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0); EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false);
return; return;
case LEVEL_SPECOPENDOOR: case LEVEL_SPECOPENDOOR:

View file

@ -55,7 +55,8 @@ void DFloor::Serialize (FArchive &arc)
<< m_Delay << m_Delay
<< m_PauseTime << m_PauseTime
<< m_StepTime << m_StepTime
<< m_PerStepTime; << m_PerStepTime
<< m_Hexencrush;
} }
IMPLEMENT_CLASS (DElevator) IMPLEMENT_CLASS (DElevator)
@ -133,7 +134,7 @@ void DFloor::Tick ()
if (m_Type == waitStair) if (m_Type == waitStair)
return; return;
res = MoveFloor (m_Speed, m_FloorDestDist, m_Crush, m_Direction); res = MoveFloor (m_Speed, m_FloorDestDist, m_Crush, m_Direction, m_Hexencrush);
if (res == pastdest) if (res == pastdest)
{ {
@ -325,7 +326,7 @@ DFloor::DFloor (sector_t *sec)
// [RH] Added tag, speed, height, crush, change params. // [RH] Added tag, speed, height, crush, change params.
// //
bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
fixed_t speed, fixed_t height, int crush, int change) fixed_t speed, fixed_t height, int crush, int change, bool hexencrush)
{ {
int secnum; int secnum;
bool rtn; bool rtn;
@ -368,6 +369,7 @@ manual_floor:
floor = new DFloor (sec); floor = new DFloor (sec);
floor->m_Type = floortype; floor->m_Type = floortype;
floor->m_Crush = -1; floor->m_Crush = -1;
floor->m_Hexencrush = hexencrush;
floor->m_Speed = speed; floor->m_Speed = speed;
floor->m_ResetCount = 0; // [RH] floor->m_ResetCount = 0; // [RH]
floor->m_OrgDist = sec->floorplane.d; // [RH] floor->m_OrgDist = sec->floorplane.d; // [RH]
@ -761,6 +763,7 @@ manual_stair:
floor->m_StepTime = floor->m_PerStepTime = persteptime; floor->m_StepTime = floor->m_PerStepTime = persteptime;
floor->m_Crush = (!usespecials && speed == 4*FRACUNIT) ? 10 : -1; //jff 2/27/98 fix uninitialized crush field floor->m_Crush = (!usespecials && speed == 4*FRACUNIT) ? 10 : -1; //jff 2/27/98 fix uninitialized crush field
floor->m_Hexencrush = false;
floor->m_Speed = speed; floor->m_Speed = speed;
height = sec->floorplane.ZatPoint (0, 0) + stairstep; height = sec->floorplane.ZatPoint (0, 0) + stairstep;
@ -929,6 +932,7 @@ bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed)
floor = new DFloor (s2); floor = new DFloor (s2);
floor->m_Type = DFloor::donutRaise; floor->m_Type = DFloor::donutRaise;
floor->m_Crush = -1; floor->m_Crush = -1;
floor->m_Hexencrush = false;
floor->m_Direction = 1; floor->m_Direction = 1;
floor->m_Sector = s2; floor->m_Sector = s2;
floor->m_Speed = slimespeed; floor->m_Speed = slimespeed;
@ -942,6 +946,7 @@ bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed)
floor = new DFloor (s1); floor = new DFloor (s1);
floor->m_Type = DFloor::floorLowerToNearest; floor->m_Type = DFloor::floorLowerToNearest;
floor->m_Crush = -1; floor->m_Crush = -1;
floor->m_Hexencrush = false;
floor->m_Direction = -1; floor->m_Direction = -1;
floor->m_Sector = s1; floor->m_Sector = s1;
floor->m_Speed = pillarspeed; floor->m_Speed = pillarspeed;

View file

@ -61,6 +61,7 @@
#define TICS(a) (((a)*TICRATE)/35) #define TICS(a) (((a)*TICRATE)/35)
#define OCTICS(a) (((a)*TICRATE)/8) #define OCTICS(a) (((a)*TICRATE)/8)
#define BYTEANGLE(a) ((angle_t)((a)<<24)) #define BYTEANGLE(a) ((angle_t)((a)<<24))
#define CRUSHTYPE(a) ((a)==1? false : (a)==2? true : gameinfo.gametype == GAME_Hexen)
static FRandom pr_glass ("GlassBreak"); static FRandom pr_glass ("GlassBreak");
@ -221,61 +222,61 @@ FUNC(LS_Generic_Door)
FUNC(LS_Floor_LowerByValue) FUNC(LS_Floor_LowerByValue)
// Floor_LowerByValue (tag, speed, height) // Floor_LowerByValue (tag, speed, height)
{ {
return EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2, 0, 0); return EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2, 0, 0, false);
} }
FUNC(LS_Floor_LowerToLowest) FUNC(LS_Floor_LowerToLowest)
// Floor_LowerToLowest (tag, speed) // Floor_LowerToLowest (tag, speed)
{ {
return EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, 0); return EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, 0, false);
} }
FUNC(LS_Floor_LowerToHighest) FUNC(LS_Floor_LowerToHighest)
// Floor_LowerToHighest (tag, speed, adjust) // Floor_LowerToHighest (tag, speed, adjust)
{ {
return EV_DoFloor (DFloor::floorLowerToHighest, ln, arg0, SPEED(arg1), (arg2-128)*FRACUNIT, 0, 0); return EV_DoFloor (DFloor::floorLowerToHighest, ln, arg0, SPEED(arg1), (arg2-128)*FRACUNIT, 0, 0, false);
} }
FUNC(LS_Floor_LowerToNearest) FUNC(LS_Floor_LowerToNearest)
// Floor_LowerToNearest (tag, speed) // Floor_LowerToNearest (tag, speed)
{ {
return EV_DoFloor (DFloor::floorLowerToNearest, ln, arg0, SPEED(arg1), 0, 0, 0); return EV_DoFloor (DFloor::floorLowerToNearest, ln, arg0, SPEED(arg1), 0, 0, 0, false);
} }
FUNC(LS_Floor_RaiseByValue) FUNC(LS_Floor_RaiseByValue)
// Floor_RaiseByValue (tag, speed, height) // Floor_RaiseByValue (tag, speed, height)
{ {
return EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2, 0, 0); return EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2, 0, 0, false);
} }
FUNC(LS_Floor_RaiseToHighest) FUNC(LS_Floor_RaiseToHighest)
// Floor_RaiseToHighest (tag, speed) // Floor_RaiseToHighest (tag, speed)
{ {
return EV_DoFloor (DFloor::floorRaiseToHighest, ln, arg0, SPEED(arg1), 0, 0, 0); return EV_DoFloor (DFloor::floorRaiseToHighest, ln, arg0, SPEED(arg1), 0, 0, 0, false);
} }
FUNC(LS_Floor_RaiseToNearest) FUNC(LS_Floor_RaiseToNearest)
// Floor_RaiseToNearest (tag, speed) // Floor_RaiseToNearest (tag, speed)
{ {
return EV_DoFloor (DFloor::floorRaiseToNearest, ln, arg0, SPEED(arg1), 0, 0, 0); return EV_DoFloor (DFloor::floorRaiseToNearest, ln, arg0, SPEED(arg1), 0, 0, 0, false);
} }
FUNC(LS_Floor_RaiseAndCrush) FUNC(LS_Floor_RaiseAndCrush)
// Floor_RaiseAndCrush (tag, speed, crush) // Floor_RaiseAndCrush (tag, speed, crush, crushmode)
{ {
return EV_DoFloor (DFloor::floorRaiseAndCrush, ln, arg0, SPEED(arg1), 0, arg2, 0); return EV_DoFloor (DFloor::floorRaiseAndCrush, ln, arg0, SPEED(arg1), 0, arg2, 0, CRUSHTYPE(arg3));
} }
FUNC(LS_Floor_RaiseByValueTimes8) FUNC(LS_Floor_RaiseByValueTimes8)
// FLoor_RaiseByValueTimes8 (tag, speed, height) // FLoor_RaiseByValueTimes8 (tag, speed, height)
{ {
return EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2*8, 0, 0); return EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2*8, 0, 0, false);
} }
FUNC(LS_Floor_LowerByValueTimes8) FUNC(LS_Floor_LowerByValueTimes8)
// Floor_LowerByValueTimes8 (tag, speed, height) // Floor_LowerByValueTimes8 (tag, speed, height)
{ {
return EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2*8, 0, 0); return EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), FRACUNIT*arg2*8, 0, 0, false);
} }
FUNC(LS_Floor_CrushStop) FUNC(LS_Floor_CrushStop)
@ -287,51 +288,51 @@ FUNC(LS_Floor_CrushStop)
FUNC(LS_Floor_LowerInstant) FUNC(LS_Floor_LowerInstant)
// Floor_LowerInstant (tag, unused, height) // Floor_LowerInstant (tag, unused, height)
{ {
return EV_DoFloor (DFloor::floorLowerInstant, ln, arg0, 0, arg2*FRACUNIT*8, 0, 0); return EV_DoFloor (DFloor::floorLowerInstant, ln, arg0, 0, arg2*FRACUNIT*8, 0, 0, false);
} }
FUNC(LS_Floor_RaiseInstant) FUNC(LS_Floor_RaiseInstant)
// Floor_RaiseInstant (tag, unused, height) // Floor_RaiseInstant (tag, unused, height)
{ {
return EV_DoFloor (DFloor::floorRaiseInstant, ln, arg0, 0, arg2*FRACUNIT*8, 0, 0); return EV_DoFloor (DFloor::floorRaiseInstant, ln, arg0, 0, arg2*FRACUNIT*8, 0, 0, false);
} }
FUNC(LS_Floor_MoveToValueTimes8) FUNC(LS_Floor_MoveToValueTimes8)
// Floor_MoveToValueTimes8 (tag, speed, height, negative) // Floor_MoveToValueTimes8 (tag, speed, height, negative)
{ {
return EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), return EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1),
arg2*FRACUNIT*8*(arg3?-1:1), 0, 0); arg2*FRACUNIT*8*(arg3?-1:1), 0, 0, false);
} }
FUNC(LS_Floor_MoveToValue) FUNC(LS_Floor_MoveToValue)
// Floor_MoveToValue (tag, speed, height, negative) // Floor_MoveToValue (tag, speed, height, negative)
{ {
return EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), return EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1),
arg2*FRACUNIT*(arg3?-1:1), 0, 0); arg2*FRACUNIT*(arg3?-1:1), 0, 0, false);
} }
FUNC(LS_Floor_RaiseToLowestCeiling) FUNC(LS_Floor_RaiseToLowestCeiling)
// Floor_RaiseToLowestCeiling (tag, speed) // Floor_RaiseToLowestCeiling (tag, speed)
{ {
return EV_DoFloor (DFloor::floorRaiseToLowestCeiling, ln, arg0, SPEED(arg1), 0, 0, 0); return EV_DoFloor (DFloor::floorRaiseToLowestCeiling, ln, arg0, SPEED(arg1), 0, 0, 0, false);
} }
FUNC(LS_Floor_RaiseByTexture) FUNC(LS_Floor_RaiseByTexture)
// Floor_RaiseByTexture (tag, speed) // Floor_RaiseByTexture (tag, speed)
{ {
return EV_DoFloor (DFloor::floorRaiseByTexture, ln, arg0, SPEED(arg1), 0, 0, 0); return EV_DoFloor (DFloor::floorRaiseByTexture, ln, arg0, SPEED(arg1), 0, 0, 0, false);
} }
FUNC(LS_Floor_RaiseByValueTxTy) FUNC(LS_Floor_RaiseByValueTxTy)
// Floor_RaiseByValueTxTy (tag, speed, height) // Floor_RaiseByValueTxTy (tag, speed, height)
{ {
return EV_DoFloor (DFloor::floorRaiseAndChange, ln, arg0, SPEED(arg1), arg2*FRACUNIT, 0, 0); return EV_DoFloor (DFloor::floorRaiseAndChange, ln, arg0, SPEED(arg1), arg2*FRACUNIT, 0, 0, false);
} }
FUNC(LS_Floor_LowerToLowestTxTy) FUNC(LS_Floor_LowerToLowestTxTy)
// Floor_LowerToLowestTxTy (tag, speed) // Floor_LowerToLowestTxTy (tag, speed)
{ {
return EV_DoFloor (DFloor::floorLowerAndChange, ln, arg0, SPEED(arg1), arg2*FRACUNIT, 0, 0); return EV_DoFloor (DFloor::floorLowerAndChange, ln, arg0, SPEED(arg1), arg2*FRACUNIT, 0, 0, false);
} }
FUNC(LS_Floor_Waggle) FUNC(LS_Floor_Waggle)
@ -397,7 +398,7 @@ FUNC(LS_Generic_Floor)
} }
return EV_DoFloor (type, ln, arg0, SPEED(arg1), arg2*FRACUNIT, return EV_DoFloor (type, ln, arg0, SPEED(arg1), arg2*FRACUNIT,
(arg4 & 16) ? 20 : -1, arg4 & 7); (arg4 & 16) ? 20 : -1, arg4 & 7, false);
} }
@ -453,55 +454,55 @@ FUNC(LS_Generic_Stairs)
FUNC(LS_Pillar_Build) FUNC(LS_Pillar_Build)
// Pillar_Build (tag, speed, height) // Pillar_Build (tag, speed, height)
{ {
return EV_DoPillar (DPillar::pillarBuild, arg0, SPEED(arg1), arg2*FRACUNIT, 0, -1); return EV_DoPillar (DPillar::pillarBuild, arg0, SPEED(arg1), arg2*FRACUNIT, 0, -1, false);
} }
FUNC(LS_Pillar_BuildAndCrush) FUNC(LS_Pillar_BuildAndCrush)
// Pillar_BuildAndCrush (tag, speed, height, crush) // Pillar_BuildAndCrush (tag, speed, height, crush, crushtype)
{ {
return EV_DoPillar (DPillar::pillarBuild, arg0, SPEED(arg1), arg2*FRACUNIT, 0, arg3); return EV_DoPillar (DPillar::pillarBuild, arg0, SPEED(arg1), arg2*FRACUNIT, 0, arg3, CRUSHTYPE(arg4));
} }
FUNC(LS_Pillar_Open) FUNC(LS_Pillar_Open)
// Pillar_Open (tag, speed, f_height, c_height) // Pillar_Open (tag, speed, f_height, c_height)
{ {
return EV_DoPillar (DPillar::pillarOpen, arg0, SPEED(arg1), arg2*FRACUNIT, arg3*FRACUNIT, -1); return EV_DoPillar (DPillar::pillarOpen, arg0, SPEED(arg1), arg2*FRACUNIT, arg3*FRACUNIT, -1, false);
} }
FUNC(LS_Ceiling_LowerByValue) FUNC(LS_Ceiling_LowerByValue)
// Ceiling_LowerByValue (tag, speed, height) // Ceiling_LowerByValue (tag, speed, height)
{ {
return EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_RaiseByValue) FUNC(LS_Ceiling_RaiseByValue)
// Ceiling_RaiseByValue (tag, speed, height) // Ceiling_RaiseByValue (tag, speed, height)
{ {
return EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_LowerByValueTimes8) FUNC(LS_Ceiling_LowerByValueTimes8)
// Ceiling_LowerByValueTimes8 (tag, speed, height) // Ceiling_LowerByValueTimes8 (tag, speed, height)
{ {
return EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT*8, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT*8, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_RaiseByValueTimes8) FUNC(LS_Ceiling_RaiseByValueTimes8)
// Ceiling_RaiseByValueTimes8 (tag, speed, height) // Ceiling_RaiseByValueTimes8 (tag, speed, height)
{ {
return EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT*8, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2*FRACUNIT*8, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_CrushAndRaise) FUNC(LS_Ceiling_CrushAndRaise)
// Ceiling_CrushAndRaise (tag, speed, crush) // Ceiling_CrushAndRaise (tag, speed, crush, crushtype)
{ {
return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 0, arg2, 0, 0); return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 0, arg2, 0, 0, CRUSHTYPE(arg3));
} }
FUNC(LS_Ceiling_LowerAndCrush) FUNC(LS_Ceiling_LowerAndCrush)
// Ceiling_LowerAndCrush (tag, speed, crush) // Ceiling_LowerAndCrush (tag, speed, crush, crushtype)
{ {
return EV_DoCeiling (DCeiling::ceilLowerAndCrush, ln, arg0, SPEED(arg1), SPEED(arg1), 0, arg2, 0, 0); return EV_DoCeiling (DCeiling::ceilLowerAndCrush, ln, arg0, SPEED(arg1), SPEED(arg1), 0, arg2, 0, 0, CRUSHTYPE(arg3));
} }
FUNC(LS_Ceiling_CrushStop) FUNC(LS_Ceiling_CrushStop)
@ -511,83 +512,83 @@ FUNC(LS_Ceiling_CrushStop)
} }
FUNC(LS_Ceiling_CrushRaiseAndStay) FUNC(LS_Ceiling_CrushRaiseAndStay)
// Ceiling_CrushRaiseAndStay (tag, speed, crush) // Ceiling_CrushRaiseAndStay (tag, speed, crush, crushtype)
{ {
return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 0, arg2, 0, 0); return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 0, arg2, 0, 0, CRUSHTYPE(arg3));
} }
FUNC(LS_Ceiling_MoveToValueTimes8) FUNC(LS_Ceiling_MoveToValueTimes8)
// Ceiling_MoveToValueTimes8 (tag, speed, height, negative) // Ceiling_MoveToValueTimes8 (tag, speed, height, negative)
{ {
return EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, return EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0,
arg2*FRACUNIT*8*((arg3) ? -1 : 1), -1, 0, 0); arg2*FRACUNIT*8*((arg3) ? -1 : 1), -1, 0, 0, false);
} }
FUNC(LS_Ceiling_MoveToValue) FUNC(LS_Ceiling_MoveToValue)
// Ceiling_MoveToValue (tag, speed, height, negative) // Ceiling_MoveToValue (tag, speed, height, negative)
{ {
return EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, return EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0,
arg2*FRACUNIT*((arg3) ? -1 : 1), -1, 0, 0); arg2*FRACUNIT*((arg3) ? -1 : 1), -1, 0, 0, false);
} }
FUNC(LS_Ceiling_LowerToHighestFloor) FUNC(LS_Ceiling_LowerToHighestFloor)
// Ceiling_LowerToHighestFloor (tag, speed) // Ceiling_LowerToHighestFloor (tag, speed)
{ {
return EV_DoCeiling (DCeiling::ceilLowerToHighestFloor, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilLowerToHighestFloor, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_LowerInstant) FUNC(LS_Ceiling_LowerInstant)
// Ceiling_LowerInstant (tag, unused, height) // Ceiling_LowerInstant (tag, unused, height)
{ {
return EV_DoCeiling (DCeiling::ceilLowerInstant, ln, arg0, 0, 0, arg2*FRACUNIT*8, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilLowerInstant, ln, arg0, 0, 0, arg2*FRACUNIT*8, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_RaiseInstant) FUNC(LS_Ceiling_RaiseInstant)
// Ceiling_RaiseInstant (tag, unused, height) // Ceiling_RaiseInstant (tag, unused, height)
{ {
return EV_DoCeiling (DCeiling::ceilRaiseInstant, ln, arg0, 0, 0, arg2*FRACUNIT*8, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilRaiseInstant, ln, arg0, 0, 0, arg2*FRACUNIT*8, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_CrushRaiseAndStayA) FUNC(LS_Ceiling_CrushRaiseAndStayA)
// Ceiling_CrushRaiseAndStayA (tag, dnspeed, upspeed, damage) // Ceiling_CrushRaiseAndStayA (tag, dnspeed, upspeed, damage, crushtype)
{ {
return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0); return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0, CRUSHTYPE(arg4));
} }
FUNC(LS_Ceiling_CrushRaiseAndStaySilA) FUNC(LS_Ceiling_CrushRaiseAndStaySilA)
// Ceiling_CrushRaiseAndStaySilA (tag, dnspeed, upspeed, damage) // Ceiling_CrushRaiseAndStaySilA (tag, dnspeed, upspeed, damage, crushtype)
{ {
return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0); return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0, CRUSHTYPE(arg4));
} }
FUNC(LS_Ceiling_CrushAndRaiseA) FUNC(LS_Ceiling_CrushAndRaiseA)
// Ceiling_CrushAndRaiseA (tag, dnspeed, upspeed, damage) // Ceiling_CrushAndRaiseA (tag, dnspeed, upspeed, damage, crushtype)
{ {
return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0); return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0, CRUSHTYPE(arg4));
} }
FUNC(LS_Ceiling_CrushAndRaiseSilentA) FUNC(LS_Ceiling_CrushAndRaiseSilentA)
// Ceiling_CrushAndRaiseSilentA (tag, dnspeed, upspeed, damage) // Ceiling_CrushAndRaiseSilentA (tag, dnspeed, upspeed, damage, crushtype)
{ {
return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0); return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0, CRUSHTYPE(arg4));
} }
FUNC(LS_Ceiling_RaiseToNearest) FUNC(LS_Ceiling_RaiseToNearest)
// Ceiling_RaiseToNearest (tag, speed) // Ceiling_RaiseToNearest (tag, speed)
{ {
return EV_DoCeiling (DCeiling::ceilRaiseToNearest, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilRaiseToNearest, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_LowerToLowest) FUNC(LS_Ceiling_LowerToLowest)
// Ceiling_LowerToLowest (tag, speed) // Ceiling_LowerToLowest (tag, speed)
{ {
return EV_DoCeiling (DCeiling::ceilLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0, false);
} }
FUNC(LS_Ceiling_LowerToFloor) FUNC(LS_Ceiling_LowerToFloor)
// Ceiling_LowerToFloor (tag, speed) // Ceiling_LowerToFloor (tag, speed)
{ {
return EV_DoCeiling (DCeiling::ceilLowerToFloor, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0); return EV_DoCeiling (DCeiling::ceilLowerToFloor, ln, arg0, SPEED(arg1), 0, 0, -1, 0, 0, false);
} }
FUNC(LS_Generic_Ceiling) FUNC(LS_Generic_Ceiling)
@ -618,14 +619,22 @@ FUNC(LS_Generic_Ceiling)
} }
return EV_DoCeiling (type, ln, arg0, SPEED(arg1), SPEED(arg1), arg2*FRACUNIT, return EV_DoCeiling (type, ln, arg0, SPEED(arg1), SPEED(arg1), arg2*FRACUNIT,
(arg4 & 16) ? 20 : -1, 0, arg4 & 7); (arg4 & 16) ? 20 : -1, 0, arg4 & 7, false);
} }
FUNC(LS_Generic_Crusher) FUNC(LS_Generic_Crusher)
// Generic_Crusher (tag, dnspeed, upspeed, silent, damage) // Generic_Crusher (tag, dnspeed, upspeed, silent, damage)
{ {
return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1),
SPEED(arg2), 0, arg4, arg3 ? 2 : 0, 0); SPEED(arg2), 0, arg4, arg3 ? 2 : 0, 0, false);
}
FUNC(LS_Generic_Crusher2)
// Generic_Crusher2 (tag, dnspeed, upspeed, silent, damage)
{
// same as above but uses Hexen's crushing method.
return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1),
SPEED(arg2), 0, arg4, arg3 ? 2 : 0, 0, true);
} }
FUNC(LS_Plat_PerpetualRaise) FUNC(LS_Plat_PerpetualRaise)
@ -1633,8 +1642,8 @@ FUNC(LS_FloorAndCeiling_RaiseByValue)
FUNC(LS_FloorAndCeiling_LowerRaise) FUNC(LS_FloorAndCeiling_LowerRaise)
// FloorAndCeiling_LowerRaise (tag, fspeed, cspeed) // FloorAndCeiling_LowerRaise (tag, fspeed, cspeed)
{ {
return EV_DoCeiling (DCeiling::ceilRaiseToHighest, ln, arg0, SPEED(arg2), 0, 0, 0, 0, 0) | return EV_DoCeiling (DCeiling::ceilRaiseToHighest, ln, arg0, SPEED(arg2), 0, 0, 0, 0, 0, false) |
EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, 0); EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, 0, false);
} }
FUNC(LS_Elevator_MoveToFloor) FUNC(LS_Elevator_MoveToFloor)
@ -2952,7 +2961,7 @@ lnSpecFunc LineSpecials[256] =
LS_NOP, // 166 LS_NOP, // 166
LS_NOP, // 167 LS_NOP, // 167
LS_NOP, // 168 LS_NOP, // 168
LS_NOP, // 169 LS_Generic_Crusher2,
LS_Sector_SetCeilingScale2, LS_Sector_SetCeilingScale2,
LS_Sector_SetFloorScale2, LS_Sector_SetFloorScale2,
LS_Plat_UpNearestWaitDownStay, LS_Plat_UpNearestWaitDownStay,

View file

@ -52,7 +52,8 @@ void DPillar::Serialize (FArchive &arc)
<< m_CeilingSpeed << m_CeilingSpeed
<< m_FloorTarget << m_FloorTarget
<< m_CeilingTarget << m_CeilingTarget
<< m_Crush; << m_Crush
<< m_Hexencrush;
} }
void DPillar::Tick () void DPillar::Tick ()
@ -65,13 +66,13 @@ void DPillar::Tick ()
if (m_Type == pillarBuild) if (m_Type == pillarBuild)
{ {
r = MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, 1); r = MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, 1, m_Hexencrush);
s = MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, -1); s = MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, -1, m_Hexencrush);
} }
else else
{ {
r = MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, -1); r = MoveFloor (m_FloorSpeed, m_FloorTarget, m_Crush, -1, m_Hexencrush);
s = MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, 1); s = MoveCeiling (m_CeilingSpeed, m_CeilingTarget, m_Crush, 1, m_Hexencrush);
} }
if (r == pastdest && s == pastdest) if (r == pastdest && s == pastdest)
@ -83,17 +84,17 @@ void DPillar::Tick ()
{ {
if (r == crushed) if (r == crushed)
{ {
MoveFloor (m_FloorSpeed, oldfloor, -1, -1); MoveFloor (m_FloorSpeed, oldfloor, -1, -1, m_Hexencrush);
} }
if (s == crushed) if (s == crushed)
{ {
MoveCeiling (m_CeilingSpeed, oldceiling, -1, 1); MoveCeiling (m_CeilingSpeed, oldceiling, -1, 1, m_Hexencrush);
} }
} }
} }
DPillar::DPillar (sector_t *sector, EPillar type, fixed_t speed, DPillar::DPillar (sector_t *sector, EPillar type, fixed_t speed,
fixed_t floordist, fixed_t ceilingdist, int crush) fixed_t floordist, fixed_t ceilingdist, int crush, bool hexencrush)
: DMover (sector) : DMover (sector)
{ {
fixed_t newheight; fixed_t newheight;
@ -105,6 +106,7 @@ DPillar::DPillar (sector_t *sector, EPillar type, fixed_t speed,
m_Type = type; m_Type = type;
m_Crush = crush; m_Crush = crush;
m_Hexencrush = hexencrush;
if (type == pillarBuild) if (type == pillarBuild)
{ {
@ -173,7 +175,7 @@ DPillar::DPillar (sector_t *sector, EPillar type, fixed_t speed,
} }
bool EV_DoPillar (DPillar::EPillar type, int tag, fixed_t speed, fixed_t height, bool EV_DoPillar (DPillar::EPillar type, int tag, fixed_t speed, fixed_t height,
fixed_t height2, int crush) fixed_t height2, int crush, bool hexencrush)
{ {
bool rtn = false; bool rtn = false;
int secnum = -1; int secnum = -1;
@ -197,7 +199,7 @@ bool EV_DoPillar (DPillar::EPillar type, int tag, fixed_t speed, fixed_t height,
continue; continue;
rtn = true; rtn = true;
new DPillar (sec, type, speed, height, height2, crush); new DPillar (sec, type, speed, height, height2, crush, hexencrush);
} }
return rtn; return rtn;
} }

View file

@ -73,7 +73,7 @@ void DPlat::Tick ()
switch (m_Status) switch (m_Status)
{ {
case up: case up:
res = MoveFloor (m_Speed, m_High, m_Crush, 1); res = MoveFloor (m_Speed, m_High, m_Crush, 1, false);
if (res == crushed && (m_Crush == -1)) if (res == crushed && (m_Crush == -1))
{ {
@ -115,7 +115,7 @@ void DPlat::Tick ()
break; break;
case down: case down:
res = MoveFloor (m_Speed, m_Low, -1, -1); res = MoveFloor (m_Speed, m_Low, -1, -1, false);
if (res == pastdest) if (res == pastdest)
{ {

View file

@ -490,7 +490,7 @@ public:
}; };
DPillar (sector_t *sector, EPillar type, fixed_t speed, fixed_t height, DPillar (sector_t *sector, EPillar type, fixed_t speed, fixed_t height,
fixed_t height2, int crush); fixed_t height2, int crush, bool hexencrush);
void Serialize (FArchive &arc); void Serialize (FArchive &arc);
void Tick (); void Tick ();
@ -502,6 +502,7 @@ protected:
fixed_t m_FloorTarget; fixed_t m_FloorTarget;
fixed_t m_CeilingTarget; fixed_t m_CeilingTarget;
int m_Crush; int m_Crush;
bool m_Hexencrush;
private: private:
DPillar (); DPillar ();
@ -516,7 +517,7 @@ inline FArchive &operator<< (FArchive &arc, DPillar::EPillar &type)
} }
bool EV_DoPillar (DPillar::EPillar type, int tag, fixed_t speed, fixed_t height, bool EV_DoPillar (DPillar::EPillar type, int tag, fixed_t speed, fixed_t height,
fixed_t height2, int crush); fixed_t height2, int crush, bool hexencrush);
// //
// P_DOORS // P_DOORS
@ -682,6 +683,7 @@ protected:
fixed_t m_Speed1; // [RH] dnspeed of crushers fixed_t m_Speed1; // [RH] dnspeed of crushers
fixed_t m_Speed2; // [RH] upspeed of crushers fixed_t m_Speed2; // [RH] upspeed of crushers
int m_Crush; int m_Crush;
bool m_Hexencrush;
int m_Silent; int m_Silent;
int m_Direction; // 1 = up, 0 = waiting, -1 = down int m_Direction; // 1 = up, 0 = waiting, -1 = down
@ -700,14 +702,14 @@ private:
friend bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, friend bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
int tag, fixed_t speed, fixed_t speed2, fixed_t height, int tag, fixed_t speed, fixed_t speed2, fixed_t height,
int crush, int silent, int change); int crush, int silent, int change, bool hexencrush);
friend bool EV_CeilingCrushStop (int tag); friend bool EV_CeilingCrushStop (int tag);
friend void P_ActivateInStasisCeiling (int tag); friend void P_ActivateInStasisCeiling (int tag);
}; };
bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
int tag, fixed_t speed, fixed_t speed2, fixed_t height, int tag, fixed_t speed, fixed_t speed2, fixed_t height,
int crush, int silent, int change); int crush, int silent, int change, bool hexencrush);
bool EV_CeilingCrushStop (int tag); bool EV_CeilingCrushStop (int tag);
void P_ActivateInStasisCeiling (int tag); void P_ActivateInStasisCeiling (int tag);
@ -781,6 +783,7 @@ public:
protected: protected:
EFloor m_Type; EFloor m_Type;
int m_Crush; int m_Crush;
bool m_Hexencrush;
int m_Direction; int m_Direction;
short m_NewSpecial; short m_NewSpecial;
short m_Texture; short m_Texture;
@ -802,7 +805,7 @@ protected:
fixed_t stairsize, fixed_t speed, int delay, int reset, int igntxt, fixed_t stairsize, fixed_t speed, int delay, int reset, int igntxt,
int usespecials); int usespecials);
friend bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, friend bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
fixed_t speed, fixed_t height, int crush, int change); fixed_t speed, fixed_t height, int crush, int change, bool hexencrush);
friend bool EV_FloorCrushStop (int tag); friend bool EV_FloorCrushStop (int tag);
friend bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed); friend bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed);
private: private:
@ -813,7 +816,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line,
fixed_t stairsize, fixed_t speed, int delay, int reset, int igntxt, fixed_t stairsize, fixed_t speed, int delay, int reset, int igntxt,
int usespecials); int usespecials);
bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
fixed_t speed, fixed_t height, int crush, int change); fixed_t speed, fixed_t height, int crush, int change, bool hexencrush);
bool EV_FloorCrushStop (int tag); bool EV_FloorCrushStop (int tag);
bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed); bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed);

View file

@ -100,6 +100,7 @@ enum
static flagdef ActorFlags[]= static flagdef ActorFlags[]=
{ {
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
DEFINE_FLAG(MF, SOLID, AActor, flags), DEFINE_FLAG(MF, SOLID, AActor, flags),
DEFINE_FLAG(MF, SHOOTABLE, AActor, flags), DEFINE_FLAG(MF, SHOOTABLE, AActor, flags),
DEFINE_FLAG(MF, NOSECTOR, AActor, flags), DEFINE_FLAG(MF, NOSECTOR, AActor, flags),

View file

@ -75,7 +75,7 @@
// SAVESIG should match SAVEVER. // SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded. // MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 810 #define MINSAVEVER 817
#if SVN_REVISION_NUMBER == 0 #if SVN_REVISION_NUMBER == 0
// This can happen if svnrevision is not updated properly (e.g. compiling while offline) // This can happen if svnrevision is not updated properly (e.g. compiling while offline)