summaryrefslogtreecommitdiff
path: root/apps/plugins/doom/p_switch.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/doom/p_switch.c')
-rw-r--r--apps/plugins/doom/p_switch.c1138
1 files changed, 1138 insertions, 0 deletions
diff --git a/apps/plugins/doom/p_switch.c b/apps/plugins/doom/p_switch.c
new file mode 100644
index 0000000000..698c4c8ee3
--- /dev/null
+++ b/apps/plugins/doom/p_switch.c
@@ -0,0 +1,1138 @@
+/* Emacs style mode select -*- C++ -*-
+ *-----------------------------------------------------------------------------
+ *
+ *
+ * PrBoom a Doom port merged with LxDoom and LSDLDoom
+ * based on BOOM, a modified and improved DOOM engine
+ * Copyright (C) 1999 by
+ * id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
+ * Copyright (C) 1999-2000 by
+ * Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * DESCRIPTION:
+ * Switches, buttons. Two-state animation. Exits.
+ *
+ *-----------------------------------------------------------------------------*/
+
+#include "doomstat.h"
+#include "w_wad.h"
+#include "r_main.h"
+#include "p_spec.h"
+#include "g_game.h"
+#include "s_sound.h"
+#include "sounds.h"
+#include "m_swap.h"
+#include "i_system.h"
+#include "rockmacros.h"
+// killough 2/8/98: Remove switch limit
+
+static int *switchlist; // killough
+static int max_numswitches; // killough
+static int numswitches; // killough
+
+button_t buttonlist[MAXBUTTONS];
+
+//
+// P_InitSwitchList()
+//
+// Only called at game initialization in order to list the set of switches
+// and buttons known to the engine. This enables their texture to change
+// when activated, and in the case of buttons, change back after a timeout.
+//
+// This routine modified to read its data from a predefined lump or
+// PWAD lump called SWITCHES rather than a static table in this module to
+// allow wad designers to insert or modify switches.
+//
+// Lump format is an array of byte packed switchlist_t structures, terminated
+// by a structure with episode == -0. The lump can be generated from a
+// text source file using SWANTBLS.EXE, distributed with the BOOM utils.
+// The standard list of switches and animations is contained in the example
+// source text file DEFSWANI.DAT also in the BOOM util distribution.
+//
+// Rewritten by Lee Killough to remove limit 2/8/98
+//
+void P_InitSwitchList(void)
+{
+ int i, index = 0;
+ int episode = (gamemode == registered || gamemode==retail) ?
+ 2 : gamemode == commercial ? 3 : 1;
+ const switchlist_t *alphSwitchList; //jff 3/23/98 pointer to switch table
+ int lump = W_GetNumForName("SWITCHES"); // cph - new wad lump handling
+
+ //jff 3/23/98 read the switch table from a predefined lump
+ alphSwitchList = (const switchlist_t *)W_CacheLumpNum(lump);
+
+ for (i=0;;i++)
+ {
+ if (index+1 >= max_numswitches)
+ switchlist = realloc(switchlist, sizeof *switchlist *
+ (max_numswitches = max_numswitches ? max_numswitches*2 : 8));
+ if (SHORT(alphSwitchList[i].episode) <= episode) //jff 5/11/98 endianess
+ {
+ if (!SHORT(alphSwitchList[i].episode))
+ break;
+ switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name1);
+ switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name2);
+ }
+ }
+
+ numswitches = index/2;
+ switchlist[index] = -1;
+ W_UnlockLumpNum(lump);
+}
+
+//
+// P_StartButton()
+//
+// Start a button (retriggerable switch) counting down till it turns off.
+//
+// Passed the linedef the button is on, which texture on the sidedef contains
+// the button, the texture number of the button, and the time the button is
+// to remain active in gametics.
+// No return.
+//
+void P_StartButton
+( line_t* line,
+ bwhere_e w,
+ int texture,
+ int time )
+{
+ int i;
+
+ // See if button is already pressed
+ for (i = 0;i < MAXBUTTONS;i++)
+ if (buttonlist[i].btimer && buttonlist[i].line == line)
+ return;
+
+ for (i = 0;i < MAXBUTTONS;i++)
+ if (!buttonlist[i].btimer) // use first unused element of list
+ {
+ buttonlist[i].line = line;
+ buttonlist[i].where = w;
+ buttonlist[i].btexture = texture;
+ buttonlist[i].btimer = time;
+ buttonlist[i].soundorg = (mobj_t *)&line->frontsector->soundorg;
+ return;
+ }
+
+ I_Error("P_StartButton: no button slots left!");
+}
+
+//
+// P_ChangeSwitchTexture()
+//
+// Function that changes switch wall texture on activation.
+//
+// Passed the line which the switch is on, and whether its retriggerable.
+// If not retriggerable, this function clears the line special to insure that
+//
+// No return
+//
+void P_ChangeSwitchTexture
+( line_t* line,
+ int useAgain )
+{
+ int texTop;
+ int texMid;
+ int texBot;
+ int i;
+ int sound;
+
+ if (!useAgain)
+ line->special = 0;
+
+ texTop = sides[line->sidenum[0]].toptexture;
+ texMid = sides[line->sidenum[0]].midtexture;
+ texBot = sides[line->sidenum[0]].bottomtexture;
+
+ sound = sfx_swtchn;
+
+ // EXIT SWITCH?
+ if (line->special == 11)
+ sound = sfx_swtchx;
+
+ for (i = 0;i < numswitches*2;i++)
+ {
+ if (switchlist[i] == texTop) // if an upper texture
+ {
+ S_StartSound(buttonlist->soundorg,sound); // switch activation sound
+ sides[line->sidenum[0]].toptexture = switchlist[i^1]; //chg texture
+
+ if (useAgain)
+ P_StartButton(line,top,switchlist[i],BUTTONTIME); //start timer
+
+ return;
+ }
+ else
+ {
+ if (switchlist[i] == texMid) // if a normal texture
+ {
+ S_StartSound(buttonlist->soundorg,sound); // switch activation sound
+ sides[line->sidenum[0]].midtexture = switchlist[i^1]; //chg texture
+
+ if (useAgain)
+ P_StartButton(line, middle,switchlist[i],BUTTONTIME); //start timer
+
+ return;
+ }
+ else
+ {
+ if (switchlist[i] == texBot) // if a lower texture
+ {
+ S_StartSound(buttonlist->soundorg,sound); // switch activation sound
+ sides[line->sidenum[0]].bottomtexture = switchlist[i^1];//chg texture
+
+ if (useAgain)
+ P_StartButton(line, bottom,switchlist[i],BUTTONTIME); //start timer
+
+ return;
+ }
+ }
+ }
+ }
+}
+
+
+//
+// P_UseSpecialLine
+//
+//
+// Called when a thing uses (pushes) a special line.
+// Only the front sides of lines are usable.
+// Dispatches to the appropriate linedef function handler.
+//
+// Passed the thing using the line, the line being used, and the side used
+// Returns true if a thinker was created
+//
+boolean
+P_UseSpecialLine
+( mobj_t* thing,
+ line_t* line,
+ int side )
+{
+
+ if (side) //jff 6/1/98 fix inadvertent deletion of side test
+ return false;
+
+ //jff 02/04/98 add check here for generalized floor/ceil mover
+ if (!demo_compatibility)
+ {
+ // pointer to line function is NULL by default, set non-null if
+ // line special is push or switch generalized linedef type
+ int (*linefunc)(line_t *line)=NULL;
+
+ // check each range of generalized linedefs
+ if ((unsigned)line->special >= GenEnd)
+ {
+ // Out of range for GenFloors
+ }
+ else if ((unsigned)line->special >= GenFloorBase)
+ {
+ if (!thing->player)
+ if ((line->special & FloorChange) || !(line->special & FloorModel))
+ return false; // FloorModel is "Allow Monsters" if FloorChange is 0
+ if (!line->tag && ((line->special&6)!=6)) //jff 2/27/98 all non-manual
+ return false; // generalized types require tag
+ linefunc = EV_DoGenFloor;
+ }
+ else if ((unsigned)line->special >= GenCeilingBase)
+ {
+ if (!thing->player)
+ if ((line->special & CeilingChange) || !(line->special & CeilingModel))
+ return false; // CeilingModel is "Allow Monsters" if CeilingChange is 0
+ if (!line->tag && ((line->special&6)!=6)) //jff 2/27/98 all non-manual
+ return false; // generalized types require tag
+ linefunc = EV_DoGenCeiling;
+ }
+ else if ((unsigned)line->special >= GenDoorBase)
+ {
+ if (!thing->player)
+ {
+ if (!(line->special & DoorMonster))
+ return false; // monsters disallowed from this door
+ if (line->flags & ML_SECRET) // they can't open secret doors either
+ return false;
+ }
+ if (!line->tag && ((line->special&6)!=6)) //jff 3/2/98 all non-manual
+ return false; // generalized types require tag
+ linefunc = EV_DoGenDoor;
+ }
+ else if ((unsigned)line->special >= GenLockedBase)
+ {
+ if (!thing->player)
+ return false; // monsters disallowed from unlocking doors
+ if (!P_CanUnlockGenDoor(line,thing->player))
+ return false;
+ if (!line->tag && ((line->special&6)!=6)) //jff 2/27/98 all non-manual
+ return false; // generalized types require tag
+
+ linefunc = EV_DoGenLockedDoor;
+ }
+ else if ((unsigned)line->special >= GenLiftBase)
+ {
+ if (!thing->player)
+ if (!(line->special & LiftMonster))
+ return false; // monsters disallowed
+ if (!line->tag && ((line->special&6)!=6)) //jff 2/27/98 all non-manual
+ return false; // generalized types require tag
+ linefunc = EV_DoGenLift;
+ }
+ else if ((unsigned)line->special >= GenStairsBase)
+ {
+ if (!thing->player)
+ if (!(line->special & StairMonster))
+ return false; // monsters disallowed
+ if (!line->tag && ((line->special&6)!=6)) //jff 2/27/98 all non-manual
+ return false; // generalized types require tag
+ linefunc = EV_DoGenStairs;
+ }
+ else if ((unsigned)line->special >= GenCrusherBase)
+ {
+ if (!thing->player)
+ if (!(line->special & CrusherMonster))
+ return false; // monsters disallowed
+ if (!line->tag && ((line->special&6)!=6)) //jff 2/27/98 all non-manual
+ return false; // generalized types require tag
+ linefunc = EV_DoGenCrusher;
+ }
+
+ if (linefunc)
+ switch((line->special & TriggerType) >> TriggerTypeShift)
+ {
+ case PushOnce:
+ if (!side)
+ if (linefunc(line))
+ line->special = 0;
+ return true;
+ case PushMany:
+ if (!side)
+ linefunc(line);
+ return true;
+ case SwitchOnce:
+ if (linefunc(line))
+ P_ChangeSwitchTexture(line,0);
+ return true;
+ case SwitchMany:
+ if (linefunc(line))
+ P_ChangeSwitchTexture(line,1);
+ return true;
+ default: // if not a switch/push type, do nothing here
+ return false;
+ }
+ }
+
+ // Switches that other things can activate.
+ if (!thing->player)
+ {
+ // never open secret doors
+ if (line->flags & ML_SECRET)
+ return false;
+
+ switch(line->special)
+ {
+ case 1: // MANUAL DOOR RAISE
+ case 32: // MANUAL BLUE
+ case 33: // MANUAL RED
+ case 34: // MANUAL YELLOW
+ //jff 3/5/98 add ability to use teleporters for monsters
+ case 195: // switch teleporters
+ case 174:
+ case 210: // silent switch teleporters
+ case 209:
+ break;
+
+ default:
+ return false;
+ break;
+ }
+ }
+
+ if (!P_CheckTag(line)) //jff 2/27/98 disallow zero tag on some types
+ return false;
+
+ // Dispatch to handler according to linedef type
+ switch (line->special)
+ {
+ // Manual doors, push type with no tag
+ case 1: // Vertical Door
+ case 26: // Blue Door/Locked
+ case 27: // Yellow Door /Locked
+ case 28: // Red Door /Locked
+
+ case 31: // Manual door open
+ case 32: // Blue locked door open
+ case 33: // Red locked door open
+ case 34: // Yellow locked door open
+
+ case 117: // Blazing door raise
+ case 118: // Blazing door open
+ EV_VerticalDoor (line, thing);
+ break;
+
+ // Switches (non-retriggerable)
+ case 7:
+ // Build Stairs
+ if (EV_BuildStairs(line,build8))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 9:
+ // Change Donut
+ if (EV_DoDonut(line))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 11:
+ /* Exit level
+ * killough 10/98: prevent zombies from exiting levels
+ */
+ if (thing->player && thing->player->health <= 0 && !comp[comp_zombie])
+ {
+ S_StartSound(thing, sfx_noway);
+ return false;
+ }
+
+ P_ChangeSwitchTexture(line,0);
+ G_ExitLevel ();
+ break;
+
+ case 14:
+ // Raise Floor 32 and change texture
+ if (EV_DoPlat(line,raiseAndChange,32))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 15:
+ // Raise Floor 24 and change texture
+ if (EV_DoPlat(line,raiseAndChange,24))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 18:
+ // Raise Floor to next highest floor
+ if (EV_DoFloor(line, raiseFloorToNearest))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 20:
+ // Raise Plat next highest floor and change texture
+ if (EV_DoPlat(line,raiseToNearestAndChange,0))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 21:
+ // PlatDownWaitUpStay
+ if (EV_DoPlat(line,downWaitUpStay,0))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 23:
+ // Lower Floor to Lowest
+ if (EV_DoFloor(line,lowerFloorToLowest))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 29:
+ // Raise Door
+ if (EV_DoDoor(line,normal))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 41:
+ // Lower Ceiling to Floor
+ if (EV_DoCeiling(line,lowerToFloor))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 71:
+ // Turbo Lower Floor
+ if (EV_DoFloor(line,turboLower))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 49:
+ // Ceiling Crush And Raise
+ if (EV_DoCeiling(line,crushAndRaise))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 50:
+ // Close Door
+ if (EV_DoDoor(line,p_close))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 51:
+ /* Secret EXIT
+ * killough 10/98: prevent zombies from exiting levels
+ */
+ if (thing->player && thing->player->health <= 0 && !comp[comp_zombie])
+ {
+ S_StartSound(thing, sfx_noway);
+ return false;
+ }
+
+ P_ChangeSwitchTexture(line,0);
+ G_SecretExitLevel ();
+ break;
+
+ case 55:
+ // Raise Floor Crush
+ if (EV_DoFloor(line,raiseFloorCrush))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 101:
+ // Raise Floor
+ if (EV_DoFloor(line,raiseFloor))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 102:
+ // Lower Floor to Surrounding floor height
+ if (EV_DoFloor(line,lowerFloor))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 103:
+ // Open Door
+ if (EV_DoDoor(line,p_open))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 111:
+ // Blazing Door Raise (faster than TURBO!)
+ if (EV_DoDoor (line,blazeRaise))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 112:
+ // Blazing Door Open (faster than TURBO!)
+ if (EV_DoDoor (line,blazeOpen))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 113:
+ // Blazing Door Close (faster than TURBO!)
+ if (EV_DoDoor (line,blazeClose))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 122:
+ // Blazing PlatDownWaitUpStay
+ if (EV_DoPlat(line,blazeDWUS,0))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 127:
+ // Build Stairs Turbo 16
+ if (EV_BuildStairs(line,turbo16))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 131:
+ // Raise Floor Turbo
+ if (EV_DoFloor(line,raiseFloorTurbo))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 133:
+ // BlzOpenDoor BLUE
+ case 135:
+ // BlzOpenDoor RED
+ case 137:
+ // BlzOpenDoor YELLOW
+ if (EV_DoLockedDoor (line,blazeOpen,thing))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 140:
+ // Raise Floor 512
+ if (EV_DoFloor(line,raiseFloor512))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ // killough 1/31/98: factored out compatibility check;
+ // added inner switch, relaxed check to demo_compatibility
+
+ default:
+ if (!demo_compatibility)
+ switch (line->special)
+ {
+ //jff 1/29/98 added linedef types to fill all functions out so that
+ // all possess SR, S1, WR, W1 types
+
+ case 158:
+ // Raise Floor to shortest lower texture
+ // 158 S1 EV_DoFloor(raiseToTexture), CSW(0)
+ if (EV_DoFloor(line,raiseToTexture))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 159:
+ // Raise Floor to shortest lower texture
+ // 159 S1 EV_DoFloor(lowerAndChange)
+ if (EV_DoFloor(line,lowerAndChange))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 160:
+ // Raise Floor 24 and change
+ // 160 S1 EV_DoFloor(raiseFloor24AndChange)
+ if (EV_DoFloor(line,raiseFloor24AndChange))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 161:
+ // Raise Floor 24
+ // 161 S1 EV_DoFloor(raiseFloor24)
+ if (EV_DoFloor(line,raiseFloor24))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 162:
+ // Moving floor min n to max n
+ // 162 S1 EV_DoPlat(perpetualRaise,0)
+ if (EV_DoPlat(line,perpetualRaise,0))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 163:
+ // Stop Moving floor
+ // 163 S1 EV_DoPlat(perpetualRaise,0)
+ EV_StopPlat(line);
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 164:
+ // Start fast crusher
+ // 164 S1 EV_DoCeiling(fastCrushAndRaise)
+ if (EV_DoCeiling(line,fastCrushAndRaise))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 165:
+ // Start slow silent crusher
+ // 165 S1 EV_DoCeiling(silentCrushAndRaise)
+ if (EV_DoCeiling(line,silentCrushAndRaise))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 166:
+ // Raise ceiling, Lower floor
+ // 166 S1 EV_DoCeiling(raiseToHighest), EV_DoFloor(lowerFloortoLowest)
+ if (EV_DoCeiling(line, raiseToHighest) ||
+ EV_DoFloor(line, lowerFloorToLowest))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 167:
+ // Lower floor and Crush
+ // 167 S1 EV_DoCeiling(lowerAndCrush)
+ if (EV_DoCeiling(line, lowerAndCrush))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 168:
+ // Stop crusher
+ // 168 S1 EV_CeilingCrushStop()
+ if (EV_CeilingCrushStop(line))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 169:
+ // Lights to brightest neighbor sector
+ // 169 S1 EV_LightTurnOn(0)
+ EV_LightTurnOn(line,0);
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 170:
+ // Lights to near dark
+ // 170 S1 EV_LightTurnOn(35)
+ EV_LightTurnOn(line,35);
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 171:
+ // Lights on full
+ // 171 S1 EV_LightTurnOn(255)
+ EV_LightTurnOn(line,255);
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 172:
+ // Start Lights Strobing
+ // 172 S1 EV_StartLightStrobing()
+ EV_StartLightStrobing(line);
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 173:
+ // Lights to Dimmest Near
+ // 173 S1 EV_TurnTagLightsOff()
+ EV_TurnTagLightsOff(line);
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 174:
+ // Teleport
+ // 174 S1 EV_Teleport(side,thing)
+ if (EV_Teleport(line,side,thing))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 175:
+ // Close Door, Open in 30 secs
+ // 175 S1 EV_DoDoor(close30ThenOpen)
+ if (EV_DoDoor(line,close30ThenOpen))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 189: //jff 3/15/98 create texture change no motion type
+ // Texture Change Only (Trigger)
+ // 189 S1 Change Texture/Type Only
+ if (EV_DoChange(line,trigChangeOnly))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 203:
+ // Lower ceiling to lowest surrounding ceiling
+ // 203 S1 EV_DoCeiling(lowerToLowest)
+ if (EV_DoCeiling(line,lowerToLowest))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 204:
+ // Lower ceiling to highest surrounding floor
+ // 204 S1 EV_DoCeiling(lowerToMaxFloor)
+ if (EV_DoCeiling(line,lowerToMaxFloor))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 209:
+ // killough 1/31/98: silent teleporter
+ //jff 209 S1 SilentTeleport
+ if (EV_SilentTeleport(line, side, thing))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 241: //jff 3/15/98 create texture change no motion type
+ // Texture Change Only (Numeric)
+ // 241 S1 Change Texture/Type Only
+ if (EV_DoChange(line,numChangeOnly))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 221:
+ // Lower floor to next lowest floor
+ // 221 S1 Lower Floor To Nearest Floor
+ if (EV_DoFloor(line,lowerFloorToNearest))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 229:
+ // Raise elevator next floor
+ // 229 S1 Raise Elevator next floor
+ if (EV_DoElevator(line,elevateUp))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 233:
+ // Lower elevator next floor
+ // 233 S1 Lower Elevator next floor
+ if (EV_DoElevator(line,elevateDown))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+ case 237:
+ // Elevator to current floor
+ // 237 S1 Elevator to current floor
+ if (EV_DoElevator(line,elevateCurrent))
+ P_ChangeSwitchTexture(line,0);
+ break;
+
+
+ // jff 1/29/98 end of added S1 linedef types
+
+ //jff 1/29/98 added linedef types to fill all functions out so that
+ // all possess SR, S1, WR, W1 types
+
+ case 78: //jff 3/15/98 create texture change no motion type
+ // Texture Change Only (Numeric)
+ // 78 SR Change Texture/Type Only
+ if (EV_DoChange(line,numChangeOnly))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 176:
+ // Raise Floor to shortest lower texture
+ // 176 SR EV_DoFloor(raiseToTexture), CSW(1)
+ if (EV_DoFloor(line,raiseToTexture))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 177:
+ // Raise Floor to shortest lower texture
+ // 177 SR EV_DoFloor(lowerAndChange)
+ if (EV_DoFloor(line,lowerAndChange))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 178:
+ // Raise Floor 512
+ // 178 SR EV_DoFloor(raiseFloor512)
+ if (EV_DoFloor(line,raiseFloor512))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 179:
+ // Raise Floor 24 and change
+ // 179 SR EV_DoFloor(raiseFloor24AndChange)
+ if (EV_DoFloor(line,raiseFloor24AndChange))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 180:
+ // Raise Floor 24
+ // 180 SR EV_DoFloor(raiseFloor24)
+ if (EV_DoFloor(line,raiseFloor24))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 181:
+ // Moving floor min n to max n
+ // 181 SR EV_DoPlat(perpetualRaise,0)
+
+ EV_DoPlat(line,perpetualRaise,0);
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 182:
+ // Stop Moving floor
+ // 182 SR EV_DoPlat(perpetualRaise,0)
+ EV_StopPlat(line);
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 183:
+ // Start fast crusher
+ // 183 SR EV_DoCeiling(fastCrushAndRaise)
+ if (EV_DoCeiling(line,fastCrushAndRaise))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 184:
+ // Start slow crusher
+ // 184 SR EV_DoCeiling(crushAndRaise)
+ if (EV_DoCeiling(line,crushAndRaise))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 185:
+ // Start slow silent crusher
+ // 185 SR EV_DoCeiling(silentCrushAndRaise)
+ if (EV_DoCeiling(line,silentCrushAndRaise))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 186:
+ // Raise ceiling, Lower floor
+ // 186 SR EV_DoCeiling(raiseToHighest), EV_DoFloor(lowerFloortoLowest)
+ if (EV_DoCeiling(line, raiseToHighest) ||
+ EV_DoFloor(line, lowerFloorToLowest))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 187:
+ // Lower floor and Crush
+ // 187 SR EV_DoCeiling(lowerAndCrush)
+ if (EV_DoCeiling(line, lowerAndCrush))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 188:
+ // Stop crusher
+ // 188 SR EV_CeilingCrushStop()
+ if (EV_CeilingCrushStop(line))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 190: //jff 3/15/98 create texture change no motion type
+ // Texture Change Only (Trigger)
+ // 190 SR Change Texture/Type Only
+ if (EV_DoChange(line,trigChangeOnly))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 191:
+ // Lower Pillar, Raise Donut
+ // 191 SR EV_DoDonut()
+ if (EV_DoDonut(line))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 192:
+ // Lights to brightest neighbor sector
+ // 192 SR EV_LightTurnOn(0)
+ EV_LightTurnOn(line,0);
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 193:
+ // Start Lights Strobing
+ // 193 SR EV_StartLightStrobing()
+ EV_StartLightStrobing(line);
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 194:
+ // Lights to Dimmest Near
+ // 194 SR EV_TurnTagLightsOff()
+ EV_TurnTagLightsOff(line);
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 195:
+ // Teleport
+ // 195 SR EV_Teleport(side,thing)
+ if (EV_Teleport(line,side,thing))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 196:
+ // Close Door, Open in 30 secs
+ // 196 SR EV_DoDoor(close30ThenOpen)
+ if (EV_DoDoor(line,close30ThenOpen))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 205:
+ // Lower ceiling to lowest surrounding ceiling
+ // 205 SR EV_DoCeiling(lowerToLowest)
+ if (EV_DoCeiling(line,lowerToLowest))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 206:
+ // Lower ceiling to highest surrounding floor
+ // 206 SR EV_DoCeiling(lowerToMaxFloor)
+ if (EV_DoCeiling(line,lowerToMaxFloor))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 210:
+ // killough 1/31/98: silent teleporter
+ //jff 210 SR SilentTeleport
+ if (EV_SilentTeleport(line, side, thing))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 211: //jff 3/14/98 create instant toggle floor type
+ // Toggle Floor Between C and F Instantly
+ // 211 SR Toggle Floor Instant
+ if (EV_DoPlat(line,toggleUpDn,0))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 222:
+ // Lower floor to next lowest floor
+ // 222 SR Lower Floor To Nearest Floor
+ if (EV_DoFloor(line,lowerFloorToNearest))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 230:
+ // Raise elevator next floor
+ // 230 SR Raise Elevator next floor
+ if (EV_DoElevator(line,elevateUp))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 234:
+ // Lower elevator next floor
+ // 234 SR Lower Elevator next floor
+ if (EV_DoElevator(line,elevateDown))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 238:
+ // Elevator to current floor
+ // 238 SR Elevator to current floor
+ if (EV_DoElevator(line,elevateCurrent))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 258:
+ // Build stairs, step 8
+ // 258 SR EV_BuildStairs(build8)
+ if (EV_BuildStairs(line,build8))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 259:
+ // Build stairs, step 16
+ // 259 SR EV_BuildStairs(turbo16)
+ if (EV_BuildStairs(line,turbo16))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ // 1/29/98 jff end of added SR linedef types
+
+ }
+ break;
+
+ // Buttons (retriggerable switches)
+ case 42:
+ // Close Door
+ if (EV_DoDoor(line,p_close))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 43:
+ // Lower Ceiling to Floor
+ if (EV_DoCeiling(line,lowerToFloor))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 45:
+ // Lower Floor to Surrounding floor height
+ if (EV_DoFloor(line,lowerFloor))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 60:
+ // Lower Floor to Lowest
+ if (EV_DoFloor(line,lowerFloorToLowest))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 61:
+ // Open Door
+ if (EV_DoDoor(line,p_open))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 62:
+ // PlatDownWaitUpStay
+ if (EV_DoPlat(line,downWaitUpStay,1))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 63:
+ // Raise Door
+ if (EV_DoDoor(line,normal))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 64:
+ // Raise Floor to ceiling
+ if (EV_DoFloor(line,raiseFloor))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 66:
+ // Raise Floor 24 and change texture
+ if (EV_DoPlat(line,raiseAndChange,24))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 67:
+ // Raise Floor 32 and change texture
+ if (EV_DoPlat(line,raiseAndChange,32))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 65:
+ // Raise Floor Crush
+ if (EV_DoFloor(line,raiseFloorCrush))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 68:
+ // Raise Plat to next highest floor and change texture
+ if (EV_DoPlat(line,raiseToNearestAndChange,0))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 69:
+ // Raise Floor to next highest floor
+ if (EV_DoFloor(line, raiseFloorToNearest))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 70:
+ // Turbo Lower Floor
+ if (EV_DoFloor(line,turboLower))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 114:
+ // Blazing Door Raise (faster than TURBO!)
+ if (EV_DoDoor (line,blazeRaise))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 115:
+ // Blazing Door Open (faster than TURBO!)
+ if (EV_DoDoor (line,blazeOpen))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 116:
+ // Blazing Door Close (faster than TURBO!)
+ if (EV_DoDoor (line,blazeClose))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 123:
+ // Blazing PlatDownWaitUpStay
+ if (EV_DoPlat(line,blazeDWUS,0))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 132:
+ // Raise Floor Turbo
+ if (EV_DoFloor(line,raiseFloorTurbo))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 99:
+ // BlzOpenDoor BLUE
+ case 134:
+ // BlzOpenDoor RED
+ case 136:
+ // BlzOpenDoor YELLOW
+ if (EV_DoLockedDoor (line,blazeOpen,thing))
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 138:
+ // Light Turn On
+ EV_LightTurnOn(line,255);
+ P_ChangeSwitchTexture(line,1);
+ break;
+
+ case 139:
+ // Light Turn Off
+ EV_LightTurnOn(line,35);
+ P_ChangeSwitchTexture(line,1);
+ break;
+ }
+ return true;
+}