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

📄 p_spec.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 5 页
字号:
              // Lower elevator next floor              if (EV_DoElevator(line,elevateDown))                line->special = 0;              break;            case 235:              // Elevator to current floor              if (EV_DoElevator(line,elevateCurrent))                line->special = 0;              break;            case 243:               // W1 silent teleporter (linedef-linedef kind)              if (EV_SilentLineTeleport(line, side, thing, false))                line->special = 0;              break;            case 262:               if (EV_SilentLineTeleport(line, side, thing, true))                line->special = 0;              break;             case 264:               if (!thing->player &&              EV_SilentLineTeleport(line, side, thing, true))                line->special = 0;              break;            case 266:               if (!thing->player &&                  EV_SilentLineTeleport(line, side, thing, false))                line->special = 0;              break;            case 268:               if (!thing->player && EV_SilentTeleport(line, side, thing))                line->special = 0;              break;            // Extended walk many retriggerable             //Boom added lots of linedefs to fill in the gaps in trigger types            case 147:              // Raise Floor 512              EV_DoFloor(line,raiseFloor512);              break;            case 148:              // Raise Floor 24 and Change              EV_DoPlat(line,raiseAndChange,24);              break;            case 149:              // Raise Floor 32 and Change              EV_DoPlat(line,raiseAndChange,32);              break;            case 150:              // Start slow silent crusher              EV_DoCeiling(line,silentCrushAndRaise);              break;            case 151:              // RaiseCeilingLowerFloor              EV_DoCeiling( line, raiseToHighest );              EV_DoFloor( line, lowerFloorToLowest );              break;            case 152:              // Lower Ceiling to Floor              EV_DoCeiling( line, lowerToFloor );              break;            case 256:              // Build stairs, step 8              EV_BuildStairs(line,build8);              break;            case 257:              // Build stairs, step 16              EV_BuildStairs(line,turbo16);              break;            case 155:              // Lower Pillar, Raise Donut              EV_DoDonut(line);              break;            case 156:              // Start lights strobing              EV_StartLightStrobing(line);              break;            case 157:              // Lights to dimmest near              EV_TurnTagLightsOff(line);              break;            case 201:              // Lower ceiling to lowest surrounding ceiling              EV_DoCeiling(line,lowerToLowest);              break;            case 202:              // Lower ceiling to highest surrounding floor              EV_DoCeiling(line,lowerToMaxFloor);              break;            case 208:              // WR silent teleporter (normal kind)              EV_SilentTeleport(line, side, thing);              break;            case 212:              // Toggle floor between C and F instantly              EV_DoPlat(line,toggleUpDn,0);              break;            case 154:              // Texture/Type Change Only (Trigger)              EV_DoChange(line,trigChangeOnly);              break;            case 240:               // Texture/Type Change Only (Numeric)              EV_DoChange(line,numChangeOnly);              break;            case 220:              // Lower floor to next lower neighbor              EV_DoFloor(line,lowerFloorToNearest);              break;            case 228:              // Raise elevator next floor              EV_DoElevator(line,elevateUp);              break;            case 232:              // Lower elevator next floor              EV_DoElevator(line,elevateDown);              break;            case 236:              // Elevator to current floor              EV_DoElevator(line,elevateCurrent);              break;            case 244:               // WR silent teleporter (linedef-linedef kind)              EV_SilentLineTeleport(line, side, thing, false);              break;            case 263:               //Silent line-line reversed              EV_SilentLineTeleport(line, side, thing, true);              break;            case 265:               //Monster-only silent line-line reversed              if (!thing->player)                EV_SilentLineTeleport(line, side, thing, true);              break;            case 267:               //Monster-only silent line-line              if (!thing->player)                EV_SilentLineTeleport(line, side, thing, false);              break;            case 269:               //Monster-only silent              if (!thing->player)                EV_SilentTeleport(line, side, thing);              break;              }            }    }}//// P_ShootSpecialLine - IMPACT SPECIALS// Called when a thing shoots a special line.//void P_ShootSpecialLine ( mobj_t*       thing,                          line_t*       line ){    int         ok;    //SoM: 3/7/2000: Another General type check    if (boomsupport)    {      // pointer to line function is NULL by default, set non-null if      // line special is gun triggered 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;   // FloorModel is "Allow Monsters" if FloorChange is 0        if (!line->tag) //jff 2/27/98 all gun generalized types require tag          return;        linefunc = EV_DoGenFloor;      }      else if ((unsigned)line->special >= GenCeilingBase)      {        if (!thing->player)          if ((line->special & CeilingChange) || !(line->special & CeilingModel))            return;   // CeilingModel is "Allow Monsters" if CeilingChange is 0        if (!line->tag) //jff 2/27/98 all gun generalized types require tag          return;        linefunc = EV_DoGenCeiling;      }      else if ((unsigned)line->special >= GenDoorBase)      {        if (!thing->player)        {          if (!(line->special & DoorMonster))            return;   // monsters disallowed from this door          if (line->flags & ML_SECRET) // they can't open secret doors either            return;        }        if (!line->tag) //jff 3/2/98 all gun generalized types require tag          return;        linefunc = EV_DoGenDoor;      }      else if ((unsigned)line->special >= GenLockedBase)      {        if (!thing->player)          return;   // monsters disallowed from unlocking doors        if (((line->special&TriggerType)==GunOnce) || ((line->special&TriggerType)==GunMany))        { //jff 4/1/98 check for being a gun type before reporting door type          if (!P_CanUnlockGenDoor(line,thing->player))            return;        }        else          return;        if (!line->tag) //jff 2/27/98 all gun generalized types require tag          return;        linefunc = EV_DoGenLockedDoor;      }      else if ((unsigned)line->special >= GenLiftBase)      {        if (!thing->player)          if (!(line->special & LiftMonster))            return; // monsters disallowed        linefunc = EV_DoGenLift;      }      else if ((unsigned)line->special >= GenStairsBase)      {        if (!thing->player)          if (!(line->special & StairMonster))            return; // monsters disallowed        if (!line->tag) //jff 2/27/98 all gun generalized types require tag          return;        linefunc = EV_DoGenStairs;      }      else if ((unsigned)line->special >= GenCrusherBase)      {        if (!thing->player)          if (!(line->special & StairMonster))            return; // monsters disallowed        if (!line->tag) //jff 2/27/98 all gun generalized types require tag          return;        linefunc = EV_DoGenCrusher;      }      if (linefunc)        switch((line->special & TriggerType) >> TriggerTypeShift)        {          case GunOnce:            if (linefunc(line))              P_ChangeSwitchTexture(line,0);            return;          case GunMany:            if (linefunc(line))              P_ChangeSwitchTexture(line,1);            return;          default:  // if not a gun type, do nothing here            return;        }    }    //  Impacts that other things can activate.    if (!thing->player)    {        ok = 0;        switch(line->special)        {          case 46:            // OPEN DOOR IMPACT            ok = 1;            break;        }        if (!ok)            return;    }    if(!P_CheckTag(line))      return;    switch(line->special)    {      case 24:        // RAISE FLOOR        if(EV_DoFloor(line,raiseFloor) || !boomsupport)          P_ChangeSwitchTexture(line,0);        break;      case 46:        // OPEN DOOR        if(EV_DoDoor(line,dooropen,VDOORSPEED) || !boomsupport)          P_ChangeSwitchTexture(line,1);        break;      case 47:        // RAISE FLOOR NEAR AND CHANGE        if(EV_DoPlat(line,raiseToNearestAndChange,0) || !boomsupport)          P_ChangeSwitchTexture(line,0);        break;      //SoM: FraggleScript      case 278:      case 279:        t_trigger = thing;        T_RunScript(line->tag);        if(line->special == 279) line->special = 0;       // clear if G1        break;      default:        if (boomsupport)          switch (line->special)          {            case 197:              // Exit to next level              if( cv_allowexitlevel.value )              {                  P_ChangeSwitchTexture(line,0);                  G_ExitLevel();              }              break;            case 198:              // Exit to secret level              if( cv_allowexitlevel.value )              {                  P_ChangeSwitchTexture(line,0);                  G_SecretExitLevel();              }              break;              //jff end addition of new gun linedefs          }        break;    }}//// P_ProcessSpecialSector// Function that actually applies the sector special to the player.void P_ProcessSpecialSector(player_t* player, sector_t* sector, boolean instantdamage){    if(sector->special < 32)    {      // Has hitten ground.      switch (sector->special)      {        case 5:          // HELLSLIME DAMAGE          if (!player->powers[pw_ironfeet])              if (instantdamage)              {                  P_DamageMobj (player->mo, NULL, NULL, 10);                  // spawn a puff of smoke                  //CONS_Printf ("damage!\n"); //debug                  if( demoversion>=125 )                      P_SpawnSmoke (player->mo->x, player->mo->y, player->mo->z);              }          break;        case 7:          // NUKAGE DAMAGE          if (!player->powers[pw_ironfeet])              if (instantdamage)                  P_DamageMobj (player->mo, NULL, NULL, 5);          break;        case 16:          // SUPER HELLSLIME DAMAGE        case 4:          // STROBE HURT          if (!player->powers[pw_ironfeet]              || (P_Random()<5) )          {              if (instantdamage)                  P_DamageMobj (player->mo, NULL, NULL, 20);          }          break;        case 9:          // SECRET SECTOR          player->secretcount++;          sector->special = 0;          //faB: useful only in single & coop.          if (!cv_deathmatch.value && players-player == displayplayer)              CONS_Printf ("\2You found a secret area!\n");          break;        case 11:          // EXIT SUPER DAMAGE! (for E1M8 finale)          player->cheats &= ~CF_GODMODE;          if (instantdamage)              P_DamageMobj (player->mo, NULL, NULL, 20);          if ((player->health <= 10) && cv_allowexitlevel.value)              G_ExitLevel();          break;        default:          //SoM: 3/8/2000: Just ignore.          //CONS_Printf ("P_PlayerInSpecialSector: unknown special %i",          //             sector->special);          break;      };   }   else //SoM: Extended sector types for secrets and damage   {     switch ((sector->special&DAMAGE_MASK)>>DAMAGE_SHIFT)     {       case 0: // no damage         break;       case 1: // 2/5 damage per 31 ticks         if (!player->powers[pw_ironfeet])           if (instantdamage)              P_DamageMobj (player->mo, NULL, NULL, 5);         break;       case 2: // 5/10 damage per 31 ticks         if (!player->powers[pw_ironfeet])           if (instantdamage)              P_DamageMobj (player->mo, NULL, NULL, 10);         break;       case 3: // 10/20 damage per 31 ticks         if (!player->powers[pw_ironfeet]             || (P_Random()<5))  // take damage even with suit         {           if (instantdamage)             P_DamageMobj (player->mo, NULL, NULL, 20);         }         break;     }     if (sector->special&SECRET_MASK)     {       player->secretcount++;       sector->special &= ~SECRET_MASK;       if (!cv_deathmatch.value && players-player == displayplayer)          CONS_Printf ("\2You found a secret area!\n");       if (sector->special<32)         sector->special=0;     }   }}//// P_PlayerOnSpecial3DFloor// Checks to see if a player is standing on or is inside a 3D floor (water)// and applies any speicials..void P_PlayerOnSpecial3DFloor(player_t* player){  sector_t* sector;  boolean   instantdamage = false;  ffloor_t* rover;  sector = player->mo->subsector->sector;  if(!sector->ffloors)    return;  for(rover = sector->ffloors; rover; rover = rover->next)  {    if(!rover->master->frontsector->special)      continue;    // Check the 3D floor's type...    if(rover->flags & FF_SOLID)    {      // Player must be on top of the floor to be affected...      if(player->mo->z != *rover->topheight)        continue;      if (demoversion >= 125 &&        (player->mo->eflags & MF_JUSTHITFLOOR) &&        sector->heightsec == -1 && (leveltime % (2*NEWTICRATERATIO))) //SoM: penalize jumping less.        instantd

⌨️ 快捷键说明

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