home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ST-Computer Leser-CD 2000 January
/
LCD_01_2000.iso
/
games
/
doom
/
pmdoom
/
src
/
p_switch.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-17
|
15KB
|
655 lines
/* Emacs style mode select -*- C++ -*- */
/* ----------------------------------------------------------------------------- */
/* */
/* $Id:$ */
/* */
/* Copyright (C) 1993-1996 by id Software, Inc. */
/* */
/* This source is available for distribution and/or modification */
/* only under the terms of the DOOM Source Code License as */
/* published by id Software. All rights reserved. */
/* */
/* The source is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License */
/* for more details. */
/* */
/* */
/* $Log:$ */
/* */
/* DESCRIPTION: */
/* Switches, buttons. Two-state animation. Exits. */
/* */
/* ----------------------------------------------------------------------------- */
static const char
rcsid[] = "$Id: p_switch.c,v 1.3 1997/01/28 22:08:29 b1 Exp $";
#include "i_system.h"
#include "doomdef.h"
#include "p_local.h"
#include "g_game.h"
#include "s_sound.h"
/* Data. */
#include "sounds.h"
/* State. */
#include "doomstat.h"
#include "r_state.h"
/* */
/* CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE */
/* */
switchlist_t alphSwitchList[] =
{
/* Doom shareware episode 1 switches */
{"SW1BRCOM", "SW2BRCOM", 1},
{"SW1BRN1", "SW2BRN1", 1},
{"SW1BRN2", "SW2BRN2", 1},
{"SW1BRNGN", "SW2BRNGN", 1},
{"SW1BROWN", "SW2BROWN", 1},
{"SW1COMM", "SW2COMM", 1},
{"SW1COMP", "SW2COMP", 1},
{"SW1DIRT", "SW2DIRT", 1},
{"SW1EXIT", "SW2EXIT", 1},
{"SW1GRAY", "SW2GRAY", 1},
{"SW1GRAY1", "SW2GRAY1", 1},
{"SW1METAL", "SW2METAL", 1},
{"SW1PIPE", "SW2PIPE", 1},
{"SW1SLAD", "SW2SLAD", 1},
{"SW1STARG", "SW2STARG", 1},
{"SW1STON1", "SW2STON1", 1},
{"SW1STON2", "SW2STON2", 1},
{"SW1STONE", "SW2STONE", 1},
{"SW1STRTN", "SW2STRTN", 1},
/* Doom registered episodes 2&3 switches */
{"SW1BLUE", "SW2BLUE", 2},
{"SW1CMT", "SW2CMT", 2},
{"SW1GARG", "SW2GARG", 2},
{"SW1GSTON", "SW2GSTON", 2},
{"SW1HOT", "SW2HOT", 2},
{"SW1LION", "SW2LION", 2},
{"SW1SATYR", "SW2SATYR", 2},
{"SW1SKIN", "SW2SKIN", 2},
{"SW1VINE", "SW2VINE", 2},
{"SW1WOOD", "SW2WOOD", 2},
/* Doom II switches */
{"SW1PANEL", "SW2PANEL", 3},
{"SW1ROCK", "SW2ROCK", 3},
{"SW1MET2", "SW2MET2", 3},
{"SW1WDMET", "SW2WDMET", 3},
{"SW1BRIK", "SW2BRIK", 3},
{"SW1MOD1", "SW2MOD1", 3},
{"SW1ZIM", "SW2ZIM", 3},
{"SW1STON6", "SW2STON6", 3},
{"SW1TEK", "SW2TEK", 3},
{"SW1MARB", "SW2MARB", 3},
{"SW1SKULL", "SW2SKULL", 3},
{"\0", "\0", 0}
};
int switchlist[MAXSWITCHES * 2];
int numswitches;
button_t buttonlist[MAXBUTTONS];
/* */
/* P_InitSwitchList */
/* Only called at game initialization. */
/* */
void P_InitSwitchList(void)
{
int i;
int index;
int episode;
episode = 1;
if ( (gamemode == registered) || (gamemode==retail) )
episode = 2;
else
if ( gamemode == commercial )
episode = 3;
for (index = 0,i = 0;i < MAXSWITCHES;i++)
{
if (!alphSwitchList[i].episode)
{
numswitches = index/2;
switchlist[index] = -1;
break;
}
if (alphSwitchList[i].episode <= episode)
{
#if 0 /* UNUSED - debug? */
int value;
if (R_CheckTextureNumForName(alphSwitchList[i].name1) < 0)
{
I_Error("Can't find switch texture '%s'!",
alphSwitchList[i].name1);
continue;
}
value = R_TextureNumForName(alphSwitchList[i].name1);
#endif
switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name1);
switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name2);
}
}
}
/* */
/* Start a button counting down till it turns off. */
/* */
void
P_StartButton
( line_t* line,
bwhere_e w,
int texture,
int time )
{
int i;
/* See if button is already pressed */
for (i = 0;i < MAXBUTTONS;i++)
{
if (buttonlist[i].btimer
&& buttonlist[i].line == line)
{
return;
}
}
for (i = 0;i < MAXBUTTONS;i++)
{
if (!buttonlist[i].btimer)
{
buttonlist[i].line = line;
buttonlist[i].where = w;
buttonlist[i].btexture = texture;
buttonlist[i].btimer = time;
buttonlist[i].soundorg = (mobj_t *)&line->frontsector->soundorg;
return;
}
}
I_Error("P_StartButton: no button slots left!");
}
/* */
/* Function that changes wall texture. */
/* Tell it if switch is ok to use again (1=yes, it's a button). */
/* */
void
P_ChangeSwitchTexture
( line_t* line,
int useAgain )
{
int texTop;
int texMid;
int texBot;
int i;
int sound;
if (!useAgain)
line->special = 0;
texTop = sides[line->sidenum[0]].toptexture;
texMid = sides[line->sidenum[0]].midtexture;
texBot = sides[line->sidenum[0]].bottomtexture;
sound = sfx_swtchn;
/* EXIT SWITCH? */
if (line->special == 11)
sound = sfx_swtchx;
for (i = 0;i < numswitches*2;i++)
{
if (switchlist[i] == texTop)
{
S_StartSound(buttonlist->soundorg,sound);
sides[line->sidenum[0]].toptexture = switchlist[i^1];
if (useAgain)
P_StartButton(line,top,switchlist[i],BUTTONTIME);
return;
}
else
{
if (switchlist[i] == texMid)
{
S_StartSound(buttonlist->soundorg,sound);
sides[line->sidenum[0]].midtexture = switchlist[i^1];
if (useAgain)
P_StartButton(line, middle,switchlist[i],BUTTONTIME);
return;
}
else
{
if (switchlist[i] == texBot)
{
S_StartSound(buttonlist->soundorg,sound);
sides[line->sidenum[0]].bottomtexture = switchlist[i^1];
if (useAgain)
P_StartButton(line, bottom,switchlist[i],BUTTONTIME);
return;
}
}
}
}
}
/* */
/* 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 )
{
/* Err... */
/* Use the back sides of VERY SPECIAL lines... */
if (side)
{
switch(line->special)
{
case 124:
/* Sliding door open&close */
/* UNUSED? */
break;
default:
return false;
break;
}
}
/* 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 */
break;
default:
return false;
break;
}
}
/* do something */
switch (line->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 */
EV_VerticalDoor (line, thing);
break;
/* UNUSED - Door Slide Open&Close */
/* case 124: */
/* EV_SlidingDoor (line, thing); */
/* break; */
/* SWITCHES */
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;
/* BUTTONS */
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;
}