- 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)
- 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
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

View File

@ -25,7 +25,7 @@ DEFINE_SPECIAL(Floor_RaiseToHighest, 24, 2, 2)
DEFINE_SPECIAL(Floor_RaiseToNearest, 25, 2, 2)
DEFINE_SPECIAL(Stairs_BuildDown, 26, 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_Open, 30, 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(Ceiling_LowerByValue, 40, 3, 3)
DEFINE_SPECIAL(Ceiling_RaiseByValue, 41, 3, 3)
DEFINE_SPECIAL(Ceiling_CrushAndRaise, 42, 3, 3)
DEFINE_SPECIAL(Ceiling_LowerAndCrush, 43, 3, 3)
DEFINE_SPECIAL(Ceiling_CrushAndRaise, 42, 3, 4)
DEFINE_SPECIAL(Ceiling_LowerAndCrush, 43, 3, 4)
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(Ceiling_MoveToValue, 47, 3, 4)
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_Move, 92, 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_RaiseByValue, 96, 3, 3)
@ -133,6 +133,7 @@ DEFINE_SPECIAL(Sector_Set3DFloor, 160, -1, -1)
DEFINE_SPECIAL(Sector_SetContents, 161, -1, -1)
// [RH] Begin new specials for ZDoom
DEFINE_SPECIAL(Generic_Crusher2, 169, 5, 5)
DEFINE_SPECIAL(Sector_SetCeilingScale2, 170, 3, 3)
DEFINE_SPECIAL(Sector_SetFloorScale2, 171, 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_LowerInstant, 193, 3, 3)
DEFINE_SPECIAL(Ceiling_RaiseInstant, 194, 3, 3)
DEFINE_SPECIAL(Ceiling_CrushRaiseAndStayA, 195, 4, 4)
DEFINE_SPECIAL(Ceiling_CrushAndRaiseA, 196, 4, 4)
DEFINE_SPECIAL(Ceiling_CrushAndRaiseSilentA, 197, 4, 4)
DEFINE_SPECIAL(Ceiling_CrushRaiseAndStayA, 195, 4, 5)
DEFINE_SPECIAL(Ceiling_CrushAndRaiseA, 196, 4, 5)
DEFINE_SPECIAL(Ceiling_CrushAndRaiseSilentA, 197, 4, 5)
DEFINE_SPECIAL(Ceiling_RaiseByValueTimes8, 198, 3, 3)
DEFINE_SPECIAL(Ceiling_LowerByValueTimes8, 199, 3, 3)
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_LowerToLowest, 253, 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

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
//
DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
int floorOrCeiling, int direction)
int floorOrCeiling, int direction, bool hexencrush)
{
bool flag;
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);
if (flag)
{
if (crush >= 0 && gameinfo.gametype != GAME_Hexen)
if (crush >= 0 && !hexencrush)
{
m_Sector->floortexz += m_Sector->floorplane.HeightDiff (lastpos);
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);
if (flag)
{
if (crush >= 0 && gameinfo.gametype != GAME_Hexen)
if (crush >= 0 && !hexencrush)
{
m_Sector->ceilingtexz += m_Sector->ceilingplane.HeightDiff (lastpos);
return crushed;

View File

@ -30,24 +30,24 @@ protected:
enum EResult { ok, crushed, pastdest };
private:
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:
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)
{
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)
{
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))
{
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0);
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 999, FRACUNIT, 0, 0, 0, false);
log = 95;
}
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre2))
@ -575,7 +575,7 @@ void A_AlienSpectreDeath (AActor *self)
{ // Another Sigil piece. Woohoo!
log = 83;
}
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0);
EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, FRACUNIT, 0, 0, 0, false);
}
else
{

View File

@ -223,7 +223,7 @@ void A_CrusaderDeath (AActor *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);
}
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]);
S_Sound (CHAN_VOICE, "svox/voc13", 1, ATTN_NORM);
players[i].SetLogNumber (13);

View File

@ -56,7 +56,8 @@ void DCeiling::Serialize (FArchive &arc)
<< m_Texture
<< m_NewSpecial
<< m_Tag
<< m_OldDirection;
<< m_OldDirection
<< m_Hexencrush;
}
void DCeiling::PlayCeilingSound ()
@ -121,7 +122,7 @@ void DCeiling::Tick ()
case -1:
// 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)
{
@ -180,6 +181,7 @@ DCeiling::DCeiling (sector_t *sec, fixed_t speed1, fixed_t speed2, int silent)
: DMovingCeiling (sec)
{
m_Crush = -1;
m_Hexencrush = false;
m_Speed = m_Speed1 = speed1;
m_Speed2 = speed2;
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
bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
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;
bool rtn;
@ -382,6 +384,7 @@ manual_ceiling:
ceiling->m_Tag = tag;
ceiling->m_Type = type;
ceiling->m_Crush = crush;
ceiling->m_Hexencrush = hexencrush;
// Do not interpolate instant movement ceilings.
// Note for ZDoomGL: Check to make sure that you update the sector

View File

@ -121,7 +121,7 @@ void DDoor::Tick ()
case -1:
// 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
if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.d)
@ -168,7 +168,7 @@ void DDoor::Tick ()
case 1:
// 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
if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.d)
@ -552,7 +552,7 @@ bool DAnimatedDoor::StartClosing ()
}
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;
}

View File

