⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_switch.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 3 页
字号:
// 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 + -