diff options
Diffstat (limited to 'src/hexen/p_spec.c')
-rw-r--r-- | src/hexen/p_spec.c | 1679 |
1 files changed, 861 insertions, 818 deletions
diff --git a/src/hexen/p_spec.c b/src/hexen/p_spec.c index b351061a..44c9c713 100644 --- a/src/hexen/p_spec.c +++ b/src/hexen/p_spec.c @@ -1,14 +1,26 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. +// +//----------------------------------------------------------------------------- -//************************************************************************** -//** -//** p_spec.c : Heretic 2 : Raven Software, Corp. -//** -//** $RCSfile: p_spec.c,v $ -//** $Revision: 1.67 $ -//** $Date: 96/01/06 18:37:33 $ -//** $Author: bgokey $ -//** -//************************************************************************** // HEADER FILES ------------------------------------------------------------ @@ -28,7 +40,7 @@ // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- -static boolean CheckedLockedDoor(mobj_t *mo, byte lock); +static boolean CheckedLockedDoor(mobj_t * mo, byte lock); // EXTERNAL DATA DECLARATIONS ---------------------------------------------- @@ -37,23 +49,28 @@ static boolean CheckedLockedDoor(mobj_t *mo, byte lock); int *TerrainTypes; struct { - char *name; - int type; + char *name; + int type; } TerrainTypeDefs[] = { - { "X_005", FLOOR_WATER }, - { "X_001", FLOOR_LAVA }, - { "X_009", FLOOR_SLUDGE }, - { "F_033", FLOOR_ICE }, - { "END", -1 } + { + "X_005", FLOOR_WATER}, + { + "X_001", FLOOR_LAVA}, + { + "X_009", FLOOR_SLUDGE}, + { + "F_033", FLOOR_ICE}, + { + "END", -1} }; // PRIVATE DATA DEFINITIONS ------------------------------------------------ static struct { - line_t *line; - int lineTag; + line_t *line; + int lineTag; } TaggedLines[MAX_TAGGED_LINES]; static int TaggedLineCount; @@ -69,9 +86,9 @@ mobj_t LavaInflictor; void P_InitLava(void) { - memset(&LavaInflictor, 0, sizeof(mobj_t)); - LavaInflictor.type = MT_CIRCLEFLAME; - LavaInflictor.flags2 = MF2_FIREDAMAGE|MF2_NODMGTHRUST; + memset(&LavaInflictor, 0, sizeof(mobj_t)); + LavaInflictor.type = MT_CIRCLEFLAME; + LavaInflictor.flags2 = MF2_FIREDAMAGE | MF2_NODMGTHRUST; } //========================================================================== @@ -82,21 +99,21 @@ void P_InitLava(void) void P_InitTerrainTypes(void) { - int i; - int lump; - int size; - - size = (numflats+1)*sizeof(int); - TerrainTypes = Z_Malloc(size, PU_STATIC, 0); - memset(TerrainTypes, 0, size); - for(i = 0; TerrainTypeDefs[i].type != -1; i++) - { - lump = W_CheckNumForName(TerrainTypeDefs[i].name); - if(lump != -1) - { - TerrainTypes[lump-firstflat] = TerrainTypeDefs[i].type; - } - } + int i; + int lump; + int size; + + size = (numflats + 1) * sizeof(int); + TerrainTypes = Z_Malloc(size, PU_STATIC, 0); + memset(TerrainTypes, 0, size); + for (i = 0; TerrainTypeDefs[i].type != -1; i++) + { + lump = W_CheckNumForName(TerrainTypeDefs[i].name); + if (lump != -1) + { + TerrainTypes[lump - firstflat] = TerrainTypeDefs[i].type; + } + } } //========================================================================== @@ -152,15 +169,15 @@ int twoSided(int sector, int line) // Return sector_t * of sector next to current. NULL if not two-sided line // //================================================================== -sector_t *getNextSector(line_t *line,sector_t *sec) +sector_t *getNextSector(line_t * line, sector_t * sec) { - if (!(line->flags & ML_TWOSIDED)) - return NULL; + if (!(line->flags & ML_TWOSIDED)) + return NULL; - if (line->frontsector == sec) - return line->backsector; + if (line->frontsector == sec) + return line->backsector; - return line->frontsector; + return line->frontsector; } //================================================================== @@ -168,23 +185,23 @@ sector_t *getNextSector(line_t *line,sector_t *sec) // FIND LOWEST FLOOR HEIGHT IN SURROUNDING SECTORS // //================================================================== -fixed_t P_FindLowestFloorSurrounding(sector_t *sec) +fixed_t P_FindLowestFloorSurrounding(sector_t * sec) { - int i; - line_t *check; - sector_t *other; - fixed_t floor = sec->floorheight; - - for (i=0 ;i < sec->linecount ; i++) - { - check = sec->lines[i]; - other = getNextSector(check,sec); - if (!other) - continue; - if (other->floorheight < floor) - floor = other->floorheight; - } - return floor; + int i; + line_t *check; + sector_t *other; + fixed_t floor = sec->floorheight; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + if (!other) + continue; + if (other->floorheight < floor) + floor = other->floorheight; + } + return floor; } //================================================================== @@ -192,23 +209,23 @@ fixed_t P_FindLowestFloorSurrounding(sector_t *sec) // FIND HIGHEST FLOOR HEIGHT IN SURROUNDING SECTORS // //================================================================== -fixed_t P_FindHighestFloorSurrounding(sector_t *sec) +fixed_t P_FindHighestFloorSurrounding(sector_t * sec) { - int i; - line_t *check; - sector_t *other; - fixed_t floor = -500*FRACUNIT; - - for (i=0 ;i < sec->linecount ; i++) - { - check = sec->lines[i]; - other = getNextSector(check,sec); - if (!other) - continue; - if (other->floorheight > floor) - floor = other->floorheight; - } - return floor; + int i; + line_t *check; + sector_t *other; + fixed_t floor = -500 * FRACUNIT; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + if (!other) + continue; + if (other->floorheight > floor) + floor = other->floorheight; + } + return floor; } //================================================================== @@ -216,35 +233,35 @@ fixed_t P_FindHighestFloorSurrounding(sector_t *sec) // FIND NEXT HIGHEST FLOOR IN SURROUNDING SECTORS // //================================================================== -fixed_t P_FindNextHighestFloor(sector_t *sec,int currentheight) +fixed_t P_FindNextHighestFloor(sector_t * sec, int currentheight) { - int i; - int h; - int min; - line_t *check; - sector_t *other; - fixed_t height = currentheight; - fixed_t heightlist[20]; // 20 adjoining sectors max! - - for (i =0,h = 0 ;i < sec->linecount ; i++) - { - check = sec->lines[i]; - other = getNextSector(check,sec); - if (!other) - continue; - if (other->floorheight > height) - heightlist[h++] = other->floorheight; - } - - // - // Find lowest height in list - // - min = heightlist[0]; - for (i = 1;i < h;i++) - if (heightlist[i] < min) - min = heightlist[i]; - - return min; + int i; + int h; + int min; + line_t *check; + sector_t *other; + fixed_t height = currentheight; + fixed_t heightlist[20]; // 20 adjoining sectors max! + + for (i = 0, h = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + if (!other) + continue; + if (other->floorheight > height) + heightlist[h++] = other->floorheight; + } + + // + // Find lowest height in list + // + min = heightlist[0]; + for (i = 1; i < h; i++) + if (heightlist[i] < min) + min = heightlist[i]; + + return min; } //================================================================== @@ -252,23 +269,23 @@ fixed_t P_FindNextHighestFloor(sector_t *sec,int currentheight) // FIND LOWEST CEILING IN THE SURROUNDING SECTORS // //================================================================== -fixed_t P_FindLowestCeilingSurrounding(sector_t *sec) +fixed_t P_FindLowestCeilingSurrounding(sector_t * sec) { - int i; - line_t *check; - sector_t *other; - fixed_t height = MAXINT; - - for (i=0 ;i < sec->linecount ; i++) - { - check = sec->lines[i]; - other = getNextSector(check,sec); - if (!other) - continue; - if (other->ceilingheight < height) - height = other->ceilingheight; - } - return height; + int i; + line_t *check; + sector_t *other; + fixed_t height = MAXINT; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + if (!other) + continue; + if (other->ceilingheight < height) + height = other->ceilingheight; + } + return height; } //================================================================== @@ -276,23 +293,23 @@ fixed_t P_FindLowestCeilingSurrounding(sector_t *sec) // FIND HIGHEST CEILING IN THE SURROUNDING SECTORS // //================================================================== -fixed_t P_FindHighestCeilingSurrounding(sector_t *sec) +fixed_t P_FindHighestCeilingSurrounding(sector_t * sec) { - int i; - line_t *check; - sector_t *other; - fixed_t height = 0; - - for (i=0 ;i < sec->linecount ; i++) - { - check = sec->lines[i]; - other = getNextSector(check,sec); - if (!other) - continue; - if (other->ceilingheight > height) - height = other->ceilingheight; - } - return height; + int i; + line_t *check; + sector_t *other; + fixed_t height = 0; + + for (i = 0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check, sec); + if (!other) + continue; + if (other->ceilingheight > height) + height = other->ceilingheight; + } + return height; } //================================================================== @@ -321,16 +338,16 @@ int P_FindSectorFromLineTag(line_t *line,int start) int P_FindSectorFromTag(int tag, int start) { - int i; - - for(i = start+1; i < numsectors; i++) - { - if(sectors[i].tag == tag) - { - return i; - } - } - return -1; + int i; + + for (i = start + 1; i < numsectors; i++) + { + if (sectors[i].tag == tag) + { + return i; + } + } + return -1; } //================================================================== @@ -367,23 +384,23 @@ int P_FindMinSurroundingLight(sector_t *sector,int max) // //========================================================================= -boolean EV_SectorSoundChange(byte *args) +boolean EV_SectorSoundChange(byte * args) { - int secNum; - boolean rtn; - - if(!args[0]) - { - return false; - } - secNum = -1; - rtn = false; - while((secNum = P_FindSectorFromTag(args[0], secNum)) >= 0) - { - sectors[secNum].seqType = args[1]; - rtn = true; - } - return rtn; + int secNum; + boolean rtn; + + if (!args[0]) + { + return false; + } + secNum = -1; + rtn = false; + while ((secNum = P_FindSectorFromTag(args[0], secNum)) >= 0) + { + sectors[secNum].seqType = args[1]; + rtn = true; + } + return rtn; } //============================================================================ @@ -392,28 +409,27 @@ boolean EV_SectorSoundChange(byte *args) // //============================================================================ -static boolean CheckedLockedDoor(mobj_t *mo, byte lock) +static boolean CheckedLockedDoor(mobj_t * mo, byte lock) { - extern char *TextKeyMessages[11]; - char LockedBuffer[80]; - - if(!mo->player) - { - return false; - } - if(!lock) - { - return true; - } - if(!(mo->player->keys&(1<<(lock-1)))) - { - sprintf(LockedBuffer, "YOU NEED THE %s\n", - TextKeyMessages[lock-1]); - P_SetMessage(mo->player, LockedBuffer, true); - S_StartSound(mo, SFX_DOOR_LOCKED); - return false; - } - return true; + extern char *TextKeyMessages[11]; + char LockedBuffer[80]; + + if (!mo->player) + { + return false; + } + if (!lock) + { + return true; + } + if (!(mo->player->keys & (1 << (lock - 1)))) + { + sprintf(LockedBuffer, "YOU NEED THE %s\n", TextKeyMessages[lock - 1]); + P_SetMessage(mo->player, LockedBuffer, true); + S_StartSound(mo, SFX_DOOR_LOCKED); + return false; + } + return true; } @@ -423,46 +439,49 @@ static boolean CheckedLockedDoor(mobj_t *mo, byte lock) // //========================================================================== -boolean EV_LineSearchForPuzzleItem(line_t *line, byte *args, mobj_t *mo) +boolean EV_LineSearchForPuzzleItem(line_t * line, byte * args, mobj_t * mo) { - player_t *player; - int i; - artitype_t type,arti; - - if (!mo) return false; - player = mo->player; - if (!player) return false; - - // Search player's inventory for puzzle items - for (i=0; i<player->artifactCount; i++) - { - arti = player->inventory[i].type; - type = arti - arti_firstpuzzitem; - if (type < 0) continue; - if (type == line->arg1) - { - // A puzzle item was found for the line - if (P_UseArtifact(player, arti)) - { - // A puzzle item was found for the line - P_PlayerRemoveArtifact(player, i); - if(player == &players[consoleplayer]) - { - if(arti < arti_firstpuzzitem) - { - S_StartSound(NULL, SFX_ARTIFACT_USE); - } - else - { - S_StartSound(NULL, SFX_PUZZLE_SUCCESS); - } - ArtifactFlash = 4; - } - return true; - } - } - } - return false; + player_t *player; + int i; + artitype_t type, arti; + + if (!mo) + return false; + player = mo->player; + if (!player) + return false; + + // Search player's inventory for puzzle items + for (i = 0; i < player->artifactCount; i++) + { + arti = player->inventory[i].type; + type = arti - arti_firstpuzzitem; + if (type < 0) + continue; + if (type == line->arg1) + { + // A puzzle item was found for the line + if (P_UseArtifact(player, arti)) + { + // A puzzle item was found for the line + P_PlayerRemoveArtifact(player, i); + if (player == &players[consoleplayer]) + { + if (arti < arti_firstpuzzitem) + { + S_StartSound(NULL, SFX_ARTIFACT_USE); + } + else + { + S_StartSound(NULL, SFX_PUZZLE_SUCCESS); + } + ArtifactFlash = 4; + } + return true; + } + } + } + return false; } @@ -482,338 +501,337 @@ Events are operations triggered by using, crossing, or shooting special lines, o // //============================================================================ -boolean P_ExecuteLineSpecial(int special, byte *args, line_t *line, int side, - mobj_t *mo) +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; + 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; } //============================================================================ @@ -822,41 +840,42 @@ boolean P_ExecuteLineSpecial(int special, byte *args, line_t *line, int side, // //============================================================================ -boolean P_ActivateLine(line_t *line, mobj_t *mo, int side, int activationType) +boolean P_ActivateLine(line_t * line, mobj_t * mo, int side, + int activationType) { - int lineActivation; - boolean repeat; - boolean buttonSuccess; - - lineActivation = GET_SPAC(line->flags); - if(lineActivation != activationType) - { - return false; - } - if(!mo->player && !(mo->flags&MF_MISSILE)) - { - if(lineActivation != SPAC_MCROSS) - { // currently, monsters can only activate the MCROSS activation type - return false; - } - if(line->flags & ML_SECRET) - return false; // never open secret doors - } - repeat = line->flags&ML_REPEAT_SPECIAL; - buttonSuccess = false; - - buttonSuccess = P_ExecuteLineSpecial(line->special, &line->arg1, line, - side, mo); - if(!repeat && buttonSuccess) - { // clear the special on non-retriggerable lines - line->special = 0; - } - if((lineActivation == SPAC_USE || lineActivation == SPAC_IMPACT) - && buttonSuccess) - { - P_ChangeSwitchTexture(line, repeat); - } - return true; + int lineActivation; + boolean repeat; + boolean buttonSuccess; + + lineActivation = GET_SPAC(line->flags); + if (lineActivation != activationType) + { + return false; + } + if (!mo->player && !(mo->flags & MF_MISSILE)) + { + if (lineActivation != SPAC_MCROSS) + { // currently, monsters can only activate the MCROSS activation type + return false; + } + if (line->flags & ML_SECRET) + return false; // never open secret doors + } + repeat = line->flags & ML_REPEAT_SPECIAL; + buttonSuccess = false; + + buttonSuccess = P_ExecuteLineSpecial(line->special, &line->arg1, line, + side, mo); + if (!repeat && buttonSuccess) + { // clear the special on non-retriggerable lines + line->special = 0; + } + if ((lineActivation == SPAC_USE || lineActivation == SPAC_IMPACT) + && buttonSuccess) + { + P_ChangeSwitchTexture(line, repeat); + } + return true; } //---------------------------------------------------------------------------- @@ -867,72 +886,97 @@ boolean P_ActivateLine(line_t *line, mobj_t *mo, int side, int activationType) // //---------------------------------------------------------------------------- -void P_PlayerInSpecialSector(player_t *player) +void P_PlayerInSpecialSector(player_t * player) { - sector_t *sector; - static int pushTab[3] = - { - 2048*5, - 2048*10, - 2048*25 - }; - - sector = player->mo->subsector->sector; - if(player->mo->z != sector->floorheight) - { // Player is not touching the floor - return; - } - switch(sector->special) - { - case 9: // SecretArea - player->secretcount++; - sector->special = 0; - break; - - case 201: case 202: case 203: // Scroll_North_xxx - P_Thrust(player, ANG90, pushTab[sector->special-201]); - break; - case 204: case 205: case 206: // Scroll_East_xxx - P_Thrust(player, 0, pushTab[sector->special-204]); - break; - case 207: case 208: case 209: // Scroll_South_xxx - P_Thrust(player, ANG270, pushTab[sector->special-207]); - break; - case 210: case 211: case 212: // Scroll_West_xxx - P_Thrust(player, ANG180, pushTab[sector->special-210]); - break; - case 213: case 214: case 215: // Scroll_NorthWest_xxx - P_Thrust(player, ANG90+ANG45, pushTab[sector->special-213]); - break; - case 216: case 217: case 218: // Scroll_NorthEast_xxx - P_Thrust(player, ANG45, pushTab[sector->special-216]); - break; - case 219: case 220: case 221: // Scroll_SouthEast_xxx - P_Thrust(player, ANG270+ANG45, pushTab[sector->special-219]); - break; - case 222: case 223: case 224: // Scroll_SouthWest_xxx - P_Thrust(player, ANG180+ANG45, pushTab[sector->special-222]); - break; - - case 40: case 41: case 42: case 43: case 44: case 45: - case 46: case 47: case 48: case 49: case 50: case 51: - // Wind specials are handled in (P_mobj):P_XYMovement - break; - - case 26: // Stairs_Special1 - case 27: // Stairs_Special2 - // Used in (P_floor):ProcessStairSector - break; - - case 198: // Lightning Special - case 199: // Lightning Flash special - case 200: // Sky2 - // Used in (R_plane):R_Drawplanes - break; - default: - I_Error("P_PlayerInSpecialSector: " - "unknown special %i", sector->special); - } + sector_t *sector; + static int pushTab[3] = { + 2048 * 5, + 2048 * 10, + 2048 * 25 + }; + + sector = player->mo->subsector->sector; + if (player->mo->z != sector->floorheight) + { // Player is not touching the floor + return; + } + switch (sector->special) + { + case 9: // SecretArea + player->secretcount++; + sector->special = 0; + break; + + case 201: + case 202: + case 203: // Scroll_North_xxx + P_Thrust(player, ANG90, pushTab[sector->special - 201]); + break; + case 204: + case 205: + case 206: // Scroll_East_xxx + P_Thrust(player, 0, pushTab[sector->special - 204]); + break; + case 207: + case 208: + case 209: // Scroll_South_xxx + P_Thrust(player, ANG270, pushTab[sector->special - 207]); + break; + case 210: + case 211: + case 212: // Scroll_West_xxx + P_Thrust(player, ANG180, pushTab[sector->special - 210]); + break; + case 213: + case 214: + case 215: // Scroll_NorthWest_xxx + P_Thrust(player, ANG90 + ANG45, pushTab[sector->special - 213]); + break; + case 216: + case 217: + case 218: // Scroll_NorthEast_xxx + P_Thrust(player, ANG45, pushTab[sector->special - 216]); + break; + case 219: + case 220: + case 221: // Scroll_SouthEast_xxx + P_Thrust(player, ANG270 + ANG45, pushTab[sector->special - 219]); + break; + case 222: + case 223: + case 224: // Scroll_SouthWest_xxx + P_Thrust(player, ANG180 + ANG45, pushTab[sector->special - 222]); + break; + + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + case 47: + case 48: + case 49: + case 50: + case 51: + // Wind specials are handled in (P_mobj):P_XYMovement + break; + + case 26: // Stairs_Special1 + case 27: // Stairs_Special2 + // Used in (P_floor):ProcessStairSector + break; + + case 198: // Lightning Special + case 199: // Lightning Flash special + case 200: // Sky2 + // Used in (R_plane):R_Drawplanes + break; + default: + I_Error("P_PlayerInSpecialSector: " + "unknown special %i", sector->special); + } } //============================================================================ @@ -941,24 +985,24 @@ void P_PlayerInSpecialSector(player_t *player) // //============================================================================ -void P_PlayerOnSpecialFlat(player_t *player, int floorType) +void P_PlayerOnSpecialFlat(player_t * player, int floorType) { - if(player->mo->z != player->mo->floorz) - { // Player is not touching the floor - return; - } - switch(floorType) - { - case FLOOR_LAVA: - if(!(leveltime&31)) - { - P_DamageMobj(player->mo, &LavaInflictor, NULL, 10); - S_StartSound(player->mo, SFX_LAVA_SIZZLE); - } - break; - default: - break; - } + if (player->mo->z != player->mo->floorz) + { // Player is not touching the floor + return; + } + switch (floorType) + { + case FLOOR_LAVA: + if (!(leveltime & 31)) + { + P_DamageMobj(player->mo, &LavaInflictor, NULL, 10); + S_StartSound(player->mo, SFX_LAVA_SIZZLE); + } + break; + default: + break; + } } //---------------------------------------------------------------------------- @@ -969,36 +1013,36 @@ void P_PlayerOnSpecialFlat(player_t *player, int floorType) void P_UpdateSpecials(void) { - int i; - - // Handle buttons - for(i = 0; i < MAXBUTTONS; i++) - { - if(buttonlist[i].btimer) - { - buttonlist[i].btimer--; - if(!buttonlist[i].btimer) - { - switch(buttonlist[i].where) - { - case SWTCH_TOP: - sides[buttonlist[i].line->sidenum[0]].toptexture = - buttonlist[i].btexture; - break; - case SWTCH_MIDDLE: - sides[buttonlist[i].line->sidenum[0]].midtexture = - buttonlist[i].btexture; - break; - case SWTCH_BOTTOM: - sides[buttonlist[i].line->sidenum[0]].bottomtexture = - buttonlist[i].btexture; - break; - } - //S_StartSound((mobj_t *)&buttonlist[i].soundorg, sfx_switch); - memset(&buttonlist[i], 0, sizeof(button_t)); - } - } - } + int i; + + // Handle buttons + for (i = 0; i < MAXBUTTONS; i++) + { + if (buttonlist[i].btimer) + { + buttonlist[i].btimer--; + if (!buttonlist[i].btimer) + { + switch (buttonlist[i].where) + { + case SWTCH_TOP: + sides[buttonlist[i].line->sidenum[0]].toptexture = + buttonlist[i].btexture; + break; + case SWTCH_MIDDLE: + sides[buttonlist[i].line->sidenum[0]].midtexture = + buttonlist[i].btexture; + break; + case SWTCH_BOTTOM: + sides[buttonlist[i].line->sidenum[0]].bottomtexture = + buttonlist[i].btexture; + break; + } + //S_StartSound((mobj_t *)&buttonlist[i].soundorg, sfx_switch); + memset(&buttonlist[i], 0, sizeof(button_t)); + } + } + } } /* @@ -1018,115 +1062,114 @@ void P_UpdateSpecials(void) =============================================================================== */ -short numlinespecials; -line_t *linespeciallist[MAXLINEANIMS]; +short numlinespecials; +line_t *linespeciallist[MAXLINEANIMS]; -void P_SpawnSpecials (void) +void P_SpawnSpecials(void) { - sector_t *sector; - int i; - - // - // Init special SECTORs - // - sector = sectors; - for (i=0 ; i<numsectors ; i++, sector++) - { - if (!sector->special) - continue; - switch (sector->special) - { - case 1: // Phased light - // Hardcoded base, use sector->lightlevel as the index - P_SpawnPhasedLight(sector, 80, -1); - break; - case 2: // Phased light sequence start - P_SpawnLightSequence(sector, 1); - break; - // Specials 3 & 4 are used by the phased light sequences - - /* - case 1: // FLICKERING LIGHTS - P_SpawnLightFlash (sector); - break; - case 2: // STROBE FAST - P_SpawnStrobeFlash(sector,FASTDARK,0); - break; - case 3: // STROBE SLOW - P_SpawnStrobeFlash(sector,SLOWDARK,0); - break; - case 4: // STROBE FAST/DEATH SLIME - P_SpawnStrobeFlash(sector,FASTDARK,0); - sector->special = 4; - break; - case 8: // GLOWING LIGHT - P_SpawnGlowingLight(sector); - break; - case 9: // SECRET SECTOR - totalsecret++; - break; - case 10: // DOOR CLOSE IN 30 SECONDS - P_SpawnDoorCloseIn30 (sector); - break; - case 12: // SYNC STROBE SLOW - P_SpawnStrobeFlash (sector, SLOWDARK, 1); - break; - case 13: // SYNC STROBE FAST - P_SpawnStrobeFlash (sector, FASTDARK, 1); - break; - case 14: // DOOR RAISE IN 5 MINUTES - P_SpawnDoorRaiseIn5Mins (sector, i); - break; - */ - } - } - - - // - // Init line EFFECTs - // - numlinespecials = 0; - TaggedLineCount = 0; - for(i = 0; i < numlines; i++) - { - switch(lines[i].special) - { - case 100: // Scroll_Texture_Left - case 101: // Scroll_Texture_Right - case 102: // Scroll_Texture_Up - case 103: // Scroll_Texture_Down - linespeciallist[numlinespecials] = &lines[i]; - numlinespecials++; - break; - case 121: // Line_SetIdentification - if(lines[i].arg1) - { - if(TaggedLineCount == MAX_TAGGED_LINES) - { - I_Error("P_SpawnSpecials: MAX_TAGGED_LINES " - "(%d) exceeded.", MAX_TAGGED_LINES); - } - TaggedLines[TaggedLineCount].line = &lines[i]; - TaggedLines[TaggedLineCount++].lineTag - = lines[i].arg1; - } - lines[i].special = 0; - break; - } - } - - // - // Init other misc stuff - // - for (i = 0;i < MAXCEILINGS;i++) - activeceilings[i] = NULL; - for (i = 0;i < MAXPLATS;i++) - activeplats[i] = NULL; - for (i = 0;i < MAXBUTTONS;i++) - memset(&buttonlist[i],0,sizeof(button_t)); - - // Initialize flat and texture animations - P_InitFTAnims(); + sector_t *sector; + int i; + + // + // Init special SECTORs + // + sector = sectors; + for (i = 0; i < numsectors; i++, sector++) + { + if (!sector->special) + continue; + switch (sector->special) + { + case 1: // Phased light + // Hardcoded base, use sector->lightlevel as the index + P_SpawnPhasedLight(sector, 80, -1); + break; + case 2: // Phased light sequence start + P_SpawnLightSequence(sector, 1); + break; + // Specials 3 & 4 are used by the phased light sequences + + /* + case 1: // FLICKERING LIGHTS + P_SpawnLightFlash (sector); + break; + case 2: // STROBE FAST + P_SpawnStrobeFlash(sector,FASTDARK,0); + break; + case 3: // STROBE SLOW + P_SpawnStrobeFlash(sector,SLOWDARK,0); + break; + case 4: // STROBE FAST/DEATH SLIME + P_SpawnStrobeFlash(sector,FASTDARK,0); + sector->special = 4; + break; + case 8: // GLOWING LIGHT + P_SpawnGlowingLight(sector); + break; + case 9: // SECRET SECTOR + totalsecret++; + break; + case 10: // DOOR CLOSE IN 30 SECONDS + P_SpawnDoorCloseIn30 (sector); + break; + case 12: // SYNC STROBE SLOW + P_SpawnStrobeFlash (sector, SLOWDARK, 1); + break; + case 13: // SYNC STROBE FAST + P_SpawnStrobeFlash (sector, FASTDARK, 1); + break; + case 14: // DOOR RAISE IN 5 MINUTES + P_SpawnDoorRaiseIn5Mins (sector, i); + break; + */ + } + } + + + // + // Init line EFFECTs + // + numlinespecials = 0; + TaggedLineCount = 0; + for (i = 0; i < numlines; i++) + { + switch (lines[i].special) + { + case 100: // Scroll_Texture_Left + case 101: // Scroll_Texture_Right + case 102: // Scroll_Texture_Up + case 103: // Scroll_Texture_Down + linespeciallist[numlinespecials] = &lines[i]; + numlinespecials++; + break; + case 121: // Line_SetIdentification + if (lines[i].arg1) + { + if (TaggedLineCount == MAX_TAGGED_LINES) + { + I_Error("P_SpawnSpecials: MAX_TAGGED_LINES " + "(%d) exceeded.", MAX_TAGGED_LINES); + } + TaggedLines[TaggedLineCount].line = &lines[i]; + TaggedLines[TaggedLineCount++].lineTag = lines[i].arg1; + } + lines[i].special = 0; + break; + } + } + + // + // Init other misc stuff + // + for (i = 0; i < MAXCEILINGS; i++) + activeceilings[i] = NULL; + for (i = 0; i < MAXPLATS; i++) + activeplats[i] = NULL; + for (i = 0; i < MAXBUTTONS; i++) + memset(&buttonlist[i], 0, sizeof(button_t)); + + // Initialize flat and texture animations + P_InitFTAnims(); } //========================================================================== @@ -1137,16 +1180,16 @@ void P_SpawnSpecials (void) line_t *P_FindLine(int lineTag, int *searchPosition) { - int i; - - for(i = *searchPosition+1; i < TaggedLineCount; i++) - { - if(TaggedLines[i].lineTag == lineTag) - { - *searchPosition = i; - return TaggedLines[i].line; - } - } - *searchPosition = -1; - return NULL; + int i; + + for (i = *searchPosition + 1; i < TaggedLineCount; i++) + { + if (TaggedLines[i].lineTag == lineTag) + { + *searchPosition = i; + return TaggedLines[i].line; + } + } + *searchPosition = -1; + return NULL; } |