@ -2707,13 +2707,13 @@ void A_BossDeath (AActor *actor)
{
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;
}
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;
}
}
@ -2722,7 +2722,7 @@ void A_BossDeath (AActor *actor)
switch (level.flags & LEVEL_SPECACTIONSMASK)
{
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;
case LEVEL_SPECOPENDOOR:

View File

@ -55,7 +55,8 @@ void DFloor::Serialize (FArchive &arc)
<< m_Delay
<< m_PauseTime
<< m_StepTime
<< m_PerStepTime;
<< m_PerStepTime
<< m_Hexencrush;
}
IMPLEMENT_CLASS (DElevator)
@ -133,7 +134,7 @@ void DFloor::Tick ()
if (m_Type == waitStair)
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)
{
@ -325,7 +326,7 @@ DFloor::DFloor (sector_t *sec)
// [RH] Added tag, speed, height, crush, change params.
//
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;
bool rtn;
@ -368,6 +369,7 @@ manual_floor:
floor = new DFloor (sec);
floor->m_Type = floortype;
floor->m_Crush = -1;
floor->m_Hexencrush = hexencrush;
floor->m_Speed = speed;
floor->m_ResetCount = 0; // [RH]
floor->m_OrgDist = sec->floorplane.d; // [RH]
@ -761,6 +763,7 @@ manual_stair:
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_Hexencrush = false;
floor->m_Speed = speed;
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->m_Type = DFloor::donutRaise;
floor->m_Crush = -1;
floor->m_Hexencrush = false;
floor->m_Direction = 1;
floor->m_Sector = s2;
floor->m_Speed = slimespeed;
@ -942,6 +946,7 @@ bool EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed)
floor = new DFloor (s1);
floor->m_Type = DFloor::floorLowerToNearest;
floor->m_Crush = -1;
floor->m_Hexencrush = false;
floor->m_Direction = -1;
floor->m_Sector = s1;
floor->m_Speed = pillarspeed;

View File

@ -61,6 +61,7 @@
#define TICS(a) (((a)*TICRATE)/35)
#define OCTICS(a) (((a)*TICRATE)/8)
#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");
@ -221,61 +222,61 @@ FUNC(LS_Generic_Door)
FUNC(LS_Floor_LowerByValue)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
@ -287,51 +288,51 @@ FUNC(LS_Floor_CrushStop)
FUNC(LS_Floor_LowerInstant)
// 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)
// 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)
// Floor_MoveToValueTimes8 (tag, speed, height, negative)
{
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)
// Floor_MoveToValue (tag, speed, height, negative)
{
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)
// 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)
// 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)
// 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)
// 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)
@ -397,7 +398,7 @@ FUNC(LS_Generic_Floor)
}
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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
@ -511,83 +512,83 @@ FUNC(LS_Ceiling_CrushStop)
}
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)
// Ceiling_MoveToValueTimes8 (tag, speed, height, negative)
{
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)
// Ceiling_MoveToValue (tag, speed, height, negative)
{
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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
@ -618,14 +619,22 @@ FUNC(LS_Generic_Ceiling)
}
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)
// Generic_Crusher (tag, dnspeed, upspeed, silent, damage)
{
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)
@ -1633,8 +1642,8 @@ FUNC(LS_FloorAndCeiling_RaiseByValue)
FUNC(LS_FloorAndCeiling_LowerRaise)
// FloorAndCeiling_LowerRaise (tag, fspeed, cspeed)
{
return EV_DoCeiling (DCeiling::ceilRaiseToHighest, ln, arg0, SPEED(arg2), 0, 0, 0, 0, 0) |
EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 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, false);
}
FUNC(LS_Elevator_MoveToFloor)
@ -2952,7 +2961,7 @@ lnSpecFunc LineSpecials[256] =
LS_NOP, // 166
LS_NOP, // 167
LS_NOP, // 168
LS_NOP, // 169
LS_Generic_Crusher2,
LS_Sector_SetCeilingScale2,
LS_Sector_SetFloorScale2,
LS_Plat_UpNearestWaitDownStay,

View File

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

View File

@ -73,7 +73,7 @@ void DPlat::Tick ()
switch (m_Status)
{
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))
{
@ -115,7 +115,7 @@ void DPlat::Tick ()
break;
case down:
res = MoveFloor (m_Speed, m_Low, -1, -1);
res = MoveFloor (m_Speed, m_Low, -1, -1, false);
if (res == pastdest)
{

View File

@ -490,7 +490,7 @@ public:
};
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 Tick ();
@ -502,6 +502,7 @@ protected:
fixed_t m_FloorTarget;
fixed_t m_CeilingTarget;
int m_Crush;
bool m_Hexencrush;
private:
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,
fixed_t height2, int crush);
fixed_t height2, int crush, bool hexencrush);
//
// P_DOORS
@ -682,6 +683,7 @@ protected:
fixed_t m_Speed1; // [RH] dnspeed of crushers
fixed_t m_Speed2; // [RH] upspeed of crushers
int m_Crush;
bool m_Hexencrush;
int m_Silent;
int m_Direction; // 1 = up, 0 = waiting, -1 = down
@ -700,14 +702,14 @@ private:
friend bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
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 void P_ActivateInStasisCeiling (int tag);
};
bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
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);
void P_ActivateInStasisCeiling (int tag);
@ -781,6 +783,7 @@ public:
protected:
EFloor m_Type;
int m_Crush;
bool m_Hexencrush;
int m_Direction;
short m_NewSpecial;
short m_Texture;
@ -802,7 +805,7 @@ protected:
fixed_t stairsize, fixed_t speed, int delay, int reset, int igntxt,
int usespecials);
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_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed);
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,
int usespecials);
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_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed);

View File

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

View File

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