/** * 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; } }
dd_bool P_UseSpecialLine2(mobj_t *mo, Line *line, int side) { xline_t *xline = P_ToXLine(line); // Err... // Use the back sides of VERY SPECIAL lines... if(side) { switch(xline->special) { case 124: // Sliding door open&close (unused). break; default: return false; } } // Switches that other things can activate. if(!mo->player) { // Never open secret doors. if(xline->flags & ML_SECRET) return false; switch(xline->special) { case 1: // MANUAL DOOR RAISE case 32: // MANUAL BLUE case 33: // MANUAL RED case 34: // MANUAL YELLOW break; default: return false; break; } } // Do something. switch(xline->special) { // MANUALS 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 case 525: // jd64 case 526: // jd64 case 527: // jd64 EV_VerticalDoor(line, mo); break; //UNUSED - Door Slide Open&Close // case 124: // EV_SlidingDoor (line, mo); // break; // SWITCHES case 7: // Build Stairs, if(EV_BuildStairs(line, build8)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 9: // Change Donut, if(EV_DoDonut(line)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 11: // Exit level, if(cyclingMaps && mapCycleNoExit) break; // Prevent zombies from exiting levels, if(mo->player && mo->player->health <= 0 && !cfg.zombiesCanExit) { S_StartSound(SFX_NOWAY, mo); return false; } P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_SWTCHX, false, 0); xline->special = 0; G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("next")); break; case 14: // Raise Floor 32 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 32)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 15: // Raise Floor 24 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 24)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 18: // Raise Floor to next highest floor. if(EV_DoFloor(line, FT_RAISEFLOORTONEAREST)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 20: // Raise Plat next highest floor and change texture. if(EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 21: // PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAY, 0)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 23: // Lower Floor to Lowest. if(EV_DoFloor(line, FT_LOWERTOLOWEST)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 29: // Raise Door. if(EV_DoDoor(line, DT_NORMAL)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 41: // 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 71: // Turbo Lower Floor. if(EV_DoFloor(line, FT_LOWERTURBO)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 49: // Ceiling Crush And Raise. if(EV_DoCeiling(line, CT_CRUSHANDRAISE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 50: // Close Door. if(EV_DoDoor(line, DT_CLOSE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 51: // Secret EXIT. if(cyclingMaps && mapCycleNoExit) break; // Prevent zombies from exiting levels. if(mo->player && mo->player->health <= 0 && !cfg.zombiesCanExit) { S_StartSound(SFX_NOWAY, mo); return false; } P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; G_SetGameActionMapCompleted(COMMON_GAMESESSION->mapUriForNamedExit("secret"), 0, true); break; case 55: // Raise Floor Crush. if(EV_DoFloor(line, FT_RAISEFLOORCRUSH)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 101: // Raise Floor. if(EV_DoFloor(line, FT_RAISEFLOOR)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 102: // Lower Floor to Surrounding floor height. if(EV_DoFloor(line, FT_LOWER)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 103: // Open Door. if(EV_DoDoor(line, DT_OPEN)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 111: // Blazing Door Raise (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZERAISE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 112: // Blazing Door Open (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZEOPEN)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 113: // Blazing Door Close (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZECLOSE)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 122: // Blazing PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 127: // Build Stairs Turbo 16. if(EV_BuildStairs(line, turbo16)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 131: // Raise Floor Turbo. if(EV_DoFloor(line, FT_RAISEFLOORTURBO)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 133: // BlzOpenDoor BLUE. case 135: // BlzOpenDoor RED. case 137: // BlzOpenDoor YELLOW. if(EV_DoLockedDoor(line, DT_BLAZEOPEN, mo)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 140: // Raise Floor 512. if(EV_DoFloor(line, FT_RAISE512)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; // BUTTONS case 42: // Close Door. if(EV_DoDoor(line, DT_CLOSE)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 43: // Lower Ceiling to Floor. if(EV_DoCeiling(line, CT_LOWERTOFLOOR)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 45: // Lower Floor to Surrounding floor height. if(EV_DoFloor(line, FT_LOWER)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 60: // Lower Floor to Lowest. if(EV_DoFloor(line, FT_LOWERTOLOWEST)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 61: // Open Door. if(EV_DoDoor(line, DT_OPEN)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 62: // PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAY, 1)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 63: // Raise Door. if(EV_DoDoor(line, DT_NORMAL)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 64: // Raise Floor to ceiling. if(EV_DoFloor(line, FT_RAISEFLOOR)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 66: // Raise Floor 24 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 24)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 67: // Raise Floor 32 and change texture. if(EV_DoPlat(line, PT_RAISEANDCHANGE, 32)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 65: // Raise Floor Crush. if(EV_DoFloor(line, FT_RAISEFLOORCRUSH)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 68: // Raise Plat to next highest floor and change texture. if(EV_DoPlat(line, PT_RAISETONEARESTANDCHANGE, 0)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 69: // Raise Floor to next highest floor. if(EV_DoFloor(line, FT_RAISEFLOORTONEAREST)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 70: // Turbo Lower Floor. if(EV_DoFloor(line, FT_LOWERTURBO)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 114: // Blazing Door Raise (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZERAISE)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 115: // Blazing Door Open (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZEOPEN)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 116: // Blazing Door Close (faster than TURBO!). if(EV_DoDoor(line, DT_BLAZECLOSE)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 123: // Blazing PlatDownWaitUpStay. if(EV_DoPlat(line, PT_DOWNWAITUPSTAYBLAZE, 0)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 132: // Raise Floor Turbo. if(EV_DoFloor(line, FT_RAISEFLOORTURBO)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 99: // BlzOpenDoor BLUE. case 134: // BlzOpenDoor RED. case 136: // BlzOpenDoor YELLOW. if(EV_DoLockedDoor(line, DT_BLAZERAISE, mo)) // jd64 was "DT_BLAZEOPEN" P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 138: // Light Turn On. EV_LightTurnOn(line, 1); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 139: // Light Turn Off. EV_LightTurnOn(line, 35.0f/255.0f); P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 343: // jd64 - BlzOpenDoor LaserPowerup 1. case 344: // jd64 - BlzOpenDoor LaserPowerup 2. case 345: // jd64 - BlzOpenDoor LaserPowerup 3. if(EV_DoLockedDoor(line, DT_BLAZEOPEN, mo)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 414: // jd64 if(EV_DoPlat(line, PT_UPWAITDOWNSTAY, 1)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 416: // jd64 if(EV_DoFloorAndCeiling(line, FT_TOHIGHESTPLUS8, CT_RAISETOHIGHEST)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 424: // jd64 if(EV_DoCeiling(line, CT_CUSTOM)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 425: // jd64 if(EV_DoCeiling(line, CT_CUSTOM)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; case 428: // jd64 if(EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP)) P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, BUTTONTIME); break; case 429: // jd64 if(EV_DoFloor(line, FT_TOHIGHESTPLUSBITMIP)) { P_ToggleSwitch((Side *)P_GetPtrp(line, DMU_FRONT), SFX_NONE, false, 0); xline->special = 0; } break; } return true; }
boolean P_ExecuteLineSpecial(int special, byte *args, line_t *line, int side, mobj_t *mo) { boolean buttonSuccess; buttonSuccess = false; switch (special) { case 1: // Poly Start Line break; case 2: // Poly Rotate Left buttonSuccess = EV_RotatePoly(line, args, 1, false); break; case 3: // Poly Rotate Right buttonSuccess = EV_RotatePoly(line, args, -1, false); break; case 4: // Poly Move buttonSuccess = EV_MovePoly(line, args, false, false); break; case 5: // Poly Explicit Line: Only used in initialization break; case 6: // Poly Move Times 8 buttonSuccess = EV_MovePoly(line, args, true, false); break; case 7: // Poly Door Swing buttonSuccess = EV_OpenPolyDoor(line, args, PODOOR_SWING); break; case 8: // Poly Door Slide buttonSuccess = EV_OpenPolyDoor(line, args, PODOOR_SLIDE); break; case 10: // Door Close buttonSuccess = EV_DoDoor(line, args, DREV_CLOSE); break; case 11: // Door Open if(!args[0]) { buttonSuccess = EV_VerticalDoor(line, mo); } else { buttonSuccess = EV_DoDoor(line, args, DREV_OPEN); } break; case 12: // Door Raise if(!args[0]) { buttonSuccess = EV_VerticalDoor(line, mo); } else { buttonSuccess = EV_DoDoor(line, args, DREV_NORMAL); } break; case 13: // Door Locked_Raise if(CheckedLockedDoor(mo, args[3])) { if(!args[0]) { buttonSuccess = EV_VerticalDoor(line, mo); } else { buttonSuccess = EV_DoDoor(line, args, DREV_NORMAL); } } break; case 20: // Floor Lower by Value buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERFLOORBYVALUE); break; case 21: // Floor Lower to Lowest buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERFLOORTOLOWEST); break; case 22: // Floor Lower to Nearest buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERFLOOR); break; case 23: // Floor Raise by Value buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOORBYVALUE); break; case 24: // Floor Raise to Highest buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOOR); break; case 25: // Floor Raise to Nearest buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOORTONEAREST); break; case 26: // Stairs Build Down Normal buttonSuccess = EV_BuildStairs(line, args, -1, STAIRS_NORMAL); break; case 27: // Build Stairs Up Normal buttonSuccess = EV_BuildStairs(line, args, 1, STAIRS_NORMAL); break; case 28: // Floor Raise and Crush buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEFLOORCRUSH); break; case 29: // Build Pillar (no crushing) buttonSuccess = EV_BuildPillar(line, args, false); break; case 30: // Open Pillar buttonSuccess = EV_OpenPillar(line, args); break; case 31: // Stairs Build Down Sync buttonSuccess = EV_BuildStairs(line, args, -1, STAIRS_SYNC); break; case 32: // Build Stairs Up Sync buttonSuccess = EV_BuildStairs(line, args, 1, STAIRS_SYNC); break; case 35: // Raise Floor by Value Times 8 buttonSuccess = EV_DoFloor(line, args, FLEV_RAISEBYVALUETIMES8); break; case 36: // Lower Floor by Value Times 8 buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERBYVALUETIMES8); break; case 40: // Ceiling Lower by Value buttonSuccess = EV_DoCeiling(line, args, CLEV_LOWERBYVALUE); break; case 41: // Ceiling Raise by Value buttonSuccess = EV_DoCeiling(line, args, CLEV_RAISEBYVALUE); break; case 42: // Ceiling Crush and Raise buttonSuccess = EV_DoCeiling(line, args, CLEV_CRUSHANDRAISE); break; case 43: // Ceiling Lower and Crush buttonSuccess = EV_DoCeiling(line, args, CLEV_LOWERANDCRUSH); break; case 44: // Ceiling Crush Stop buttonSuccess = EV_CeilingCrushStop(line, args); break; case 45: // Ceiling Crush Raise and Stay buttonSuccess = EV_DoCeiling(line, args, CLEV_CRUSHRAISEANDSTAY); break; case 46: // Floor Crush Stop buttonSuccess = EV_FloorCrushStop(line, args); break; case 60: // Plat Perpetual Raise buttonSuccess = EV_DoPlat(line, args, PLAT_PERPETUALRAISE, 0); break; case 61: // Plat Stop EV_StopPlat(line, args); break; case 62: // Plat Down-Wait-Up-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_DOWNWAITUPSTAY, 0); break; case 63: // Plat Down-by-Value*8-Wait-Up-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_DOWNBYVALUEWAITUPSTAY, 0); break; case 64: // Plat Up-Wait-Down-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_UPWAITDOWNSTAY, 0); break; case 65: // Plat Up-by-Value*8-Wait-Down-Stay buttonSuccess = EV_DoPlat(line, args, PLAT_UPBYVALUEWAITDOWNSTAY, 0); break; case 66: // Floor Lower Instant * 8 buttonSuccess = EV_DoFloor(line, args, FLEV_LOWERTIMES8INSTANT); break; case 67: // Floor Raise Instant * 8 buttonSuccess = EV_DoFloor(line, args, FLEV_RAISETIMES8INSTANT); break; case 68: // Floor Move to Value * 8 buttonSuccess = EV_DoFloor(line, args, FLEV_MOVETOVALUETIMES8); break; case 69: // Ceiling Move to Value * 8 buttonSuccess = EV_DoCeiling(line, args, CLEV_MOVETOVALUETIMES8); break; case 70: // Teleport if(side == 0) { // Only teleport when crossing the front side of a line buttonSuccess = EV_Teleport(args[0], mo, true); } break; case 71: // Teleport, no fog if(side == 0) { // Only teleport when crossing the front side of a line buttonSuccess = EV_Teleport(args[0], mo, false); } break; case 72: // Thrust Mobj if(!side) // Only thrust on side 0 { P_ThrustMobj(mo, args[0] * (ANGLE_90 / 64), args[1] << FRACBITS); buttonSuccess = 1; } break; case 73: // Damage Mobj if(args[0]) { P_DamageMobj(mo, NULL, NULL, args[0]); } else { // If arg1 is zero, then guarantee a kill P_DamageMobj(mo, NULL, NULL, 10000); } buttonSuccess = 1; break; case 74: // Teleport_NewMap if(side == 0) { // Only teleport when crossing the front side of a line if(!(mo && mo->player && mo->player->playerstate == PST_DEAD)) // Players must be alive to teleport { G_Completed(args[0], args[1]); buttonSuccess = true; } } break; case 75: // Teleport_EndGame if(side == 0) { // Only teleport when crossing the front side of a line if(!(mo && mo->player && mo->player->playerstate == PST_DEAD)) // Players must be alive to teleport { buttonSuccess = true; if(deathmatch) { // Winning in deathmatch just goes back to map 1 G_Completed(1, 0); } else { // Passing -1, -1 to G_Completed() starts the Finale G_Completed(-1, -1); } } } break; case 80: // ACS_Execute buttonSuccess = P_StartACS(args[0], args[1], &args[2], mo, line, side); break; case 81: // ACS_Suspend buttonSuccess = P_SuspendACS(args[0], args[1]); break; case 82: // ACS_Terminate buttonSuccess = P_TerminateACS(args[0], args[1]); break; case 83: // ACS_LockedExecute buttonSuccess = P_StartLockedACS(line, args, mo, side); break; case 90: // Poly Rotate Left Override buttonSuccess = EV_RotatePoly(line, args, 1, true); break; case 91: // Poly Rotate Right Override buttonSuccess = EV_RotatePoly(line, args, -1, true); break; case 92: // Poly Move Override buttonSuccess = EV_MovePoly(line, args, false, true); break; case 93: // Poly Move Times 8 Override buttonSuccess = EV_MovePoly(line, args, true, true); break; case 94: // Build Pillar Crush buttonSuccess = EV_BuildPillar(line, args, true); break; case 95: // Lower Floor and Ceiling buttonSuccess = EV_DoFloorAndCeiling(line, args, false); break; case 96: // Raise Floor and Ceiling buttonSuccess = EV_DoFloorAndCeiling(line, args, true); break; case 109: // Force Lightning buttonSuccess = true; P_ForceLightning(); break; case 110: // Light Raise by Value buttonSuccess = EV_SpawnLight(line, args, LITE_RAISEBYVALUE); break; case 111: // Light Lower by Value buttonSuccess = EV_SpawnLight(line, args, LITE_LOWERBYVALUE); break; case 112: // Light Change to Value buttonSuccess = EV_SpawnLight(line, args, LITE_CHANGETOVALUE); break; case 113: // Light Fade buttonSuccess = EV_SpawnLight(line, args, LITE_FADE); break; case 114: // Light Glow buttonSuccess = EV_SpawnLight(line, args, LITE_GLOW); break; case 115: // Light Flicker buttonSuccess = EV_SpawnLight(line, args, LITE_FLICKER); break; case 116: // Light Strobe buttonSuccess = EV_SpawnLight(line, args, LITE_STROBE); break; case 120: // Quake Tremor buttonSuccess = A_LocalQuake(args, mo); break; case 129: // UsePuzzleItem buttonSuccess = EV_LineSearchForPuzzleItem(line, args, mo); break; case 130: // Thing_Activate buttonSuccess = EV_ThingActivate(args[0]); break; case 131: // Thing_Deactivate buttonSuccess = EV_ThingDeactivate(args[0]); break; case 132: // Thing_Remove buttonSuccess = EV_ThingRemove(args[0]); break; case 133: // Thing_Destroy buttonSuccess = EV_ThingDestroy(args[0]); break; case 134: // Thing_Projectile buttonSuccess = EV_ThingProjectile(args, 0); break; case 135: // Thing_Spawn buttonSuccess = EV_ThingSpawn(args, 1); break; case 136: // Thing_ProjectileGravity buttonSuccess = EV_ThingProjectile(args, 1); break; case 137: // Thing_SpawnNoFog buttonSuccess = EV_ThingSpawn(args, 0); break; case 138: // Floor_Waggle buttonSuccess = EV_StartFloorWaggle(args[0], args[1], args[2], args[3], args[4]); break; case 140: // Sector_SoundChange buttonSuccess = EV_SectorSoundChange(args); break; // Line specials only processed during level initialization // 100: Scroll_Texture_Left // 101: Scroll_Texture_Right // 102: Scroll_Texture_Up // 103: Scroll_Texture_Down // 121: Line_SetIdentification // Inert Line specials default: break; } return buttonSuccess; }