void P_CrossSpecialLine(line_t *line,mobj_t *thing) { /* Triggers that other things can activate */ if (!thing->player) { /* Not a player? */ switch(line->special) { default: /* None of the above? */ return; /* Exit */ case 39: /* TELEPORT TRIGGER */ case 97: /* TELEPORT RETRIGGER */ case 4: /* RAISE DOOR */ case 10: /* PLAT DOWN-WAIT-UP-STAY TRIGGER */ case 88: /* PLAT DOWN-WAIT-UP-STAY RETRIGGER */ ; /* Null event */ } } /********************************** The first group of triggers all clear line->special so that they can't be triggered again. The second groun leaves line->special alone so triggering can occur at will. **********************************/ switch (line->special) { case 2: /* Open Door */ EV_DoDoor(line,open); line->special = 0; break; case 3: /* Close Door */ EV_DoDoor(line,close); line->special = 0; break; case 4: /* Raise Door */ EV_DoDoor(line,normaldoor); line->special = 0; break; case 5: /* Raise Floor */ EV_DoFloor(line,raiseFloor); line->special = 0; break; case 6: /* Fast Ceiling Crush & Raise */ EV_DoCeiling(line,fastCrushAndRaise); line->special = 0; break; case 8: /* Build Stairs */ EV_BuildStairs(line); line->special = 0; break; case 10: /* PlatDownWaitUp */ EV_DoPlat(line,downWaitUpStay,0); line->special = 0; break; case 12: /* Light Turn On - brightest near */ EV_LightTurnOn(line,0); line->special = 0; break; case 13: /* Light Turn On 255 */ EV_LightTurnOn(line,255); line->special = 0; break; case 16: /* Close Door 30 */ EV_DoDoor(line,close30ThenOpen); line->special = 0; break; case 17: /* Start Light Strobing */ EV_StartLightStrobing(line); line->special = 0; break; case 19: /* Lower Floor */ EV_DoFloor(line,lowerFloor); line->special = 0; break; case 22: /* Raise floor to nearest height and change texture */ EV_DoPlat(line,raiseToNearestAndChange,0); line->special = 0; break; case 25: /* Ceiling Crush and Raise */ EV_DoCeiling(line,crushAndRaise); line->special = 0; break; case 30: /* Raise floor to shortest texture height */ /* on either side of lines */ EV_DoFloor(line,raiseToTexture); line->special = 0; break; case 35: /* Lights Very Dark */ EV_LightTurnOn(line,35); line->special = 0; break; case 36: /* Lower Floor (TURBO) */ EV_DoFloor(line,turboLower); line->special = 0; break; case 37: /* LowerAndChange */ EV_DoFloor(line,lowerAndChange); line->special = 0; break; case 38: /* Lower Floor To Lowest */ EV_DoFloor(line,lowerFloorToLowest); line->special = 0; break; case 39: /* TELEPORT! */ EV_Teleport(line,thing); line->special = 0; break; case 40: /* RaiseCeilingLowerFloor */ EV_DoCeiling(line,raiseToHighest); EV_DoFloor(line,lowerFloorToLowest); line->special = 0; break; case 44: /* Ceiling Crush */ EV_DoCeiling(line,lowerAndCrush); line->special = 0; break; case 52: /* EXIT! */ G_ExitLevel(); line->special = 0; break; case 53: /* Perpetual Platform Raise */ EV_DoPlat(line,perpetualRaise,0); line->special = 0; break; case 54: /* Platform Stop */ EV_StopPlat(line); line->special = 0; break; case 56: /* Raise Floor Crush */ EV_DoFloor(line,raiseFloorCrush); line->special = 0; break; case 57: /* Ceiling Crush Stop */ EV_CeilingCrushStop(line); line->special = 0; break; case 58: /* Raise Floor 24 */ EV_DoFloor(line,raiseFloor24); line->special = 0; break; case 59: /* Raise Floor 24 And Change */ EV_DoFloor(line,raiseFloor24AndChange); line->special = 0; break; case 104: /* Turn lights off in sector(tag) */ EV_TurnTagLightsOff(line); line->special = 0; break; /* These are restartable, do not affect line->special */ case 72: /* Ceiling Crush */ EV_DoCeiling(line,lowerAndCrush); break; case 73: /* Ceiling Crush and Raise */ EV_DoCeiling(line,crushAndRaise); break; case 74: /* Ceiling Crush Stop */ EV_CeilingCrushStop(line); break; case 75: /* Close Door */ EV_DoDoor(line,close); break; case 76: /* Close Door 30 */ EV_DoDoor(line,close30ThenOpen); break; case 77: /* Fast Ceiling Crush & Raise */ EV_DoCeiling(line,fastCrushAndRaise); break; case 79: /* Lights Very Dark */ EV_LightTurnOn(line,35); break; case 80: /* Light Turn On - brightest near */ EV_LightTurnOn(line,0); break; case 81: /* Light Turn On 255 */ EV_LightTurnOn(line,255); break; case 82: /* Lower Floor To Lowest */ EV_DoFloor(line,lowerFloorToLowest); break; case 83: /* Lower Floor */ EV_DoFloor(line,lowerFloor); break; case 84: /* LowerAndChange */ EV_DoFloor(line,lowerAndChange); break; case 86: /* Open Door */ EV_DoDoor(line,open); break; case 87: /* Perpetual Platform Raise */ EV_DoPlat(line,perpetualRaise,0); break; case 88: /* PlatDownWaitUp */ EV_DoPlat(line,downWaitUpStay,0); break; case 89: /* Platform Stop */ EV_StopPlat(line); break; case 90: /* Raise Door */ EV_DoDoor(line,normaldoor); break; case 91: /* Raise Floor */ EV_DoFloor(line,raiseFloor); break; case 92: /* Raise Floor 24 */ EV_DoFloor(line,raiseFloor24); break; case 93: /* Raise Floor 24 And Change */ EV_DoFloor(line,raiseFloor24AndChange); break; case 94: /* Raise Floor Crush */ EV_DoFloor(line,raiseFloorCrush); break; case 95: /* Raise floor to nearest height and change texture */ EV_DoPlat(line,raiseToNearestAndChange,0); break; case 96: /* Raise floor to shortest texture height */ /* on either side of lines */ EV_DoFloor(line,raiseToTexture); break; case 97: /* TELEPORT! */ EV_Teleport(line,thing); break; case 98: /* Lower Floor (TURBO) */ EV_DoFloor(line,turboLower); break; } }
void P_CrossSpecialLine(int linenum, int side, mobj_t *thing) { line_t *line; line = &lines[linenum]; if(!thing->player) { // Check if trigger allowed by non-player mobj switch(line->special) { case 39: // Trigger_TELEPORT case 97: // Retrigger_TELEPORT case 4: // Trigger_Raise_Door //case 10: // PLAT DOWN-WAIT-UP-STAY TRIGGER //case 88: // PLAT DOWN-WAIT-UP-STAY RETRIGGER break; default: return; break; } } switch(line->special) { //==================================================== // TRIGGERS //==================================================== case 2: // Open Door EV_DoDoor(line,open,VDOORSPEED); line->special = 0; break; case 3: // Close Door EV_DoDoor(line,close,VDOORSPEED); line->special = 0; break; case 4: // Raise Door EV_DoDoor(line,normal,VDOORSPEED); line->special = 0; break; case 5: // Raise Floor EV_DoFloor(line,raiseFloor); line->special = 0; break; case 6: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); line->special = 0; break; case 8: // Trigger_Build_Stairs (8 pixel steps) EV_BuildStairs(line, 8*FRACUNIT); line->special = 0; break; case 106: // Trigger_Build_Stairs_16 (16 pixel steps) EV_BuildStairs(line, 16*FRACUNIT); line->special = 0; break; case 10: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); line->special = 0; break; case 12: // Light Turn On - brightest near EV_LightTurnOn(line,0); line->special = 0; break; case 13: // Light Turn On 255 EV_LightTurnOn(line,255); line->special = 0; break; case 16: // Close Door 30 EV_DoDoor(line,close30ThenOpen,VDOORSPEED); line->special = 0; break; case 17: // Start Light Strobing EV_StartLightStrobing(line); line->special = 0; break; case 19: // Lower Floor EV_DoFloor(line,lowerFloor); line->special = 0; break; case 22: // Raise floor to nearest height and change texture EV_DoPlat(line,raiseToNearestAndChange,0); line->special = 0; break; case 25: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); line->special = 0; break; case 30: // Raise floor to shortest texture height // on either side of lines EV_DoFloor(line,raiseToTexture); line->special = 0; break; case 35: // Lights Very Dark EV_LightTurnOn(line,35); line->special = 0; break; case 36: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); line->special = 0; break; case 37: // LowerAndChange EV_DoFloor(line,lowerAndChange); line->special = 0; break; case 38: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 39: // TELEPORT! EV_Teleport( line, side, thing ); line->special = 0; break; case 40: // RaiseCeilingLowerFloor EV_DoCeiling( line, raiseToHighest ); EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 44: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); line->special = 0; break; case 52: // EXIT! G_ExitLevel (); line->special = 0; break; case 53: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); line->special = 0; break; case 54: // Platform Stop EV_StopPlat(line); line->special = 0; break; case 56: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); line->special = 0; break; case 57: // Ceiling Crush Stop EV_CeilingCrushStop(line); line->special = 0; break; case 58: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); line->special = 0; break; case 59: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); line->special = 0; break; case 104: // Turn lights off in sector(tag) EV_TurnTagLightsOff(line); line->special = 0; break; case 105: // Trigger_SecretExit G_SecretExitLevel(); line->special = 0; break; //==================================================== // RE-DOABLE TRIGGERS //==================================================== case 72: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); break; case 73: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); break; case 74: // Ceiling Crush Stop EV_CeilingCrushStop(line); break; case 75: // Close Door EV_DoDoor(line,close,VDOORSPEED); break; case 76: // Close Door 30 EV_DoDoor(line,close30ThenOpen,VDOORSPEED); break; case 77: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); break; case 79: // Lights Very Dark EV_LightTurnOn(line,35); break; case 80: // Light Turn On - brightest near EV_LightTurnOn(line,0); break; case 81: // Light Turn On 255 EV_LightTurnOn(line,255); break; case 82: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); break; case 83: // Lower Floor EV_DoFloor(line,lowerFloor); break; case 84: // LowerAndChange EV_DoFloor(line,lowerAndChange); break; case 86: // Open Door EV_DoDoor(line,open,VDOORSPEED); break; case 87: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); break; case 88: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); break; case 89: // Platform Stop EV_StopPlat(line); break; case 90: // Raise Door EV_DoDoor(line,normal,VDOORSPEED); break; case 100: // Retrigger_Raise_Door_Turbo EV_DoDoor(line, normal, VDOORSPEED*3); break; case 91: // Raise Floor EV_DoFloor(line,raiseFloor); break; case 92: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); break; case 93: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); break; case 94: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); break; case 95: // Raise floor to nearest height and change texture EV_DoPlat(line,raiseToNearestAndChange,0); break; case 96: // Raise floor to shortest texture height // on either side of lines EV_DoFloor(line,raiseToTexture); break; case 97: // TELEPORT! EV_Teleport( line, side, thing ); break; case 98: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); break; } }
// // P_CrossSpecialLine - TRIGGER // Called every time a thing origin is about // to cross a line with a non 0 special. // void P_CrossSpecialLine ( int linenum, int side, mobj_t* thing ) { line_t* line; int ok; line = &lines[linenum]; // Triggers that other things can activate if (!thing->player) { // Things that should NOT trigger specials... switch(thing->type) { case MT_ROCKET: case MT_PLASMA: case MT_BFG: case MT_TROOPSHOT: case MT_HEADSHOT: case MT_BRUISERSHOT: return; break; default: break; } ok = 0; switch(line->special) { case 39: // TELEPORT TRIGGER case 97: // TELEPORT RETRIGGER case 125: // TELEPORT MONSTERONLY TRIGGER case 126: // TELEPORT MONSTERONLY RETRIGGER case 4: // RAISE DOOR case 10: // PLAT DOWN-WAIT-UP-STAY TRIGGER case 88: // PLAT DOWN-WAIT-UP-STAY RETRIGGER ok = 1; break; } if (!ok) return; } // Note: could use some const's here. switch (line->special) { // TRIGGERS. // All from here to RETRIGGERS. case 2: // Open Door EV_DoDoor(line,vld_open); line->special = 0; break; case 3: // Close Door EV_DoDoor(line,vld_close); line->special = 0; break; case 4: // Raise Door EV_DoDoor(line,vld_normal); line->special = 0; break; case 5: // Raise Floor EV_DoFloor(line,raiseFloor); line->special = 0; break; case 6: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); line->special = 0; break; case 8: // Build Stairs EV_BuildStairs(line,build8); line->special = 0; break; case 10: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); line->special = 0; break; case 12: // Light Turn On - brightest near EV_LightTurnOn(line,0); line->special = 0; break; case 13: // Light Turn On 255 EV_LightTurnOn(line,255); line->special = 0; break; case 16: // Close Door 30 EV_DoDoor(line,vld_close30ThenOpen); line->special = 0; break; case 17: // Start Light Strobing EV_StartLightStrobing(line); line->special = 0; break; case 19: // Lower Floor EV_DoFloor(line,lowerFloor); line->special = 0; break; case 22: // Raise floor to nearest height and change texture EV_DoPlat(line,raiseToNearestAndChange,0); line->special = 0; break; case 25: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); line->special = 0; break; case 30: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line,raiseToTexture); line->special = 0; break; case 35: // Lights Very Dark EV_LightTurnOn(line,35); line->special = 0; break; case 36: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); line->special = 0; break; case 37: // LowerAndChange EV_DoFloor(line,lowerAndChange); line->special = 0; break; case 38: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 39: // TELEPORT! EV_Teleport( line, side, thing ); line->special = 0; break; case 40: // RaiseCeilingLowerFloor EV_DoCeiling( line, raiseToHighest ); EV_DoFloor( line, lowerFloorToLowest ); line->special = 0; break; case 44: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); line->special = 0; break; case 52: // EXIT! G_ExitLevel (); break; case 53: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); line->special = 0; break; case 54: // Platform Stop EV_StopPlat(line); line->special = 0; break; case 56: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); line->special = 0; break; case 57: // Ceiling Crush Stop EV_CeilingCrushStop(line); line->special = 0; break; case 58: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); line->special = 0; break; case 59: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); line->special = 0; break; case 104: // Turn lights off in sector(tag) EV_TurnTagLightsOff(line); line->special = 0; break; case 108: // Blazing Door Raise (faster than TURBO!) EV_DoDoor (line,vld_blazeRaise); line->special = 0; break; case 109: // Blazing Door Open (faster than TURBO!) EV_DoDoor (line,vld_blazeOpen); line->special = 0; break; case 100: // Build Stairs Turbo 16 EV_BuildStairs(line,turbo16); line->special = 0; break; case 110: // Blazing Door Close (faster than TURBO!) EV_DoDoor (line,vld_blazeClose); line->special = 0; break; case 119: // Raise floor to nearest surr. floor EV_DoFloor(line,raiseFloorToNearest); line->special = 0; break; case 121: // Blazing PlatDownWaitUpStay EV_DoPlat(line,blazeDWUS,0); line->special = 0; break; case 124: // Secret EXIT G_SecretExitLevel (); break; case 125: // TELEPORT MonsterONLY if (!thing->player) { EV_Teleport( line, side, thing ); line->special = 0; } break; case 130: // Raise Floor Turbo EV_DoFloor(line,raiseFloorTurbo); line->special = 0; break; case 141: // Silent Ceiling Crush & Raise EV_DoCeiling(line,silentCrushAndRaise); line->special = 0; break; // RETRIGGERS. All from here till end. case 72: // Ceiling Crush EV_DoCeiling( line, lowerAndCrush ); break; case 73: // Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); break; case 74: // Ceiling Crush Stop EV_CeilingCrushStop(line); break; case 75: // Close Door EV_DoDoor(line,vld_close); break; case 76: // Close Door 30 EV_DoDoor(line,vld_close30ThenOpen); break; case 77: // Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); break; case 79: // Lights Very Dark EV_LightTurnOn(line,35); break; case 80: // Light Turn On - brightest near EV_LightTurnOn(line,0); break; case 81: // Light Turn On 255 EV_LightTurnOn(line,255); break; case 82: // Lower Floor To Lowest EV_DoFloor( line, lowerFloorToLowest ); break; case 83: // Lower Floor EV_DoFloor(line,lowerFloor); break; case 84: // LowerAndChange EV_DoFloor(line,lowerAndChange); break; case 86: // Open Door EV_DoDoor(line,vld_open); break; case 87: // Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); break; case 88: // PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); break; case 89: // Platform Stop EV_StopPlat(line); break; case 90: // Raise Door EV_DoDoor(line,vld_normal); break; case 91: // Raise Floor EV_DoFloor(line,raiseFloor); break; case 92: // Raise Floor 24 EV_DoFloor(line,raiseFloor24); break; case 93: // Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); break; case 94: // Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); break; case 95: // Raise floor to nearest height // and change texture. EV_DoPlat(line,raiseToNearestAndChange,0); break; case 96: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line,raiseToTexture); break; case 97: // TELEPORT! EV_Teleport( line, side, thing ); break; case 98: // Lower Floor (TURBO) EV_DoFloor(line,turboLower); break; case 105: // Blazing Door Raise (faster than TURBO!) EV_DoDoor (line,vld_blazeRaise); break; case 106: // Blazing Door Open (faster than TURBO!) EV_DoDoor (line,vld_blazeOpen); break; case 107: // Blazing Door Close (faster than TURBO!) EV_DoDoor (line,vld_blazeClose); break; case 120: // Blazing PlatDownWaitUpStay. EV_DoPlat(line,blazeDWUS,0); break; case 126: // TELEPORT MonsterONLY. if (!thing->player) EV_Teleport( line, side, thing ); break; case 128: // Raise To Nearest Floor EV_DoFloor(line,raiseFloorToNearest); break; case 129: // Raise Floor Turbo EV_DoFloor(line,raiseFloorTurbo); break; } }
// // T_VerticalDoor // void T_VerticalDoor(vldoor_t *door) { result_e res; switch(door->direction) { case 0: // WAITING if (!--door->topcountdown) { switch(door->type) { case blazeRaise: door->direction = -1; // time to go back down S_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls); break; case normal: door->direction = -1; // time to go back down S_StartSound((mobj_t *)&door->sector->soundorg, sfx_dorcls); break; case close30ThenOpen: door->direction = 1; S_StartSound((mobj_t *)&door->sector->soundorg, sfx_doropn); break; default: break; } } break; case 2: // INITIAL WAIT if (!--door->topcountdown) { switch(door->type) { case raiseIn5Mins: door->direction = 1; door->type = normal; S_StartSound((mobj_t *)&door->sector->soundorg, sfx_doropn); break; default: break; } } break; case -1: // DOWN res = T_MovePlane(door->sector, door->speed, door->sector->floorheight, false, 1, door->direction); if (res == pastdest) { switch(door->type) { case blazeRaise: case blazeClose: door->sector->ceilingdata = (void *)0; P_RemoveThinker(&door->thinker); // unlink and free S_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls); break; case normal: case close: door->sector->ceilingdata = (void *)0; P_RemoveThinker(&door->thinker); // unlink and free break; case close30ThenOpen: door->direction = 0; door->topcountdown = 35 * 30; break; default: break; } // turn lighting off in tagged sectors of manual doors // idea taken from Boom if (door->line && door->line->tag) { switch (door->line->special) { case 1: case 31: case 26: case 27: case 28: case 32: case 33: case 34: case 117: case 118: EV_TurnTagLightsOff(door->line); break; default: break; } } } else if (res == crushed) { switch(door->type) { case blazeClose: case close: // DO NOT GO BACK UP! break; default: door->direction = 1; S_StartSound((mobj_t *)&door->sector->soundorg, sfx_doropn); break; } } break; case 1: // UP res = T_MovePlane(door->sector, door->speed, door->topheight, false, 1, door->direction); if (res == pastdest) { switch(door->type) { case blazeRaise: case normal: door->direction = 0; // wait at top door->topcountdown = door->topwait; break; case close30ThenOpen: case blazeOpen: case open: door->sector->ceilingdata = (void *)0; P_RemoveThinker(&door->thinker); // unlink and free break; default: break; } // turn lighting on in tagged sectors of manual doors // idea taken from Boom if (door->line && door->line->tag) { switch (door->line->special) { case 1: case 31: case 26: case 27: case 28: case 32: case 33: case 34: case 117: case 118: EV_LightTurnOn(door->line, 0); break; default: break; } } } break; } }
// // P_UseSpecialLine // Called when a thing uses a special line. // Only the front sides of lines are usable. // boolean 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 boolean (*linefunc)(line_t *line) = NULL; // 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 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 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: 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: if (thing->player && thing->player->health <= 0) { S_StartSound(thing, sfx_noway); return false; } 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: if (thing->player && thing->player->health <= 0) { S_StartSound(thing, sfx_noway); return false; } 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_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_Floor_LowerToNearestFloor: if (EV_DoFloor(line, lowerFloorToNearest)) P_ChangeSwitchTexture(line, 0); 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_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; }
// // T_VerticalDoor // void T_VerticalDoor (vldoor_t* door) { result_e res; line_t* line; switch(door->direction) { case 0: // WAITING if (!--door->topcountdown) { switch(door->type) { case normal: case blazeRaise: door->direction = -1; // time to go back down T_Makedoorsound (door); break; case closeThenOpen: case close30ThenOpen: door->direction = 1; T_Makedoorsound (door); break; default: break; } } break; case 2: // INITIAL WAIT if (!--door->topcountdown) { switch(door->type) { case raiseIn5Mins: door->direction = 1; door->type = normal; T_Makedoorsound (door); break; default: break; } } break; case -1: // DOWN res = T_MovePlane(door->sector, door->speed, door->sector->floorheight, false,1,door->direction); switch (res) { case pastdest: if ((line = door->line) != NULL) EV_TurnTagLightsOff (line); switch(door->type) { case blazeRaise: case blazeClose: door->sector->ceilingdata = NULL; P_RemoveThinker (&door->thinker); // unlink and free //S_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls); break; case normal: case normalClose: door->sector->ceilingdata = NULL; P_RemoveThinker (&door->thinker); // unlink and free break; case close30ThenOpen: door->direction = 0; door->topcountdown = 35*30; break; case closeThenOpen: door->direction = 0; door->topcountdown = door->topwait; break; default: break; } break; case crushed: switch(door->type) { case blazeClose: case normalClose: // DO NOT GO BACK UP! break; default: door->direction = 1; T_Makedoorsound (door); break; } break; default: if ((line = door->line) != NULL) { sector_t* sector; fixed_t fraction; sector = door->sector; fraction = FixedDiv (sector->ceilingheight - sector->floorheight, door->topheight - sector->floorheight); P_AdjustDoorLight (line, fraction); } break; } break; case 1: // UP res = T_MovePlane(door->sector, door->speed, door->topheight, false,1,door->direction); switch (res) { case pastdest: if ((line = door->line) != NULL) EV_LightTurnOn (line, 0); switch(door->type) { case blazeRaise: case normal: if (netgame || (!gamekeydown['`'])) // Stay open cheat { door->direction = 0; // wait at top door->topcountdown = door->topwait; break; } case closeThenOpen: case close30ThenOpen: case blazeOpen: case normalOpen: door->sector->ceilingdata = NULL; P_RemoveThinker (&door->thinker); // unlink and free break; default: break; } break; default: if ((line = door->line) != NULL) { sector_t* sector; fixed_t fraction; sector = door->sector; fraction = FixedDiv (sector->ceilingheight - sector->floorheight, door->topheight - sector->floorheight); P_AdjustDoorLight (line, fraction); } break; } break; } }
/** * Called every time a thing origin is about to cross a line with a non 0 special. */ static void P_CrossSpecialLine(Line *line, int side, mobj_t *thing) { // Extended functionality overrides old. if(XL_CrossLine(line, side, thing)) return; xline_t *xline = P_ToXLine(line); // Triggers that other things can activate if(!thing->player) { dd_bool ok = false; // Things that should NOT trigger specials... switch(thing->type) { case MT_ROCKET: case MT_PLASMA: case MT_BFG: case MT_TROOPSHOT: case MT_HEADSHOT: case MT_BRUISERSHOT: case MT_BRUISERSHOTRED: // jd64 case MT_NTROSHOT: // jd64 return; default: break; } switch(xline->special) { case 39: ///< TELEPORT TRIGGER case 97: ///< TELEPORT RETRIGGER case 993: // jd64 case 125: ///< TELEPORT MONSTERONLY TRIGGER case 126: ///< TELEPORT MONSTERONLY RETRIGGER case 4: ///< RAISE DOOR case 10: ///< PLAT DOWN-WAIT-UP-STAY TRIGGER case 88: ///< PLAT DOWN-WAIT-UP-STAY RETRIGGER case 415: // jd64 ok = true; break; } // Anything can trigger this line! if(xline->flags & ML_ALLTRIGGER) ok = true; if(!ok) return; } // Note: could use some const's here. switch(xline->special) { // TRIGGERS. // All from here to RETRIGGERS. case 2: // Open Door EV_DoDoor(line, DT_OPEN); xline->special = 0; break; case 3: // Close Door EV_DoDoor(line, DT_CLOSE); xline->special = 0; break; case 4: // Raise Door EV_DoDoor(line, DT_NORMAL); xline->special = 0; break; case 5: // Raise Floor EV_DoFloor(line, FT_RAISEFLOOR); xline->special = 0; break; case 6: // Fast Ceiling Crush & Raise EV_DoCeiling(line, CT_CRUSHANDRAISEFAST); xline->special = 0; break; case 8: // Build Stairs EV_BuildStairs(line, build8); xline->special = 0; break; case 10: // PlatDownWaitUp EV_DoPlat(line, PT_DOWNWAITUPSTAY, 0); xline->special = 0; break; case 12: // Light Turn On - brightest near EV_LightTurnOn(line, 0); xline->special = 0; break; case 13: // Light Turn On - max EV_LightTurnOn(line, 1); xline->special = 0; break; case 16: // Close Door 30 EV_DoDoor(line, DT_CLOSE30THENOPEN); xline->special = 0; break; case 17: // Start Light Strobing EV_StartLightStrobing(line); xline->special = 0; break; case 19: // Lower Floor EV_DoFloor(line, FT_LOWER); xline->special = 0; break; case 22: // Raise floor to nearest height and change texture EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0); xline->special = 0; break; case 25: // Ceiling Crush and Raise EV_DoCeiling(line, CT_CRUSHANDRAISE); xline->special = 0; break; case 30: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line, FT_RAISETOTEXTURE); xline->special = 0; break; case 35: // Lights Very Dark EV_LightTurnOn(line, 35.0f/255.0f); xline->special = 0; break; case 36: // Lower Floor (TURBO) EV_DoFloor(line, FT_LOWERTURBO); xline->special = 0; break; case 37: // LowerAndChange EV_DoFloor(line, FT_LOWERANDCHANGE); xline->special = 0; break; case 38: // Lower Floor To Lowest EV_DoFloor(line, FT_LOWERTOLOWEST); xline->special = 0; break; case 420: // jd64 EV_DoFloorAndCeiling(line, FT_TOHIGHESTPLUS8, CT_RAISETOHIGHEST); xline->special = 0; break; case 430: // jd64 EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP); break; case 431: // jd64 EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP); xline->special = 0; break; case 426: // jd64 EV_DoCeiling(line, CT_CUSTOM); break; case 427: // jd64 EV_DoCeiling(line, CT_CUSTOM); xline->special = 0; break; case 991: // jd64 // TELEPORT! EV_FadeSpawn(line, thing); xline->special = 0; break; case 993: // jd64 if(!thing->player) EV_FadeSpawn(line, thing); xline->special = 0; break; case 992: // jd64 // Lower Ceiling to Floor if(EV_DoCeiling(line, CT_LOWERTOFLOOR)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 994: // jd64 /// @todo Might as well do this with XG. /// Also, export this text string to DED. P_SetMessage(thing->player, "You've found a secret area!"); thing->player->secretCount++; thing->player->update |= PSF_COUNTERS; xline->special = 0; break; case 995: // jd64 /// @todo Might as well do this with XG. P_SetMessage(thing->player, "You've found a shrine!"); xline->special = 0; break; case 998: // jd64 // BE GONE! EV_FadeAway(line, thing); xline->special = 0; break; case 39: // TELEPORT! EV_Teleport(line, side, thing, true); xline->special = 0; break; case 40: // RaiseCeilingLowerFloor EV_DoCeiling(line, CT_RAISETOHIGHEST); EV_DoFloor(line, FT_LOWERTOLOWEST); xline->special = 0; break; case 44: // Ceiling Crush EV_DoCeiling(line, CT_LOWERANDCRUSH); xline->special = 0; break; case 52: // EXIT! G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("next")); break; case 53: // Perpetual Platform Raise EV_DoPlat(line, PT_PERPETUALRAISE, 0); xline->special = 0; break; case 54: // Platform Stop P_PlatDeactivate(xline->tag); xline->special = 0; break; case 56: // Raise Floor Crush EV_DoFloor(line, FT_RAISEFLOORCRUSH); xline->special = 0; break; case 57: // Ceiling Crush Stop P_CeilingDeactivate(xline->tag); xline->special = 0; break; case 58: // Raise Floor 24 EV_DoFloor(line, FT_RAISE24); xline->special = 0; break; case 59: // Raise Floor 24 And Change EV_DoFloor(line, FT_RAISE24ANDCHANGE); xline->special = 0; break; case 104: // Turn lights off in sector(tag) EV_TurnTagLightsOff(line); xline->special = 0; break; case 108: // Blazing Door Raise (faster than TURBO!) EV_DoDoor(line, DT_BLAZERAISE); xline->special = 0; break; case 109: // Blazing Door Open (faster than TURBO!) EV_DoDoor(line, DT_BLAZEOPEN); xline->special = 0; break; case 100: // Build Stairs Turbo 16 EV_BuildStairs(line, turbo16); xline->special = 0; break; case 110: // Blazing Door Close (faster than TURBO!) EV_DoDoor(line, DT_BLAZECLOSE); xline->special = 0; break; case 119: // Raise floor to nearest surr. floor EV_DoFloor(line, FT_RAISEFLOORTONEAREST); xline->special = 0; break; case 121: // Blazing PlatDownWaitUpStay EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0); xline->special = 0; break; case 124: // Secret EXIT G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("secret"), 0, true); break; case 125: // TELEPORT MonsterONLY if(!thing->player) { EV_Teleport(line, side, thing, true); xline->special = 0; } break; case 130: // Raise Floor Turbo EV_DoFloor(line, FT_RAISEFLOORTURBO); xline->special = 0; break; case 141: // Silent Ceiling Crush & Raise EV_DoCeiling(line, CT_SILENTCRUSHANDRAISE); xline->special = 0; break; // RETRIGGERS. All from here till end. case 72: // Ceiling Crush EV_DoCeiling(line, CT_LOWERANDCRUSH); break; case 73: // Ceiling Crush and Raise EV_DoCeiling(line, CT_CRUSHANDRAISE); break; case 74: // Ceiling Crush Stop P_CeilingDeactivate(xline->tag); break; case 75: // Close Door EV_DoDoor(line, DT_CLOSE); break; case 76: // Close Door 30 EV_DoDoor(line, DT_CLOSE30THENOPEN); break; case 77: // Fast Ceiling Crush & Raise EV_DoCeiling(line, CT_CRUSHANDRAISEFAST); break; case 79: // Lights Very Dark EV_LightTurnOn(line, 35.0f/255.0f); break; case 80: // Light Turn On - brightest near EV_LightTurnOn(line, 0); break; case 81: // Light Turn On - max EV_LightTurnOn(line, 1); break; case 82: // Lower Floor To Lowest EV_DoFloor(line, FT_LOWERTOLOWEST); break; case 83: // Lower Floor EV_DoFloor(line, FT_LOWER); break; case 84: // LowerAndChange EV_DoFloor(line, FT_LOWERANDCHANGE); break; case 86: // Open Door EV_DoDoor(line, DT_OPEN); break; case 87: // Perpetual Platform Raise EV_DoPlat(line, PT_PERPETUALRAISE, 0); break; case 88: // PlatDownWaitUp EV_DoPlat(line, PT_DOWNWAITUPSTAY, 0); break; case 415: // jd64 if(thing->player) EV_DoPlat(line, PT_UPWAITDOWNSTAY, 0); break; case 89: // Platform Stop P_PlatDeactivate(xline->tag); break; case 90: // Raise Door EV_DoDoor(line, DT_NORMAL); break; case 91: // Raise Floor EV_DoFloor(line, FT_RAISEFLOOR); break; case 92: // Raise Floor 24 EV_DoFloor(line, FT_RAISE24); break; case 93: // Raise Floor 24 And Change EV_DoFloor(line, FT_RAISE24ANDCHANGE); break; case 94: // Raise Floor Crush EV_DoFloor(line, FT_RAISEFLOORCRUSH); break; case 95: // Raise floor to nearest height // and change texture. EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0); break; case 96: // Raise floor to shortest texture height // on either side of lines. EV_DoFloor(line, FT_RAISETOTEXTURE); break; case 97: // TELEPORT! EV_Teleport(line, side, thing, true); break; case 423: // jd64 // TELEPORT! (no fog) // FIXME: DJS - might as well do this in XG. EV_Teleport(line, side, thing, false); break; case 98: // Lower Floor (TURBO) EV_DoFloor(line, FT_LOWERTURBO); break; case 105: // Blazing Door Raise (faster than TURBO!) EV_DoDoor(line, DT_BLAZERAISE); break; case 106: // Blazing Door Open (faster than TURBO!) EV_DoDoor(line, DT_BLAZEOPEN); break; case 107: // Blazing Door Close (faster than TURBO!) EV_DoDoor(line, DT_BLAZECLOSE); break; case 120: // Blazing PlatDownWaitUpStay. EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0); break; case 126: // TELEPORT MonsterONLY. if(!thing->player) EV_Teleport(line, side, thing, true); break; case 128: // Raise To Nearest Floor EV_DoFloor(line, FT_RAISEFLOORTONEAREST); break; case 129: // Raise Floor Turbo EV_DoFloor(line, FT_RAISEFLOORTURBO); break; case 155: // jd64 // Raise Floor 512 // FIXME: DJS - again, might as well do this in XG. if(EV_DoFloor(line, FT_RAISE32)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); P_ToXLine(line)->special = 0; } break; } }
// // 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; }