📄 p_switch.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: p_switch.c,v 1.10 2001/04/18 21:00:22 metzgermeister Exp $//// Copyright (C) 1993-1996 by id Software, Inc.// Portions Copyright (C) 1998-2000 by DooM Legacy Team.//// 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.////// $Log: p_switch.c,v $// Revision 1.10 2001/04/18 21:00:22 metzgermeister// fix crash bug//// Revision 1.9 2001/02/24 13:35:21 bpereira// no message//// Revision 1.8 2001/01/25 22:15:44 bpereira// added heretic support//// Revision 1.7 2000/11/02 17:50:09 stroggonmeth// Big 3Dfloors & FraggleScript commit!!//// Revision 1.6 2000/09/28 20:57:17 bpereira// no message//// Revision 1.5 2000/04/16 18:38:07 bpereira// no message//// Revision 1.4 2000/04/06 20:40:22 hurdler// Mostly remove warnings under windows//// Revision 1.3 2000/04/04 00:32:47 stroggonmeth// Initial Boom compatability plus few misc changes all around.//// Revision 1.2 2000/02/27 00:42:10 hurdler// fix CR+LF problem//// Revision 1.1.1.1 2000/02/22 20:32:32 hurdler// Initial import into CVS (v1.29 pr3)////// DESCRIPTION:// Switches, buttons. Two-state animation. Exits.////-----------------------------------------------------------------------------#include "doomdef.h"#include "g_game.h"#include "p_local.h"#include "s_sound.h"#include "r_main.h"#include "w_wad.h" //SoM: 3/22/2000#include "z_zone.h"#include "t_script.h"//// CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE//switchlist_t oldalphSwitchList[] ={ // 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}, // heretic {"SW1OFF", "SW1ON", 4}, {"SW2OFF", "SW2ON", 4}, {"\0", "\0", 0}};//SoM: 3/22/2000: Switch limit removal//int switchlist[MAXSWITCHES * 2];static int *switchlist=NULL;static int max_numswitches;static int numswitches;button_t buttonlist[MAXBUTTONS];//// P_InitSwitchList// - this is now called at P_SetupLevel () time.////SoM: 3/22/2000: Use boom code.void P_InitSwitchList(void){ int i, index = 0; int episode; switchlist_t *alphSwitchList; switch (gamemode){ case registered : case retail: episode = 2; break; case commercial : episode = 3; break; case heretic : episode = 4; break; default: episode = 1; } //SoM: 3/22/2000: No Switches lump? Use old table! if(W_CheckNumForName("SWITCHES") != -1) { alphSwitchList = (switchlist_t *)W_CacheLumpName("SWITCHES",PU_STATIC); // endian conversion only when loading from extra lump for (i=0;alphSwitchList[i].episode!=0;i++) alphSwitchList[i].episode = SHORT(alphSwitchList[i].episode); } else alphSwitchList = oldalphSwitchList; // initialization for artificial levels without switches (yes, they exist!) if(NULL == switchlist) switchlist = malloc(sizeof(*switchlist)); for (i=0;alphSwitchList[i].episode!=0;i++) { if (index+1 >= max_numswitches) switchlist = realloc(switchlist, sizeof *switchlist * (max_numswitches = max_numswitches ? max_numswitches*2 : 8)); if (alphSwitchList[i].episode <= episode && (gamemode != heretic || alphSwitchList[i].episode == 4)) { switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name1); switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name2); } } numswitches = index/2; switchlist[index] = -1; //SoM: 3/22/2000: Don't change tag if not from lump if(alphSwitchList != oldalphSwitchList) Z_ChangeTag(alphSwitchList,PU_CACHE);}//// 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) { return false; } //SoM: 3/18/2000: Add check for Generalized linedefs. if (boomsupport) { // pointer to line function is NULL by default, set non-null if // line special is push or switch generalized linedef type int (*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)) //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)) //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)) //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)) //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)) //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)) //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)) //all non-manual return false; //generalized types require tag linefunc = EV_DoGenCrusher; } if (linefunc)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -