// // P_UseSpecialLine // Called when a thing uses a special line. // Only the front sides of lines are usable. // dboolean P_UseSpecialLine(mobj_t *thing, line_t *line, int side) { if (side) return false; //jff 02/04/98 add check here for generalized floor/ceil mover { // pointer to line function is NULL by default, set non-null if // line special is push or switch generalized linedef type dboolean(*linefunc)(line_t *line) = NULL; // check each range of generalized linedefs if ((unsigned int)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 int)line->special >= GenCeilingBase) { if (!thing->player) if ((line->special & CeilingChange) || !(line->special & CeilingModel)) return false; // CeilingModel is "Allow Monsters" if CeilingChange is 0 linefunc = EV_DoGenCeiling; } else if ((unsigned int)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; } linefunc = EV_DoGenDoor; } else if ((unsigned int)line->special >= GenLockedBase) { if (!thing->player) return false; // monsters disallowed from unlocking doors if (!P_CanUnlockGenDoor(line, thing->player)) return false; linefunc = EV_DoGenLockedDoor; } else if ((unsigned int)line->special >= GenLiftBase) { if (!thing->player) if (!(line->special & LiftMonster)) return false; // monsters disallowed linefunc = EV_DoGenLift; } else if ((unsigned int)line->special >= GenStairsBase) { if (!thing->player) if (!(line->special & StairMonster)) return false; // monsters disallowed linefunc = EV_DoGenStairs; } else if ((unsigned int)line->special >= GenCrusherBase) { if (!thing->player) if (!(line->special & CrusherMonster)) return false; // monsters disallowed 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 DR_Door_OpenWaitClose_AlsoMonsters: case D1_Door_Blue_OpenStay: case D1_Door_Red_OpenStay: case D1_Door_Yellow_OpenStay: //jff 3/5/98 add ability to use teleporters for monsters case SR_Teleport_AlsoMonsters: case S1_Teleport_AlsoMonsters: case S1_Teleport_AlsoMonsters_Silent_SameAngle: case SR_Teleport_AlsoMonsters_Silent_SameAngle: break; default: return false; } } if (!P_CheckTag(line)) // jff 2/27/98 disallow zero tag on some types return false; // do something switch (line->special) { // MANUALS case DR_Door_OpenWaitClose_AlsoMonsters: case DR_Door_Blue_OpenWaitClose: case DR_Door_Yellow_OpenWaitClose: case DR_Door_Red_OpenWaitClose: case D1_Door_OpenStay: case D1_Door_Blue_OpenStay: case D1_Door_Red_OpenStay: case D1_Door_Yellow_OpenStay: case DR_Door_OpenWaitClose_Fast: if (nomonsters && (line->flags & ML_TRIGGER666)) { line_t junk; junk.tag = 666; EV_DoFloor(&junk, lowerFloorToLowest); line->flags &= ~ML_TRIGGER666; } case D1_Door_OpenStay_Fast: EV_VerticalDoor(line, thing); break; // Switches case S1_Stairs_RaiseBy8: if (EV_BuildStairs(line, build8)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseDonut_ChangesTexture: if (EV_DoDonut(line)) P_ChangeSwitchTexture(line, 0); break; case S1_ExitLevel: P_ChangeSwitchTexture(line, 0); G_ExitLevel(); break; case S1_Floor_RaiseBy32_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 32)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy24_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 24)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToNextHighestFloor: if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToNextHighestFloor_ChangesTexture: if (EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_LowerWaitRaise: if (EV_DoPlat(line, downWaitUpStay, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToLowestFloor: if (EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 0); if (nomonsters && (line->flags & ML_TRIGGER666)) { line_t junk; junk.tag = 666; EV_DoFloor(&junk, lowerFloorToLowest); junk.tag = 667; EV_DoFloor(&junk, raiseToTexture); line->flags &= ~ML_TRIGGER666; } break; case S1_Door_OpenWaitClose: if (EV_DoDoor(line, doorNormal)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerToFloor: if (EV_DoCeiling(line, lowerToFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerTo8AboveHighestFloor: if (EV_DoFloor(line, turboLower)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerTo8AboveFloor_PerpetualSlowCrusherDamage: if (EV_DoCeiling(line, crushAndRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_CloseStay: if (EV_DoDoor(line, doorClose)) P_ChangeSwitchTexture(line, 0); break; case S1_ExitLevel_GoesToSecretLevel: P_ChangeSwitchTexture(line, 0); G_SecretExitLevel(); break; case S1_Floor_RaiseTo8BelowLowestCeiling_Crushes: if (EV_DoFloor(line, raiseFloorCrush)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToLowestCeiling: if (EV_DoFloor(line, raiseFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToHighestFloor: if (EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_OpenStay: if (EV_DoDoor(line, doorOpen)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_OpenWaitClose_Fast: if (EV_DoDoor(line, doorBlazeRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_OpenStay_Fast: if (EV_DoDoor(line, doorBlazeOpen)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_CloseStay_Fast: if (EV_DoDoor(line, doorBlazeClose)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_LowerWaitRaise_Fast: if (EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Stairs_RaiseBy16_Fast: if (EV_BuildStairs(line, turbo16)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseToNextHighestFloor_Fast: if (EV_DoFloor(line, raiseFloorTurbo)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_Blue_OpenStay_Fast: case S1_Door_Red_OpenStay_Fast: case S1_Door_Yellow_OpenStay_Fast: if (EV_DoLockedDoor(line, doorBlazeOpen, thing)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy512: if (EV_DoFloor(line, raiseFloor512)) P_ChangeSwitchTexture(line, 0); break; // Extended switches case S1_Floor_RaiseByShortestLowerTexture: if (EV_DoFloor(line, raiseToTexture)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToLowestFloor_ChangesTexture: if (EV_DoFloor(line, lowerAndChange)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy24_ChangesTextureAndEffect: if (EV_DoFloor(line, raiseFloor24AndChange)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_RaiseBy24: if (EV_DoFloor(line, raiseFloor24)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_PerpetualLowestAndHighestFloors: if (EV_DoPlat(line, perpetualRaise, 0)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_Stop: EV_StopPlat(line); P_ChangeSwitchTexture(line, 0); break; case S1_Crusher_Start_Fast: if (EV_DoCeiling(line, fastCrushAndRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Crusher_Start_Silent: if (EV_DoCeiling(line, silentCrushAndRaise)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_RaiseToHighestCeiling: if (EV_DoCeiling(line, raiseToHighest) || EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerTo8AboveFloor: if (EV_DoCeiling(line, lowerAndCrush)) P_ChangeSwitchTexture(line, 0); break; case S1_Crusher_Stop: if (EV_CeilingCrushStop(line)) P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeToBrightestAdjacent: EV_LightTurnOn(line, 0); P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeTo35: EV_LightTurnOn(line, 35); P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeTo255: EV_LightTurnOn(line, 255); P_ChangeSwitchTexture(line, 0); break; case S1_Light_StartBlinking: EV_StartLightStrobing(line); P_ChangeSwitchTexture(line, 0); break; case S1_Light_ChangeToDarkestAdjacent: EV_TurnTagLightsOff(line); P_ChangeSwitchTexture(line, 0); break; case S1_Teleport_AlsoMonsters: if (EV_Teleport(line, side, thing)) P_ChangeSwitchTexture(line, 0); break; case S1_Door_CloseWaitOpen_30Seconds: if (EV_DoDoor(line, doorClose30ThenOpen)) P_ChangeSwitchTexture(line, 0); break; case S1_ChangeTextureAndEffect: if (EV_DoChange(line, trigChangeOnly)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerToLowestCeiling: if (EV_DoCeiling(line, lowerToLowest)) P_ChangeSwitchTexture(line, 0); break; case S1_Ceiling_LowerToHighestFloor: if (EV_DoCeiling(line, lowerToMaxFloor)) P_ChangeSwitchTexture(line, 0); break; case S1_Teleport_AlsoMonsters_Silent_SameAngle: if (EV_SilentTeleport(line, side, thing)) P_ChangeSwitchTexture(line, 0); break; case S1_ChangeTextureAndEffectToNearest: if (EV_DoChange(line, numChangeOnly)) P_ChangeSwitchTexture(line, 0); break; case S1_Floor_LowerToNearestFloor: if (EV_DoFloor(line, lowerFloorToNearest)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_RaiseToNextHighestFloor_Fast: if (EV_DoElevator(line, elevateUp)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_LowerToNextLowestFloor_Fast: if (EV_DoElevator(line, elevateDown)) P_ChangeSwitchTexture(line, 0); break; case S1_Lift_MoveToSameFloorHeight_Fast: if (EV_DoElevator(line, elevateCurrent)) P_ChangeSwitchTexture(line, 0); break; case SR_ChangeTextureAndEffectToNearest: if (EV_DoChange(line, numChangeOnly)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseByShortestLowerTexture: if (EV_DoFloor(line, raiseToTexture)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToLowestFloor_ChangesTexture: if (EV_DoFloor(line, lowerAndChange)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy512: if (EV_DoFloor(line, raiseFloor512)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy512_ChangesTextureAndEffect: if (EV_DoFloor(line, raiseFloor24AndChange)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy24: if (EV_DoFloor(line, raiseFloor24)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_PerpetualLowestAndHighestFloors: EV_DoPlat(line, perpetualRaise, 0); P_ChangeSwitchTexture(line, 1); break; case SR_Lift_Stop: EV_StopPlat(line); P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Start_Fast: if (EV_DoCeiling(line, fastCrushAndRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Start: if (EV_DoCeiling(line, crushAndRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Start_Silent: if (EV_DoCeiling(line, silentCrushAndRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_RaiseToHighestCeiling: if (EV_DoCeiling(line, raiseToHighest) || EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerTo8AboveFloor: if (EV_DoCeiling(line, lowerAndCrush)) P_ChangeSwitchTexture(line, 1); break; case SR_Crusher_Stop: if (EV_CeilingCrushStop(line)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseDonut_ChangesTexture: if (EV_DoDonut(line)) P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeToBrightestAdjacent: EV_LightTurnOn(line, 0); P_ChangeSwitchTexture(line, 1); break; case SR_Light_StartBlinking: EV_StartLightStrobing(line); P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeToDarkestAdjacent: EV_TurnTagLightsOff(line); P_ChangeSwitchTexture(line, 1); break; case SR_Teleport_AlsoMonsters: if (EV_Teleport(line, side, thing)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_CloseWaitOpen_30Seconds: if (EV_DoDoor(line, doorClose30ThenOpen)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerToLowestCeiling: if (EV_DoCeiling(line, lowerToLowest)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerToHighestFloor: if (EV_DoCeiling(line, lowerToMaxFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Teleport_AlsoMonsters_Silent_SameAngle: if (EV_SilentTeleport(line, side, thing)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_RaiseToCeiling_Instantly: if (EV_DoPlat(line, toggleUpDn, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToNearestFloor: if (EV_DoFloor(line, lowerFloorToNearest)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_RaiseToNextHighestFloor_Fast: if (EV_DoElevator(line, elevateUp)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_LowerToNextLowestFloor_Fast: if (EV_DoElevator(line, elevateDown)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_MoveToSameFloorHeight_Fast: if (EV_DoElevator(line, elevateCurrent)) P_ChangeSwitchTexture(line, 1); break; case SR_Stairs_RaiseBy8: if (EV_BuildStairs(line, build8)) P_ChangeSwitchTexture(line, 1); break; case SR_Stairs_RaiseBy16_Fast: if (EV_BuildStairs(line, turbo16)) P_ChangeSwitchTexture(line, 1); break; // Buttons (retriggerable switches) case SR_Door_CloseStay: if (EV_DoDoor(line, doorClose)) P_ChangeSwitchTexture(line, 1); break; case SR_Ceiling_LowerToFloor: if (EV_DoCeiling(line, lowerToFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToHighestFloor: if (EV_DoFloor(line, lowerFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerToLowestFloor: if (EV_DoFloor(line, lowerFloorToLowest)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenStay: if (EV_DoDoor(line, doorOpen)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_LowerWaitRaise: if (EV_DoPlat(line, downWaitUpStay, 1)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenWaitClose: if (EV_DoDoor(line, doorNormal)) P_ChangeSwitchTexture(line, 1); else if (thing->player) S_StartSound(thing, sfx_oof); break; case SR_Floor_RaiseToLowestCeiling: if (EV_DoFloor(line, raiseFloor)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy24_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 24)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseBy32_ChangesTexture: if (EV_DoPlat(line, raiseAndChange, 32)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseTo8BelowLowestCeiling_Crushes: if (EV_DoFloor(line, raiseFloorCrush)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseToNextHighestFloor_ChangesTexture: if (EV_DoPlat(line, raiseToNearestAndChange, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseToNextHighestFloor: if (EV_DoFloor(line, raiseFloorToNearest)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_LowerTo8AboveHighestFloor: if (EV_DoFloor(line, turboLower)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenWaitClose_Fast: if (EV_DoDoor(line, doorBlazeRaise)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_OpenStay_Fast: if (EV_DoDoor(line, doorBlazeOpen)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_CloseStay_Fast: if (EV_DoDoor(line, doorBlazeClose)) P_ChangeSwitchTexture(line, 1); break; case SR_Lift_LowerWaitRaise_Fast: if (EV_DoPlat(line, blazeDWUS, 0)) P_ChangeSwitchTexture(line, 1); break; case SR_Floor_RaiseToNextHighestFloor_Fast: if (EV_DoFloor(line, raiseFloorTurbo)) P_ChangeSwitchTexture(line, 1); break; case SR_Door_Blue_OpenStay_Fast: case SR_Door_Red_OpenStay_Fast: case SR_Door_Yellow_OpenStay_Fast: if (EV_DoLockedDoor(line, doorBlazeOpen, thing)) P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeTo255: EV_LightTurnOn(line, 255); P_ChangeSwitchTexture(line, 1); break; case SR_Light_ChangeTo35: if (canmodify && gamemission == doom2 && gamemap == 4) EV_LightTurnOn(line, 0); else EV_LightTurnOn(line, 35); P_ChangeSwitchTexture(line, 1); break; } return true; }
// // 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 // OVERLAY 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) { if ((unsigned)line->special >= GenCrusherBase) { if ((unsigned)line->special >= GenLockedBase && (unsigned)line->special < GenDoorBase) { if (!thing->player) return false; // monsters disallowed from unlocking doors if (!P_CanUnlockGenDoor(line,thing->player)) return false; } int lineTriggerType = (line->special & TriggerType) >> TriggerTypeShift; switch (lineTriggerType) { case PushOnce: case PushMany: if (side) return true; break; case SwitchOnce: case SwitchMany: break; default: // if not a switch/push type, do nothing here return false; } int retval; // check each range of generalized linedefs 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 retval = EV_DoGenFloor(line); } 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 retval = EV_DoGenCeiling(line); } 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 retval = EV_DoGenDoor(line); } else if ((unsigned)line->special >= GenLockedBase) { if (!line->tag && ((line->special&6)!=6)) //jff 2/27/98 all non-manual return false; // generalized types require tag retval = EV_DoGenLockedDoor(line); } 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 retval = EV_DoGenLift(line); } 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 retval = EV_DoGenStairs(line); } else { assert((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 retval = EV_DoGenCrusher(line); } switch (lineTriggerType) { case PushOnce: if (retval) line->special = 0; // fallthrough case PushMany: return true; case SwitchOnce: if (retval) P_ChangeSwitchTexture(line,0); return true; case SwitchMany: if (retval) P_ChangeSwitchTexture(line,1); return true; } } } // 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 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,close)) P_ChangeSwitchTexture(line,0); break; case 51: // Secret EXIT 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,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,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,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; }