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

📄 p_doors.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*-//-----------------------------------------------------------------------------//// $Id: p_doors.c,v 1.10 2001/04/04 20:24:21 judgecutor 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_doors.c,v $// Revision 1.10  2001/04/04 20:24:21  judgecutor// Added support for the 3D Sound//// Revision 1.9  2001/02/24 13:35:20  bpereira// no message//// Revision 1.8  2001/01/25 22:15:43  bpereira// added heretic support//// Revision 1.7  2000/11/02 17:50:07  stroggonmeth// Big 3Dfloors & FraggleScript commit!!//// Revision 1.6  2000/09/28 20:57:16  bpereira// no message//// Revision 1.5  2000/04/16 18:38:07  bpereira// no message//// Revision 1.4  2000/04/11 19:07:24  stroggonmeth// Finished my logs, fixed a crashing bug.//// Revision 1.3  2000/04/04 00:32:46  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: //      Door animation code (opening/closing)////-----------------------------------------------------------------------------#include "doomdef.h"#include "doomstat.h"#include "dstrings.h"#include "p_local.h"#include "r_state.h"#include "s_sound.h"#include "z_zone.h"#ifdef HW3SOUND#include "hardware/hw3sound.h"#endif#if 0//// Sliding door frame information//slidename_t     slideFrameNames[MAXSLIDEDOORS] ={    {"GDOORF1","GDOORF2","GDOORF3","GDOORF4",   // front     "GDOORB1","GDOORB2","GDOORB3","GDOORB4"},  // back    {"\0","\0","\0","\0"}};#endif// =========================================================================//                            VERTICAL DOORS// =========================================================================int doorclosesound = sfx_dorcls;//// T_VerticalDoor//void T_VerticalDoor (vldoor_t* door){    result_e    res;    switch(door->direction)    {      case 0:        // WAITING        if (!--door->topcountdown)        {            switch(door->type)            {              case blazeRaise:              case genBlazeRaise: //SoM: 3/6/2000                door->direction = -1; // time to go back down                S_StartSound((mobj_t *)&door->sector->soundorg,                             sfx_bdcls);                break;              case normalDoor:              case genRaise:   //SoM: 3/6/2000                door->direction = -1; // time to go back down                S_StartSound((mobj_t *)&door->sector->soundorg,                             doorclosesound);                break;              case close30ThenOpen:              case genCdO:      //SoM: 3/6/2000                door->direction = 1;                S_StartSound((mobj_t *)&door->sector->soundorg,                             sfx_doropn);                break;              //SoM: 3/6/2000              case genBlazeCdO:                door->direction = 1;  // time to go back up                S_StartSound((mobj_t *)&door->sector->soundorg,sfx_bdopn);                break;              default:                break;            }        }        break;      case 2:        //  INITIAL WAIT        if (!--door->topcountdown)        {            switch(door->type)            {              case raiseIn5Mins:                door->direction = 1;                door->type = normalDoor;                S_StartSound((mobj_t *)&door->sector->soundorg,                             sfx_doropn);                break;              default:                break;            }        }        break;      case -1:        // DOWN        res = T_MovePlane(door->sector,                          door->speed,                          door->sector->floorheight,                          false,1,door->direction);        if (res == pastdest)        {            switch(door->type)            {              case blazeRaise:              case blazeClose:              case genBlazeRaise:              case genBlazeClose:                door->sector->ceilingdata = NULL;  // SoM: 3/6/2000                P_RemoveThinker (&door->thinker);  // unlink and free                if(boomsupport) //SoM: Removes the double closing sound of doors.                  S_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls);                break;              case normalDoor:              case doorclose:              case genRaise:              case genClose:                door->sector->ceilingdata = NULL; //SoM: 3/6/2000                P_RemoveThinker (&door->thinker);  // unlink and free                if( gamemode == heretic )                    S_StartSound ((mobj_t *)& door->sector->soundorg, sfx_dorcls);                break;              case close30ThenOpen:                door->direction = 0;                door->topcountdown = 35*30;                break;              //SoM: 3/6/2000: General door stuff              case genCdO:              case genBlazeCdO:                door->direction = 0;                door->topcountdown = door->topwait;                 break;              default:                break;            }            //SoM: 3/6/2000: Code to turn lighting off in tagged sectors.            if (boomsupport && door->line && door->line->tag)            {              if (door->line->special > GenLockedBase &&                  (door->line->special&6)==6)                EV_TurnTagLightsOff(door->line);              else                switch (door->line->special)                {                  case 1: case 31:                  case 26:                  case 27: case 28:                  case 32: case 33:                  case 34: case 117:                  case 118:                    EV_TurnTagLightsOff(door->line);                  default:                  break;                }            }        }        else if (res == crushed)        {            switch(door->type)            {              case genClose: //SoM: 3/6/2000              case genBlazeClose: //SoM: 3/6/2000              case blazeClose:              case doorclose:           // DO NOT GO BACK UP!                break;              default:                door->direction = 1;                S_StartSound((mobj_t *)&door->sector->soundorg,                             sfx_doropn);                break;            }        }        break;      case 1:        // UP        res = T_MovePlane(door->sector,                          door->speed,                          door->topheight,                          false,1,door->direction);        if (res == pastdest)        {            switch(door->type)            {              case blazeRaise:              case normalDoor:              case genRaise:     //SoM: 3/6/2000              case genBlazeRaise://SoM: 3/6/2000                door->direction = 0; // wait at top                door->topcountdown = door->topwait;                break;              case close30ThenOpen:              case blazeOpen:              case dooropen:              case genBlazeOpen:              case genOpen:              case genCdO:              case genBlazeCdO:                door->sector->ceilingdata = NULL;                P_RemoveThinker (&door->thinker);  // unlink and free                if( gamemode == heretic )                    S_StopSound ((mobj_t *)&door->sector->soundorg);                break;              default:                break;            }            //SoM: 3/6/2000: turn lighting on in tagged sectors of manual doors            if (boomsupport && door->line && door->line->tag)            {              if (door->line->special > GenLockedBase &&                  (door->line->special&6)==6)     //jff 3/9/98 all manual doors                EV_LightTurnOn(door->line,0);              else                switch (door->line->special)                {                  case 1: case 31:                  case 26:                  case 27: case 28:                  case 32: case 33:                  case 34: case 117:                  case 118:                    EV_LightTurnOn(door->line,0);                  default:                    break;                }            }        }        break;    }}//// EV_DoLockedDoor// Move a locked door up/down//// SoM: Removed the player checks at every different color door (checking to make sure 'p' is // not NULL) because you only need to do that once.intEV_DoLockedDoor( line_t*       line,  vldoor_e      type,  mobj_t*       thing, fixed_t speed ){    player_t*   p;    p = thing->player;    if (!p)        return 0;    switch(line->special)    {      case 99:  // Blue Lock      case 133:        if (!(p->cards & it_bluecard) && !(p->cards & it_blueskull))        {            p->message = PD_BLUEO;#ifdef HW3SOUND            S_StartScreamSound(p->mo, sfx_oof);#else            S_StartSound(p->mo,sfx_oof);  //SoM: 3/6/200: killough's idea#endif            return 0;        }        break;      case 134: // Red Lock      case 135:        if (!(p->cards & it_redcard) && !(p->cards & it_redskull))        {            p->message = PD_REDO;#ifdef HW3SOUND            S_StartScreamSound(p->mo, sfx_oof);#else            S_StartSound(p->mo,sfx_oof);  //SoM: 3/6/200: killough's idea#endif            return 0;        }        break;      case 136: // Yellow Lock      case 137:        if (!(p->cards & it_yellowcard) &&            !(p->cards & it_yellowskull))        {            p->message = PD_YELLOWO;#ifdef HW3SOUND            S_StartScreamSound(p->mo, sfx_oof);#else            S_StartSound(p->mo,sfx_oof);   //SoM: 3/6/200: killough's idea#endif            return 0;        }        break;    }    return EV_DoDoor(line,type,speed);}int EV_DoDoor ( line_t* line, vldoor_e type, fixed_t speed){    int         secnum,rtn;    sector_t*   sec;    vldoor_t*   door;    secnum = -1;    rtn = 0;    while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)    {        sec = &sectors[secnum];        if (P_SectorActive(ceiling_special,sec)) //SoM: 3/6/2000            continue;        // new door thinker        rtn = 1;        door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0);        P_AddThinker (&door->thinker);        sec->ceilingdata = door;  //SoM: 3/6/2000        door->thinker.function.acp1 = (actionf_p1) T_VerticalDoor;        door->sector = sec;        door->type = type;        door->topwait = VDOORWAIT;        door->speed = speed;        door->line = line; //SoM: 3/6/2000: Remember the line that triggered the door.        switch(type)        {          case blazeClose:            door->topheight = P_FindLowestCeilingSurrounding(sec);            door->topheight -= 4*FRACUNIT;            door->direction = -1;            S_StartSound((mobj_t *)&door->sector->soundorg,sfx_bdcls);            break;          case doorclose:            door->topheight = P_FindLowestCeilingSurrounding(sec);            door->topheight -= 4*FRACUNIT;            door->direction = -1;            S_StartSound((mobj_t *)&door->sector->soundorg,doorclosesound);            break;          case close30ThenOpen:            door->topheight = sec->ceilingheight;            door->direction = -1;            S_StartSound((mobj_t *)&door->sector->soundorg,doorclosesound);            break;          case blazeRaise:          case blazeOpen:            door->direction = 1;            door->topheight = P_FindLowestCeilingSurrounding(sec);            door->topheight -= 4*FRACUNIT;            if (door->topheight != sec->ceilingheight)                S_StartSound((mobj_t *)&door->sector->soundorg,sfx_bdopn);            break;          case normalDoor:          case dooropen:            door->direction = 1;            door->topheight = P_FindLowestCeilingSurrounding(sec);            door->topheight -= 4*FRACUNIT;            if (door->topheight != sec->ceilingheight)                S_StartSound((mobj_t *)&door->sector->soundorg,sfx_doropn);            break;          default:            break;        }    }    return rtn;}//// EV_OpenDoor// Generic function to open a door (used by FraggleScript)void EV_OpenDoor(int sectag, int speed, int wait_time){  vldoor_e door_type;  int secnum = -1;  vldoor_t *door;  if(speed < 1) speed = 1;    // find out door type first  if(wait_time)               // door closes afterward    {      if(speed >= 4)              // blazing ?        door_type = blazeRaise;      else        door_type = normalDoor;    }  else    {      if(speed >= 4)              // blazing ?        door_type = blazeOpen;      else        door_type = dooropen;    }  // open door in all the sectors with the specified tag  while ((secnum = P_FindSectorFromTag(sectag, secnum)) >= 0)    {      sector_t *sec = &sectors[secnum];      // if the ceiling already moving, don't start the door action      if (P_SectorActive(ceiling_special,sec))        continue;      // new door thinker      door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0);      P_AddThinker(&door->thinker);      sec->ceilingdata = door;      door->thinker.function.acp1 = (actionf_p1)T_VerticalDoor;      door->sector = sec;      door->type = door_type;      door->topwait = wait_time;      door->speed = VDOORSPEED * speed;      door->line = NULL;   // not triggered by a line

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -