📄 p_spec.c
字号:
// 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 + -